如何将特定的CMake目标指定为依赖项?

如何将特定的CMake目标指定为依赖项?,cmake,Cmake,我们的CMake项目托管在GitHub上,有一个CMake git子模块作为依赖项。因此,文件结构大致如下: project/ CMakeLists.txt extern/ big_lib/ CMakeLists.txt include/ *.hpp static/ CMakeLists.txt shared/ CMakeLists.txt 我们拥有项目和大库

我们的CMake项目托管在GitHub上,有一个CMake git子模块作为依赖项。因此,文件结构大致如下:

project/
  CMakeLists.txt
  extern/
    big_lib/
      CMakeLists.txt
        include/
          *.hpp
        static/
          CMakeLists.txt
        shared/
          CMakeLists.txt
我们拥有
项目
大库
的作者

项目的顶级
CMakeLists.txt
包括以下内容:

add_subdirectory(${PROJECT_SOURCE_DIR}/extern/big_lib)

target_link_libraries(${PROJECT_NAME} big_lib::static)
big_lib::static
是一个我们不安装/发布的库;在
big_lib
配置中没有这样指定,它仅用于内部消耗-即用于测试。我们提供了一个面向客户端的共享库,但该共享库不适用于
项目

这就是为什么
ExternalProject\u Add
可能不是满足依赖关系的最合适的解决方案,因为我的理解是,在构建目录中安装依赖关系不会安装我们需要的特定构建目标。而且,我还没有运气让它工作

我还注意到,我们正在
big_lib
中构建所有目标,其中有数百个——大部分是测试,以及我不想要或不需要的共享库。我怀疑这是因为我们从它的基本目录中包含了整个库

我试过:

add_subdirectory(${PROJECT_SOURCE_DIR}/extern/big_lib/static)
但是似乎有来自
big_lib
基本目录的配置现在没有指定,这就是为什么我在
project
中包含基本目录而不是这个

因此,我的问题是:

  • 是否有更好的方法来指定静态构建目标,以便只生成静态构建目标

  • 有没有更好的方法来组织
    big_lib
    的配置,这样我就可以只添加静态库作为依赖项文件夹,而不在静态和共享目录之间从基本目录复制配置

  • 我不知道有什么选择?也许我应该使用ExternalProject\u Add并指定某种自定义构建命令,在这里我只发布静态库作为构建目标和安装目标,然后链接到该工件


您是对的,ExternalProject不允许您访问
大库的目标。但我认为
add_子目录(${PROJECT\u SOURCE\u DIR}/extern/big\u lib)
方法没有问题。“是否有更好的方法来指定静态生成目标,以便只生成该目标?”-只需将
option()
-s添加到
big_lib
,这样就可以将其配置为只生成静态库或共享库,或同时生成静态库或共享库。@Tsyvarev您应该将注释作为答案,这是完全合理的。在寻找解决方案时,我确实看到了这样一个例子。这可能就是我最后要做的。我只希望CMake比这聪明一点。