This blog post có một số thông tin hữu ích và this post mô tả một số mẫu chống phổ biến.
Bốn loại xây dựng mà CMake bao gồm ngoài hộp là Release
, Debug
, RelWithDebInfo
và MinSizeRel
. Tương ứng, CMake giao các giá trị mặc định cho từng loại xây dựng được xác định trong CMAKE_C_FLAGS_<buildType>
và CMAKE_CXX_FLAGS_<buildType>
.
Nếu bạn muốn tìm hiểu những gì các giá trị mặc định là dành cho từng loại xây dựng, bạn có thể thêm những điều khoản sau đây để CMakeLists.txt
của bạn:
message("CMAKE_C_FLAGS_DEBUG is ${CMAKE_C_FLAGS_DEBUG}")
message("CMAKE_C_FLAGS_RELEASE is ${CMAKE_C_FLAGS_RELEASE}")
message("CMAKE_C_FLAGS_RELWITHDEBINFO is ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
message("CMAKE_C_FLAGS_MINSIZEREL is ${CMAKE_C_FLAGS_MINSIZEREL}")
message("CMAKE_CXX_FLAGS_DEBUG is ${CMAKE_CXX_FLAGS_DEBUG}")
message("CMAKE_CXX_FLAGS_RELEASE is ${CMAKE_CXX_FLAGS_RELEASE}")
message("CMAKE_CXX_FLAGS_RELWITHDEBINFO is ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message("CMAKE_CXX_FLAGS_MINSIZEREL is ${CMAKE_CXX_FLAGS_MINSIZEREL}")
Trên phiên bản của tôi về phiên bản cmake
(cmake 2.8.12.1 trên OS X), điều này sẽ in các giá trị sau:.
CMAKE_C_FLAGS_DEBUG is -g
CMAKE_C_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_C_FLAGS_MINSIZEREL is -Os -DNDEBUG
CMAKE_CXX_FLAGS_DEBUG is -g
CMAKE_CXX_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_CXX_FLAGS_MINSIZEREL is -Os -DNDEBUG
(như bạn có thể thấy, các bộ cờ là như nhau cho C và C++ theo mặc định)
Hãy thận trọng, vì loại bản dựng mặc định là một chuỗi trống . Vì vậy, trừ khi bạn chỉ định loại xây dựng, không có loại nào ở trên được áp dụng. Trên cmake mailing list, đoạn mã sau đã được đề xuất (nên được đặt gần đầu của một top-level CMakeLists.txt
, tôi tưởng tượng) cho những người không mong muốn hành vi này:
if (NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release")
endif()
Tuy nhiên, đây là not recommended, bởi vì nó sẽ phá vỡ một số trình tạo cấu hình mutli. (Tốt hơn để cài đặt nó bên trong một xây dựng kịch bản.)
(Một trong những bài đăng trên blog trên chủ trương sử dụng một bí danh vỏ thiết -DCMAKE_BUILD_TYPE=Debug
khi cmake
là lần đầu tiên gọi để thay thế.)
Tất cả các bài viết mà bạn đã đề cập và chính câu trả lời của bạn (phần 'if (NOT CMAKE_BUILD_TYPE)' sẽ không hoạt động đối với các trình tạo đa cấu hình. Xem [answer] của tôi (http://stackoverflow.com/a/24470998/2288008) –
Bài đăng này (http://ecrafter.wordpress.com/2012/04/24/cmake-tutorial-part-2/) giữ một số mẫu chống chính nó, như xây dựng trong nguồn ('cmake .'), thiết lập cờ biên dịch bằng lệnh add_definitions (' add_definitions (-Wall -std = C++ 0x) ') và viết lại cờ do người dùng định nghĩa (set (CMAKE_CXX_FLAGS "-std = C++ 0x -Wall")) –
@ruslo, cảm ơn. Tôi sẽ chỉnh sửa câu trả lời của mình để làm rõ rằng việc kiểm tra xem kiểu xây dựng có được xác định không phải là giải pháp di động hay không. (Tôi liên kết với các bài viết để cung cấp tín dụng, vì một phần của câu trả lời được sao chép/dán và sau đó mở rộng theo.) – mpontillo