[Cmake-commits] CMake branch, next, updated. v3.0.0-rc3-1934-g966b57f

Stephen Kelly steveire at gmail.com
Sun Apr 6 04:02:56 EDT 2014


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  966b57fbdeaf35998bf88fa9bfbb22f1d41716a0 (commit)
       via  a4e6bf8e36e6fa38bb40dc6df2345922de86bad4 (commit)
       via  92e2fbe103c6ffc3af1189d0450493488c65baaa (commit)
       via  c5b26f3bec0e6e18255802da53886eae30a74021 (commit)
       via  eb163f37d449af27fe8446c5d8d632aa295b6428 (commit)
      from  821c131b55fd2aefae81e8c417a6009bc1df1fb7 (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=966b57fbdeaf35998bf88fa9bfbb22f1d41716a0
commit 966b57fbdeaf35998bf88fa9bfbb22f1d41716a0
Merge: 821c131 a4e6bf8
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Sun Apr 6 04:02:55 2014 -0400
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Sun Apr 6 04:02:55 2014 -0400

    Merge topic 'optimize-source-file-processing' into next
    
    a4e6bf8e cmTarget: Make GetSourceFiles string overload private.
    92e2fbe1 cmGeneratorTarget: Trace cmSourceFile objects instead of strings.
    c5b26f3b cmTarget: Cache the cmSourceFiles in GetSourceFiles.
    eb163f37 cmTarget: Extract a ProcessSourceItemCMP0049 method.


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a4e6bf8e36e6fa38bb40dc6df2345922de86bad4
commit a4e6bf8e36e6fa38bb40dc6df2345922de86bad4
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Sat Apr 5 12:35:43 2014 +0200
Commit:     Stephen Kelly <steveire at gmail.com>
CommitDate: Sun Apr 6 10:02:34 2014 +0200

    cmTarget: Make GetSourceFiles string overload private.
    
    Consumers should use the cmSourceFile overload, which is now
    always the case.

diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index a8ac57f..da9d0a1 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -135,9 +135,6 @@ public:
   /**
    * Get the list of the source files used by this target
    */
-  void GetSourceFiles(std::vector<std::string> &files,
-                      const std::string& config,
-                      cmTarget const* head = 0) const;
   void GetSourceFiles(std::vector<cmSourceFile*> &files,
                       const std::string& config,
                       cmTarget const* head = 0) const;
@@ -683,6 +680,9 @@ private:
                                        const std::string& config,
                                        bool contentOnly) const;
 
+  void GetSourceFiles(std::vector<std::string> &files,
+                      const std::string& config,
+                      cmTarget const* head = 0) const;
 private:
   std::string Name;
   std::vector<cmCustomCommand> PreBuildCommands;

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=92e2fbe103c6ffc3af1189d0450493488c65baaa
commit 92e2fbe103c6ffc3af1189d0450493488c65baaa
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Sat Apr 5 11:41:58 2014 +0200
Commit:     Stephen Kelly <steveire at gmail.com>
CommitDate: Sun Apr 6 10:02:34 2014 +0200

    cmGeneratorTarget: Trace cmSourceFile objects instead of strings.
    
    This reverses the decision in commit d38423ec (cmTarget: Add a
    method to obtain list of filenames for sources., 2014-03-17).  The
    cmSourceFile based API is preferred because that avoids creation of
    many cmSourceFileLocation objects for matching strings, and the
    result is cached by cmTarget.

diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 69a2977..0d25a00 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -606,12 +606,12 @@ private:
   cmGlobalGenerator const* GlobalGenerator;
   typedef cmGeneratorTarget::SourceEntry SourceEntry;
   SourceEntry* CurrentEntry;
-  std::queue<std::string> SourceQueue;
-  std::set<std::string> SourcesQueued;
+  std::queue<cmSourceFile*> SourceQueue;
+  std::set<cmSourceFile*> SourcesQueued;
   typedef std::map<std::string, cmSourceFile*> NameMapType;
   NameMapType NameMap;
 
-  void QueueSource(std::string const& name);
+  void QueueSource(cmSourceFile* sf);
   void FollowName(std::string const& name);
   void FollowNames(std::vector<std::string> const& names);
   bool IsUtility(std::string const& dep);
@@ -642,19 +642,19 @@ cmTargetTraceDependencies
       {
       configs.push_back("");
       }
-    std::set<std::string> emitted;
+    std::set<cmSourceFile*> emitted;
     for(std::vector<std::string>::const_iterator ci = configs.begin();
         ci != configs.end(); ++ci)
       {
-      std::vector<std::string> sources;
+      std::vector<cmSourceFile*> sources;
       this->Target->GetSourceFiles(sources, *ci);
-      for(std::vector<std::string>::const_iterator si = sources.begin();
+      for(std::vector<cmSourceFile*>::const_iterator si = sources.begin();
           si != sources.end(); ++si)
         {
-        if(emitted.insert(*si).second && this->SourcesQueued.insert(*si).second)
+        cmSourceFile* sf = *si;
+        if(emitted.insert(sf).second && this->SourcesQueued.insert(sf).second)
           {
-          this->SourceQueue.push(*si);
-          this->Makefile->GetOrCreateSource(*si);
+          this->SourceQueue.push(sf);
           }
         }
       }
@@ -673,8 +673,7 @@ void cmTargetTraceDependencies::Trace()
   while(!this->SourceQueue.empty())
     {
     // Get the next source from the queue.
-    std::string src = this->SourceQueue.front();
-    cmSourceFile* sf = this->Makefile->GetSource(src);
+    cmSourceFile* sf = this->SourceQueue.front();
     this->SourceQueue.pop();
     this->CurrentEntry = &this->GeneratorTarget->SourceEntries[sf];
 
@@ -702,14 +701,14 @@ void cmTargetTraceDependencies::Trace()
 }
 
 //----------------------------------------------------------------------------
-void cmTargetTraceDependencies::QueueSource(std::string const& name)
+void cmTargetTraceDependencies::QueueSource(cmSourceFile* sf)
 {
-  if(this->SourcesQueued.insert(name).second)
+  if(this->SourcesQueued.insert(sf).second)
     {
-    this->SourceQueue.push(name);
+    this->SourceQueue.push(sf);
 
     // Make sure this file is in the target.
-    this->Target->AddSource(name);
+    this->Target->AddSource(sf->GetFullPath());
     }
 }
 
@@ -731,7 +730,7 @@ void cmTargetTraceDependencies::FollowName(std::string const& name)
       {
       this->CurrentEntry->Depends.push_back(sf);
       }
-    this->QueueSource(sf->GetFullPath());
+    this->QueueSource(sf);
     }
 }
 

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c5b26f3bec0e6e18255802da53886eae30a74021
commit c5b26f3bec0e6e18255802da53886eae30a74021
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Sat Apr 5 11:40:38 2014 +0200
Commit:     Stephen Kelly <steveire at gmail.com>
CommitDate: Sun Apr 6 10:02:34 2014 +0200

    cmTarget: Cache the cmSourceFiles in GetSourceFiles.
    
    Avoid calling GetSourceFiles with the same result container multiple
    times when tracing target dependencies.  The result from the previous
    configuration is cached and used later otherwise.

diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 01fad26..69a2977 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -636,26 +636,26 @@ cmTargetTraceDependencies
   // Queue all the source files already specified for the target.
   if (this->Target->GetType() != cmTarget::INTERFACE_LIBRARY)
     {
-    std::vector<std::string> sources;
     std::vector<std::string> configs;
     this->Makefile->GetConfigurations(configs);
     if (configs.empty())
       {
       configs.push_back("");
       }
+    std::set<std::string> emitted;
     for(std::vector<std::string>::const_iterator ci = configs.begin();
         ci != configs.end(); ++ci)
       {
+      std::vector<std::string> sources;
       this->Target->GetSourceFiles(sources, *ci);
-      }
-    std::set<std::string> emitted;
-    for(std::vector<std::string>::const_iterator si = sources.begin();
-        si != sources.end(); ++si)
-      {
-      if(emitted.insert(*si).second && this->SourcesQueued.insert(*si).second)
+      for(std::vector<std::string>::const_iterator si = sources.begin();
+          si != sources.end(); ++si)
         {
-        this->SourceQueue.push(*si);
-        this->Makefile->GetOrCreateSource(*si);
+        if(emitted.insert(*si).second && this->SourcesQueued.insert(*si).second)
+          {
+          this->SourceQueue.push(*si);
+          this->Makefile->GetOrCreateSource(*si);
+          }
         }
       }
     }
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 22be57f..d28ac3f 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -138,6 +138,10 @@ public:
                                                           LinkClosureMapType;
   LinkClosureMapType LinkClosureMap;
 
+  typedef std::map<TargetConfigPair, std::vector<cmSourceFile*> >
+                                                          SourceFilesMapType;
+  SourceFilesMapType SourceFilesMap;
+
   struct TargetPropertyEntry {
     TargetPropertyEntry(cmsys::auto_ptr<cmCompiledGeneratorExpression> cge,
       const std::string &targetName = std::string())
@@ -793,19 +797,33 @@ void cmTarget::GetSourceFiles(std::vector<cmSourceFile*> &files,
                               const std::string& config,
                               cmTarget const* head) const
 {
-  std::vector<std::string> srcs;
-  this->GetSourceFiles(srcs, config, head);
 
-  std::set<cmSourceFile*> emitted;
+  // Lookup any existing link implementation for this configuration.
+  TargetConfigPair key(head, cmSystemTools::UpperCase(config));
 
-  for(std::vector<std::string>::const_iterator i = srcs.begin();
-      i != srcs.end(); ++i)
+  cmTargetInternals::SourceFilesMapType::iterator
+    it = this->Internal->SourceFilesMap.find(key);
+  if(it != this->Internal->SourceFilesMap.end())
+    {
+    files = it->second;
+    }
+  else
     {
-    cmSourceFile* sf = this->Makefile->GetOrCreateSource(*i);
-    if (emitted.insert(sf).second)
+    std::vector<std::string> srcs;
+    this->GetSourceFiles(srcs, config, head);
+
+    std::set<cmSourceFile*> emitted;
+
+    for(std::vector<std::string>::const_iterator i = srcs.begin();
+        i != srcs.end(); ++i)
       {
-      files.push_back(sf);
+      cmSourceFile* sf = this->Makefile->GetOrCreateSource(*i);
+      if (emitted.insert(sf).second)
+        {
+        files.push_back(sf);
+        }
       }
+    this->Internal->SourceFilesMap[key] = files;
     }
 }
 
@@ -835,6 +853,7 @@ void cmTarget::AddSources(std::vector<std::string> const& srcs)
     }
   if (!srcFiles.empty())
     {
+    this->Internal->SourceFilesMap.clear();
     cmListFileBacktrace lfbt;
     this->Makefile->GetBacktrace(lfbt);
     cmGeneratorExpression ge(lfbt);
@@ -969,6 +988,7 @@ cmSourceFile* cmTarget::AddSource(const std::string& src)
                    TargetPropertyEntryFinder(sfl))
                                       == this->Internal->SourceEntries.end())
     {
+    this->Internal->SourceFilesMap.clear();
     cmListFileBacktrace lfbt;
     this->Makefile->GetBacktrace(lfbt);
     cmGeneratorExpression ge(lfbt);
@@ -1738,6 +1758,7 @@ void cmTarget::SetProperty(const std::string& prop, const char* value)
       this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
       return;
       }
+    this->Internal->SourceFilesMap.clear();
     cmListFileBacktrace lfbt;
     this->Makefile->GetBacktrace(lfbt);
     cmGeneratorExpression ge(lfbt);
@@ -1824,7 +1845,7 @@ void cmTarget::AppendProperty(const std::string& prop, const char* value,
       this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
       return;
       }
-
+      this->Internal->SourceFilesMap.clear();
       cmListFileBacktrace lfbt;
       this->Makefile->GetBacktrace(lfbt);
       cmGeneratorExpression ge(lfbt);

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=eb163f37d449af27fe8446c5d8d632aa295b6428
commit eb163f37d449af27fe8446c5d8d632aa295b6428
Author:     Stephen Kelly <steveire at gmail.com>
AuthorDate: Fri Apr 4 17:45:28 2014 +0200
Commit:     Stephen Kelly <steveire at gmail.com>
CommitDate: Sun Apr 6 10:02:34 2014 +0200

    cmTarget: Extract a ProcessSourceItemCMP0049 method.
    
    Avoid calling AddSource for each src filename.  That involves
    checking each entry for uniqueness and creating a separate
    generator expression for each one.
    
    Instead, add a single entry for the list of sources.  The source
    files are passed through a uniqueness filter at generate-time, so
    duplicates don't matter so much.

diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index b6bb2d3..22be57f 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -812,23 +812,41 @@ void cmTarget::GetSourceFiles(std::vector<cmSourceFile*> &files,
 //----------------------------------------------------------------------------
 void cmTarget::AddSources(std::vector<std::string> const& srcs)
 {
+  std::string srcFiles;
+  const char* sep = "";
   for(std::vector<std::string>::const_iterator i = srcs.begin();
       i != srcs.end(); ++i)
     {
-    const char* src = i->c_str();
-    if(src[0] == '$' && src[1] == '<')
-      {
-      this->AddSource(src);
-      }
-    else
+    std::string filename = *i;
+    const char* src = filename.c_str();
+
+    if(!(src[0] == '$' && src[1] == '<'))
       {
-      this->AddSourceCMP0049(src);
+      filename = this->ProcessSourceItemCMP0049(filename);
+      if (cmSystemTools::GetErrorOccuredFlag())
+        {
+        return;
+        }
+      this->Makefile->GetOrCreateSource(filename);
       }
+    srcFiles += sep;
+    srcFiles += filename;
+    sep = ";";
+    }
+  if (!srcFiles.empty())
+    {
+    cmListFileBacktrace lfbt;
+    this->Makefile->GetBacktrace(lfbt);
+    cmGeneratorExpression ge(lfbt);
+    cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(srcFiles);
+    cge->SetEvaluateForBuildsystem(true);
+    this->Internal->SourceEntries.push_back(
+                          new cmTargetInternals::TargetPropertyEntry(cge));
     }
 }
 
 //----------------------------------------------------------------------------
-cmSourceFile* cmTarget::AddSourceCMP0049(const std::string& s)
+std::string cmTarget::ProcessSourceItemCMP0049(const std::string& s)
 {
   std::string src = s;
 
@@ -863,10 +881,22 @@ cmSourceFile* cmTarget::AddSourceCMP0049(const std::string& s)
       this->Makefile->IssueMessage(messageType, e.str());
       if (messageType == cmake::FATAL_ERROR)
         {
-        return 0;
+        return "";
         }
       }
     }
+  return src;
+}
+
+//----------------------------------------------------------------------------
+cmSourceFile* cmTarget::AddSourceCMP0049(const std::string& s)
+{
+  std::string src = this->ProcessSourceItemCMP0049(s);
+
+  if (cmSystemTools::GetErrorOccuredFlag())
+    {
+    return 0;
+    }
   return this->AddSource(src);
 }
 
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index da032a5..a8ac57f 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -752,6 +752,8 @@ private:
   void ComputeLinkClosure(const std::string& config, LinkClosure& lc,
                           cmTarget const* head) const;
 
+  std::string ProcessSourceItemCMP0049(const std::string& s);
+
   void ClearLinkMaps();
 
   void MaybeInvalidatePropertyCache(const std::string& prop);

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

Summary of changes:


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list