我有一个依赖于Boost库(和其他人)的项目。我创建了一个CMakeLists来自动下载和编译ExternalProject_Add
的依赖项。
我想支持多配置(发布和调试)。因此,对于我的其他库,我在CMakeLists的开头定义了CMAKE_BUILD_TYPE
。我使用-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
变量。
是否可以在我的CMakeLists中检测VS中选择的配置?
谢谢。
#-----------------------------------------------------------------------------
# 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 ""
)
答案 0 :(得分:2)
当运行CMake时,在使用多配置生成器(Visual Studio或Xcode)时,无法知道用户在构建时将选择的构建类型。在CMake完成配置和生成阶段之后(即在cmake
命令完成之后),用户做出该选择。用户也可以构建多个构建类型,因此没有使用这些构建器的单一构建类型的概念。
一个选项可能是定义一个自定义命令,它将相关的boost构建作为构建时任务而不是使用ExternalProject。这可能是您最想要达到的目标。您仍然可以在CMake运行期间的配置时下载源,这一技术以googletest为例提到here。该答案提供了一篇文章的链接,该文章更详细,以及github上可用的完全通用实现,可能适合您的情况。