Условно CXX_FLAGS с использованием cmake на основе компилятора? - PullRequest
18 голосов
/ 06 февраля 2010

Я только начал использовать 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 ++.).

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

1 Ответ

22 голосов
/ 06 февраля 2010

Существует куча предопределенных переменных CMake в зависимости от используемого компилятора:

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 ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...