CMake get_property at"生成时间"而不是"配置时间"对于INTERFACE_INCLUDE_DIRECTORIES

时间:2018-04-10 07:52:46

标签: cmake getproperty

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

当我尝试使用get_property命令来抓取这样一个创建目标的INCLUDE_DIRECTORIES列表时出现问题 - 根据this already answered question - 只在生成时评估库的链接因此,INCLUDE_DIRECTORIES的传播仅在生成时进行。

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

我正在使用:

  • Cmake版本3.5.0
  • Scientific 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在评估链接时会自动再次设置它),这对我来说似乎是错的......

0 个答案:

没有答案
相关问题