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
This commit is contained in:
Nemanja Ivanovic 2022-11-15 20:25:55 -06:00 committed by Brad King
parent 4f9ec5a9be
commit e7f78309e7

View File

@ -179,12 +179,27 @@ void cmSearchPath::AddPrefixPaths(const std::vector<std::string>& paths,
cmValue arch = cmValue arch =
this->FC->Makefile->GetDefinition("CMAKE_LIBRARY_ARCHITECTURE"); this->FC->Makefile->GetDefinition("CMAKE_LIBRARY_ARCHITECTURE");
if (cmNonempty(arch)) { 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") && if (this->FC->Makefile->IsDefinitionSet("CMAKE_SYSROOT") &&
this->FC->Makefile->IsDefinitionSet( this->FC->Makefile->IsDefinitionSet(
"CMAKE_PREFIX_LIBRARY_ARCHITECTURE")) { "CMAKE_PREFIX_LIBRARY_ARCHITECTURE")) {
if (foundUnknown) {
this->AddPathInternal(cmStrCat('/', archNoUnknown, dir, subdir),
cmStrCat('/', archNoUnknown, prefix), base);
}
this->AddPathInternal(cmStrCat('/', *arch, dir, subdir), this->AddPathInternal(cmStrCat('/', *arch, dir, subdir),
cmStrCat('/', *arch, prefix), base); cmStrCat('/', *arch, prefix), base);
} else { } else {
if (foundUnknown) {
this->AddPathInternal(cmStrCat(dir, subdir, '/', archNoUnknown),
prefix, base);
}
this->AddPathInternal(cmStrCat(dir, subdir, '/', *arch), prefix, this->AddPathInternal(cmStrCat(dir, subdir, '/', *arch), prefix,
base); base);
} }