summaryrefslogtreecommitdiffstats
path: root/Source/cmOrderLinkDirectories.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2006-04-04 18:25:17 (GMT)
committerBrad King <brad.king@kitware.com>2006-04-04 18:25:17 (GMT)
commit57a9e26c151f429bc41dd90e86bc50ada9600bd1 (patch)
tree85d6261d26a455c99ecb59a518058d26d0481081 /Source/cmOrderLinkDirectories.cxx
parente45ef47bb8081ddc20f3f1997f253184e4adfcc8 (diff)
downloadCMake-57a9e26c151f429bc41dd90e86bc50ada9600bd1.zip
CMake-57a9e26c151f429bc41dd90e86bc50ada9600bd1.tar.gz
CMake-57a9e26c151f429bc41dd90e86bc50ada9600bd1.tar.bz2
BUG: Fixed cmOrderLinkDirectories to make sure cmake-built libraries are found properly. Also taking libraries that will be built but may not yet exist into account. The per-configuration subdirectories that are included by generators in the link path are checked for conflicting libraries also. Potentially conflicting libraries that are actually symlinks back to the desired library are no longer considered conflicting, which avoids bogus impossible ordering warnings.
Diffstat (limited to 'Source/cmOrderLinkDirectories.cxx')
-rw-r--r--Source/cmOrderLinkDirectories.cxx86
1 files changed, 75 insertions, 11 deletions
diff --git a/Source/cmOrderLinkDirectories.cxx b/Source/cmOrderLinkDirectories.cxx
index 4d74c47..5a3b405 100644
--- a/Source/cmOrderLinkDirectories.cxx
+++ b/Source/cmOrderLinkDirectories.cxx
@@ -11,14 +11,12 @@ cmOrderLinkDirectories::cmOrderLinkDirectories()
}
//-------------------------------------------------------------------
-bool cmOrderLinkDirectories::LibraryInDirectory(const char* dir,
+bool cmOrderLinkDirectories::LibraryInDirectory(const char* desiredLib,
+ const char* dir,
const char* libIn)
{
- cmStdString path = dir;
- path += "/";
- path += libIn;
// first look for the library as given
- if(cmSystemTools::FileExists(path.c_str()))
+ if(this->LibraryMayConflict(desiredLib, dir, libIn))
{
return true;
}
@@ -33,10 +31,9 @@ bool cmOrderLinkDirectories::LibraryInDirectory(const char* dir,
{
if(ext != *i)
{
- path = dir;
- path += "/";
- path += lib + *i;
- if(cmSystemTools::FileExists(path.c_str()))
+ std::string fname = lib;
+ lib += *i;
+ if(this->LibraryMayConflict(desiredLib, dir, fname.c_str()))
{
return true;
}
@@ -58,7 +55,8 @@ void cmOrderLinkDirectories::FindLibrariesInSearchPaths()
{
if(lib->second.Path != *dir)
{
- if(this->LibraryInDirectory(dir->c_str(), lib->second.File.c_str()))
+ if(this->LibraryInDirectory(lib->second.FullPath.c_str(),
+ dir->c_str(), lib->second.File.c_str()))
{
this->LibraryToDirectories[lib->second.FullPath].push_back(*dir);
}
@@ -244,12 +242,17 @@ void cmOrderLinkDirectories::OrderPaths(std::vector<cmStdString>&
void cmOrderLinkDirectories::SetLinkInformation(
const char* targetName,
const std::vector<std::string>& linkLibraries,
- const std::vector<std::string>& linkDirectories
+ const std::vector<std::string>& linkDirectories,
+ const cmTargetManifest& manifest,
+ const char* configSubdir
)
{
// Save the target name.
this->TargetName = targetName;
+ // Save the subdirectory used for linking in this configuration.
+ this->ConfigSubdir = configSubdir? configSubdir : "";
+
// Merge the link directory search path given into our path set.
std::vector<cmStdString> empty;
for(std::vector<std::string>::const_iterator p = linkDirectories.begin();
@@ -270,6 +273,17 @@ void cmOrderLinkDirectories::SetLinkInformation(
{
this->RawLinkItems.push_back(*l);
}
+
+ // Construct a set of files that will exist after building.
+ for(cmTargetManifest::const_iterator i = manifest.begin();
+ i != manifest.end(); ++i)
+ {
+ for(cmTargetSet::const_iterator j = i->second.begin();
+ j != i->second.end(); ++j)
+ {
+ this->ManifestFiles.insert(*j);
+ }
+ }
}
//-------------------------------------------------------------------
@@ -464,3 +478,53 @@ void cmOrderLinkDirectories::GetFullPathLibraries(std::vector<cmStdString>&
}
}
+
+//----------------------------------------------------------------------------
+bool cmOrderLinkDirectories::LibraryMayConflict(const char* desiredLib,
+ const char* dir,
+ const char* fname)
+{
+ // We need to check whether the given file may be picked up by the
+ // linker. This will occur if it exists as given or may be built
+ // using the name given.
+ bool found = false;
+ std::string path = dir;
+ path += "/";
+ path += fname;
+ if(this->ManifestFiles.find(path) != this->ManifestFiles.end())
+ {
+ found = true;
+ }
+ else if(cmSystemTools::FileExists(path.c_str()))
+ {
+ found = true;
+ }
+
+ // When linking with a multi-configuration build tool the
+ // per-configuration subdirectory is added to each link path. Check
+ // this subdirectory too.
+ if(!found && !this->ConfigSubdir.empty())
+ {
+ path = dir;
+ path += "/";
+ path += this->ConfigSubdir;
+ path += "/";
+ path += fname;
+ if(this->ManifestFiles.find(path) != this->ManifestFiles.end())
+ {
+ found = true;
+ }
+ else if(cmSystemTools::FileExists(path.c_str()))
+ {
+ found = true;
+ }
+ }
+
+ // A library conflicts if it is found and is not a symlink back to
+ // the desired library.
+ if(found)
+ {
+ return !cmSystemTools::SameFile(desiredLib, path.c_str());
+ }
+ return false;
+}