好的CMake样式:继承属性

时间:2018-07-31 10:30:48

标签: cmake build-system

Daniel Pfeifer在他的演讲“有效的CMake”中, 指出,建议避免变数 尽可能的定义。

现在,如何将属性添加到各种构建中 目标。也就是说,例如

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

定义一组包含目录。而不是定义 与target_atarget_b, 和target_c,我想让这些目标继承 来自“ base_target”的包含目录,类似

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 个答案:

答案 0 :(得分:2)

  

我想要的是一个实际上不是物理产生的目标,但是可以传播一些共同的属性。

正是出于这个目的,CMake具有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.

答案 1 :(得分:1)

  

最优雅的方法是什么?

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

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

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