target_include_directories 上生成器表达式的用例是什么?

What is the use case for generator expression on target_include_directories?

我在多个地方看到了在定义包含目录时使用生成器表达式的引用,因此您可以在编译和安装期间为包含定义不同的位置。例如:

# Define headers for this library. PUBLIC headers are used for
# compiling the library, and will be added to consumers' build
# paths.
target_include_directories(lib PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
    PRIVATE src)

我正在构建一个库项目,因为我使用的是标准路径(lib/ 用于静态库,include/ 用于 public headers) ,我希望通过设置 CMAKE_INSTALL_PREFIX 并使用简单的 install() 调用来逃脱,例如:

set(CMAKE_INSTALL_PREFIX "${MY_INSTALL_DIR}")
install(TARGETS myLibrary ARCHIVE PUBLIC_HEADERS)

我的期望是 DESTINATION 是两者的默认值,所以我只是告诉 CMake 安装这些文件。当然它不起作用,我需要明确设置库和 header 文件的目标。

所以问题仍然存在:如果我似乎无法使用 INSTALL_INTERFACE,一开始生成器表达式的用例是什么?


这是我的样本CMakeLists.txt:

cmake_minimum_required(VERSION 3.12.1)
project(my_library C)

FILE(GLOB SOURCE_FILES src/*.c)
add_library(my_library ${SOURCE_FILES})
target_include_directories(my_library PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>)

set(OUTPUT_DIR "${CMAKE_BINARY_DIR}/output")
set(INSTALL_DIR "${OUTPUT_DIR}/my_library")
set(INSTALL_LIB_DIR "${INSTALL_DIR}/lib")
set(INSTALL_INC_DIR "${INSTALL_DIR}/include")
set(CMAKE_INSTALL_PREFIX "${INSTALL_DIR}")
install(TARGETS my_library ARCHIVE DESTINATION lib)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" DESTINATION include)
# I was hoping I could do, after setting the headers with the INSTALL_INTERFACE generator expression
#install(TARGETS my_library ARCHIVE PUBLIC_HEADERS)

类似生成器的表达式 $<BUILD_INTERFACE>$<INSTALL_INTERFACE> 被 CMake 用于区分事物,对于 build tree安装树.

在构建项目本身时,使用 $<BUILD_INTERFACE> 但不使用 $<INSTALL_INTERFACE>

当使用 install(EXPORT) 命令创建 导出文件 时, $<INSTALL_INTERFACE> 中列出的内容将包含在其中,但 [=10= 中的内容] 不会。

但是用export命令创建导出文件使用$<BUILD_INTERFACE>,但不使用$<INSTALL_INTERFACE>.

其他用于区分构建和安装树的表达式 $<BUILD_INTERFACE>$<INSTALL_INTERFACE> 未使用。

例如$<INSTALL_INTERFACE> 不会 影响 install(TARGETS .. PUBLIC_HEADERS) 命令。