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

Я пытаюсь использовать другое целевое свойство на основе конфигурации сборки. Существует импортированная цель с именем 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" ..

Обновление2

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

Скрипты CMakeLists.txt и Findlibmongocxx.cmake могут различать командную строку CMake и IDE. Например, проверив генератор. Вы не показываете нам ни один из этих скриптов, так что мы можем только догадываться, почему результаты разные в разных вариантах использования. Пожалуйста, подготовьте минимальный воспроизводимый пример, демонстрирующий вашу проблему.

Tsyvarev 22.05.2019 14:39

Какой генератор вызывает проблему? Или вы говорите, что генератор Visual Studio дает сбой при использовании CMake в командной строке, но не при использовании плагина Visual Studio CMake?

fdk1342 22.05.2019 14:43

Ну, когда командная строка была опубликована, это объясняет проблему. См. дублирующийся вопрос о правильной настройке типа сборки для Visual Studio.

Tsyvarev 22.05.2019 17:57

@Tsyvarev Я не согласен, что это дубликат. Это НЕ касается изменения типа сборки. Речь идет о выражениях генератора и необходимости учитывать все типы сборки в CMAKE_CONFIGURATION_TYPES. Вы заметите, что та же ошибка возникает, даже если CMAKE_BUILD_TYPE НЕ находится в командной строке. Его использование просто отвлекает от реальной проблемы.

fdk1342 22.05.2019 19:07

«Этот вопрос касается использования выражений генератора cmake и использования cmake из командной строки». - Дублирование связано с тем, как вы пытаетесь установить CMAKE_BUILD_TYPE для Visual Studio в командной строке. Но я согласен с @Fred, что без этой попытки ваш вопрос определенно был бы другим. Пожалуйста, удалите эту попытку из сообщения (или просто удалите часть -DCMAKE_BUILD_TYPE=Debug, так как это не имеет никакого эффекта), и я буду рад снова открыть вопрос.

Tsyvarev 22.05.2019 19:22
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
5
343
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Так что либо добавьте недостающие значения, либо измените CMAKE_CONFIGURATION_TYPES.

Другие вопросы по теме