Я хочу написать файл cmake, который устанавливает разные параметры компилятора для clang++, g++ и MSVC в отладочных и релизных сборках. То, что я сейчас делаю, выглядит примерно так:
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /W4")
# Default debug flags are OK
set(CMAKE_CXX_FLAGS_RELEASE "{CMAKE_CXX_FLAGS_RELEASE} /O2")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall -Wextra -Werror")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} some other flags")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
else()
# nothing special for gcc at the moment
endif()
endif()
Но у меня есть пара проблем с этим:
- Сначала тривиальным: не существует ли команды вроде appen, которая позволила бы мне заменить
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} Foo")
наappend(CMAKE_CXX_FLAGS "Foo")
? - Я читал несколько раз, что не следует вручную устанавливать
CMAKE_CXX_FLAGS
и подобные переменные в первую очередь, но я не уверен, какой другой механизм использовать. - Самое главное: способ, которым я это делаю здесь, мне нужен отдельный каталог сборки для каждого компилятора и конфигурации. В идеале я хотел бы преобразовать это в несколько целей в одном каталоге, чтобы я мог, например. вызов
make foo_debug_clang
.
Итак, мои вопросы
- a) Есть ли лучший способ написать cmake script, который решает мои "болевые точки"? решение проблем, упомянутых выше?
- b) Есть ли что-то вроде принятой, современной передовой практики создания таких проектов?
Большинство ссылок, которые я мог найти в Интернете, либо устарели, либо показывают только тривиальные примеры. В настоящее время я использую cmake3.8, но если это имеет значение, меня больше интересует ответ для более поздних версий.