0

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

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

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

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

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

所以在FetchContent_MakeAvailable我做了之后:

include(${somelib_SOURCE_DIR}/CMakeLists.txt)

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

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 中拥有手头的所有东西。可能吗 ?

4

1 回答 1

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()

于 2021-10-12T18:06:39.197 回答