Выражения 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",
который действительно работает.
Я понятия не имею, создает ли это проблемы где-то еще, поэтому был бы очень признателен за комментарий от кого-то более осведомленного.