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/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