【发布时间】:2010-12-07 01:06:23
【问题描述】:
你好,
我在我的一个非常复杂的项目中使用 CMake 作为构建系统。该项目包括几个库和几个应用程序。我的目标是,使以下成为可能:
- 可以根据用户请求构建库(由缓存的 CMake 变量实现)
- 应用程序是根据用户请求构建的(见上文),但应用程序可以选择需要哪些库并构建它们,而无需用户选择它们
- 这不应更改缓存的用户选择要构建的库(如果关闭应用程序构建,则禁用自动构建库)
我的构建系统布局如下:我有一个父目录,其中包含一个 CMakeLists.txt,它将库和应用程序添加为子目录。每个库和应用程序都有自己的 CmakeLists.txt,它定义了要存储在缓存中的用户可定义的配置选项、要构建的目标以及它依赖于项目的其他库。应用程序不一定位于父目录的下一个子目录中,但也可能位于较低的某些级别,因此我无法使用 PARENT_SCOPE,因为父级不必是最顶层的父级,但必须知道依赖关系在上面。
我尝试将诸如 PROJECT_BUILD_SOMELIBRARY 之类的 GLOBAL 属性设置为 on 并尝试在 SOMELIBRARY 的 CMakeLists.txt 中检索它们以决定是否构建,但这些属性没有传递给库,因此即使它从未构建过事实上,它必须这样做,因为另一个库或应用程序表明它依赖于这个库。根据库使用包含每个应用程序或库目标名称的 LIST 并在内部缓存该库也不起作用。
总结这些话,我正在寻找一种方法来影响某个子目录中的 CMakeLists,该子目录负责通过其他子目录中的 CMakeLists 构建库(这不一定与其他子目录相同的子目录级别) 来构建该库,即使用户没有通过 cmake 调用的配置选项明确指定它。
有人知道如何做到这一点,或者这对 CMake 来说是不可能的吗?是否有针对此问题的其他方法的建议,但是,包括使用 CMake?您是否知道任何其他构建系统可以轻松处理此要求?
非常感谢, 脆皮鱼
【问题讨论】:
标签: variables dependencies cmake global