CMakeジェネレーター式を複数の行に分割するにはどうすればよいですか?いくつかメモを追加したいと思います。
行継続メソッドは機能しません。CMakeは、空白(インデント)と行継続で作成されたジェネレーターリストを解析できません。
string(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 ’
string(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})
これは、私が回答を投稿している質問とは無関係である可能性があります。残念ながら、私が回答している質問は、この質問の複製として誤ってマークされています。
ジェネレーターリストは、文字列と同じように処理および解析されません。そのため、ジェネレーターリストを複数の行に分割するために必要な追加の対策があります。