Я только что начал использовать 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 ++ флаги.).
Что я делаю неправильно здесь или являюсь там лучшим способом обработать этот вид проблемы?
Существует набор предопределенных переменных 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 ()