1

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

我想支持多配置(发布和调试)。因此,对于我的其他库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_TYPEcmake. 当我尝试更改 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 ""
)
4

1 回答 1

2

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

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

于 2017-04-29T10:22:30.703 回答