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