使用CMake通过多配置编译Boost

时间:2017-04-29 07:26:01

标签: c++ visual-studio boost cmake multi-configuration

我有一个依赖于Boost库(和其他人)的项目。我创建了一个CMakeLists来自动下载和编译ExternalProject_Add的依赖项。

我想支持多配置(发布和调试)。因此,对于我的其他库,我在CMakeLists的开头定义了CMAKE_BUILD_TYPE。我使用-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}命令中的ExternalProject_Add依赖传播它。

在Windows和Linux上运行良好。

然而,对于Boost,我需要使用variant=debugvariant=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 ""
)

1 个答案:

答案 0 :(得分:2)

当运行CMake时,在使用多配置生成器(Visual Studio或Xcode)时,无法知道用户在构建时将选择的构建类型。在CMake完成配置和生成阶段之后(即在cmake命令完成之后),用户做出该选择。用户也可以构建多个构建类型,因此没有使用这些构建器的单一构建类型的概念。

一个选项可能是定义一个自定义命令,它将相关的boost构建作为构建时任务而不是使用ExternalProject。这可能是您最想要达到的目标。您仍然可以在CMake运行期间的配置时下载源,这一技术以googletest为例提到here。该答案提供了一篇文章的链接,该文章更详细,以及github上可用的完全通用实现,可能适合您的情况。