cmake:先用ExternalProject_Add下载构建依赖项



我正试图通过cmake的"ExternalProject_Add"函数使我的测试程序main.cpp链接到外部下载的库(在本例中为fmt 8.1.1(,如下所示

CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(test)
set(CMAKE_CXX_STANDARD 20)
include(ExternalProject)
ExternalProject_Add(fmt
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
GIT_TAG 8.1.1
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=20 -DFMT_TEST=OFF -DFMT_DOC=OFF -DFMT_INSTALL=ON -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/fmt-build
STEP_TARGETS build
)
set(fmt_BINARY_DIR "${CMAKE_BINARY_DIR}/fmt-prefix/src/fmt-build")
set(fmt_SOURCE_DIR "${CMAKE_BINARY_DIR}/fmt-prefix/src/fmt/include")
add_executable(${PROJECT_NAME} main.cpp)
add_dependencies(${PROJECT_NAME} fmt-build) # does not have an effect
target_link_libraries(${PROJECT_NAME} PRIVATE ${fmt_BINARY_DIR}/libfmt.a)
target_include_directories(${PROJECT_NAME} PUBLIC ${fmt_SOURCE_DIR})

main.cpp

#include <chrono>
#include <fmt/core.h>
#include <fmt/chrono.h>
int main() {
const auto now = std::chrono::system_clock::now();
fmt::print("The time is {}", now);
return 0;
}

如果我提前构建了目标fmt-build,测试程序main.cpp运行正常,但抱怨

ninja: error: 'fmt-prefix/src/fmt-build/libfmt.a', needed by 'test', missing and no known rule to make it

指示依赖关系CCD_ 8必须提前构建。虽然这是可行的,但我如何让cmake自主构建fmt-build作为test的依赖项,而不需要首先手动运行它?我认为add_dependencies(${PROJECT_NAME} fmt-build)线路应该解决这个问题,但显然没有。

根据@Tsyvarev的评论,只需添加行

BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/fmt-prefix/src/fmt-build/libfmt.a

ExternalProject_Add调用就可以了,而且不必手动构建fmt-build

最新更新