This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  1849419857cb7f960e71af4f99be9327ce3f4675 (commit)
       via  2268c41a057d948ad6773c5145ee5bf6d19ea3bf (commit)
      from  21e61f055931d7e561b4ef4cab60ea7797fdf809 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1849419857cb7f960e71af4f99be9327ce3f4675
commit 1849419857cb7f960e71af4f99be9327ce3f4675
Merge: 21e61f0 2268c41
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Tue Aug 6 16:18:22 2013 -0400
Commit:     CMake Topic Stage <kwro...@kitware.com>
CommitDate: Tue Aug 6 16:18:22 2013 -0400

    Merge topic 'optimize-custom-command-dependencies' into next
    
    2268c41 Optimize custom command full-path dependency lookup


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2268c41a057d948ad6773c5145ee5bf6d19ea3bf
commit 2268c41a057d948ad6773c5145ee5bf6d19ea3bf
Author:     Nicolas Despres <nicolas.desp...@gmail.com>
AuthorDate: Tue Aug 6 18:12:50 2013 +0200
Commit:     Brad King <brad.k...@kitware.com>
CommitDate: Tue Aug 6 16:17:13 2013 -0400

    Optimize custom command full-path dependency lookup
    
    In the common case of custom command dependencies specified via full
    path optimize the implementation of GetSourceFileWithOutput using a
    (hash) map.  This is significantly faster than the existing linear
    search.  In the non-full-path case fall back to the existing linear
    suffix search.

diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index aae92dd..08c9763 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -150,6 +150,7 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new 
Internals)
   this->Initialize();
   this->CheckSystemVars = mf.CheckSystemVars;
   this->ListFileStack = mf.ListFileStack;
+  this->OutputToSource = mf.OutputToSource;
 }
 
 //----------------------------------------------------------------------------
@@ -1010,11 +1011,32 @@ cmMakefile::AddCustomCommandToOutput(const 
std::vector<std::string>& outputs,
     cc->SetEscapeOldStyle(escapeOldStyle);
     cc->SetEscapeAllowMakeVars(true);
     file->SetCustomCommand(cc);
+    this->UpdateOutputToSourceMap(outputs, file);
     }
   return file;
 }
 
 //----------------------------------------------------------------------------
+void
+cmMakefile::UpdateOutputToSourceMap(std::vector<std::string> const& outputs,
+                                    cmSourceFile* source)
+{
+  for(std::vector<std::string>::const_iterator o = outputs.begin();
+      o != outputs.end(); ++o)
+    {
+    this->UpdateOutputToSourceMap(*o, source);
+    }
+}
+
+//----------------------------------------------------------------------------
+void
+cmMakefile::UpdateOutputToSourceMap(std::string const& output,
+                                    cmSourceFile* source)
+{
+  this->OutputToSource[output] = source;
+}
+
+//----------------------------------------------------------------------------
 cmSourceFile*
 cmMakefile::AddCustomCommandToOutput(const char* output,
                                      const std::vector<std::string>& depends,
@@ -1994,7 +2016,7 @@ cmMakefile::AddNewTarget(cmTarget::TargetType type, const 
char* name)
   return &it->second;
 }
 
-cmSourceFile *cmMakefile::GetSourceFileWithOutput(const char *cname)
+cmSourceFile *cmMakefile::LinearGetSourceFileWithOutput(const char *cname)
 {
   std::string name = cname;
   std::string out;
@@ -2030,6 +2052,25 @@ cmSourceFile *cmMakefile::GetSourceFileWithOutput(const 
char *cname)
   return 0;
 }
 
+cmSourceFile *cmMakefile::GetSourceFileWithOutput(const char *cname)
+{
+  std::string name = cname;
+
+  // If the queried path is not absolute we use the backward compatible
+  // linear-time search for an output with a matching suffix.
+  if(!cmSystemTools::FileIsFullPath(cname))
+    {
+    return LinearGetSourceFileWithOutput(cname);
+    }
+  // Otherwise we use an efficient lookup map.
+  OutputToSourceMap::iterator o = this->OutputToSource.find(name);
+  if (o != this->OutputToSource.end())
+    {
+    return (*o).second;
+    }
+  return 0;
+}
+
 #if defined(CMAKE_BUILD_WITH_CMAKE)
 cmSourceGroup* cmMakefile::GetSourceGroup(const std::vector<std::string>&name)
 {
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 711a208..8bce9fd 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -29,6 +29,9 @@
 
 #include <cmsys/auto_ptr.hxx>
 #include <cmsys/RegularExpression.hxx>
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+# include <cmsys/hash_map.hxx>
+#endif
 
 class cmFunctionBlocker;
 class cmCommand;
@@ -1039,6 +1042,26 @@ private:
 
   bool GeneratingBuildSystem;
 
+  /**
+   * Old version of GetSourceFileWithOutput(const char*) kept for
+   * backward-compatibility. It implements a linear search and support
+   * relative file paths. It is used as a fall back by
+   * GetSourceFileWithOutput(const char*).
+   */
+  cmSourceFile *LinearGetSourceFileWithOutput(const char *cname);
+
+  // A map for fast output to input look up.
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+  typedef cmsys::hash_map<std::string, cmSourceFile*> OutputToSourceMap;
+#else
+  typedef std::map<std::string, cmSourceFile*> OutputToSourceMap;
+#endif
+  OutputToSourceMap OutputToSource;
+
+  void UpdateOutputToSourceMap(std::vector<std::string> const& outputs,
+                               cmSourceFile* source);
+  void UpdateOutputToSourceMap(std::string const& output,
+                               cmSourceFile* source);
 };
 
 //----------------------------------------------------------------------------

-----------------------------------------------------------------------

Summary of changes:
 Source/cmMakefile.cxx |   43 ++++++++++++++++++++++++++++++++++++++++++-
 Source/cmMakefile.h   |   23 +++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletions(-)


hooks/post-receive
-- 
CMake
_______________________________________________
Cmake-commits mailing list
Cmake-commits@cmake.org
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-commits

Reply via email to