CMake ExternalProject允许定义如何下载,配置,构建和安装外部项目。所有步骤都将在构建时执行。
我想在主项目配置期间执行外部项目的配置步骤。完成外部项目配置后,可以使用导入目标的描述,因此可以使用find_package()
函数加载外部项目。
是否可以在配置时构建一些目标?
答案 0 :(得分:7)
ExternalProject 只是一系列要执行的步骤。因此,您可以使用两个实例:
<强> 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
)
<强>的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)
如果您不想在配置时构建 †,而只想下载它,请使用FetchContent。 FetchContent_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
module和FetchContent 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()
你现在很高兴