diff --git a/make-glob-faster.patch b/make-glob-faster.patch new file mode 100644 index 0000000..418358c --- /dev/null +++ b/make-glob-faster.patch @@ -0,0 +1,116 @@ +Index: read.c +=================================================================== +RCS file: /sources/make/make/read.c,v +retrieving revision 1.198 +retrieving revision 1.200 +diff -u -p -u -r1.198 -r1.200 +--- read.c 29 Apr 2011 15:27:39 -0000 1.198 ++++ read.c 7 May 2011 14:36:12 -0000 1.200 +@@ -2901,6 +2901,7 @@ parse_file_seq (char **stringp, unsigned + const char *name; + const char **nlist = 0; + char *tildep = 0; ++ int globme = 1; + #ifndef NO_ARCHIVES + char *arname = 0; + char *memname = 0; +@@ -3109,32 +3110,40 @@ parse_file_seq (char **stringp, unsigned + } + #endif /* !NO_ARCHIVES */ + +- switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl)) +- { +- case GLOB_NOSPACE: +- fatal (NILF, _("virtual memory exhausted")); +- +- case 0: +- /* Success. */ +- i = gl.gl_pathc; +- nlist = (const char **)gl.gl_pathv; +- break; +- +- case GLOB_NOMATCH: +- /* If we want only existing items, skip this one. */ +- if (flags & PARSEFS_EXISTS) +- { +- i = 0; +- break; +- } +- /* FALLTHROUGH */ +- +- default: +- /* By default keep this name. */ ++ /* glob() is expensive: don't call it unless we need to. */ ++ if (!(flags & PARSEFS_EXISTS) && strpbrk (name, "?*[") == NULL) ++ { ++ globme = 0; + i = 1; + nlist = &name; +- break; +- } ++ } ++ else ++ switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl)) ++ { ++ case GLOB_NOSPACE: ++ fatal (NILF, _("virtual memory exhausted")); ++ ++ case 0: ++ /* Success. */ ++ i = gl.gl_pathc; ++ nlist = (const char **)gl.gl_pathv; ++ break; ++ ++ case GLOB_NOMATCH: ++ /* If we want only existing items, skip this one. */ ++ if (flags & PARSEFS_EXISTS) ++ { ++ i = 0; ++ break; ++ } ++ /* FALLTHROUGH */ ++ ++ default: ++ /* By default keep this name. */ ++ i = 1; ++ nlist = &name; ++ break; ++ } + + /* For each matched element, add it to the list. */ + while (i-- > 0) +@@ -3174,7 +3183,8 @@ parse_file_seq (char **stringp, unsigned + #endif /* !NO_ARCHIVES */ + NEWELT (concat (2, prefix, nlist[i])); + +- globfree (&gl); ++ if (globme) ++ globfree (&gl); + + #ifndef NO_ARCHIVES + if (arname) +Index: tests/scripts/functions/wildcard +=================================================================== +RCS file: /sources/make/make/tests/scripts/functions/wildcard,v +retrieving revision 1.6 +retrieving revision 1.7 +diff -u -p -u -r1.6 -r1.7 +--- tests/scripts/functions/wildcard 13 Jun 2009 21:21:49 -0000 1.6 ++++ tests/scripts/functions/wildcard 7 May 2011 14:36:11 -0000 1.7 +@@ -88,4 +88,16 @@ all: ; @echo $(wildcard xz--y*.7) + !, + '', "\n"); + ++# TEST #5: wildcard used to verify file existence ++ ++touch('xxx.yyy'); ++ ++run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!, ++ '', "file=xxx.yyy\n"); ++ ++unlink('xxx.yyy'); ++ ++run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!, ++ '', "file=\n"); ++ + 1; diff --git a/make.changes b/make.changes index 07f4284..a2661eb 100644 --- a/make.changes +++ b/make.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Apr 10 14:26:35 CEST 2012 - meissner@suse.de + +- Faster globbing support from upstream to speed up + some large make projects like libreoffice. bnc#753323 + ------------------------------------------------------------------- Tue Oct 11 22:37:40 CEST 2011 - mhrusecky@suse.cz diff --git a/make.spec b/make.spec index cd775de..0b0e324 100644 --- a/make.spec +++ b/make.spec @@ -1,7 +1,7 @@ # # spec file for package make # -# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -15,25 +15,23 @@ # Please submit bugfixes or comments via http://bugs.opensuse.org/ # -# norootforbuild - Name: make Url: http://www.gnu.org/software/make/make.html -License: GPL-2.0+ -Group: Development/Tools/Building Provides: gmake PreReq: %install_info_prereq -AutoReqProv: on Version: 3.82 -Release: 2 +Release: 0 Summary: GNU make +License: GPL-2.0+ +Group: Development/Tools/Building Source: make-%version.tar.bz2 Patch2: make-slowdown-parallelism.diff Patch3: make-disable-broken-tests.diff Patch4: make-savannah-bug30723-expand_makeflags_before_reexec.diff Patch5: make-savannah-bug30612-handling_of_archives.diff Patch6: make-fix_whitespace_tokenization.diff +Patch7: make-glob-faster.patch Patch64: make-library-search-path.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -41,12 +39,13 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build The GNU make command with extensive documentation. %prep -%setup +%setup -q %patch2 %patch3 -p1 %patch4 %patch5 %patch6 -p1 +%patch7 -p0 if [ %_lib == lib64 ]; then %patch64 fi