Я видел в нескольких местах ссылки на использование выражений генератора при определении каталогов включения, поэтому вы можете определять различные места для включений во время компиляции и во время установки. Например:
# 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)