Как правильно передать список меток CMake (точка с запятой) для set_target_properties?
Списки CMake представляют собой, по сути, строки, разделенные точкой с запятой, но если вы передадите такую переменную команде, она будет расширена на несколько аргументов - например,
set(FLAGS f1 f2 f3)
# now FLAGS == 'f1;f2;f3'
add_custom_command(
...
COMMAND my_cmd ${FLAGS}
...
)
будет правильно вызывать my_cmd f1 f2 f3
.
Теперь, если я делаю это с помощью
set_target_properties(
myTarget PROPERTIES
LINK_FLAGS "${LD_FLAGS}"
)
разложение не происходит, и я заканчиваю одним LD_FLAG, который содержит точки с запятой - бесполезен, вместо того, чтобы расширять его в строку, разделенную пробелом.
Есть ли способ сделать это так, что когда я передаю список в свойство LINK_FLAGS (или любое другое свойство), он расширяется на несколько аргументов, а не только на один?
Спасибо,
Dan
Ответы
Ответ 1
Я не думаю, что set_target_properties
может делать расширение автоматически, но вы можете использовать string (REPLACE ...)
, чтобы развернуть список в строку, разделенную пробелами:
string (REPLACE ";" " " LD_FLAGS_STR "${LD_FLAGS}")
set_target_properties(
myTarget PROPERTIES
LINK_FLAGS "${LD_FLAGS_STR}"
)
Ответ 2
Для использования списка cmake List в качестве списка используйте
${LD_FLAG}
Для использования списка cmake в качестве строки (т.е. элементы списка разделяются символом ';'), используйте
"${LD_FLAG}"
Так что в вашем случае просто удалить "" должно быть достаточно.
Ответ 3
Команда set_property
предназначена для этого
http://www.cmake.org/cmake/help/v3.0/command/set_property.html
set_property(TARGET tgt PROPERTY LINK_FLAGS foo bar)
Ответ 4
Я использую его как строки
set(FLAGS " f1 f2 f3")
Обратите внимание на пространство спереди, оно позволяет конкатенировать другие наборы флагов.
Для более сложных проектов вместо if-elses вы также можете выполнить трюк с двойным расширением:
set(GCC_FLAGS " -Wl,--relax")
set(DIAB_FLAGS " -tPPCE500ES:cross")
set(MSVC_FLAGS " /RAINBOW_CRAP)
# ...
# ...LINUX_FLAGS, WINDOWS_FLAGS, etc...
set_target_properties(
myTarget PROPERTIES
LINK_FLAGS "${${COMPILER}_FLAGS} ${${SYSTEM}_FLAGS}"
)
# COMPILER and SYSTEM is set somewhere else, in toolchain files for example