Існує два типи генераторів: одноконфігураційні та багатоконфігураційні.
Поодинокі конфігурації
Генератори , подібні до макетів : Unix Makefiles , NMake Makefiles , MinGW Makefiles , ...
Ви встановлюєте тип конфігурації на етапі генерації:
cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"
У цьому випадку кроком збірки завжди є налагодження :
> cmake --build _builds/Debug
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Debug # `--config` ignored
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Release # yep, ignored
/usr/bin/c++ -g ...
Багатоконфігурація
Генератори IDE: Visual Studio , Xcode
CMAKE_BUILD_TYPE
на кроці генерування ігнорується:
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Debug "-GVisual Studio 12 2013 Win64"
і
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Release "-GVisual Studio 12 2013 Win64"
матиме той самий ефект:
Це відбувається тому , що всі зміни є внутрішнім (тобто, _builds/msvc-opaque/Release
і _builds/msvc-opaque/Debug
чи що - то, не має значення). Ви можете використовувати --config
параметри для перемикання:
> cmake --build _builds --config Release
cl /O2 ...
> cmake --build _builds --config Debug
cl /Od ...
Контроль (?)
Так, ти можеш. Просто визначте CMAKE_CONFIGURATION_TYPES :
# Somewhere in CMakeLists.txt
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")
Вихід за замовчуванням:
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo
-- Configuring done
Перепишіть:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;Release" "-GVisual Studio 12 2013 Win64"
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release
-- Configuring done
Ви навіть можете визначити власний тип конфігурації:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;MyRelease" -DCMAKE_CXX_FLAGS_MYRELEASE="/My-Rel-flag" -DCMAKE_EXE_LINKER_FLAGS_MYRELEASE="/My-Linker-flags" "-GVisual Studio 12 2013 Win64"
І побудуйте:
cmake --build _builds --config MyRelease
Брудний (?)
Зовсім не, якщо ви знаєте фокус :) Ось як побудувати / протестувати конфігурацію в сценарії / CI-сервері / інструкції зі збірки документації тощо:
> CONFIG=Debug
> cmake -H. -B_builds "-DCMAKE_BUILD_TYPE=${CONFIG}" # Set Debug to Makefile, ignored by IDE
> cmake --build _builds --config "${CONFIG}" # Build Debug in IDE, ignored by Makefile
> (cd _builds && ctest -VV -C "${CONFIG}") # Test Debug in IDE, ignored by Makefile
Поганий візерунок
if(CMAKE_BUILD_TYPE STREQUAL Debug) # Burn it with fire!!!
set(CMAKE_BUILD_TYPE MySuperRelease) # Be ready to catch a bug from IDE user...
Хороший
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --my-debug-flags")
Працює приємно.
target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>")
Дякую! :) Ви економите день для одного програміста.
У мене працює з Makefile, я щасливий ...
Деякі цитати з приємної книги симпатичного хлопця, якого ви, напевно, знаєте (наголос на моєму):
Чому ти повинен турбуватись? Люди, які програмують на різноманітних системах або використовують різні компілятори, дуже піклуються, бо якщо цього не роблять, вони змушені витрачати час на пошук та виправлення незрозумілих помилок. Люди, які стверджують, що їм не байдужа портативність, зазвичай роблять це, оскільки вони використовують лише одну систему і відчувають, що можуть дозволити собі ставлення, що `` мова застосовується моїм компілятором ''. Це вузька і недалекогляднавид. Якщо ваша програма має успіх, вона, швидше за все, буде перенесена, тому комусь доведеться знаходити та виправляти проблеми, пов’язані із функціями, що залежать від реалізації. Крім того, програми часто потрібно компілювати з іншими компіляторами для тієї самої системи, і навіть у майбутньому випуску вашого улюбленого компілятора деякі дії можуть відрізнятися від поточного. Значно легше дізнатися та обмежити вплив залежностей реалізації, коли програма написана, ніж намагатися розплутати безлад потім.