Para aquellos que fueron traídos aquí desde ¿Cómo divido una expresión generadora de CMake en varias líneas? Me gustaría agregar algunas notas.
El método de continuación de línea no funcionará, CMake no puede analizar una lista generadora hecha con espacios en blanco (sangría) y continuación de línea.
Si bien la solución de cadena (CONCAT) proporcionará una expresión generadora que se puede evaluar, la expresión evaluada estará rodeada de comillas si el resultado contiene un espacio.
Para que se agregue cada opción individual, se debe construir una lista de generador separada, por lo que las opciones de apilamiento como lo he hecho a continuación harán que la compilación falle:
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})
Esto se debe a que las opciones resultantes se pasan al compilador entre comillas.
/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 evaluar expresiones generadoras largas representadas mediante la solución de cadena (CONCAT), cada expresión generadora debe evaluar una sola opción sin espacios:
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})
Esto puede no estar relacionado con la pregunta a la que estoy publicando una respuesta; desafortunadamente, la pregunta que estoy respondiendo está marcada incorrectamente como un duplicado de esta pregunta.
Las listas de generadores no se manejan ni analizan de la misma manera que las cadenas, y debido a esto, hay medidas adicionales que se deben tomar para dividir una lista de generadores en varias líneas.