Para aqueles que foram trazidos aqui de Como faço para dividir uma expressão do gerador CMake em várias linhas? Eu gostaria de adicionar algumas notas.
O método de continuação de linha não funcionará, o CMake não pode analisar uma lista de gerador feita com espaços em branco (indentação) e continuação de linha.
Embora a solução de string (CONCAT) forneça uma expressão geradora que pode ser avaliada, a expressão avaliada será cercada por aspas se o resultado contiver um espaço.
Para cada opção individual a ser adicionada, uma lista de gerador separada deve ser construída, portanto, as opções de empilhamento como fiz a seguir farão com que a compilação falhe:
string(CONCAT WARNING_OPTIONS "$<"
"$<OR:"
"$<CXX_COMPILER_ID:MSVC>,"
"$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>"
">:"
"/D_CRT_SECURE_NO_WARNINGS "
">$<"
"$<AND:"
"$<CXX_COMPILER_ID:Clang,GNU>,"
"$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
">:"
"-Wall -Werror "
">$<"
"$<CXX_COMPILER_ID:GNU>:"
"-Wno-multichar -Wno-sign-compare "
">")
add_compile_options(${WARNING_OPTIONS})
Isso ocorre porque as opções resultantes são passadas para o compilador entre aspas
/usr/lib64/ccache/c++ -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgtest_EXPORTS -I../ThirdParty/googletest/googletest/include -I../ThirdParty/googletest/googletest -std=c++11 -fno-rtti -fno-exceptions -fPIC -std=c++11 -fno-rtti -fno-exceptions -Wall -Wshadow -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers "-Wall -Werror -Wno-multichar -Wno-sign-compare " -fdiagnostics-color -MD -MT ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o -MF ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o.d -o ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o -c ../ThirdParty/googletest/googletest/src/gtest-all.cc
c++: error: unrecognized command line option ‘-Wall -Werror -Wno-multichar -Wno-sign-compare ’
Para avaliar expressões geradoras extensas representadas usando a solução de string (CONCAT), cada expressão geradora deve ser avaliada em uma única opção sem espaços:
string(CONCAT WALL "$<"
"$<AND:"
"$<CXX_COMPILER_ID:Clang,GNU>,"
"$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
">:"
"-Wall"
">")
string(CONCAT WERROR "$<"
"$<AND:"
"$<CXX_COMPILER_ID:Clang,GNU>,"
"$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
">:"
"-Werror"
">")
message(STATUS "Warning Options: " ${WALL} ${WERROR})
add_compile_options(${WALL} ${WERROR})
Isso pode não estar relacionado à pergunta para a qual estou postando uma resposta; infelizmente, a pergunta que estou respondendo está marcada incorretamente como uma duplicata desta pergunta.
As listas de geradores não são tratadas e analisadas da mesma forma que as strings e, por isso, há medidas adicionais que devem ser tomadas para dividir uma lista de geradores em várias linhas.