Bagi mereka yang dibawa ke sini dari Bagaimana cara membagi ekspresi generator CMake menjadi beberapa baris? Saya ingin menambahkan beberapa catatan.
Metode kelanjutan baris tidak akan berfungsi, CMake tidak dapat mengurai daftar generator yang dibuat dengan spasi (indentasi) dan kelanjutan baris.
Sementara solusi string (CONCAT) akan memberikan ekspresi generator yang dapat dievaluasi, ekspresi yang dievaluasi akan diapit oleh tanda kutip jika hasilnya berisi spasi.
Untuk setiap opsi individu yang akan ditambahkan, daftar generator terpisah harus dibuat, jadi opsi susun seperti yang telah saya lakukan berikut ini akan menyebabkan build gagal:
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})
Ini karena opsi yang dihasilkan diteruskan ke kompiler dalam tanda kutip
/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 ’
Untuk mengevaluasi ekspresi generator yang panjang yang direpresentasikan menggunakan solusi string (CONCAT), setiap ekspresi generator harus mengevaluasi ke satu opsi tanpa spasi:
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})
Ini mungkin tidak terkait dengan pertanyaan yang saya posting jawabannya, sayangnya pertanyaan yang saya jawab salah ditandai sebagai duplikat dari pertanyaan ini.
Daftar generator tidak ditangani dan diurai dengan cara yang sama seperti string, dan karena itu, ada tindakan tambahan yang harus diambil untuk memisahkan daftar generator menjadi beberapa baris.