Per coloro che sono stati portati qui da Come divido un'espressione del generatore CMake su più righe? Vorrei aggiungere alcune note.
Il metodo di continuazione della riga non funzionerà, CMake non può analizzare un elenco di generatori creato con spazi bianchi (rientro) e continuazione di riga.
Mentre la soluzione stringa (CONCAT) fornirà un'espressione generatore che può essere valutata, l'espressione valutata sarà racchiusa tra virgolette se il risultato contiene uno spazio.
Per ogni singola opzione da aggiungere deve essere creato un elenco di generatori separato, quindi le opzioni di impilamento come ho fatto di seguito causeranno il fallimento della compilazione:
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})
Questo perché le opzioni risultanti vengono passate al compilatore tra virgolette
/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 ’
Per valutare lunghe espressioni del generatore rappresentate utilizzando la soluzione stringa (CONCAT), ciascuna espressione del generatore deve valutare una singola opzione senza spazi:
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})
Ciò potrebbe non essere correlato alla domanda a cui sto inviando una risposta, purtroppo la domanda a cui sto rispondendo è erroneamente contrassegnata come un duplicato di questa domanda.
Gli elenchi di generatori non vengono gestiti e analizzati allo stesso modo delle stringhe e, per questo motivo, sono necessarie misure aggiuntive per dividere un elenco di generatori su più righe.