Для тих, кого сюди привезли звідки я розділити вираз генератора CMake на кілька рядків? Я хотів би додати кілька приміток.
Метод продовження рядка не буде працювати, CMake не може проаналізувати список генераторів, створений з пробілами (відступи) та продовженням рядка.
У той час як рядкове (CONCAT) рішення забезпечить генераторне вираження, яке можна оцінити, оцінене вираження буде оточене лапки, якщо результат містить пробіл.
Для кожного окремого варіанту, який потрібно додати, повинен бути побудований окремий список генераторів, тому параметри стекування, як я робив у наступному, спричинять збій збій:
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})
Це тому, що отримані параметри передаються компілятору в лапки
/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 ’
Для оцінки тривалих виразів генератора, представлених за допомогою рядкового (CONCAT) рішення, кожен вираз генератора повинен оцінювати до одного варіанту без пробілів:
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})
Це може бути не пов'язане з питанням, на яке я публікую відповідь, на жаль, питання, на яке я відповідаю, неправильно позначено як дублікат цього питання.
Списки генераторів не обробляються та розбираються так само, як і рядки, і через це необхідно вжити додаткових заходів, щоб розділити список генераторів на кілька рядків.