Выражения генератора cmake ведут себя по-разному в IDE и в командной строке - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь использовать другое целевое свойство в зависимости от конфигурации сборки.Импортированная цель называется libmongocxx и имеет 3 свойства для разных конфигов:

  • IMPORTED_LOCATION_DEBUG
  • IMPORTED_LOCATION_RELEASE
  • IMPORTED_LOCATION_RELWITHDEBINFO

Итак, чтобы скопировать необходимые зависимости для создания каталога, я попытался использовать следующий код:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
    "$<TARGET_PROPERTY:libmongocxx,$<$<CONFIG:Debug>:IMPORTED_LOCATION_DEBUG>$<$<CONFIG:Release>:IMPORTED_LOCATION_RELEASE>$<$<CONFIG:RelWithDebInfo>:IMPORTED_LOCATION_RELWITHDEBINFO>>"
    $<TARGET_FILE_DIR:${PROJECT_NAME}>)

Проблема: это прекрасно работает, когда я запускаю конфигурацию из IDE (я пробовал CLion и VS2017), но тот же CMakeLists.txt не удается настроить, когда я запускаю cmake из командной строки.Ошибка cmake показывает:

CMake Error at CMakeLists.txt:93 (add_custom_command):
  Error evaluating generator expression:

    $<TARGET_PROPERTY:libmongocxx,$<$<CONFIG:Debug>:IMPORTED_LOCATION_DEBUG>$<$<CONFIG:Release>:IMPORTED_LOCATION_RELEASE>$<$<CONFIG:RelWithDebInfo>:IMPORTED_LOCATION_RELWITHDEBINFO>>

  $<TARGET_PROPERTY:...> expression requires a non-empty property name.

Кстати, я уже обнаружил, что эту же задачу легче решить с помощью выражения генератора TARGET_FILE, но все же, почему различается поведение в IDE ииз командной строки?Я обнаружил это в CMake версии 3.12.3, но позже проверил на 3.14.4 (только для строки cmd), и он все еще не работает.

Обновление

Вот минимальный примервоспроизвести проблему.Никаких зависимостей не требуется.test.cpp - пустой файлКонфигурация успешно завершается из VS2017, но не выполняется из строки cmd.

CMakeLists.txt:

project(test LANGUAGES CXX)
cmake_minimum_required(VERSION 3.8.0)

add_executable(${PROJECT_NAME} test.cpp)

set_target_properties(${PROJECT_NAME} PROPERTIES
  IMPORTED_LOCATION_DEBUG "libd.dll"
  IMPORTED_LOCATION_RELEASE "lib.dll"
  IMPORTED_LOCATION_RELWITHDEBINFO "libi.dll"
)

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
    "$<TARGET_PROPERTY:${PROJECT_NAME},$<$<CONFIG:Debug>:IMPORTED_LOCATION_DEBUG>$<$<CONFIG:Release>:IMPORTED_LOCATION_RELEASE>$<$<CONFIG:RelWithDebInfo>:IMPORTED_LOCATION_RELWITHDEBINFO>>"
    $<TARGET_FILE_DIR:${PROJECT_NAME}>
)

Командная строка:

cmake -G "Visual Studio 15 2017 Win64" ..

Update2

Не могу согласиться с тем, что этот вопрос является дубликатом.Другой вопрос касается правильной настройки сборки Visual Studio.Этот вопрос касается использования выражений генератора cmake и использования cmake из командной строки.

1 Ответ

2 голосов
/ 22 мая 2019

Плагин Visual Studio IDE CMake использует только конфигурации RelWithDebInfo и Debug (по крайней мере, для меня). При вызове из командной строки по умолчанию используются все четыре стандартные конфигурации: Debug;Release;MinSizeRel;RelWithDebInfo.

Ваш файл CMakeLists.txt является неполным, поскольку MinSizeRel не определен или не используется, поэтому нет информации для конфигурации MinSizeRel.

Кстати, CMAKE_BUILD_TYPE игнорируется для генераторов с множеством конфигураций. CMAKE_CONFIGURATION_TYPES определяет, какие типы сборки следует учитывать при генерации.

Так что либо добавьте пропущенные значения, либо измените CMAKE_CONFIGURATION_TYPES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...