Подтвердить что ты не робот

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

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

Скажем, я пытаюсь собрать компиляцию на С++ под несколькими компиляторами (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++.).

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

4b9b3361

Ответ 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 ()