如何在主项目配置期间配置ExternalProject?

时间:2016-06-15 20:43:45

标签: cmake external-project

CMake ExternalProject允许定义如何下载,配置,构建和安装外部项目。所有步骤都将在构建时执行。

我想在主项目配置期间执行外部项目的配置步骤。完成外部项目配置后,可以使用导入目标的描述,因此可以使用find_package()函数加载外部项目。

是否可以在配置时构建一些目标?

4 个答案:

答案 0 :(得分:7)

ExternalProject 只是一系列要执行的步骤。因此,您可以使用两个实例

  1. 在主项目的配置阶段中构建的ExternalProject_Add()调用。例如,如that question
  2. 中所述

    <强> other_project /的CMakeLists.txt

    project(other_project)
    include(ExternalProject)
    
    ExternalProject_Add(<project_name> <options...>
        BUILD_COMMAND "" # Disable build step.
        INSTALL_COMMAND "" # Disable install step too.
    )
    

    <强>的CMakeLists.txt

    # The first external project will be built at *configure stage*
    execute_process(
        COMMAND ${CMAKE_COMMAND} --build . ${CMAKE_SOURCE_DIR}/other_project
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/other_project
    )
    
    1. 在主项目的构建阶段中构建的ExternalProject_Add()调用。
    2. <强>的CMakeLists.txt

      # The second external project will be built at *build stage*
      ExternalProject_Add(<project_name> <options...>
          CONFIGURE_COMMAND "" # Disable configure step. But other steps will be generated.
      )
      

      通过对ExternalProject_Add()个调用使用相同的&lt; options&gt; ,我们实现了两个外部项目的“抢占”:构建和跟踪第二个项目的步骤将使用配置步骤的结果第一个。

答案 1 :(得分:4)

Hunter C++ package manager符合我的要求。 Hunter基于CMake ExternalProject,但附带一组预定义项目。此外,它还会在配置中构建依赖关系,并且find_package(... CONFIG)可以访问它们。非常好的东西!

答案 2 :(得分:3)

如果您不想在配置时构建 ,而只想下载它,请使用FetchContentFetchContent_Declare使用许多与ExternalProject_Add相同的参数,除了它不允许构建项目。

documentation有一个很好的示例,说明了如何使用它:

FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.8.0
)

FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
  FetchContent_Populate(googletest)
  add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
endif()

这需要CMake 3.11或更高版本。对于早期版本,您可以从CMake存储库中下载FetchContent.cmake moduleFetchContent directory,以确保符合BSD 3-条款许可。

†在配置时进行构建有一些严重的缺点。例如,您的库用户无法控制构建过程,除非您非常仔细地进行设置。包管理器是更好的解决方案

答案 3 :(得分:0)

从CMake 3.14及更高版本开始,这就是您使用FetchContent的方式

FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.8.0
)

FetchContent_MakeAvailable(googletest)

然后进行测试 test/CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(${PROJECT_NAME}_test)

# Tests for cpp_binary_search
file(GLOB_RECURSE TEST_SOURCES 
    ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp
    ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
)

add_executable(${PROJECT_NAME}_test ${TEST_SOURCES})
target_link_libraries(${PROJECT_NAME}_test gtest gmock_main)

# Register the tests
add_test(NAME ${PROJECT_NAME}_test
         COMMAND ${PROJECT_NAME}_test)
enable_testing()

你现在很高兴