Joh*_*nck 20 modularity build cmake
想象一下包含几个组件的整体项目:
现在,假设web依赖于依赖于basic的io,所有这些东西都在一个repo中并且有一个CMakeLists.txt来构建它们作为共享库.
我应该如何设置以便构建三个应用程序,如果每个应用程序都是可选的,并且可能在构建时不存在?
一个想法是在主仓库中有一个空的"apps"目录,我们可以克隆我们想要的任何应用程序回购.我们的主要CMakeLists.txt文件可以使用GLOB查找所有应用程序目录并构建它们(事先不知道将有多少个).这种方法的问题包括:
make
,CMake不会重新发送,所以如果你添加一个新的应用程序,你必须cmake
再次运行.一般概念就像传统的递归CMake项目,但是较低级别的模块不一定事先知道哪些更高级别的模块将使用它们.但是,我不想要求用户在固定位置安装较低级别的库(例如/usr/local/lib
).但是,我确实希望单个调用make
来注意整个项目中已更改的依赖项,因此,如果我正在构建应用程序但已更改其中一个低级库,则所有内容都将重新编译.
我的第一个想法是使用 CMake导入/导出目标功能。
拥有的CMakeLists.txt的basic
,io
并web
和一个的CMakeLists.txt引用那些。然后您可以使用 CMake导出功能导出这些目标,然后应用程序项目可以导入CMake 目标。
当您首先构建库项目时,应用程序项目应该能够自动找到已编译的库(无需将库安装到/usr/local/lib
),否则始终可以设置正确的 CMake 变量以指示正确的目录。
以这种方式make
在应用程序项目中执行 a 不会make
在库项目中执行此操作时,您必须自己处理。
我最终做了我在问题中概述的内容,即签入一个空目录(包含一个忽略所有内容的 .gitignore 文件)并告诉 CMake GLOB 任何目录(由用户放入其中)。然后我可以说 cmake myrootdir ,它确实找到了所有不同的组件。这或多或少可以正常工作。但它确实有一些缺点,例如像 BuildBot 这样的一些第三方工具需要更传统的项目结构,这使得将其他工具与这种安排集成起来需要更多的工作。