Условный CXX_FLAGS с помощью cmake на основе компилятора?

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

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

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

if(CMAKE_CXX_COMPILER STREQUAL g++)

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

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

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

18
задан mloskot 6 February 2010 в 01:43
поделиться

1 ответ

Существует набор предопределенных переменных 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 ()
22
ответ дан 30 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: