2010-02-05 4 views
16

Я только начал использовать CMake для некоторых личных и школьных проектов, и я был в шоке от незначительной проблемы.Условный CXX_FLAGS с использованием cmake на основе компилятора?

Предположим, я пытаюсь выполнить компиляцию на C++ в нескольких компиляторах (g ++, cl и bcc32 в этом случае). У меня есть разные ключи командной строки для каждого компилятора, и то, что я пытался сделать, это в основном создать каталог gnu/ms/borland и создать там материал CMake (введя каталоги и сделав cmake -DCMAKE_CXX_COMPILER=g++ .. в gnu, каталог, например).

В CMakeLists.txt на каталог верхнего уровня, я пытался делать что-то вдоль линий:

if(CMAKE_CXX_COMPILER STREQUAL g++) 

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

И так далее с elsifs для других компиляторов, но это, кажется, не правильно работает - он полностью опускает CXXFLAGS. Строка работает, если я делаю файл совершенно безусловным (т. Е. Просто предположим g ++ и используем флагов g ++).

Что я здесь делаю неправильно, или есть лучший способ справиться с такой проблемой?

ответ

19

Есть куча pre-defined CMake variables в зависимости от компилятора, который вы используете:

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

Если вы хотите, чтобы ваши опции компилятора, чтобы переопределить и сохраняются в сгенерированной CMakeCache:

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

Примечание ' CMAKE_COMPILER_IS_GNUCXX' предназначен только для g ++. OP запрашивает C++, правильно, но хорошо знать, что существует также 'CMAKE_COMPILER_IS_GNUCC', чтобы избежать путаницы. – mloskot