Für diejenigen, die hierher gebracht wurden von Wie teile ich einen CMake-Generatorausdruck in mehrere Zeilen auf? Ich möchte einige Notizen hinzufügen.
Die Zeilenfortsetzungsmethode funktioniert nicht. CMake kann keine Generatorliste analysieren, die mit Leerzeichen (Einrückung) und Zeilenfortsetzung erstellt wurde.
Während die String-Lösung (CONCAT) einen Generatorausdruck bereitstellt, der ausgewertet werden kann, wird der ausgewertete Ausdruck von Anführungszeichen umgeben, wenn das Ergebnis ein Leerzeichen enthält.
Für jede einzelne Option, die hinzugefügt werden soll, muss eine separate Generatorliste erstellt werden. Wenn also Stapeloptionen wie im Folgenden ausgeführt werden, schlägt der Build fehl:
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})
Dies liegt daran, dass die resultierenden Optionen in Anführungszeichen an den Compiler übergeben werden
/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 ’
Um lange Generatorausdrücke auszuwerten, die mit der String (CONCAT) -Lösung dargestellt werden, muss jeder Generatorausdruck eine einzelne Option ohne Leerzeichen ergeben:
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})
Dies hängt möglicherweise nicht mit der Frage zusammen, auf die ich eine Antwort poste. Leider ist die Frage, die ich beantworte, fälschlicherweise als Duplikat dieser Frage markiert.
Generatorlisten werden nicht wie Zeichenfolgen behandelt und analysiert. Aus diesem Grund müssen zusätzliche Maßnahmen ergriffen werden, um eine Generatorliste auf mehrere Zeilen aufzuteilen.