Stephen Kelly wrote:

> I haven't dug any deeper into why calling that method is so slow. I assume
> it is hitting slow code paths in the parser because of the '$' which are
> not part of variables, but are generator expressions.

Here's a patch you can apply to play with the parsing problem. Simply apply 
it and try to build any helloworld cmake project.
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 8498d72..cdab63f 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -2154,6 +2154,50 @@ void cmMakefile::ExpandVariables()
       }
     }
 
+  std::string testcase = "/home/stephen/dev/src/kdelibs;/home/stephen/dev/build/qt48/kdelibs;/home/stephen/dev/src/kdelibs/interfaces;/home/stephen/dev/build/qt48/kdelibs/kdecore/network;/home/st"
+  "ephen/dev/build/qt48/kdelibs/k"
+  "decore/date;/home/stephen/dev/build/qt48/kdelibs/kdecore/compression;/home/stephen/dev/src/kdelibs/kdecore/auth;/home/stephen/dev/src/kdelibs/kjs;/home/stephen/dev/build/qt48/kdelibs/kjs;/home/stephen"
+  "/dev/src/kdelibs/kdecore;/home/stephen/dev/build/qt48/kdelibs/kdecore;/home/stephen/dev/src/kdelibs/kdecore/compression;/home/stephen/dev/src/kdelibs/kdecore/config;/home/stephen/dev/src/kdelibs/kdecore"
+  "/date;/home/stephen/dev/src/kdelibs/kdecore/io;/home/stephen/dev/src/kdelibs/kdecore/jobs;/home/stephen/dev/src/kdelibs/kdecore/kernel;/home/stephen/dev/src/kdelibs/kdecore/auth;/home/stephen/dev/src/kd"
+  "elibs/kdecore/network;/home/stephen/dev/src/kdelibs/kdecore/services;/home/stephen/dev/src/kdelibs/kdecore/localization;/home/stephen/dev/src/kdelibs/kdecore/sycoca;/home/stephen/dev/src/kdelibs/kdecore"
+  "/text;/home/stephen/dev/src/kdelibs/kdecore/util;/home/stephen/dev/src/kdelibs/kdecore/sonnet;/home/stephen/dev/prefix/qt48/include/QtXmlPatterns;/home/stephen/dev/prefix/qt48/include/QtXml;/home/stephen"
+  "/dev/prefix/qt48/include/QtWebKit;/home/stephen/dev/prefix/qt48/include/QtUiTools;/home/stephen/dev/prefix/qt48/include/QtTest;/home/stephen/dev/prefix/qt48/include/QtSvg;/home/stephen/dev/prefix/qt48/i"
+  "nclude/QtSql;/home/stephen/dev/prefix/qt48/include/QtScriptTools;/home/stephen/dev/prefix/qt48/include/QtScript;/home/stephen/dev/prefix/qt48/include/QtOpenGL;/home/stephen/dev/prefix/qt48/include/QtNet"
+  "work;/home/stephen/dev/prefix/qt48/include/QtMultimedia;/home/stephen/dev/prefix/qt48/include/QtHelp;/home/stephen/dev/prefix/qt48/include/QtDesigner;/home/stephen/dev/prefix/qt48/include/QtDesigner;/h"
+  "ome/stephen/dev/prefix/qt48/include/QtDeclarative;/home/stephen/dev/prefix/qt48/include/QtDBus;/home/stephen/dev/prefix/qt48/include/Qt3Support;/home/stephen/dev/prefix/qt48/include/QtGui;/home/stephen"
+  "/dev/prefix/qt48/include/QtCore;/home/stephen/dev/prefix/qt48/include/Qt;/home/stephen/dev/prefix/qt48/mkspecs/default;/home/stephen/dev/prefix/qt48/include;/usr/include;/usr/include;/usr/include;/usr/i"
+  "nclude;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/home/stephen/dev/prefix/qt48/include/QtXmlPattern"
+  "s;/home/stephen/dev/prefix/qt48/include/QtXml;/home/stephen/dev/prefix/qt48/include/QtWebKit;/home/stephen/dev/prefix/qt48/include/QtUiTools;/home/stephen/dev/prefix/qt48/include/QtTest;/home/stephen/de"
+  "v/prefix/qt48/include/QtSvg;/home/stephen/dev/prefix/qt48/include/QtSql;/home/stephen/dev/prefix/qt48/include/QtScriptTools;/home/stephen/dev/prefix/qt48/include/QtScript;/home/stephen/dev/prefix/qt48/in"
+  "clude/QtOpenGL;/home/stephen/dev/prefix/qt48/include/QtNetwork;/home/stephen/dev/prefix/qt48/include/QtMultimedia;/home/stephen/dev/prefix/qt48/include/QtHelp;/home/stephen/dev/prefix/qt48/include/QtDe"
+  "signer;/home/stephen/dev/prefix/qt48/include/QtDesigner;/home/stephen/dev/prefix/qt48/include/QtDeclarative;/home/stephen/dev/prefix/qt48/include/QtDBus;/home/stephen/dev/prefix/qt48/include/Qt3Sup"
+  "port;/home/stephen/dev/prefix/qt48/include/QtGui;/home/stephen/dev/prefix/qt48/include/QtCore;/home/stephen/dev/prefix/qt48/include/Qt;/home/stephen/dev/prefix/qt48/mkspecs/default;/home/stephen/dev/p"
+  "refix/qt48/include;/home/stephen/dev/src/kdelibs/kdecore/sonnet;/usr/include;/usr/include;/home/stephen/dev/src/kdelibs/kjs;/home/stephen/dev/build/qt48/kdelibs/kjs;/home/stephen/dev/src/kdelibs/kdeco"
+  "re;/home/stephen/dev/build/qt48/kdelibs/kdecore;/home/stephen/dev/src/kdelibs/kdecore/compression;/home/stephen/dev/src/kdelibs/kdecore/config;/home/stephen/dev/src/kdelibs/kdecore/date;/home/stephe"
+  "n/dev/src/kdelibs/kdecore/io;/home/stephen/dev/src/kdelibs/kdecore/jobs;/home/stephen/dev/src/kdelibs/kdecore/kernel;/home/stephen/dev/src/kdelibs/kdecore/auth;/home/stephen/dev/src/kdelibs/kdecore/ne"
+  "twork;/home/stephen/dev/src/kdelibs/kdecore/services;/home/stephen/dev/src/kdelibs/kdecore/localization;/home/stephen/dev/src/kdelibs/kdecore/sycoca;/home/stephen/dev/src/kdelibs/kdecore/text;/home/s"
+  "tephen/dev/src/kdelibs/kdecore/util;/home/stephen/dev/src/kdelibs/kdecore/sonnet;/home/stephen/dev/prefix/qt48/include/QtXmlPatterns;/home/stephen/dev/prefix/qt48/include/QtXml;/home/stephen/dev/pref"
+  "ix/qt48/include/QtWebKit;/home/stephen/dev/prefix/qt48/include/QtUiTools;/home/stephen/dev/prefix/qt48/include/QtTest;/home/stephen/dev/prefix/qt48/include/QtSvg;/home/stephen/dev/prefix/qt48/include"
+  "/QtSql;/home/stephen/dev/prefix/qt48/include/QtScriptTools;/home/stephen/dev/prefix/qt48/include/QtScript;/home/stephen/dev/prefix/qt48/include/QtOpenGL;/home/stephen/dev/prefix/qt48/include/QtNetwo"
+  "rk;/home/stephen/dev/prefix/qt48/include/QtMultimedia;/home/stephen/dev/prefix/qt48/include/QtHelp;/home/stephen/dev/prefix/qt48/include/QtDesigner;/home/stephen/dev/prefix/qt48/include/QtDesigner;/"
+  "home/stephen/dev/prefix/qt48/include/QtDeclarative;/home/stephen/dev/prefix/qt48/include/QtDBus;/home/stephen/dev/prefix/qt48/include/Qt3Support;/home/stephen/dev/prefix/qt48/include/QtGui;/home/ste"
+  "phen/dev/prefix/qt48/include/QtCore;/home/stephen/dev/prefix/qt48/include/Qt;/home/stephen/dev/prefix/qt48/mkspecs/default;/home/stephen/dev/prefix/qt48/include;/usr/include;/usr/include;/usr/includ"
+  "e;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;/usr/include;";
+
+  std::cout << "START" << std::endl;
+
+  for(int i = 0; i < 20; ++i)
+  this->ExpandVariablesInString(testcase, true, true);
+  std::cout << "Test1 done" << std::endl;
+
+  testcase += "$<$<TARGET_DEFINED:Qt4::QtTest>:$<TARGET_PROPERTY:Qt4::QtTest,INTERFACE_INCLUDE_DIRECTORIES>>"
+  ";$<$<TARGET_DEFINED:Qt4::QtNetwork>:$<TARGET_PROPERTY:Qt4::QtNetwork,INTERFACE_INCLUDE_DIRECTORIES>>";
+
+  for(int i = 0; i < 20; ++i)
+  this->ExpandVariablesInString(testcase, true, true);
+
+  std::cout << "Test2 done" << std::endl;
+
   for(std::vector<std::string>::iterator d = this->LinkDirectories.begin();
       d != this->LinkDirectories.end(); ++d)
     {

--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to