summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNemanja Ivanovic <nemanjai@ca.ibm.com>2022-11-16 02:25:55 (GMT)
committerBrad King <brad.king@kitware.com>2022-12-01 22:55:39 (GMT)
commite7f78309e761af3c4c929388bba0cb967f670b35 (patch)
tree48763326c556cbad51b022bb04a0ab07b24ac44f
parent4f9ec5a9befe176a402c079a1644de034ff6ab79 (diff)
downloadCMake-e7f78309e761af3c4c929388bba0cb967f670b35.zip
CMake-e7f78309e761af3c4c929388bba0cb967f670b35.tar.gz
CMake-e7f78309e761af3c4c929388bba0cb967f670b35.tar.bz2
find_library: Construct paths by removing 'unknown' from library arch
The compiler used for a build sometimes disagrees with the remainder of the toolchain wrt. to the architecture triple. Specifically, Clang will typically put its libraries in `<arch>-unknown-<os>-<env>` but it uses the GCC toolchain on many targets (which often has its libraries in `<arch>-<os>-<env>`). In such cases CMake will acquire the triple from Clang and use it in library search paths for libraries that are provided by the GCC toolchain. This of course fails due to the mismatch. This patch augments the list of search paths with ones that include the architecture triple with any occurrences of 'unknown' removed. Fixes: #24175
-rw-r--r--Source/cmSearchPath.cxx15
1 files changed, 15 insertions, 0 deletions
diff --git a/Source/cmSearchPath.cxx b/Source/cmSearchPath.cxx
index 6c53b85..44f37cb 100644
--- a/Source/cmSearchPath.cxx
+++ b/Source/cmSearchPath.cxx
@@ -179,12 +179,27 @@ void cmSearchPath::AddPrefixPaths(const std::vector<std::string>& paths,
cmValue arch =
this->FC->Makefile->GetDefinition("CMAKE_LIBRARY_ARCHITECTURE");
if (cmNonempty(arch)) {
+ std::string archNoUnknown = arch;
+ auto unknownAtPos = archNoUnknown.find("-unknown-");
+ bool foundUnknown = unknownAtPos != std::string::npos;
+ if (foundUnknown) {
+ // Replace "-unknown-" with "-".
+ archNoUnknown.replace(unknownAtPos, 9, "-");
+ }
if (this->FC->Makefile->IsDefinitionSet("CMAKE_SYSROOT") &&
this->FC->Makefile->IsDefinitionSet(
"CMAKE_PREFIX_LIBRARY_ARCHITECTURE")) {
+ if (foundUnknown) {
+ this->AddPathInternal(cmStrCat('/', archNoUnknown, dir, subdir),
+ cmStrCat('/', archNoUnknown, prefix), base);
+ }
this->AddPathInternal(cmStrCat('/', *arch, dir, subdir),
cmStrCat('/', *arch, prefix), base);
} else {
+ if (foundUnknown) {
+ this->AddPathInternal(cmStrCat(dir, subdir, '/', archNoUnknown),
+ prefix, base);
+ }
this->AddPathInternal(cmStrCat(dir, subdir, '/', *arch), prefix,
base);
}