Выражения Cmake Generator с несколькими записями (пробелы?)

(Во время написания этого вопроса я нашел решение, так что это просто документирует его, потому что мне это действительно нужно было бы заранее!)

Я пишу проект на C++ и использую для этого cmake.

В моем файле cmake у меня есть:

set(MY_DEBUG_WARNINGS "-Og -Wall"
)

# Add warnings:
add_compile_options("$<$<CONFIG:DEBUG>:${MY_DEBUG_WARNINGS}>"
"$<$<CXX_COMPILER_ID:Clang,AppleClang>:-fcolor-diagnostics>"
"$<$<CXX_COMPILER_ID:GNU>:-fdiagnostics-color>"
)

что не работает, потому что команда компиляции выбирает лишние экранированные кавычки:

  "/usr/bin/clang++ -I../src/Exception/include -g \"-Og -Wall\" -fcolor-diagnostics - 
  std=c++17 -o src/Exception/CMakeFiles/exception.dir/Exception.cpp.o -c 
  /home/bob/app/src/Exception/Exception.cpp",
  "file": "/home/bob/app/src/Exception/Exception.cpp"  

Проблема, кажется, в пробеле в предупреждениях.

Этот вопрос "решает" проблему, заключая каждое значение в собственное выражение, что кажется странным и ужасно непрактичным. Есть ли более простой способ передать строку с пробелами в выражении генератора?

Как уже упоминалось, я сам нашел приемлемое решение, но пока не буду отмечать его как принятый ответ, потому что я не уверен, это хорошее решение, а не хитрость, которая может укусить меня, если мне когда-либо понадобятся точки с запятой в самих параметрах.

2 ответа

Решение

"-Og -Wall" это строка, тогда как "-Og;-Wall" - это список (поскольку списки представляют собой строки, разделенные точкой с запятой).

Так set(my_list -Og -Wall)(без двойных кавычек) также создается список. Прочтите об этом здесь.

Проблема действительно в пространстве, и ее можно решить так:

 set(MY_DEBUG_WARNINGS "-Og;-Wall"
 )

заменяя все пробелы точкой с запятой. При этом команда компиляции становится:

 "/usr/bin/clang++ -I../src/Exception/include -g -Og -Wall 
 -fcolor-diagnostics -std=c++17 -o 
 src/Exception/CMakeFiles/exception.dir/Exception.cpp.o -c 
 /home/bob/app/src/Exception/Exception.cpp",

который действительно работает.

Я понятия не имею, создает ли это проблемы где-то еще, поэтому был бы очень признателен за комментарий от кого-то более осведомленного.

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