diff mbox

[v2] Makefile: add --no-builtin-rules flag

Message ID 1457740059-9618-1-git-send-email-arnout@mind.be
State Rejected
Headers show

Commit Message

Arnout Vandecappelle March 11, 2016, 11:47 p.m. UTC
When calling 'make', it takes several seconds before anything happens.
This is because all the makefiles that have to be parsed and variables
and rules that have to be evaluated.

One of the rules to be evaluated are the implicit rules that make adds
to check out the *.mk files from RCS etc. This obviously makes no
sense. Therefore, disable the built-in rules.

To avoid breaking package that depend on them, make sure we filter this
out when calling sub-makes. MFLAGS has to be overridden too, otherwise
the sub-make will just use that instead of MAKEFLAGS when MAKEFLAGS is
empty.

Time for 'make help > /dev/null' on my machine (with hot cache):
         before      after
real    0m4.167s   0m3.375s
user    0m3.596s   0m2.928s
sys     0m0.256s   0m0.180s

and for 'make graph-depends' on a large config:
         before      after
real    0m58.417s  0m53.625s
user    0m48.284s  0m43.680s
sys     0m4.076s   0m3.536s

A roughly 10% improvement.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
v2: override MFLAGS as well.
---
 Makefile            | 2 ++
 package/Makefile.in | 2 ++
 2 files changed, 4 insertions(+)

Comments

Yann E. MORIN March 12, 2016, 10:13 p.m. UTC | #1
Arnout, All,

On 2016-03-12 00:47 +0100, Arnout Vandecappelle (Essensium/Mind) spake thusly:
> When calling 'make', it takes several seconds before anything happens.
> This is because all the makefiles that have to be parsed and variables
> and rules that have to be evaluated.
> 
> One of the rules to be evaluated are the implicit rules that make adds
> to check out the *.mk files from RCS etc. This obviously makes no
> sense. Therefore, disable the built-in rules.
> 
> To avoid breaking package that depend on them, make sure we filter this
> out when calling sub-makes. MFLAGS has to be overridden too, otherwise
> the sub-make will just use that instead of MAKEFLAGS when MAKEFLAGS is
> empty.
> 
> Time for 'make help > /dev/null' on my machine (with hot cache):
>          before      after
> real    0m4.167s   0m3.375s
> user    0m3.596s   0m2.928s
> sys     0m0.256s   0m0.180s
> 
> and for 'make graph-depends' on a large config:
>          before      after
> real    0m58.417s  0m53.625s
> user    0m48.284s  0m43.680s
> sys     0m4.076s   0m3.536s
> 
> A roughly 10% improvement.
> 
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> ---
> v2: override MFLAGS as well.
> ---
>  Makefile            | 2 ++
>  package/Makefile.in | 2 ++
>  2 files changed, 4 insertions(+)
> 
> diff --git a/Makefile b/Makefile
> index f2822a2..bbb2017 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -29,6 +29,8 @@ UMASK = 0022
>  ifneq ($(shell umask),$(UMASK))
>  .PHONY: _all $(MAKECMDGOALS)
>  
> +%.mk:
> +
>  $(MAKECMDGOALS): _all
>  	@:
>  
> diff --git a/package/Makefile.in b/package/Makefile.in
> index fbf5485..730810e 100644
> --- a/package/Makefile.in
> +++ b/package/Makefile.in
> @@ -1,3 +1,4 @@
> +MAKEFLAGS += --no-builtin-rules
>  ifndef MAKE
>  MAKE := make
>  endif
> @@ -5,6 +6,7 @@ ifndef HOSTMAKE
>  HOSTMAKE = $(MAKE)
>  endif
>  HOSTMAKE := $(shell which $(HOSTMAKE) || type -p $(HOSTMAKE) || echo make)
> +HOSTMAKE += MAKEFLAGS="$(filter-out --no-builtin-rules,$(MAKEFLAGS))" MFLAGS=

Is the extra added complexity worth the improvement?

Regards,
Yann E. MORIN.

>  # If BR2_JLEVEL is 0, scale the maximum concurrency with the number of
>  # CPUs. An additional job is used in order to keep processors busy
> -- 
> 2.7.0
> 
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
Yann E. MORIN March 12, 2016, 10:26 p.m. UTC | #2
Arnout, All,

On 2016-03-12 00:47 +0100, Arnout Vandecappelle (Essensium/Mind) spake thusly:
> When calling 'make', it takes several seconds before anything happens.
> This is because all the makefiles that have to be parsed and variables
> and rules that have to be evaluated.
> 
> One of the rules to be evaluated are the implicit rules that make adds
> to check out the *.mk files from RCS etc. This obviously makes no
> sense. Therefore, disable the built-in rules.
> 
> To avoid breaking package that depend on them, make sure we filter this
> out when calling sub-makes. MFLAGS has to be overridden too, otherwise
> the sub-make will just use that instead of MAKEFLAGS when MAKEFLAGS is
> empty.

Sorry, it breaks at least host-ncurses:

    /usr/bin/make MAKEFLAGS="--no-print-directory" MFLAGS= -j1 -C /home/ymorin/dev/buildroot/O/build/host-ncurses-5.9 sources
    cd include && /usr/bin/make ---no-print-directory DESTDIR="" sources
    /usr/bin/make: unrecognized option '---no-print-directory'
    Usage: make [options] [target] ...
    [--SNIP--]

Regards,
Yann E. MORIN.

> Time for 'make help > /dev/null' on my machine (with hot cache):
>          before      after
> real    0m4.167s   0m3.375s
> user    0m3.596s   0m2.928s
> sys     0m0.256s   0m0.180s
> 
> and for 'make graph-depends' on a large config:
>          before      after
> real    0m58.417s  0m53.625s
> user    0m48.284s  0m43.680s
> sys     0m4.076s   0m3.536s
> 
> A roughly 10% improvement.
> 
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> ---
> v2: override MFLAGS as well.
> ---
>  Makefile            | 2 ++
>  package/Makefile.in | 2 ++
>  2 files changed, 4 insertions(+)
> 
> diff --git a/Makefile b/Makefile
> index f2822a2..bbb2017 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -29,6 +29,8 @@ UMASK = 0022
>  ifneq ($(shell umask),$(UMASK))
>  .PHONY: _all $(MAKECMDGOALS)
>  
> +%.mk:
> +
>  $(MAKECMDGOALS): _all
>  	@:
>  
> diff --git a/package/Makefile.in b/package/Makefile.in
> index fbf5485..730810e 100644
> --- a/package/Makefile.in
> +++ b/package/Makefile.in
> @@ -1,3 +1,4 @@
> +MAKEFLAGS += --no-builtin-rules
>  ifndef MAKE
>  MAKE := make
>  endif
> @@ -5,6 +6,7 @@ ifndef HOSTMAKE
>  HOSTMAKE = $(MAKE)
>  endif
>  HOSTMAKE := $(shell which $(HOSTMAKE) || type -p $(HOSTMAKE) || echo make)
> +HOSTMAKE += MAKEFLAGS="$(filter-out --no-builtin-rules,$(MAKEFLAGS))" MFLAGS=
>  
>  # If BR2_JLEVEL is 0, scale the maximum concurrency with the number of
>  # CPUs. An additional job is used in order to keep processors busy
> -- 
> 2.7.0
> 
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
Arnout Vandecappelle March 13, 2016, 9:11 p.m. UTC | #3
On 03/12/16 23:26, Yann E. MORIN wrote:
> Arnout, All,
>
> On 2016-03-12 00:47 +0100, Arnout Vandecappelle (Essensium/Mind) spake thusly:
>> >When calling 'make', it takes several seconds before anything happens.
>> >This is because all the makefiles that have to be parsed and variables
>> >and rules that have to be evaluated.
>> >
>> >One of the rules to be evaluated are the implicit rules that make adds
>> >to check out the *.mk files from RCS etc. This obviously makes no
>> >sense. Therefore, disable the built-in rules.
>> >
>> >To avoid breaking package that depend on them, make sure we filter this
>> >out when calling sub-makes. MFLAGS has to be overridden too, otherwise
>> >the sub-make will just use that instead of MAKEFLAGS when MAKEFLAGS is
>> >empty.
> Sorry, it breaks at least host-ncurses:
>
>      /usr/bin/make MAKEFLAGS="--no-print-directory" MFLAGS= -j1 -C /home/ymorin/dev/buildroot/O/build/host-ncurses-5.9 sources
>      cd include && /usr/bin/make ---no-print-directory DESTDIR="" sources
>      /usr/bin/make: unrecognized option '---no-print-directory'
>      Usage: make [options] [target] ...
>      [--SNIP--]

  Gah, bug in make 3.81 :-(

  That will probably require even more hackery to work around... Let's drop this 
patch.

  Regards,
  Arnout
diff mbox

Patch

diff --git a/Makefile b/Makefile
index f2822a2..bbb2017 100644
--- a/Makefile
+++ b/Makefile
@@ -29,6 +29,8 @@  UMASK = 0022
 ifneq ($(shell umask),$(UMASK))
 .PHONY: _all $(MAKECMDGOALS)
 
+%.mk:
+
 $(MAKECMDGOALS): _all
 	@:
 
diff --git a/package/Makefile.in b/package/Makefile.in
index fbf5485..730810e 100644
--- a/package/Makefile.in
+++ b/package/Makefile.in
@@ -1,3 +1,4 @@ 
+MAKEFLAGS += --no-builtin-rules
 ifndef MAKE
 MAKE := make
 endif
@@ -5,6 +6,7 @@  ifndef HOSTMAKE
 HOSTMAKE = $(MAKE)
 endif
 HOSTMAKE := $(shell which $(HOSTMAKE) || type -p $(HOSTMAKE) || echo make)
+HOSTMAKE += MAKEFLAGS="$(filter-out --no-builtin-rules,$(MAKEFLAGS))" MFLAGS=
 
 # If BR2_JLEVEL is 0, scale the maximum concurrency with the number of
 # CPUs. An additional job is used in order to keep processors busy