1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-16 22:37:30 +08:00

File set: Allow absolute CMAKE_INSTALL_INCLUDEDIR

When install(TARGETS) and install(EXPORT) were called with file sets
and an absolute CMAKE_INSTALL_INCLUDEDIR, "${_IMPORT_PREFIX}/" was
still being prepended to the base directory and files, resulting in
incorrect paths. Don't prepend this when absolute paths are used.

Fixes: #25010
This commit is contained in:
Kyle Edwards
2023-06-19 17:49:38 +02:00
parent 9eccac530c
commit 70f36de1e5
4 changed files with 40 additions and 9 deletions

View File

@@ -590,10 +590,12 @@ std::string cmExportInstallFileGenerator::GetFileSetDirectories(
auto cge = ge.Parse(te->FileSetGenerators.at(fileSet)->GetDestination());
for (auto const& config : configs) {
auto dest = cmStrCat("${_IMPORT_PREFIX}/",
cmOutputConverter::EscapeForCMake(
cge->Evaluate(gte->LocalGenerator, config, gte),
cmOutputConverter::WrapQuotes::NoWrap));
auto unescapedDest = cge->Evaluate(gte->LocalGenerator, config, gte);
auto dest = cmOutputConverter::EscapeForCMake(
unescapedDest, cmOutputConverter::WrapQuotes::NoWrap);
if (!cmSystemTools::FileIsFullPath(unescapedDest)) {
dest = cmStrCat("${_IMPORT_PREFIX}/", dest);
}
auto const& type = fileSet->GetType();
// C++ modules do not support interface file sets which are dependent upon
@@ -645,11 +647,14 @@ std::string cmExportInstallFileGenerator::GetFileSetFiles(
fileSet->EvaluateFileEntry(directories, files, entry,
gte->LocalGenerator, config, gte);
}
auto dest = cmStrCat("${_IMPORT_PREFIX}/",
cmOutputConverter::EscapeForCMake(
destCge->Evaluate(gte->LocalGenerator, config, gte),
cmOutputConverter::WrapQuotes::NoWrap),
'/');
auto unescapedDest = destCge->Evaluate(gte->LocalGenerator, config, gte);
auto dest =
cmStrCat(cmOutputConverter::EscapeForCMake(
unescapedDest, cmOutputConverter::WrapQuotes::NoWrap),
'/');
if (!cmSystemTools::FileIsFullPath(unescapedDest)) {
dest = cmStrCat("${_IMPORT_PREFIX}/", dest);
}
bool const contextSensitive = destCge->GetHadContextSensitiveCondition() ||
std::any_of(directoryEntries.begin(), directoryEntries.end(),

View File

@@ -0,0 +1,16 @@
enable_language(C)
# According to https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html#module:GNUInstallDirs
# relative CMAKE_INSTALL_<dir> are encouraged, but absolute path's are also allowed.
# Construct an absolute CMAKE_INSTALL_INCLUDEDIR.
set(CMAKE_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include")
add_library(lib1)
target_sources(lib1
PRIVATE lib1.c
PUBLIC FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h)
# Expect install(TARGETS) to respect absolute CMAKE_INSTALL_INCLUDEDIR
# when installing the HEADERS.
# Must not prepend the CMAKE_INSTALL_PREFIX in the <pkg>-config.cmake.
install(TARGETS lib1 EXPORT lib1-config FILE_SET HEADERS)
install(EXPORT lib1-config NAMESPACE lib1:: DESTINATION share/lib1)

View File

@@ -0,0 +1,9 @@
enable_language(CXX)
get_filename_component(CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}" DIRECTORY)
string(APPEND CMAKE_PREFIX_PATH "/FileSetAbsoluteInstallIncludeDirExport-build/install")
find_package(lib1 REQUIRED)
add_executable(exe main.cpp)
target_link_libraries(exe PRIVATE lib1::lib1)

View File

@@ -99,3 +99,4 @@ function(run_export_import name)
endfunction()
run_export_import(FileSet)
run_export_import(FileSetAbsoluteInstallIncludeDir)