【问题标题】:Shared CMake scripts between multiple projects在多个项目之间共享 CMake 脚本
【发布时间】:2021-10-12 09:22:12
【问题描述】:

我正在寻找一种在多个项目之间共享 CMake 脚本的方法。

在一个名为somelib 的存储库中,我有一个cmake 文件夹,并且我想从其他项目中将脚本包含在其中。在somelibCMakeLists.txt 中,我包含了来自cmake 文件夹的许多文件。

我的项目将“somelib”声明为外部依赖项,如下所示:

include(FetchContent)                                                                   
FetchContent_Declare(                                                                   
    somelib                                                                              
    GIT_REPOSITORY git@git.somewhere.com:somewhere/somelib.git                             
    GIT_TAG        origin/master                                                        
)                                                                                       
                                                                                        
FetchContent_MakeAvailable(somelib)          

我不确定这是一个好的做法,所以请随时纠正我,但我愿意包含 somelibCMakeLists.txt,以便我的项目包含 somelib 包含的所有文件。

所以在FetchContent_MakeAvailable 之后我做了:

include(${somelib_SOURCE_DIR}/CMakeLists.txt)

这个包含本身工作得很好,但问题在于somelibCMakeLists.txt。实际上,它所包含的内容与其位置无关,从而导致如下错误:

CMake Error at _build/_deps/somelib-src/CMakeLists.txt:26 (include):
  include could not find load file:

    cmake/Cache.cmake
Call Stack (most recent call first):
  CMakeLists.txt:47 (include)


CMake Error at _build/_deps/somelib-src/CMakeLists.txt:29 (include):
  include could not find load file:

    cmake/Linker.cmake
Call Stack (most recent call first):
  CMakeLists.txt:47 (include)


CMake Error at _build/_deps/somelib-src/CMakeLists.txt:33 (include):
  include could not find load file:

    cmake/CompilerWarnings.cmake
Call Stack (most recent call first):
  CMakeLists.txt:47 (include)

我确实意识到,除了包含CMakeLists.txt,我可以简单地这样做:

include(${somelib_SOURCE_DIR}/cmake/Cache.cmake)
include(${somelib_SOURCE_DIR}/cmake/Linker.cmake)
include(${somelib_SOURCE_DIR}/cmake/CompilerWarnings.cmake)

但是随着时间的推移,这将变得相当大(而且它会在我的所有项目之间重复),所以我希望有一个单一的入口点,我可以包括一个单一的东西来让我手头的一切CMakeLists。有可能吗?

【问题讨论】:

    标签: c++ makefile cmake cmake-modules


    【解决方案1】:

    不要使用include(${somelib_SOURCE_DIR}/CMakeLists.txt),因为FetchContent_MakeAvailable(somelib) 已经在同一个文件上调用了add_subdirectory

    如果你想访问它的脚本,那么只需运行:

    list(APPEND CMAKE_MODULE_PATH "${somelib_SOURCE_DIR}/cmake")
    include(Cache)
    include(Linker)
    include(CompilerWarnings)
    

    但是随着时间的推移,这将变得相当大(而且它会在我的所有项目之间重复),所以我希望有一个单一的入口点,我可以包括一个单一的东西来让我手头的一切CMakeLists。有可能吗?

    您还可以将这些帮助程序移动到他们自己的存储库中,并让每个项目 FetchContent 。那么它的 CMakeLists.txt 就会有这个:

    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
    set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE)
    

    你会跑:

    FetchContent_MakeAvailable(my_helpers)
    include(MyHelpers)
    

    MyHelpers.cmake 只是 include()s 所有其他助手。

    【讨论】:

    • 有道理,非常感谢 ;)
    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2018-03-18
    • 2012-07-22
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多