2016-02-29 3 views
1

В связи со следующим предупреждением:выражение генератор CMake не оценивается

CMake Error at test/CMakeLists.txt:29 (get_target_property): 
    The LOCATION property may not be read from target "my_exe". Use the 
    target name directly with add_custom_command, or use the generator 
    expression $<TARGET_FILE>, as appropriate. 

, которая является результатом линии, как это:

get_target_property(my_exe_path my_exe LOCATION) 

Как рекомендовано в документации, я пытался использовать выражение генератора, как это:

add_executable(my_exe_path main.cpp) 
message("path to executable: $<TARGET_FILE:my_exe_path>") 

Но TARGET_FILE не является оценка d

path to executable: $<TARGET_FILE:my_exe> 

Я использую CMake 3.4 и добавил cmake_minimum_required(VERSION 3.4) к моему CMakeLists.txt так, что я делаю неправильно?

+1

Оценка выражений генератора выполняется на этапе ** build **. Но 'message()' выводит строку непосредственно на этапе * configure *, когда выражение может быть не разрешимым в случае генераторов с несколькими конфигурациями (используется ли ваш генератор Visual Studio?). – Tsyvarev

+0

Я нахожусь в Linux, используя генератор командной строки и генератор QtCreator (CodeBlocks). Я начал печатать оцениваемое выражение, используя 'message()', когда 'add_test (test1 $ )' не работал. Поэтому я догадался, что выражение не было правильно оценено (и я все еще это делаю). – frans

+1

Простой вариант 'add_test' не реконструирует выражения генератора. Вам нужно использовать полную форму: 'add_test (NAME test COMMAND $ )'. Или даже 'add_test (NAME test COMMAND my_exe)'. – Tsyvarev

ответ

4

В то время как выражение генератора хранится при конфигурации стадии (когда команда соответствует CMake выполняется),

Оценка выражений генератора выполняется на этапе сборки .

Именно поэтому message() команда печатает выражение генератора в не разыменованной форме: величина, обозначено выражением генератора не известен на данном этапе.

Кроме того, CMake никогда не вызывает разложения генераторных выражений сам по себе. Вместо этого он генерирует соответствующую строку в файле сборки, которая затем интерпретируется утилитой сборки (make, Visual Studio и т. Д.).

Обратите внимание, что

Не каждый CMake команда принимаетгенератор выражений. Каждое возможное использование выражений генератора является явно, описанное в documentation для конкретной команды.

Кроме того,

Различные команды CMake потоки или различные варианты имеют другую политику о генератор выражений.

Например, команда потока

add_test(NAME <name> COMMAND <executable>) 

принимает генератор выражений для COMMAND опции

но команда потока

add_test(<name> <executable>) 

не делает!

Другой пример различия политики:

install(DIRECTORY <dir> DESTINATION <dest>) 

В этой команде потока выражений генератора допускается для DESTINATION, но не для DIRECTORY опции.

Снова, внимательно прочитайте документацию.

6

Вот быстрый и простой способ вывести значение выражения генератора:

add_custom_target(print 
     ${CMAKE_COMMAND} -E echo $<1:hello> $<0:world> 
    ) 

В этом примере, если вы запустите cmake ., а затем make print, вы увидите «привет» (без кавычек) на выходе.

Однако, если вы используете только message($<1:hello> $<0:world>), вы увидите «$<1:hello> $<0:world>» в качестве вывода (опять же, без кавычек).

Смежные вопросы