Каков вариант использования для выражения генератора в target_include_directories? - PullRequest
1 голос
/ 06 ноября 2019

Я видел в нескольких местах ссылки на использование выражений генератора при определении каталогов включения, поэтому вы можете определять различные места для включений во время компиляции и во время установки. Например:

# 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/ для публичных заголовков), я надеялся получитьустановив CMAKE_INSTALL_PREFIX и используя простой вызов install(), такой как:

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

Я ожидал, что DESTINATION будет значением по умолчанию для обоих, поэтому я просто говорю CMake:установить такие файлы. Конечно, это не работает, и мне нужно явно указать место назначения для библиотек и заголовочных файлов.

Таким образом, остается вопрос: каков вариант использования выражений генератора в начале, если я неКажется, в любом случае можно использовать 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)

1 Ответ

3 голосов
/ 06 ноября 2019

Генератор-подобные выражения $<BUILD_INTERFACE> и $<INSTALL_INTERFACE> используются CMake для различения вещей, отличающихся для дерева сборки и для дерева установки .

При создании самого проекта используется $<BUILD_INTERFACE>, но $<INSTALL_INTERFACE> - нет.

При создании файла экспорта с помощью команды install (EXPORT) ,вещи, перечисленные в $<INSTALL_INTERFACE>, будут включены в него, но вещи в $<BUILD_INTERFACE> не будут.

Но создание файла экспорта с export Команда использует $<BUILD_INTERFACE>, но не использует $<INSTALL_INTERFACE>.

Другое для различения деревьев сборки и установки выражения $<BUILD_INTERFACE> и $<INSTALL_INTERFACE> не используются.

Например $<INSTALL_INTERFACE> делает НЕ влияет на команду install(TARGETS .. PUBLIC_HEADERS).

...