- Как установить определение препроцессора для Release и другое для Debug?
Правильный способ сделать это - установить свойство COMPILE_DEFINITIONS в правильной области, используя выражения генератора.
Если вы хотите добавить определения ко всем целям, как add_definitions()
, используйте:
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
$<$<CONFIG:DebugOpenGL>:_DEBUG>
$<$<CONFIG:ReleaseOpenGL>:NDEBUG>
$<$<CONFIG:DebugDirectX>:_DEBUG>
$<$<CONFIG:ReleaseDirectX>:NDEBUG>
)
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
$<$<CONFIG:DebugOpenGL>:TE_USE_OPENGL>
$<$<CONFIG:ReleaseOpenGL>:TE_USE_OPENGL>
$<$<CONFIG:DebugDirectX>:TE_USE_DIRECTX>
$<$<CONFIG:ReleaseDirectX>:TE_USE_DIRECTX>
)
Вы также можете установить COMPILE_DEFINITIONS только для target или определенного исходного файла . См set_property
.
Чтобы установить другие флаги компиляции, вы можете установить свойство COMPILE_OPTIONS
для каталога, целевого файла или исходного файла, как описано выше. Однако вы также можете использовать команду add_compile_options()
, поскольку в отличие от add_definitions()
она поддерживает выражения генератора. Вы также можете установить COMPILE_OPTIONS
для целей или использовать target_compile_options()
. Для исходных файлов, начиная с CMake 3.3, вам все равно нужно установить свойство COMPILE_FLAGS
.
set(MY_DEBUG_OPTIONS /MDd /Zi /Ob0 /Od /RTC1)
set(MY_RELEASE_OPTIONS /MD /Ob2 /O2)
add_compile_options(
"$<$<CONFIG:DebugOpenGL>:${MY_DEBUG_OPTIONS}>"
"$<$<CONFIG:ReleaseOpenGL>:${MY_RELEASE_OPTIONS}>"
"$<$<CONFIG:DebugDirectX>:${MY_DEBUG_OPTIONS}>"
"$<$<CONFIG:ReleaseDirectX>:${MY_RELEASE_OPTIONS}>"
)
Обратите внимание, что для размещения списков параметров внутри этих выражений-генераторов требуются кавычки в add_compile_options()
.
- У меня есть проект с opengl и directx, поэтому для DebugOpenGL и ReleaseOpenGL я хочу исключить все файлы directx cpp / h из бульда. С помощью DebugDirectX и ReleaseDirectx исключите файлы opengl. Как мне это настроить?
Это может быть проблемой. Хотя можно использовать выражения генератора для условного добавления исходных файлов к цели, я не знаю ни одной IDE, поддерживающей исходные файлы для каждой конфигурации. Visual Studio и генератор CMake Visual Studio не поддерживают его. Xcode и генератор Xcode также не поддерживают это. Поэтому, если вы хотите собрать с помощью Visual Studio или другой IDE, вы не можете этого сделать.
Генераторы, которые используют одну конфигурацию за раз, например генераторы makefile или ninja, должны прекрасно это поддерживать.
Вместо того, чтобы исходные файлы различались между конфигурациями, есть несколько других опций. Вот пара.
У вас может быть несколько целей, и источник может отличаться между ними:
set(OPENGL_SOURCES src/opengl/func1.cpp src/opengl/func2.cpp)
set(DIRECTX_SOURCES src/opengl/func1.cpp src/opengl/func2.cpp)
add_executable(opengl_foo ${COMMON_SOURCES} ${OPENGL_SOURCES})
add_executable(directx_foo ${COMMON_SOURCES} ${DIRECTX_SOURCES})
Обратите внимание, что это означает, что вы можете вернуться к настройкам Debug и Release, которые также упростят остальную часть вашей конфигурации.
Кроме того, вы можете сохранить свои отдельные конфигурации OpenGL и DirectX, используя некоторую косвенность в вашем исходном коде. Иметь некоторые «фиктивные» файлы cpp и заголовочные файлы, которые переключаются между #include
файлами opengl или файлами directx на основе определения препроцессора:
// src/func1.h
#ifdef TE_USE_OPENGL
# include "opengl/func1.h.inc"
#elif defined(TC_USE_DIRECTX)
# include "directx/func1.h.inc"
#endif
// src/func1.cpp
#ifdef TE_USE_OPENGL
# include "opengl/func1.cpp.inc"
#elif defined(TC_USE_DIRECTX)
# include "directx/func1.cpp.inc"
#endif
А затем просто сослаться на эти фиктивные файлы в CMake:
add_executable(foo src/func1.h src/func1.cpp)
Теперь создание разных конфигов приведет к потере другого кода. Кроме того, если вы переименуете файлы в конец .inc
, вы даже можете ссылаться на них в add_executable()
, чтобы они отображались в VS, но VS не будет пытаться создать их напрямую.