代码之家  ›  专栏  ›  技术社区  ›  Frank-Rene Schäfer

良好的CMake样式:继承属性

  •  1
  • Frank-Rene Schäfer  · 技术社区  · 6 年前

    Daniel Pfeifer在他的演讲“有效的CMake”, 提出一个观点,建议避免变量 尽可能多的定义。

    现在,我们如何将属性引入到各种构建中 目标。比如说

       target_include_directories(base_IncludeFlags
                                  INTERFACE 
                                  first/dir
                                  second/dir
                                  ...)
    

    定义一组包含目录。而不是定义 完全相同的包括目录 target_a , target_b , 和 target_c ,我想让那些目标 继承 “base_target”中的include目录,类似于

    target_link_libraries(target_a PUBLIC base_IncludeFlags) 
    target_link_libraries(target_b PUBLIC base_IncludeFlags)
    target_link_libraries(target_c PUBLIC base_IncludeFlags)
    

    哪里 base_IncludeFlags 不是真正的物理目标, 更像是 抽象基类 接口 .

    另一方面,我不想用 include_directories 因为这会影响到所有目标。用起来更好吗 foreach ? 最优雅的方法是什么?我可以做吗 base_target 一个库并添加依赖项?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Tsyvarev    6 年前

    我想要的是一个目标,它不是实际产生的,而是传播一些共同的属性。

    正是为了这个目的 INTERFACE library -不同属性的容器,当此库链接到另一个目标时传播。

    例子:

    # Create "container" target
    add_library(base_target INTERFACE)
    
    # Add some INTERFACE properties for that target
    target_include_directories(base_target INTERFACE 
                              first/dir
                              second/dir)
    
    # Some 'other_target' (library or executable) may easily consume all common properties:
    target_link_libraries(other_target PUBLIC base_target)
    # Now 'other_target' has aforementioned include directories too.
    # Instead of PUBLIC other linking types (PRIVATE, INTERFACE) may be used.
    
        2
  •  1
  •   w-m    6 年前

    最优雅的方法是什么?

    考虑到CMake文件通常由不是CMake专家的人读取和编辑。与其追求优雅,不如考虑追求简单:保持简单,愚蠢。

    如果您引入抽象、任何类型的隐藏隐式行为,那么每个人都将很难维护CMake文件。

    对我来说,在这种情况下简单意味着复制条目,如果只有2-3条。如果有更多的库,我会把头放在一个变量中。“有效的CMake”演示说明了要避免的一点 不必要的 ,一次性变量定义。我认为这个头列表是一个有用的变量,值得创建。