我正在尝试使用
FetchContent
来包含仅包含标头的 C++ 项目的依赖项。它不需要建造。但是,它包含一个构建其测试的 CMakeLists.txt 文件,并且它不是以标准方式执行的。我想完全绕过 make 步骤,以免构建无关的二进制文件,也不会看到它发出的警告。
我的代码目前是:
FetchContent_Declare(
TheProject
GIT_REPOSITORY <the git repo>
GIT_TAG <the git commit>
)
FetchContent_MakeAvailable(TheProject)
这会正确下载项目,但它会调用其上的 make 系统,这是我不想要的。我可以通过将其更改为这样来解决问题:
FetchContent_Declare(
TheProject
GIT_REPOSITORY <the git repo>
GIT_TAG <the git commit>
)
FetchContent_Populate(TheProject)
这有效,并且它不调用构建系统。太棒了。但它会发出一条被诅咒的警告,指出单独调用
FetchContent_Populate
已被弃用,并将从 cmake 的未来版本中删除。有没有一种正确的方法可以在不使用已弃用的功能的情况下完成我想要的事情?
当前建议的解决方法是使用
SOURCE_SUBDIR
选项并将其设置为不存在的路径。
CMake gitlab 上有一个未解决的问题可以更好地处理这种情况: https://gitlab.kitware.com/cmake/cmake/-/issues/26220
这里也讨论了: https://discourse.cmake.org/t/prevent-fetchcontent-makeavailable-to-execute-cmakelists-txt/12704
您可以使用
FETCHCONTENT_BASE_DIR
添加包含目录。
示例:
include(FetchContent)
FetchContent_Declare(the-project
GIT_REPOSITORY <the git repo>
GIT_TAG <the git commit>
SOURCE_SUBDIR "MADE-UP-DIRECTORY"
)
FetchContent_MakeAvailable(the-project)
# I recommend using SYSTEM when dealing with 3rd party code.
# Avoids the hassle of warnings from a library you don't own.
target_include_directories(foo SYSTEM PRIVATE
"${FETCHCONTENT_BASE_DIR}/the-project-src/include"
)
注意:
FETCHCONTENT_BASE_DIR
下的目录是小写的。这是获取内容的详细记录,因此它应该是可靠的。请参阅https://cmake.org/cmake/help/latest/module/FetchContent.html#populate-content-without-adding-it-to-the-build