Подтвердить что ты не робот

Как правильно передать список меток 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

4b9b3361

Ответ 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}"

Так что в вашем случае просто удалить "" должно быть достаточно.

Ответ 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