From 93f77d8183bbe5a215385cd4bc7da2f83c9776d7 Mon Sep 17 00:00:00 2001 From: Vito Gamberini Date: Wed, 13 Aug 2025 11:56:58 -0400 Subject: PkgC: Allow system paths during IMPORT, POPULATE Fixes: #27138 --- Source/cmCMakePkgConfigCommand.cxx | 3 +++ Tests/RunCMake/cmake_pkg_config/ImportSystem-check.cmake | 11 +++++++++++ Tests/RunCMake/cmake_pkg_config/ImportSystem.cmake | 12 ++++++++++++ Tests/RunCMake/cmake_pkg_config/RunCMakeTest.cmake | 1 + 4 files changed, 27 insertions(+) create mode 100644 Tests/RunCMake/cmake_pkg_config/ImportSystem-check.cmake create mode 100644 Tests/RunCMake/cmake_pkg_config/ImportSystem.cmake diff --git a/Source/cmCMakePkgConfigCommand.cxx b/Source/cmCMakePkgConfigCommand.cxx index 181c7d8..0d753bb 100644 --- a/Source/cmCMakePkgConfigCommand.cxx +++ b/Source/cmCMakePkgConfigCommand.cxx @@ -911,6 +911,9 @@ std::pair PopulatePCTarget(PopulateArguments& args, auto& pcEnv = maybeEnv->first; auto& imEnv = maybeEnv->second; + pcEnv.AllowSysCflags = true; + pcEnv.AllowSysLibs = true; + pkgProviders providers; if (args.Providers) { for (auto const& provider_str : *args.Providers) { diff --git a/Tests/RunCMake/cmake_pkg_config/ImportSystem-check.cmake b/Tests/RunCMake/cmake_pkg_config/ImportSystem-check.cmake new file mode 100644 index 0000000..a6f4eb3 --- /dev/null +++ b/Tests/RunCMake/cmake_pkg_config/ImportSystem-check.cmake @@ -0,0 +1,11 @@ +set(expected +"Include Directories: /TestDirectories/Include +Link Directories: /TestDirectories/Library +" +) + +file(READ "${RunCMake_TEST_BINARY_DIR}/import-system.txt" actual) + +if(NOT(expected STREQUAL actual)) + set(RunCMake_TEST_FAILED "cmake_pkg_config import-system.txt does not match expected:\n${actual}") +endif() diff --git a/Tests/RunCMake/cmake_pkg_config/ImportSystem.cmake b/Tests/RunCMake/cmake_pkg_config/ImportSystem.cmake new file mode 100644 index 0000000..bf0fb14 --- /dev/null +++ b/Tests/RunCMake/cmake_pkg_config/ImportSystem.cmake @@ -0,0 +1,12 @@ +set(CMAKE_PKG_CONFIG_SYS_INCLUDE_DIRS /TestDirectories/Include) +set(CMAKE_PKG_CONFIG_SYS_LIB_DIRS /TestDirectories/Library) + +cmake_pkg_config(IMPORT import-simple REQUIRED) + +file(GENERATE + OUTPUT import-system.txt + CONTENT +"Include Directories: $ +Link Directories: $ +" +) diff --git a/Tests/RunCMake/cmake_pkg_config/RunCMakeTest.cmake b/Tests/RunCMake/cmake_pkg_config/RunCMakeTest.cmake index 422a993..b2e38fc 100644 --- a/Tests/RunCMake/cmake_pkg_config/RunCMakeTest.cmake +++ b/Tests/RunCMake/cmake_pkg_config/RunCMakeTest.cmake @@ -20,6 +20,7 @@ run_cmake(ImportName) run_cmake(ImportPrefix) run_cmake(ImportRequires) run_cmake(ImportSimple) +run_cmake(ImportSystem) run_cmake(ImportTransitiveFail) run_cmake(ImportTransitiveVersion) run_cmake(ImportTransitiveVersionFail) -- cgit v0.12 From d5f6cf5ba8c280df347dbd8df7e5049598d575e9 Mon Sep 17 00:00:00 2001 From: Vito Gamberini Date: Wed, 13 Aug 2025 12:59:00 -0400 Subject: PkgC: Only remove system paths which are exact matches --- Source/cmPkgConfigResolver.cxx | 49 +++++++++++----------- .../cmake_pkg_config/ExtractEnv-stderr.txt | 4 +- .../cmake_pkg_config/ExtractMangle-stderr.txt | 16 +++---- .../cmake_pkg_config/ExtractReroot-stderr.txt | 8 ++-- .../cmake_pkg_config/PackageRoot/relocate.pc | 4 +- 5 files changed, 41 insertions(+), 40 deletions(-) diff --git a/Source/cmPkgConfigResolver.cxx b/Source/cmPkgConfigResolver.cxx index bd8b9b7..8be5f34 100644 --- a/Source/cmPkgConfigResolver.cxx +++ b/Source/cmPkgConfigResolver.cxx @@ -56,6 +56,15 @@ std::string AppendAndTrim(std::string& str, cm::string_view sv) return { &*begin, static_cast(cur - begin) + 1 }; } +cm::string_view TrimFlag(cm::string_view flag) +{ + std::size_t trim_size = 2; + for (auto c = flag.rbegin(); c != flag.rend() && std::isspace(*c); ++c) { + ++trim_size; + } + return { flag.data() + 2, flag.size() - trim_size }; +} + } // namespace std::string cmPkgConfigVersionReq::string() const @@ -460,12 +469,10 @@ cmPkgConfigCflagsResult cmPkgConfigResolver::MangleCflags( for (auto flag : flags) { if (flag.rfind("-I", 0) == 0) { - cm::string_view noprefix{ flag.data() + 2, flag.size() - 2 }; - - if (std::all_of(syspaths.begin(), syspaths.end(), - [&](std::string const& path) { - return noprefix.rfind(path, 0) == noprefix.npos; - })) { + cm::string_view trimmed = TrimFlag(flag); + if (std::all_of( + syspaths.begin(), syspaths.end(), + [&](std::string const& path) { return path != trimmed; })) { result.Includes.emplace_back(AppendAndTrim(result.Flagline, flag)); } @@ -486,12 +493,10 @@ cmPkgConfigCflagsResult cmPkgConfigResolver::MangleCflags( for (auto flag : flags) { if (flag.rfind("-I", 0) == 0) { std::string reroot = Reroot(flag, "-I", sysroot); - cm::string_view noprefix{ reroot.data() + 2, reroot.size() - 2 }; - - if (std::all_of(syspaths.begin(), syspaths.end(), - [&](std::string const& path) { - return noprefix.rfind(path, 0) == noprefix.npos; - })) { + cm::string_view trimmed = TrimFlag(reroot); + if (std::all_of( + syspaths.begin(), syspaths.end(), + [&](std::string const& path) { return path != trimmed; })) { result.Includes.emplace_back(AppendAndTrim(result.Flagline, reroot)); } @@ -548,12 +553,10 @@ cmPkgConfigLibsResult cmPkgConfigResolver::MangleLibs( for (auto flag : flags) { if (flag.rfind("-L", 0) == 0) { - cm::string_view noprefix{ flag.data() + 2, flag.size() - 2 }; - - if (std::all_of(syspaths.begin(), syspaths.end(), - [&](std::string const& path) { - return noprefix.rfind(path, 0) == noprefix.npos; - })) { + cm::string_view trimmed = TrimFlag(flag); + if (std::all_of( + syspaths.begin(), syspaths.end(), + [&](std::string const& path) { return path != trimmed; })) { result.LibDirs.emplace_back(AppendAndTrim(result.Flagline, flag)); } @@ -576,12 +579,10 @@ cmPkgConfigLibsResult cmPkgConfigResolver::MangleLibs( for (auto flag : flags) { if (flag.rfind("-L", 0) == 0) { std::string reroot = Reroot(flag, "-L", sysroot); - cm::string_view noprefix{ reroot.data() + 2, reroot.size() - 2 }; - - if (std::all_of(syspaths.begin(), syspaths.end(), - [&](std::string const& path) { - return noprefix.rfind(path, 0) == noprefix.npos; - })) { + cm::string_view trimmed = TrimFlag(reroot); + if (std::all_of( + syspaths.begin(), syspaths.end(), + [&](std::string const& path) { return path != trimmed; })) { result.LibDirs.emplace_back(AppendAndTrim(result.Flagline, reroot)); } diff --git a/Tests/RunCMake/cmake_pkg_config/ExtractEnv-stderr.txt b/Tests/RunCMake/cmake_pkg_config/ExtractEnv-stderr.txt index 67713c9..e1c98f3 100644 --- a/Tests/RunCMake/cmake_pkg_config/ExtractEnv-stderr.txt +++ b/Tests/RunCMake/cmake_pkg_config/ExtractEnv-stderr.txt @@ -1,5 +1,5 @@ -Includes: -I/Alpha;-I/Gamma -LibDirs: -L/Delta;-L/Zeta +Includes: -I/Alpha;-I/Alpha/sub;-I/Gamma +LibDirs: -L/Delta;-L/Delta/sub;-L/Zeta Cflags: QuxInstalled PC_LIB_DIRS: Alpha;Beta PC_PATH: [^ diff --git a/Tests/RunCMake/cmake_pkg_config/ExtractMangle-stderr.txt b/Tests/RunCMake/cmake_pkg_config/ExtractMangle-stderr.txt index 75557fc..04a1bc0 100644 --- a/Tests/RunCMake/cmake_pkg_config/ExtractMangle-stderr.txt +++ b/Tests/RunCMake/cmake_pkg_config/ExtractMangle-stderr.txt @@ -1,8 +1,8 @@ -Cflags: Beta -I/Gamma -Includes: -I/Gamma -Libs: Epsilon -L/Zeta -LibDirs: -L/Zeta -Cflags: -I/Alpha Beta -I/Gamma -Includes: -I/Alpha;-I/Gamma -Libs: -L/Delta Epsilon -L/Zeta -LibDirs: -L/Delta;-L/Zeta +Cflags: -I/Alpha/sub Beta -I/Gamma +Includes: -I/Alpha/sub;-I/Gamma +Libs: -L/Delta/sub Epsilon -L/Zeta +LibDirs: -L/Delta/sub;-L/Zeta +Cflags: -I/Alpha -I/Alpha/sub Beta -I/Gamma +Includes: -I/Alpha;-I/Alpha/sub;-I/Gamma +Libs: -L/Delta -L/Delta/sub Epsilon -L/Zeta +LibDirs: -L/Delta;-L/Delta/sub;-L/Zeta diff --git a/Tests/RunCMake/cmake_pkg_config/ExtractReroot-stderr.txt b/Tests/RunCMake/cmake_pkg_config/ExtractReroot-stderr.txt index ab524d4..d4bab07 100644 --- a/Tests/RunCMake/cmake_pkg_config/ExtractReroot-stderr.txt +++ b/Tests/RunCMake/cmake_pkg_config/ExtractReroot-stderr.txt @@ -1,4 +1,4 @@ -Cflags: -I/NewRoot/Alpha Beta -I/NewRoot/Gamma -Includes: -I/NewRoot/Alpha;-I/NewRoot/Gamma -Libs: -L/NewRoot/Delta Epsilon -L/NewRoot/Zeta -LibDirs: -L/NewRoot/Delta;-L/NewRoot/Zeta +Cflags: -I/NewRoot/Alpha -I/NewRoot/Alpha/sub Beta -I/NewRoot/Gamma +Includes: -I/NewRoot/Alpha;-I/NewRoot/Alpha/sub;-I/NewRoot/Gamma +Libs: -L/NewRoot/Delta -L/NewRoot/Delta/sub Epsilon -L/NewRoot/Zeta +LibDirs: -L/NewRoot/Delta;-L/NewRoot/Delta/sub;-L/NewRoot/Zeta diff --git a/Tests/RunCMake/cmake_pkg_config/PackageRoot/relocate.pc b/Tests/RunCMake/cmake_pkg_config/PackageRoot/relocate.pc index 5abce76..ac97d46 100644 --- a/Tests/RunCMake/cmake_pkg_config/PackageRoot/relocate.pc +++ b/Tests/RunCMake/cmake_pkg_config/PackageRoot/relocate.pc @@ -2,5 +2,5 @@ Name: Relocate Description: For testing relocation and flag mangling Version: 1.0.0 -Cflags: -I/Alpha Beta -I/Gamma -Libs: -L/Delta Epsilon -L/Zeta +Cflags: -I/Alpha -I/Alpha/sub Beta -I/Gamma +Libs: -L/Delta -L/Delta/sub Epsilon -L/Zeta -- cgit v0.12