2014-07-15 40 views
6

Tôi đang cố gắng định cấu hình hệ thống xây dựng của mình để bản phát hành bản phát hành của tôi không có thêm gỡ lỗi. Nhưng tôi không thể tìm thấy bất cứ nơi nào trong tài liệu CMake liệt kê những cờ biên dịch được sử dụng theo mặc định cho mỗi loại xây dựng, và tôi không muốn phát minh ra cách làm việc của riêng mình.Sử dụng cmake, làm cách nào để xác định cờ trình biên dịch mặc định cho mỗi loại xây dựng?

Chức năng này đã tồn tại chưa? Không dùng đến thử và sai, làm thế nào tôi có thể xác định cờ nào được sử dụng theo mặc định cho các kiểu xây dựng khác nhau?

Trả lời

10

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, RelWithDebInfoMinSizeRel. 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>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ế.)

+1

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) –

+1

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")) –

+0

@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

Các vấn đề liên quan