У меня есть проект, который зависит от библиотеки Boost (и других). Я создал CMakeLists для автоматической загрузки и компиляции зависимостей с ExternalProject_Add
,
Я хочу поддерживать мультиконфигурацию (Release и Debug). Итак, для других моих библиотек я определил CMAKE_BUILD_TYPE
в начале моего CMakeLists. Я распространяю это по зависимости с -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
в ExternalProject_Add
команда.
Хорошо работает на Windows и Linux.
Для Boost, однако, на основе конфигурации мне нужно скомпилировать с variant=debug
или же variant=release
, Я создал if(${CMAKE_BUILD_TYPE) MATCHES Debug)
Заявление и установить вариант на основе этого требования.
Для Linux это работает хорошо, но в Windows это работает, только если я изменю CMAKE_BUILD_TYPE
переменная во время cmake
, Когда я пытаюсь изменить конфигурацию в VS, это не меняет CMAKE_BUILD_TYPE
переменная.
Можно ли обнаружить конфигурацию, выбранную в VS в моих CMakeLists?
Спасибо.
#-----------------------------------------------------------------------------
# Boost
#-----------------------------------------------------------------------------
message(STATUS "Installing Boost library.")
set(BOOST_BOOTSTRAP_COMMAND)
if(WIN32)
set(BOOST_BOOTSTRAP_COMMAND bootstrap.bat)
set(BOOST_B2_COMMAND b2.exe)
elseif(UNIX )
set(BOOST_BOOTSTRAP_COMMAND ./bootstrap.sh)
set(BOOST_B2_COMMAND ./b2)
else()
# MacOSX
set(BOOST_BOOTSTRAP_COMMAND ./bootstrap.sh)
set(BOOST_B2_COMMAND ./b2)
endif()
set(BOOST_BUILD_TYPE variant=release)
if (${CMAKE_BUILD_TYPE} MATCHES Debug)
set(BOOST_BUILD_TYPE variant=debug)
endif(${CMAKE_BUILD_TYPE} MATCHES Debug)
set(BOOST_INSTALL_DIR ${PROJECT_BINARY_DIR}/deps/boost-install)
ExternalProject_Add(boost
SOURCE_DIR "${PROJECT_BINARY_DIR}/deps/boost"BUILD_IN_SOURCE 1
GIT_REPOSITORY "${git_protocol}://github.com/boostorg/boost"GIT_TAG "5ec478a570bdc71c5d4854e7165a8b3f4fa82ad9"CONFIGURE_COMMAND ${BOOST_BOOTSTRAP_COMMAND}
BUILD_COMMAND ${BOOST_B2_COMMAND} headers COMMAND ${BOOST_B2_COMMAND} install
link=static
${BOOST_BUILD_TYPE}
--prefix=${BOOST_INSTALL_DIR}
--with-filesystem
--with-program_options
--with-system
--with-thread
-j8
INSTALL_COMMAND "")
Когда запускается CMake, невозможно узнать, какой тип сборки пользователь выберет во время сборки при использовании генератора с множеством конфигураций (Visual Studio или Xcode). Пользователь делает этот выбор после того, как CMake завершил этап конфигурирования и генерации (т.е. после cmake
команда завершена). Пользователь также может создавать более одного типа сборки, поэтому с этими генераторами нет концепции единого типа сборки.
Одним из вариантов может быть определение пользовательской команды, которая выполняет соответствующую сборку boost как задачу времени сборки, а не с использованием ExternalProject. Это, вероятно, самое близкое к тому, чего вы хотите достичь. Вы все еще можете загрузить исходный код во время настройки во время запуска CMake, методика, которая упоминается Вот с googletest в качестве примера. Этот ответ содержит ссылку на статью, которая более детально описана, а также полностью общую реализацию, доступную на github, которая потенциально подойдет для вашей ситуации.
Других решений пока нет …