我有多个库,它们利用该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 在评估链接时会自动再次设置它),这对我来说似乎是错误的......