Commit 733726ed authored by Brad King's avatar Brad King

find_library: Fix mixed lib->lib64 (non-)conversion cases (#13419)

When a search path contains multiple "lib/" instances we previously
converted all or none.  This fails for cases where only some of the
multiple instances must be converted.  Teach AddArchitecturePaths to
generate all combinations that exist.  Uncomment these cases in the
CMakeOnly.find_library test now that they work.
parent 54add62f
......@@ -134,32 +134,51 @@ void cmFindLibraryCommand::AddArchitecturePaths(const char* suffix)
{
std::vector<std::string> original;
original.swap(this->SearchPaths);
std::string subpath = "lib";
subpath += suffix;
subpath += "/";
for(std::vector<std::string>::iterator i = original.begin();
i != original.end(); ++i)
{
// Try replacing lib/ with lib<suffix>/
std::string s = *i;
cmSystemTools::ReplaceString(s, "lib/", subpath.c_str());
if((s != *i) && cmSystemTools::FileIsDirectory(s.c_str()))
this->AddArchitecturePath(*i, 0, suffix);
}
}
//----------------------------------------------------------------------------
void cmFindLibraryCommand::AddArchitecturePath(
std::string const& dir, std::string::size_type start_pos,
const char* suffix, bool fresh)
{
std::string::size_type pos = dir.find("lib/", start_pos);
if(pos != std::string::npos)
{
std::string cur_dir = dir.substr(0,pos+3);
// Follow "lib<suffix>".
std::string next_dir = cur_dir + suffix;
if(cmSystemTools::FileIsDirectory(next_dir.c_str()))
{
this->SearchPaths.push_back(s);
next_dir += dir.substr(pos+3);
std::string::size_type next_pos = pos+3+strlen(suffix)+1;
this->AddArchitecturePath(next_dir, next_pos, suffix);
}
// Now look for <original><suffix>/
s = *i;
s += suffix;
s += "/";
if(cmSystemTools::FileIsDirectory(s.c_str()))
// Follow "lib".
if(cmSystemTools::FileIsDirectory(cur_dir.c_str()))
{
this->AddArchitecturePath(dir, pos+3+1, suffix, false);
}
}
if(fresh)
{
// Check for <dir><suffix>/.
std::string cur_dir = dir + suffix + "/";
if(cmSystemTools::FileIsDirectory(cur_dir.c_str()))
{
this->SearchPaths.push_back(s);
this->SearchPaths.push_back(cur_dir);
}
// Now add the original unchanged path
if(cmSystemTools::FileIsDirectory(i->c_str()))
if(cmSystemTools::FileIsDirectory(dir.c_str()))
{
this->SearchPaths.push_back(*i);
this->SearchPaths.push_back(dir);
}
}
}
......
......@@ -62,6 +62,10 @@ public:
protected:
void AddArchitecturePaths(const char* suffix);
void AddArchitecturePath(std::string const& dir,
std::string::size_type start_pos,
const char* suffix,
bool fresh = true);
std::string FindLibrary();
virtual void GenerateDocumentation();
private:
......
......@@ -50,9 +50,9 @@ endforeach()
set(CMAKE_SIZEOF_VOID_P 8)
foreach(lib64
lib/64/libtest2.a
#lib/A/lib64/libtest3.a # known breakage
lib/A/lib64/libtest3.a
lib/libtest3.a
#lib64/A/lib/libtest2.a # known breakage
lib64/A/lib/libtest2.a
lib64/A/lib64/libtest1.a
lib64/A/libtest1.a
lib64/libtest1.a
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment