diff --git a/Source/cmCMakePkgConfigCommand.cxx b/Source/cmCMakePkgConfigCommand.cxx index 181c7d8624..0d753bb86e 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/Source/cmPkgConfigResolver.cxx b/Source/cmPkgConfigResolver.cxx index bd8b9b7a29..8be5f3408a 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 67713c9034..e1c98f361b 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 75557fc2c5..04a1bc0eef 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 ab524d44bc..d4bab07b10 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/ImportSystem-check.cmake b/Tests/RunCMake/cmake_pkg_config/ImportSystem-check.cmake new file mode 100644 index 0000000000..a6f4eb3f07 --- /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 0000000000..bf0fb1468b --- /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/PackageRoot/relocate.pc b/Tests/RunCMake/cmake_pkg_config/PackageRoot/relocate.pc index 5abce769b4..ac97d46e07 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 diff --git a/Tests/RunCMake/cmake_pkg_config/RunCMakeTest.cmake b/Tests/RunCMake/cmake_pkg_config/RunCMakeTest.cmake index 422a993fdd..b2e38fc2f5 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)