diff options
author | Nemanja Ivanovic <nemanjai@ca.ibm.com> | 2022-11-16 02:25:55 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-12-01 22:55:39 (GMT) |
commit | e7f78309e761af3c4c929388bba0cb967f670b35 (patch) | |
tree | 48763326c556cbad51b022bb04a0ab07b24ac44f | |
parent | 4f9ec5a9befe176a402c079a1644de034ff6ab79 (diff) | |
download | CMake-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.cxx | 15 |
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); } |