2010-02-05 28 views
16

Tôi mới bắt đầu sử dụng CMake cho một số dự án cá nhân và trường học, và tôi đã bị bối rối bởi một vấn đề nhỏ.CXX_FLAGS có điều kiện sử dụng cmake dựa trên trình biên dịch?

Giả sử tôi đang cố gắng lấy một chương trình C++ biên dịch theo nhiều trình biên dịch (g ++, cl và bcc32 trong trường hợp này). Tôi có các thiết bị chuyển mạch dòng lệnh khác nhau cho mỗi trình biên dịch và những gì tôi đang cố gắng thực hiện là tạo thư mục gnu/ms/borland và tạo nội dung CMake trong đó (bằng cách nhập các thư mục và thực hiện cmake -DCMAKE_CXX_COMPILER=g++ .. trong gnu, ví dụ).

Trong CMakeLists.txt trên thư mục cấp cao nhất, tôi đã cố gắng làm điều gì đó dọc theo dòng:

if(CMAKE_CXX_COMPILER STREQUAL g++) 

    set(CMAKE_CXX_FLAGS "-Wextra -Wall -ansi -pedantic") 

Và như vậy với elsifs cho trình biên dịch khác, nhưng điều này dường như không hoạt động chính xác - nó giảm hoàn toàn CXXFLAGS. Dòng này hoạt động nếu tôi làm cho tệp hoàn toàn vô điều kiện (ví dụ, chỉ giả sử g ++ và sử dụng cờ g ++.).

Tôi đang làm gì sai ở đây hoặc có cách nào tốt hơn để xử lý loại sự cố này?

Trả lời

19

Có một loạt các pre-defined CMake variables tùy thuộc vào trình biên dịch bạn đang sử dụng:

if (MSVC) 
    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGSS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE") 
endif() 

if (BORLAND) 
    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE") 
endif() 

if (CMAKE_COMPILER_IS_GNUCXX) 
    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE") 
endif() 

Nếu bạn muốn tùy chọn trình biên dịch của bạn để ghi đè lên và tồn tại trong CMakeCache tạo:

if (CMAKE_COMPILER_IS_GNUCXX) 

    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE" 
     CACHE STRING "g++ Compiler Flags for All Builds" FORCE) 

    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE" 
     CACHE STRING "g++ Compiler Flags for Debug Builds" FORCE) 

    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE" 
     CACHE STRING "g++ Compiler Flags for Release Builds" FORCE) 

endif() 
+4

Lưu ý, ' CMAKE_COMPILER_IS_GNUCXX' chỉ dành cho g ++. OP yêu cầu C++, đúng, nhưng thật tốt khi biết rằng còn có 'CMAKE_COMPILER_IS_GNUCC' để tránh nhầm lẫn. – mloskot

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