Конфигурация отладки / выпуска CMake visual studio - PullRequest
5 голосов
/ 01 декабря 2011

Я настраиваю свой проект Visual Studio для использования CMake, но у меня есть две проблемы, которые я пока не могу решить.

1 Как мне задать определение препроцессора для Release и еще одно дляDebug?

2 У меня есть проект с opengl и directx, поэтому для DebugOpenGL и ReleaseOpenGL я хочу исключить все файлы directx cpp / h из buld.С помощью DebugDirectX и ReleaseDirectx исключите файлы opengl.Как мне это настроить?

РЕДАКТИРОВАТЬ:

Вот что я получил за 1. до сих пор:

cmake_minimum_required(VERSION 2.8)

project(TEngine)

if(CMAKE_CONFIGURATION_TYPES AND MSVC)
#DebugOpenGL flags
set(CMAKE_CXX_FLAGS_DEBUGOPENGL "/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_DEBUGOPENGL "/D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_DEBUGOPENGL "/debug /INCREMENTAL" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_DEBUGOPENGL "/debug /INCREMENTAL" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

#ReleaseOpenGL flags
set(CMAKE_CXX_FLAGS_RELEASEOPENGL "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_RELEASEOPENGL "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_RELEASEOPENGL "/INCREMENTAL:NO" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_RELEASEOPENGL "/INCREMENTAL:NO" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

#DebugDirectX flags
set(CMAKE_CXX_FLAGS_DEBUGDIRECTX "/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_DEBUGDIRECTX "/D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_DEBUGDIRECTX "/debug /INCREMENTAL" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_DEBUGDIRECTX "/debug /INCREMENTAL" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

#ReleaseDirectx flags
set(CMAKE_CXX_FLAGS_RELEASEDIRECTX "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_RELEASEDIRECTX "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_RELEASEDIRECTX "/INCREMENTAL:NO" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_RELEASEDIRECTX "/INCREMENTAL:NO" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

set(CMAKE_CONFIGURATION_TYPES "DebugOpenGL;ReleaseOpenGL;DebugDirectX;ReleaseDirectX")
set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
"Reset the configurations to what we need"
FORCE)

if(CMAKE_BUILD_TYPE STREQUAL "DebugOpenGL")
    add_definitions(/DTE_USE_OPENGL)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "ReleaseOpenGL")
    add_definitions(/DTE_USE_OPENGL)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "DebugDirectX")
    add_definitions(/DTE_USE_OPENGL)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "ReleaseDirectX")
    add_definitions(/DTE_USE_OPENGL)
endif()
endif()

set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
set(BOOST_ROOT "${TEngine_SOURCE_DIR}/Externals/boost_1_47_0")

if(WIN32)
    add_definitions(-DTEWINDOWS)
elseif(LINUX)
    add_definitions(-DTELINUX -DTE_USE_OPENGL)
endif()

subdirs(TEEngineTest TECore TEGraphics TEPhysics TEngine)

Ответы [ 3 ]

14 голосов
/ 21 августа 2015
  1. Как установить определение препроцессора для 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().

  1. У меня есть проект с 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 не будет пытаться создать их напрямую.

7 голосов
/ 22 июля 2014
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  add_definitions(/DYOURDEFINITION)
endif()

не будет работать в контексте мультиконфигурации решения MSVS.Для этого вам нужно

set(MY_DEFINITION 
    $<$<CONFIG:Debug>:definition_for_debug>
    $<$<CONFIG:RelWithDebInfo>:definition_for_rel_with_debug>
    $<$<CONFIG:Release>:definition_for_release> 
    $<$<CONFIG:MinSizeRel>:definition_for_tight_release>
    )
0 голосов
/ 01 декабря 2011

1:

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  add_definitions(/DYOURDEFINITION)
endif()

2: Если я вас правильно понял, вам нужно создать переменную параметра

option(USE_OPENGL "Use OpenGL or DirectX")

, а затем проверить ее при добавлении новой цели:

if(USE_OPENGL)
add_subdirectory(OpenGL)
else()
add_subdirectory(DirectX)
endif()

Конечно, вы должны создать CMakeLists.txt в OpenGL / и DirectX / dirs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...