重构大型cmake项目

时间:2016-01-08 17:59:17

标签: c++ cmake

我最近加入了一个使用cmake并且有很多魔法的项目。我有一些为小型项目设置cmake的经验,但这对我来说似乎很乱。

该项目包括几个应用程序和库,它们共享一个主库(由我们开发)和几个小库(部分是外部的,部分是我们自己的),其中一些共享依赖,一些不共享。由于非常具体的分发模型,最重要的要求之一是每个应用程序和库都可以独立编译。换句话说,我应该能够进入每个目录并使用mkdir build&& cd build&& cmake ..&&使。显然,我也应该能够在父目录中完成它。目前,它以下列方式完成:

  1. 几乎每个文件夹都是一个单独的cmake项目。
  2. 每个依赖于其他库或包含的库和应用程序都在其CMakeLists.txt中包含特定的Install + Find脚本。例如,InstallLib1Internal.cmake查看当前的构建目录。如果Lib1Internal库和包含在那里,它只返回,如果没有它配置,编译和安装库并包含到构建目录。一切都是使用execute_process(COMMAND $ {CMAKE_COMMAND} [...])完成的。然后,FindLib1Internal.cmake决定是查找头文件和库,添加库和依赖项,并设置相关的* _DIRS / FOUND和其他变量。
  3. 文件结构或多或少如下:

    root/
        app1/
            app1-1/
                include/
                src/
                CMakeLists.txt
            app1-2/
                include/
                src/
                CMakeLists.txt
            app1-3/
                include/
                src/
                CMakeLists.txt
            CMakeLists.txt
        app2/
            include/
            src/
            CMakeLists.txt
        cmake
            FindLib1Internal.cmake
            FindLib2Internal.cmake
            FindLib3External.cmake
            InstallLib1Internal.cmake
            InstallLib2Internal.cmake
            InstallLib3External.cmake
        shared/
            lib1_internal/
                include/
                src/
                CMakeLists.txt
            lib2_internal/
                include/
                src/
                CMakeLists.txt
            lib3_external/
                include/
                src/
                CMakeLists.txt
        CMakeLists.txt
    

    我用这种方法看到了很多问题。

    1. 如果修改了内部库,我们将无法看到更改,因为唯一的检查是在构建目录中完成的。
    2. 对于每个项目,所有组件的编译都在当前项目的构建目录中完成。如果组件编译发生在他们的文件夹中,那么可以为所有项目共享它们,而无需重新编译它们。
    3. 大多数CMakeLists.txt都会复制安装/查找并且几乎完全相同,添加新版本或修改任何内容都是一种真正的痛苦。
    4. 出于某种原因,我觉得这个解决方案很糟糕,但我还没有看到任何其他方法让每个项目都可以构建。
    5. 安装cmake的逻辑不是我们的工作 - 我认为它应该用于在用户系统中安装东西,而不是在构建过程中复制标题和库。
    6. 理想情况下,我想摆脱脚本并仅依赖于CMakeLists及其依赖性。但是,我无法进行小的更改并测试它们,因为每当我修改任何内容时,cmake都会因各种错误而失败。感觉就像我玩Jenga一样,大部分的塔已经消失了......

      如果有人可以推荐任何全局变化以简化cmake结构,那将是很棒的。我觉得很难相信,但也许目前的组织和方法是正确的?

0 个答案:

没有答案