CMake: Как скопировать разные файлы для создания каталога в соответствии с конфигурацией и архитектурой

Я создаю свой vcxproj а также sln файлы для MSVC с CMake. Я хочу скопировать некоторые dlls в каталоге сборки как POST_BUILD событие, которые отличаются в зависимости от того, строю ли я Debug или же Release конфигурация и является ли она x86 или же x64 архитектура. я использую add_custom_command следующим образом

add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${FILES_TO_COPY} ${CMAKE_CURRENT_BINARY_DIR})

Я хочу установить FILES_TO_COPY к различным значениям в зависимости от архитектуры и конфигурации или использовать разные add_custom_command в соответствии с теми же условиями. Но CMake MSVC является мультиконфигурационным генератором и CMAKE_BUILD_TYPE под ним пусто, и я не могу просто написать что-то вроде:

if (CMAKE_SIZEOF_VOID_P EQUAL 4)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")

set (FILES_TO_COPY
"${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Debug/i386/libdb52d.dll")

elseif (CMAKE_BUILD_TYPE STREQUAL "Release")

set (FILES_TO_COPY
"${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Release/i386/libdb52.dll")

else ()
message (FATAL_ERROR "Invalid configuration name ${CMAKE_BUILD_TYPE}.")
endif ()
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")

set (FILES_TO_COPY
"${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Debug/x64/libdb52d.dll")

elseif (CMAKE_BUILD_TYPE STREQUAL "Release")

set (FILES_TO_COPY
"${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/Release/x64/libdb52.dll")

else ()
message (FATAL_ERROR "Invalid configuration name ${CMAKE_BUILD_TYPE}.")
endif ()
else ()
message (FATAL_ERROR "Unsupported architecture with ${CMAKE_SIZEOF_VOID_P}
bytes pointer size.")
endif ()

Как это сделать правильно?

1

Решение

попробуй это:

set(arch "i386")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(arch "x64")
endif()

set(FILES_TO_COPY "${CMAKE_SOURCE_DIR}/Externals/DLLs/bdb/$<CONFIG>/${arch}/libdb52$<$<CONFIG:Debug>:d>.dll")
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]