diff --git a/Modules/CMakeCompilerABI.h b/Modules/CMakeCompilerABI.h index 8980abb5a..d6d5ca295 100644 --- a/Modules/CMakeCompilerABI.h +++ b/Modules/CMakeCompilerABI.h @@ -17,6 +17,8 @@ const char info_sizeof_dptr[] = { # define ABI_ID "ELF N32" #elif defined(__sgi) && defined(_ABI64) # define ABI_ID "ELF 64" +#elif defined(__sparcv9) +# define ABI_ID "SPARCV9" #elif defined(__ELF__) # define ABI_ID "ELF" #endif diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx index 0c7f0cfbd..45eb539c2 100644 --- a/Source/cmFindLibraryCommand.cxx +++ b/Source/cmFindLibraryCommand.cxx @@ -77,13 +77,19 @@ bool cmFindLibraryCommand::InitialPass(std::vector const& argsIn) return true; } - if(const char* abi = + if(const char* abi_name = this->Makefile->GetDefinition("CMAKE_INTERNAL_PLATFORM_ABI")) { - if(strncmp(abi, "ELF N32", 7) ==0) + std::string abi = abi_name; + if(abi.find("ELF N32") != abi.npos) { - // Convert /lib to /lib32 if the architecture requests it. - this->AddLib32Paths(); + // Convert lib to lib32. + this->AddArchitecturePaths("32"); + } + else if(abi.find("SPARCV9") != abi.npos) + { + // Convert lib to lib/sparcv9. + this->AddArchitecturePaths("/sparcv9"); } } @@ -117,42 +123,44 @@ bool cmFindLibraryCommand::InitialPass(std::vector const& argsIn) } //---------------------------------------------------------------------------- -void cmFindLibraryCommand::AddLib32Paths() +void cmFindLibraryCommand::AddArchitecturePaths(const char* suffix) { - std::vector path32; - bool found32 = false; + std::vector newPaths; + bool found = false; + std::string subpath = "lib"; + subpath += suffix; + subpath += "/"; for(std::vector::iterator i = this->SearchPaths.begin(); i != this->SearchPaths.end(); ++i) { + // Try replacing lib/ with lib/ std::string s = *i; - std::string s2 = *i; - cmSystemTools::ReplaceString(s, "lib/", "lib32/"); - // try to replace lib with lib32 and see if it is there, - // then prepend it to the path + cmSystemTools::ReplaceString(s, "lib/", subpath.c_str()); if((s != *i) && cmSystemTools::FileIsDirectory(s.c_str())) { - path32.push_back(s); - found32 = true; + found = true; + newPaths.push_back(s); } - // now just add a 32 to the path name and if it is there, - // add it to the path - s2 += "32"; - if(cmSystemTools::FileIsDirectory(s2.c_str())) + + // Now look for lib + s = *i; + s += suffix; + if(cmSystemTools::FileIsDirectory(s.c_str())) { - found32 = true; - path32.push_back(s2); + found = true; + newPaths.push_back(s); } // now add the original unchanged path if(cmSystemTools::FileIsDirectory(i->c_str())) { - path32.push_back(*i); + newPaths.push_back(*i); } } - // now replace the SearchPaths with the 32 bit converted path - // if any 32 bit paths were discovered - if(found32) + + // If any new paths were found replace the original set. + if(found) { - this->SearchPaths = path32; + this->SearchPaths = newPaths; } } diff --git a/Source/cmFindLibraryCommand.h b/Source/cmFindLibraryCommand.h index a0f2338af..aa4e46cbf 100644 --- a/Source/cmFindLibraryCommand.h +++ b/Source/cmFindLibraryCommand.h @@ -65,7 +65,7 @@ public: cmTypeMacro(cmFindLibraryCommand, cmFindBase); protected: - void AddLib32Paths(); + void AddArchitecturePaths(const char* suffix); void AddLib64Paths(); std::string FindLibrary(const char* name); };