在不同的子目录中构建具有数十个包依赖项的 cmake 项目

时间:2021-04-01 01:27:56

标签: cmake

我正在尝试构建一个示例项目,该项目需要 几十个 包含在不同子目录中的包,例如

/home/Olumide/src/project/Release/modules/module1/CMakeFiles/Export/lib/cmake/module1    
/home/Olumide/src/project/Release/modules/module2/CMakeFiles/Export/lib/cmake/module2
/home/Olumide/src/project/Release/modules/module3/CMakeFiles/Export/lib/cmake/module3
...

鉴于我尝试构建的应用程序位于 /home/Olumide/src/project/applications/tutorial 位置,是否可以在不明确指定项目所需的所有每个包的路径或修改 {{ 1}},例如通过指定一个公共根路径来搜索所有包,例如:

CMakeLists.txt file

不幸的是,这不起作用,cmake 抱怨它找不到名称为 cmake -DCMAKE_MODULE_PATH=/home/Olumide/src/project/Release/modules . Modul1eConfig.cmake 等的包配置文件。

1 个答案:

答案 0 :(得分:1)

如果所有模块都遵循这个确切的模式,您应该能够通过缓存变量提供“根路径”,并通过 find_package 将在何处查找库的信息传递给 PATHS参数:

# maybe a more reasonable default here?
set(MYPROJECT_MODULE_PATH "/home/Olumide/src/project/Release/modules" CACHE PATH "the path to the modules we're looking for")

set(MYPROJECT_MODULE_NAMES
    module1
    module2
    ...
)

foreach(_MODULE IN LISTS MYPROJECT_MODULE_NAMES)
    find_package(${_MODULE} REQUIRED CONFIG
        PATHS "${MYPROJECT_MODULE_PATH}/${_MODULE}/CMakeFiles/Export"
    )
endforeach()

通常,如果这些包在逻辑上属于同一个软件包,您应该通过将它们作为组件传递给 find_package 来提供一种查找这些模块的方法,但是由于这似乎是不受您自己控制的代码,您可以没有那种奢侈。 (例如,boost 提供此功能:find_package(boost COMPONENTS test mpl ...)。)但是,如果某处存在应该自动包含模块的配置脚本(如果列为组件,例如ReleaseRelease/modules 中的某处。

相关问题