Đối với những người được đưa đến đây từ Làm cách nào để chia biểu thức trình tạo CMake thành nhiều dòng? Tôi muốn thêm một số lưu ý.
Phương pháp tiếp tục dòng sẽ không hoạt động, CMake không thể phân tích cú pháp danh sách trình tạo được tạo bằng khoảng trắng (thụt đầu dòng) và tiếp tục dòng.
Trong khi giải pháp chuỗi (CONCAT) sẽ cung cấp một biểu thức trình tạo có thể được đánh giá, biểu thức được đánh giá sẽ được bao quanh bởi dấu ngoặc kép nếu kết quả chứa khoảng trắng.
Đối với mỗi tùy chọn riêng lẻ được thêm vào một danh sách trình tạo riêng biệt phải được xây dựng, vì vậy các tùy chọn xếp chồng như tôi đã thực hiện trong phần sau sẽ gây ra lỗi xây dựng:
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})
Điều này là do các tùy chọn kết quả được chuyển đến trình biên dịch trong dấu ngoặc kép
/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 ’
Để đánh giá các biểu thức trình tạo độ dài được biểu diễn bằng giải pháp chuỗi (CONCAT), mỗi biểu thức trình tạo phải đánh giá một tùy chọn duy nhất không có khoảng trắng:
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})
Điều này có thể không liên quan đến câu hỏi tôi đang đăng câu trả lời, rất tiếc là câu hỏi tôi đang trả lời bị đánh dấu sai là bản sao của câu hỏi này.
Danh sách trình tạo không được xử lý và phân tích cú pháp giống như các chuỗi, và do đó, có những biện pháp bổ sung mà người ta phải thực hiện để tách danh sách trình tạo thành nhiều dòng.