Release 18.02
[platform/upstream/armnn.git] / cmake / AddDllCopyCommands.cmake
1 macro (addDllCopyCommand target sourceDebug sourceRelease)
2     add_custom_command(TARGET ${target} POST_BUILD
3         COMMAND ${CMAKE_COMMAND} -E copy_if_different
4         "$<$<CONFIG:Debug>:${sourceDebug}>$<$<CONFIG:Release>:${sourceRelease}>$<$<CONFIG:RelWithDebInfo>:${sourceRelease}>$<$<CONFIG:MinSizeRel>:${sourceRelease}>"
5         $<TARGET_FILE_DIR:${target}>)
6 endmacro()
7
8 macro (addBoostDllCopyCommand target ignored sourceReleaseLib ignored sourceDebugLib)
9     string(REGEX REPLACE ".lib$" ".dll" sourceReleaseDll ${sourceReleaseLib})
10     string(REGEX REPLACE "/libboost" "/boost" sourceReleaseDll2 ${sourceReleaseDll})
11
12     string(REGEX REPLACE ".lib$" ".dll" sourceDebugDll ${sourceDebugLib})
13     string(REGEX REPLACE "/libboost" "/boost" sourceDebugDll2 ${sourceDebugDll})
14     addDllCopyCommand(${target} ${sourceDebugDll2} ${sourceReleaseDll2})
15 endmacro()
16
17 # Checks if the given list contains an entry which matches the given regex.
18 function(listContainsRegex result list regex)
19     set(${result} 0 PARENT_SCOPE)
20     foreach(element ${list})
21         if(${element} MATCHES ${regex})
22             set(${result} 1 PARENT_SCOPE)
23             return()
24         endif()
25     endforeach()
26 endfunction()
27
28 macro(addDllCopyCommands target)
29     if(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
30         # Get the list of dependencies for the given target, so we can copy just the DLLs we need.
31         get_target_property(target_deps_str ${target} LINK_LIBRARIES)
32         set(target_deps)
33         list(APPEND target_deps ${target_deps_str})
34
35         cmake_policy(SET CMP0057 NEW) # Enable the "IN_LIST" operator
36
37         # armnn.dll
38         if ("armnn" IN_LIST target_deps)
39             addDllCopyCommand(${target} "$<TARGET_FILE_DIR:armnn>/armnn.dll" "$<TARGET_FILE_DIR:armnn>/armnn.dll")
40         endif()
41
42         # armnnCaffeParser.dll
43         if ("armnnCaffeParser" IN_LIST target_deps)
44             addDllCopyCommand(${target} "$<TARGET_FILE_DIR:armnnCaffeParser>/armnnCaffeParser.dll"
45                                         "$<TARGET_FILE_DIR:armnnCaffeParser>/armnnCaffeParser.dll")
46             addDllCopyCommand(${target} "${PROTOBUF_ROOT}/bin/libprotobufd.dll"
47                                         "${PROTOBUF_ROOT}/bin/libprotobuf.dll")
48        endif()
49
50         # armnnTfParser.dll
51         if ("armnnTfParser" IN_LIST target_deps)
52             addDllCopyCommand(${target} "$<TARGET_FILE_DIR:armnnTfParser>/armnnTfParser.dll"
53                                         "$<TARGET_FILE_DIR:armnnTfParser>/armnnTfParser.dll")
54             addDllCopyCommand(${target} "${PROTOBUF_ROOT}/bin/libprotobufd.dll"
55                                         "${PROTOBUF_ROOT}/bin/libprotobuf.dll")
56         endif()
57
58         # caffe.dll and its dependencies
59         listContainsRegex(includeCaffeDlls "${target_deps}" "caffe")
60         if (${includeCaffeDlls})
61             addDllCopyCommand(${target} "${CAFFE_BUILD_ROOT}/lib/caffe-d.dll"
62                                         "${CAFFE_BUILD_ROOT}/lib/caffe.dll")
63             addDllCopyCommand(${target} "${PROTOBUF_ROOT}/bin/libprotobufd.dll"
64                                         "${PROTOBUF_ROOT}/bin/libprotobuf.dll")
65             addDllCopyCommand(${target} "${BLAS_ROOT}/bin/libopenblas.dll"          "${BLAS_ROOT}/bin/libopenblas.dll")
66             addDllCopyCommand(${target} "${MINGW32_ROOT}/bin/libgfortran-3.dll"     "${MINGW32_ROOT}/bin/libgfortran-3.dll")
67             addDllCopyCommand(${target} "${MINGW32_ROOT}/bin/libgcc_s_dw2-1.dll"    "${MINGW32_ROOT}/bin/libgcc_s_dw2-1.dll")
68             addDllCopyCommand(${target} "${MINGW32_ROOT}/bin/libquadmath-0.dll"     "${MINGW32_ROOT}/bin/libquadmath-0.dll")
69             addBoostDllCopyCommand(${target} ${Boost_SYSTEM_LIBRARY})
70             addBoostDllCopyCommand(${target} ${Boost_THREAD_LIBRARY})
71             addBoostDllCopyCommand(${target} ${Boost_CHRONO_LIBRARY})
72         endif()
73     endif()
74 endmacro()