Pour ceux qui ont été amenés ici de Comment diviser une expression de générateur CMake en plusieurs lignes? Je voudrais ajouter quelques notes.
La méthode de continuation de ligne ne fonctionnera pas, CMake ne peut pas analyser une liste de générateurs faite avec des espaces (indentation) et une continuation de ligne.
Alors que la solution de chaîne (CONCAT) fournira une expression de générateur qui peut être évaluée, l'expression évaluée sera entourée de guillemets si le résultat contient un espace.
Pour chaque option individuelle à ajouter, une liste de générateurs distincte doit être construite, donc les options d'empilement comme je l'ai fait dans ce qui suit entraînera l'échec de la construction:
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})
C'est parce que les options résultantes sont passées au compilateur entre guillemets
/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 ’
Pour évaluer de longues expressions de générateur représentées à l'aide de la solution de chaîne (CONCAT), chaque expression de générateur doit s'évaluer en une seule option sans espaces:
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})
Cela n'a peut-être aucun rapport avec la question à laquelle je poste une réponse, malheureusement, la question à laquelle je réponds est à tort marquée comme un double de cette question.
Les listes de générateurs ne sont pas gérées et analysées de la même manière que les chaînes, et pour cette raison, il existe des mesures supplémentaires à prendre pour diviser une liste de générateurs sur plusieurs lignes.