0

我有多个库,它们利用该target_include_directories(myLib PUBLIC myLib/inc)命令填充它们的 INTERFACE_INCLUDE_DIRECTORIES 属性。现在,如果我构建一个与这样的库链接的目标,则 INTERFACE_INCLUDE_DIRECTORIES 会(根据需要)传播到目标。

当我尝试使用get_property命令来获取这样一个已创建目标的 INCLUDE_DIRECTORIES 列表时,就会出现我的问题 - 根据这个已经回答的问题- 库的链接仅在生成时进行评估,因此 INCLUDE_DIRECTORIES 的传播也只是在生成时完成。

发生的情况是通过创建的列表get_property是空的/不完整的。当所有链接都完成时,有没有办法强制 CMake 在生成时再次评估列表?我想在列表上使用一些字符串操作,稍后将结果用于 custom_command ......

我在用着:

  • Cmake 版本 3.5.0
  • 科学 Linux 7.2 版

问题的最小示例

1) 主 CMakeLists.txt

cmake_minimum_required (VERSION 2.8)
project(MINIMAL LANGUAGES CXX) 

add_subdirectory(${PROJECT_SOURCE_DIR}/libA)
add_subdirectory(${PROJECT_SOURCE_DIR}/libB)

2) libA CMakeLists.txt

cmake_minimum_required (VERSION 2.8) 
project (libA) 
add_library(libA ${Some_Sources} ${Some_Header})
# Set include_directories, this populates INTERFACE_INCLUDE_DIRECTORIES
target_include_directories(libA PUBLIC "../libA/src")

3) libB CMakeLists.txt

cmake_minimum_required (VERSION 2.8) 
project (libB) 
add_library(libB ${Some_Sources} ${Some_Header})
target_link_libraries(libB PUBLIC libA)
target_include_directories(libB PUBLIC "../libB/src")

# this contains only the value set here directly as 
# get_property is evaluated at configure_time
get_property(INC_DIR_LIST TARGET libB PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
message(${INC_DIR_LIST})
# >>> Output: ../libB/src

# this expression is evaluated at generate time, 
# thus it contains all needed information as the linking is done already
file(GENERATE 
     OUTPUT "includes.txt" 
     CONTENT "$<TARGET_PROPERTY:libB,INTERFACE_INCLUDE_DIRECTORIES>\n
# >>> Output in text-file: ../libB/src;../libA/src

可能的(但不好??)解决方案

据我所知(在示例中)libB 与 libA 相关联,我可以手动添加:

get_property(INC_DIRS_LIBA TARGET libA PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
target_include_directories(libB PUBLIC INC_DIRS_LIBA)

这将起作用,因为该属性现在在配置时已正确设置,但现在在生成时设置了两次(因为 CMake 在评估链接时会自动再次设置它),这对我来说似乎是错误的......

4

0 回答 0