0

我的项目布局如下:

src/
    include/
           include1.h
           include2.h
           include3.h

    lib/
        lib1/
            source1_lib1.c
            source2_lib1.c
        lib2/
            source1_lib2.c
            source2_lib2.c
            source3_lib2.c
        lib3/
            source1_lib3.c
        lib4/
            source1_lib4.c
            source2_lib4.c

    module_A/ (this module will need lib1 and lib4)
            source1_moduleA.c
            source2_moduleA.c

    module_B/ (this module will need lib2 and lib3)
            source1_moduleB.c
            source2_moduleB.c
            source3_moduleB.c

    module_C/ (this module will need lib1, lib2, lib3 and lib4)
            source1_moduleC.c

    module_D/ (this module will need lib1 and lib3)
            source1_moduleD.c
            source2_moduleD.c
            source3_moduleD.c
            source4_moduleD.c

全局解决方案可以由任意数量的module_X(取决于客户)

我的项目 CMake 文件位于“/src”下,包括一个配置文件(由客户需求定义)。此配置文件指示必须为目标客户构建和打包哪些模块。

假设我有一个客户 X,他选择的模块是 module_A 和 module_D。在这种情况下,我的构建系统应该只构建 lib_1、lib_3 和 lib_4。

我正在寻找的是一种无需构建即可定义目标库的方法,直到我在 module_X 目录下的 CMakeLists 文件中引用它们。

哦,我的错,我错过了非常感谢您的帮助

4

2 回答 2

0

CMake 不能开箱即用。通过add_library调用添加的任何库都将被构建。

但是您可以在 CMake 中实现您想要的行为。您可以调用自定义包装函数,而不是直接add_library调用。包装器只是存储调用所需的信息add_executable,而不是直接调用它。包装器遍历可执行文件的所有依赖项,并在需要时进行调用。add_libraryadd_libraryadd_executableadd_library

您必须设计自己的系统来维护特定库是否已添加的状态以及构建库目标的参数。在考虑瞬态依赖时,事情也会变得稍微困难​​一些(module_1 依赖于 lib_a,而 lib_a 又依赖于 lib_b;但没有可执行文件直接依赖于 lib_b)。但是完全有可能用几百行 CMake 代码来构建这样一个系统。

于 2013-07-05T07:57:38.427 回答
0
cmake ..
make module_A module_D
于 2013-08-23T13:10:26.417 回答