首页 > 解决方案 > 良好的 CMake 风格:继承属性

问题描述

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

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

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

定义了一组包含目录。我不想为 、 和 定义完全相同的包含目录,而是让这些目标target_atarget_b“ base_target ”继承包含目录,例如target_c

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

where base_IncludeFlagsis 不应该是一个真正的物理目标,而是一个抽象基类接口之类的东西。

另一方面,我不想使用,include_directories 因为这会影响所有目标。是不是更好用foreach?最优雅的方法是什么?我应该创建base_target 一个库并添加依赖项吗?

标签: cmakebuild-system

解决方案


我想要的是一个实际上不是物理产生的目标,但它传播了一些常见的属性。

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

例子:

# 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.

推荐阅读