CMake:如果任何可执行目标需要它,则构建目标库

时间:2013-07-04 11:51:31

标签: build cmake shared-libraries

我的项目布局如下:

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(取决于客户)进行

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

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

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

哦,我的坏,我错过了为你的帮助说大感谢

2 个答案:

答案 0 :(得分:0)

CMake无法开箱即用。将构建通过add_library调用添加的任何库。

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

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

答案 1 :(得分:0)

cmake ..
make module_A module_D