mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-03 21:00:01 -05:00
Add support for x32-abi
Detect x32-abi through CMakeCompilerABI infrastruture and use this information at runtime to determine the correct library paths with `FIND_LIBRARY_USE_LIBX32_PATHS`. Fixes: #15994
This commit is contained in:
committed by
Brad King
parent
06ef23c3e0
commit
462cf25427
@@ -195,8 +195,10 @@ void cmExportInstallFileGenerator::GenerateImportPrefix(std::ostream& os)
|
||||
<< " \"${CMAKE_CURRENT_LIST_FILE}\" PATH)\n";
|
||||
if (cmHasLiteralPrefix(absDestS.c_str(), "/lib/") ||
|
||||
cmHasLiteralPrefix(absDestS.c_str(), "/lib64/") ||
|
||||
cmHasLiteralPrefix(absDestS.c_str(), "/libx32/") ||
|
||||
cmHasLiteralPrefix(absDestS.c_str(), "/usr/lib/") ||
|
||||
cmHasLiteralPrefix(absDestS.c_str(), "/usr/lib64/")) {
|
||||
cmHasLiteralPrefix(absDestS.c_str(), "/usr/lib64/") ||
|
||||
cmHasLiteralPrefix(absDestS.c_str(), "/usr/libx32/")) {
|
||||
// Handle "/usr move" symlinks created by some Linux distros.
|
||||
/* clang-format off */
|
||||
os <<
|
||||
|
||||
@@ -43,7 +43,8 @@ bool cmFindLibraryCommand::InitialPass(std::vector<std::string> const& argsIn,
|
||||
return true;
|
||||
}
|
||||
|
||||
// add custom lib<qual> paths instead of using fixed lib32 or lib64
|
||||
// add custom lib<qual> paths instead of using fixed lib32, lib64 or
|
||||
// libx32
|
||||
if (const char* customLib = this->Makefile->GetDefinition(
|
||||
"CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX")) {
|
||||
this->AddArchitecturePaths(customLib);
|
||||
@@ -60,6 +61,12 @@ bool cmFindLibraryCommand::InitialPass(std::vector<std::string> const& argsIn,
|
||||
"FIND_LIBRARY_USE_LIB64_PATHS")) {
|
||||
this->AddArchitecturePaths("64");
|
||||
}
|
||||
// add special 32 bit paths if this is an x32 compile.
|
||||
else if (this->Makefile->PlatformIsx32() &&
|
||||
this->Makefile->GetState()->GetGlobalPropertyAsBool(
|
||||
"FIND_LIBRARY_USE_LIBX32_PATHS")) {
|
||||
this->AddArchitecturePaths("x32");
|
||||
}
|
||||
|
||||
std::string library = this->FindLibrary();
|
||||
if (library != "") {
|
||||
|
||||
@@ -92,6 +92,7 @@ cmFindPackageCommand::cmFindPackageCommand()
|
||||
this->DebugMode = false;
|
||||
this->UseLib32Paths = false;
|
||||
this->UseLib64Paths = false;
|
||||
this->UseLibx32Paths = false;
|
||||
this->PolicyScope = true;
|
||||
this->VersionMajor = 0;
|
||||
this->VersionMinor = 0;
|
||||
@@ -173,6 +174,13 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args,
|
||||
this->UseLib64Paths = true;
|
||||
}
|
||||
|
||||
// Lookup whether libx32 paths should be used.
|
||||
if (this->Makefile->PlatformIsx32() &&
|
||||
this->Makefile->GetState()->GetGlobalPropertyAsBool(
|
||||
"FIND_LIBRARY_USE_LIBX32_PATHS")) {
|
||||
this->UseLibx32Paths = true;
|
||||
}
|
||||
|
||||
// Check if User Package Registry should be disabled
|
||||
if (this->Makefile->IsOn("CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY")) {
|
||||
this->NoUserRegistry = true;
|
||||
@@ -2002,6 +2010,9 @@ bool cmFindPackageCommand::SearchPrefix(std::string const& prefix_in)
|
||||
if (this->UseLib64Paths) {
|
||||
common.push_back("lib64");
|
||||
}
|
||||
if (this->UseLibx32Paths) {
|
||||
common.push_back("libx32");
|
||||
}
|
||||
common.push_back("lib");
|
||||
common.push_back("share");
|
||||
|
||||
|
||||
@@ -169,6 +169,7 @@ private:
|
||||
bool DebugMode;
|
||||
bool UseLib32Paths;
|
||||
bool UseLib64Paths;
|
||||
bool UseLibx32Paths;
|
||||
bool PolicyScope;
|
||||
std::string LibraryArchitecture;
|
||||
std::vector<std::string> Names;
|
||||
|
||||
@@ -2149,6 +2149,12 @@ bool cmMakefile::IsSet(const std::string& name) const
|
||||
|
||||
bool cmMakefile::PlatformIs32Bit() const
|
||||
{
|
||||
if (const char* plat_abi =
|
||||
this->GetDefinition("CMAKE_INTERNAL_PLATFORM_ABI")) {
|
||||
if (strcmp(plat_abi, "ELF X32") == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (const char* sizeof_dptr = this->GetDefinition("CMAKE_SIZEOF_VOID_P")) {
|
||||
return atoi(sizeof_dptr) == 4;
|
||||
}
|
||||
@@ -2163,6 +2169,17 @@ bool cmMakefile::PlatformIs64Bit() const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cmMakefile::PlatformIsx32() const
|
||||
{
|
||||
if (const char* plat_abi =
|
||||
this->GetDefinition("CMAKE_INTERNAL_PLATFORM_ABI")) {
|
||||
if (strcmp(plat_abi, "ELF X32") == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cmMakefile::PlatformIsAppleIos() const
|
||||
{
|
||||
std::string sdkRoot;
|
||||
|
||||
@@ -436,6 +436,8 @@ public:
|
||||
|
||||
/** Return whether the target platform is 64-bit. */
|
||||
bool PlatformIs64Bit() const;
|
||||
/** Return whether the target platform is x32. */
|
||||
bool PlatformIsx32() const;
|
||||
|
||||
/** Return whether the target platform is Apple iOS. */
|
||||
bool PlatformIsAppleIos() const;
|
||||
|
||||
Reference in New Issue
Block a user