我正在尝试构建一个示例项目,该项目需要 几十个 包含在不同子目录中的包,例如
/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
等的包配置文件。
答案 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 ...)
。)但是,如果某处存在应该自动包含模块的配置脚本(如果列为组件,例如Release
或 Release/modules
中的某处。