CMake: как получить целевое местоположение для правила установки - PullRequest
6 голосов
/ 06 июня 2019

У меня есть CMakeLists.txt, который делает это:

get_target_property(myloc mytarget LOCATION)

Раньше он работал нормально, но CMake 3.0 устарел при использовании LOCATION (см. https://cmake.org/cmake/help/v3.0/policy/CMP0026.html).. Поэтому я попытался использовать выражение генератора:

set(myloc $<TARGET_FILE:mytarget>)

Казалось бы, это сработает, за исключением того, что выражения генератора вычисляются не везде, а только при настройке свойств других целей и разрешаются на этапе "генерации", а не на предыдущем этапе "конфигурирования". Проблема в том, что мне нужно знать целевое местоположение в install() правиле, что-то вроде этого (реальное использование не strip, но это не имеет значения):

install(CODE "execute_process(COMMAND strip ${myloc})")

Это работало нормально при использовании LOCATION, но теперь это устарело, и я не могу найти правильный способ сделать это. Корень проблемы, по-видимому, заключается в том, что install() вызывается на этапе «конфигурирования», когда целевой путь неизвестен.

Как я могу преодолеть этот пробел и найти целевой выходной путь, как я делал, перед вызовом install()?

Ответы [ 2 ]

5 голосов
/ 10 июня 2019

В идеале это будет сделано с помощью выражений генератора :

install(CODE "execute_process(COMMAND strip $<TARGET_FILE:mytarget>)")

К сожалению, поддержка выражений генератора в режимах CODE и SCRIPT команды install была добавлена ​​только в CMake 3.14 (см. Документацию команды install в этой версии).

До CMake 3.14 вы можете работать только с генераторами с одной конфигурацией (например, с Makefile, но не с Visual Studio).

В таких условиях вы можете либо отключить предупреждение CMP0026, как предлагается в Th.Thielemann's answer , и прочитать свойство LOCATION.

Или вы можете использовать install(SCRIPT) поток команды, где скрипт подготовлен с помощью команды file (GENERATE) , которая похожа на configure_file, но работает с выражениями генератора:

file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake
     CONTENT "execute_process(COMMAND strip $<TARGET_FILE:mytarget>)")

install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake)

Обратите внимание, что подход с file(GENERATE) по-прежнему не работает с мультиконфигурацией генераторами: CMake требует, чтобы имя файла для предложения OUTPUT было уникальным среди конфигураций. Это можно исправить с помощью

file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake_$<CONFIG>
     CONTENT "execute_process(COMMAND strip $<TARGET_FILE:mytarget>)")

install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake_${CMAKE_BUILD_TYPE})

но это все равно не будет работать: в генераторах с множеством конфигураций CMAKE_BUILD_TYPE оценивается как пустая строка.

(Замена ${CMAKE_BUILD_TYPE} на $<CONFIG> в команде install(SCRIPT) будет работать только в CMake 3.14 и после, но в этих версиях весь file(GENERATE) не нужен, и можно просто использовать самый первый фрагмент.)

0 голосов
/ 06 июня 2019

Вы можете попытаться использовать / повторно включить поведение

cmake_policy(SET CMP0026 OLD)

См. cmake-policy

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