Dla tych, którzy zostali przywiezieni z Jak podzielić wyrażenie generatora CMake na wiele wierszy? Chciałbym dodać kilka uwag.
Metoda kontynuacji linii nie zadziała, CMake nie może przeanalizować listy generatorów utworzonej z użyciem białych znaków (wcięć) i kontynuacji linii.
Chociaż rozwiązanie typu string (CONCAT) zapewni wyrażenie generatora, które można ocenić, oszacowane wyrażenie zostanie otoczone cudzysłowami, jeśli wynik zawiera spację.
Dla każdej opcji, która ma zostać dodana, należy utworzyć oddzielną listę generatorów, więc opcje układania w stos, takie jak poniżej, spowodują niepowodzenie kompilacji:
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})
Dzieje się tak, ponieważ wynikowe opcje są przekazywane do kompilatora w cudzysłowach
/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 ’
Aby obliczyć długie wyrażenia generatora reprezentowane za pomocą rozwiązania typu string (CONCAT), każde wyrażenie generatora musi wyliczać na pojedynczą opcję bez spacji:
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})
Może to nie mieć związku z pytaniem, na które piszę odpowiedź, niestety pytanie, na które odpowiadam, jest błędnie oznaczone jako duplikat tego pytania.
Listy generatorów nie są obsługiwane i przetwarzane w taki sam sposób jak łańcuchy, dlatego też istnieją dodatkowe środki, które należy podjąć, aby podzielić listę generatorów na wiele wierszy.