aboutsummaryrefslogtreecommitdiff
path: root/cmake/AddDllCopyCommands.cmake
blob: 74f6f6fff10b4b5c4c3762c2d9bb8c73a27d6d38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
macro (addDllCopyCommand target sourceDebug sourceRelease)
    add_custom_command(TARGET ${target} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "$<$<CONFIG:Debug>:${sourceDebug}>$<$<CONFIG:Release>:${sourceRelease}>$<$<CONFIG:RelWithDebInfo>:${sourceRelease}>$<$<CONFIG:MinSizeRel>:${sourceRelease}>"
        $<TARGET_FILE_DIR:${target}>)
endmacro()

macro (addBoostDllCopyCommand target ignored sourceReleaseLib ignored sourceDebugLib)
    string(REGEX REPLACE ".lib$" ".dll" sourceReleaseDll ${sourceReleaseLib})
    string(REGEX REPLACE "/libboost" "/boost" sourceReleaseDll2 ${sourceReleaseDll})

    string(REGEX REPLACE ".lib$" ".dll" sourceDebugDll ${sourceDebugLib})
    string(REGEX REPLACE "/libboost" "/boost" sourceDebugDll2 ${sourceDebugDll})
    addDllCopyCommand(${target} ${sourceDebugDll2} ${sourceReleaseDll2})
endmacro()

# Checks if the given list contains an entry which matches the given regex.
function(listContainsRegex result list regex)
    set(${result} 0 PARENT_SCOPE)
    foreach(element ${list})
        if(${element} MATCHES ${regex})
            set(${result} 1 PARENT_SCOPE)
            return()
        endif()
    endforeach()
endfunction()

macro(addDllCopyCommands target)
    if(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
        # Get the list of dependencies for the given target, so we can copy just the DLLs we need.
        get_target_property(target_deps_str ${target} LINK_LIBRARIES)
        set(target_deps)
        list(APPEND target_deps ${target_deps_str})

        cmake_policy(SET CMP0057 NEW) # Enable the "IN_LIST" operator

        # armnn.dll
        if ("armnn" IN_LIST target_deps)
            addDllCopyCommand(${target} "$<TARGET_FILE_DIR:armnn>/armnn.dll" "$<TARGET_FILE_DIR:armnn>/armnn.dll")
        endif()

        # armnnCaffeParser.dll
        if ("armnnCaffeParser" IN_LIST target_deps)
            addDllCopyCommand(${target} "$<TARGET_FILE_DIR:armnnCaffeParser>/armnnCaffeParser.dll"
                                        "$<TARGET_FILE_DIR:armnnCaffeParser>/armnnCaffeParser.dll")
            addDllCopyCommand(${target} "${PROTOBUF_ROOT}/bin/libprotobufd.dll"
                                        "${PROTOBUF_ROOT}/bin/libprotobuf.dll")
       endif()

        # armnnTfParser.dll
        if ("armnnTfParser" IN_LIST target_deps)
            addDllCopyCommand(${target} "$<TARGET_FILE_DIR:armnnTfParser>/armnnTfParser.dll"
                                        "$<TARGET_FILE_DIR:armnnTfParser>/armnnTfParser.dll")
            addDllCopyCommand(${target} "${PROTOBUF_ROOT}/bin/libprotobufd.dll"
                                        "${PROTOBUF_ROOT}/bin/libprotobuf.dll")
        endif()

        # armnnTfLiteParser.dll
        if ("armnnTfLiteParser" IN_LIST target_deps)
            addDllCopyCommand(${target} "$<TARGET_FILE_DIR:armnnTfLiteParser>/armnnTfLiteParser.dll"
                                        "$<TARGET_FILE_DIR:armnnTfLiteParser>/armnnTfLiteParser.dll")
        endif()

        # caffe.dll and its dependencies
        listContainsRegex(includeCaffeDlls "${target_deps}" "caffe")
        if (${includeCaffeDlls})
            addDllCopyCommand(${target} "${CAFFE_BUILD_ROOT}/lib/caffe-d.dll"
                                        "${CAFFE_BUILD_ROOT}/lib/caffe.dll")
            addDllCopyCommand(${target} "${PROTOBUF_ROOT}/bin/libprotobufd.dll"
                                        "${PROTOBUF_ROOT}/bin/libprotobuf.dll")
            addDllCopyCommand(${target} "${BLAS_ROOT}/bin/libopenblas.dll"          "${BLAS_ROOT}/bin/libopenblas.dll")
            addDllCopyCommand(${target} "${MINGW32_ROOT}/bin/libgfortran-3.dll"     "${MINGW32_ROOT}/bin/libgfortran-3.dll")
            addDllCopyCommand(${target} "${MINGW32_ROOT}/bin/libgcc_s_dw2-1.dll"    "${MINGW32_ROOT}/bin/libgcc_s_dw2-1.dll")
            addDllCopyCommand(${target} "${MINGW32_ROOT}/bin/libquadmath-0.dll"     "${MINGW32_ROOT}/bin/libquadmath-0.dll")
            addBoostDllCopyCommand(${target} ${Boost_SYSTEM_LIBRARY})
            addBoostDllCopyCommand(${target} ${Boost_THREAD_LIBRARY})
            addBoostDllCopyCommand(${target} ${Boost_CHRONO_LIBRARY})
        endif()
    endif()
endmacro()