Browse Source

ENH: Further centralized custom command dependency computation. Custom command dependencies in the source tree may now also be specified relative to the source directory.

Brad King 20 years ago
parent
commit
8340c0d186

+ 21 - 21
Source/cmLocalGenerator.cxx

@@ -1620,8 +1620,7 @@ void cmLocalGenerator::AddLanguageFlags(std::string& flags,
 
 //----------------------------------------------------------------------------
 std::string cmLocalGenerator::GetRealDependency(const char* inName,
-                                                const char* config,
-                                                bool* inLocal)
+                                                const char* config)
 {
   // Older CMake code may specify the dependency using the target
   // output file rather than the target name.  Such code would have
@@ -1634,22 +1633,8 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
     name = cmSystemTools::GetFilenameWithoutLastExtension(name);
     }
 
-  // Look for a CMake target in the current makefile.
-  cmTarget* target = m_Makefile->FindTarget(name.c_str());
-
-  // If no target was found in the current makefile search globally.
-  bool local = target?true:false;
-  if(inLocal)
-    {
-    *inLocal = local;
-    }
-  if(!local)
-    {
-    target = m_GlobalGenerator->FindTarget(0, name.c_str());
-    }
-
-  // If a target was found then get its real location.
-  if(target)
+  // Look for a CMake target with the given name.
+  if(cmTarget* target = m_GlobalGenerator->FindTarget(0, name.c_str()))
     {
     switch (target->GetType())
       {
@@ -1666,15 +1651,30 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
         }
         break;
       case cmTarget::UTILITY:
+        // Depending on a utility target may not work but just trust
+        // the user to have given a valid name.
+        return inName;
       case cmTarget::INSTALL_FILES:
       case cmTarget::INSTALL_PROGRAMS:
         break;
       }
     }
 
-  // The name was not that of a CMake target.  The dependency should
-  // use the name as given.
-  return inName;
+  // The name was not that of a CMake target.  It must name a file.
+  if(cmSystemTools::FileIsFullPath(inName))
+    {
+    // This is a full path.  Return it as given.
+    return inName;
+    }
+  else
+    {
+    // Treat the name as relative to the source directory in which it
+    // was given.
+    name = m_Makefile->GetCurrentDirectory();
+    name += "/";
+    name += inName;
+    return name;
+    }
 }
 
 //----------------------------------------------------------------------------

+ 6 - 6
Source/cmLocalGenerator.h

@@ -137,12 +137,12 @@ public:
   /** Translate a dependency as given in CMake code to the name to
       appear in a generated build file.  If the given name is that of
       a CMake target it will be transformed to the real output
-      location of that target for the given configuration.  Otherwise
-      the original name will be returned.  If the local argument is
-      given it is set to indicate whethr the name is of a utility
-      target available in the same makefile.  */
-  std::string GetRealDependency(const char* name, const char* config,
-                                bool* local=0);
+      location of that target for the given configuration.  If the
+      given name is the full path to a file it will be returned.
+      Otherwise the name is treated as a relative path with respect to
+      the source directory of this generator.  This should only be
+      used for dependencies of custom commands.  */
+  std::string GetRealDependency(const char* name, const char* config);
 
   ///! for existing files convert to output path and short path if spaces
   std::string ConvertToOutputForExisting(const char* p);

+ 14 - 42
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -2270,6 +2270,7 @@ cmLocalUnixMakefileGenerator3
 ::AppendTargetDepends(std::vector<std::string>& depends,
                       cmTarget& target)
 {
+  // Static libraries never depend on anything for linking.
   if(target.GetType() == cmTarget::STATIC_LIBRARY)
     {
     return;
@@ -2289,48 +2290,17 @@ cmLocalUnixMakefileGenerator3
     // Don't emit the same library twice for this target.
     if(emitted.insert(lib->first).second)
       {
-      // Add this dependency.
-      this->AppendAnyDepend(depends, lib->first.c_str());
-      }
-    }
-}
-
-//----------------------------------------------------------------------------
-void
-cmLocalUnixMakefileGenerator3
-::AppendAnyDepend(std::vector<std::string>& depends, const char* name)
-{
-  // There are a few cases for the name of the target:
-  //  - CMake target.
-  //  - Full path to a file: depend on it.
-  //  - Other format (like -lm): no file on which to depend, do nothing.
-
-  // Lookup the real name of the dependency in case it is a CMake target.
-  bool local;
-  std::string dep = this->GetRealDependency(name,
-                                            m_ConfigurationName.c_str(),
-                                            &local);
-  if(dep == name)
-    {
-    if(local)
-      {
-      // The dependency is on a CMake utility target in the current
-      // makefile.  Just depend on it directly.
-      depends.push_back(name);
-      }
-    else if(cmSystemTools::FileIsFullPath(name))
-      {
-      // This is a path to a file.  Just trust the listfile author
-      // that it will be present or there is a rule to build it.
-      depends.push_back(cmSystemTools::CollapseFullPath(name));
+      // Depend only on other CMake targets.
+      if(cmTarget* tgt = m_GlobalGenerator->FindTarget(0, lib->first.c_str()))
+        {
+        if(const char* location =
+           tgt->GetLocation(m_ConfigurationName.c_str()))
+          {
+          depends.push_back(location);
+          }
+        }
       }
     }
-  else
-    {
-    // The dependency is on a CMake target and has been transformed to
-    // the target's location on disk.
-    depends.push_back(dep);
-    }
 }
 
 //----------------------------------------------------------------------------
@@ -2370,8 +2340,10 @@ cmLocalUnixMakefileGenerator3
   for(std::vector<std::string>::const_iterator d = cc.GetDepends().begin();
       d != cc.GetDepends().end(); ++d)
     {
-    // Add this dependency.
-    this->AppendAnyDepend(depends, d->c_str());
+    // Lookup the real name of the dependency in case it is a CMake target.
+    std::string dep = this->GetRealDependency(d->c_str(),
+                                              m_ConfigurationName.c_str());
+    depends.push_back(dep);
     }
 }
 

+ 0 - 1
Source/cmLocalUnixMakefileGenerator3.h

@@ -327,7 +327,6 @@ protected:
   const char* GetSourceFileLanguage(const cmSourceFile& source);
   std::string ConvertToQuotedOutputPath(const char* p);
 
-  void AppendAnyDepend(std::vector<std::string>& depends, const char* name);
   void AppendRuleDepend(std::vector<std::string>& depends,
                         const char* ruleFileName);
   void AppendCustomDepends(std::vector<std::string>& depends,