Avoid running $(CXX) during build to obtain header file paths

Message ID 0193b73d-2ccb-b92d-e86e-0a2f4bb8d7bd@redhat.com
State Committed
Headers

Commit Message

Florian Weimer Sept. 20, 2016, 11:19 a.m. UTC
  On my machine, this cuts down no-op rebuild time from about 10 seconds 
to around 8.5 seconds.

(If you change the compiler, you better re-run configure anyway.)

Thanks,
Florian
  

Comments

Carlos O'Donell Sept. 20, 2016, 7:21 p.m. UTC | #1
On 09/20/2016 07:19 AM, Florian Weimer wrote:
> On my machine, this cuts down no-op rebuild time from about 10 seconds to around 8.5 seconds.
> 
> (If you change the compiler, you better re-run configure anyway.)

This looks good to me.

I agree that if you change the compiler, there are a lot of niggling
details that need to be updated and re-running configure is the only
safe way we support that (particularly given that glibc manually links
several things together using implementation dependent knowledge).

Computing this early and once seems like a very reasonable optimization.

> Avoid running $(CXX) during build to obtain header file paths
> 
> This reduces the build time somewhat and is particularly noticeable
> during rebuilds with few code changes.
> 
> 2016-09-20  Florian Weimer  <fweimer@redhat.com>
> 
> 	Avoid running $(CXX) during build to obtain header file paths.
> 	* configure.ac (CXX_SYSINCLUDES, CXX_CMATH_HEADER): Set.
> 	* config.make.in (c++-cstdlib-header, c++-cmath-header): Define.
> 	* Makerules (cstdlib, cmath): Remove variables.  Use
> 	$(c++-cstdlib-header), $(c++-cmath-header) instead.
> 	* configure: Regenerate.
> 
> diff --git a/Makerules b/Makerules
> index 748790b..e865782 100644
> --- a/Makerules
> +++ b/Makerules
> @@ -121,14 +121,10 @@ ifneq (,$(CXX))
>  # will be used instead of /usr/include/stdlib.h and /usr/include/math.h.
>  before-compile := $(common-objpfx)cstdlib $(common-objpfx)cmath \
>  	          $(before-compile)
> -cstdlib=$(shell echo "\#include <cstdlib>" | $(CXX) -M -MP -x c++ - \
> -		| sed -n "/cstdlib:/{s/:$$//;p}")
> -$(common-objpfx)cstdlib: $(cstdlib)
> +$(common-objpfx)cstdlib: $(c++-cstdlib-header)
>  	$(INSTALL_DATA) $< $@T
>  	$(move-if-change) $@T $@
> -cmath=$(shell echo "\#include <cmath>" | $(CXX) -M -MP -x c++ - \
> -		| sed -n "/cmath:/{s/:$$//;p}")
> -$(common-objpfx)cmath: $(cmath)
> +$(common-objpfx)cmath: $(c++-cmath-header)
>  	$(INSTALL_DATA) $< $@T
>  	$(move-if-change) $@T $@
>  endif
> diff --git a/config.make.in b/config.make.in
> index 95c6f36..04a8b3e 100644
> --- a/config.make.in
> +++ b/config.make.in
> @@ -45,6 +45,8 @@ defines = @DEFINES@
>  sysheaders = @sysheaders@
>  sysincludes = @SYSINCLUDES@
>  c++-sysincludes = @CXX_SYSINCLUDES@
> +c++-cstdlib-header = @CXX_CSTDLIB_HEADER@
> +c++-cmath-header = @CXX_CMATH_HEADER@
>  all-warnings = @all_warnings@
>  enable-werror = @enable_werror@
>  
> diff --git a/configure b/configure
> index 17625e1..6ff2527 100755
> --- a/configure
> +++ b/configure
> @@ -635,6 +635,8 @@ BISON
>  INSTALL_INFO
>  PERL
>  BASH_SHELL
> +CXX_CMATH_HEADER
> +CXX_CSTDLIB_HEADER
>  CXX_SYSINCLUDES
>  SYSINCLUDES
>  AUTOCONF
> @@ -5054,6 +5056,18 @@ fi
>  
>  
>  
> +# Obtain some C++ header file paths.  This is used to make a local
> +# copy of those headers in Makerules.
> +if test -n "$CXX"; then
> +  find_cxx_header () {
> +    echo "#include <$1>" | $CXX -M -MP -x c++ - | sed -n "/$1:/{s/:\$//;p}"
> +  }
> +  CXX_CSTDLIB_HEADER="$(find_cxx_header cstdlib)"
> +  CXX_CMATH_HEADER="$(find_cxx_header cmath)"
> +fi
> +
> +
> +
>  # Test if LD_LIBRARY_PATH contains the notation for the current directory
>  # since this would lead to problems installing/building glibc.
>  # LD_LIBRARY_PATH contains the current directory if one of the following
> diff --git a/configure.ac b/configure.ac
> index 33bcd62..9938ab0 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1039,6 +1039,18 @@ fi
>  AC_SUBST(SYSINCLUDES)
>  AC_SUBST(CXX_SYSINCLUDES)
>  
> +# Obtain some C++ header file paths.  This is used to make a local
> +# copy of those headers in Makerules.
> +if test -n "$CXX"; then
> +  find_cxx_header () {
> +    echo "#include <$1>" | $CXX -M -MP -x c++ - | sed -n "/$1:/{s/:\$//;p}"
> +  }
> +  CXX_CSTDLIB_HEADER="$(find_cxx_header cstdlib)"
> +  CXX_CMATH_HEADER="$(find_cxx_header cmath)"
> +fi
> +AC_SUBST(CXX_CSTDLIB_HEADER)
> +AC_SUBST(CXX_CMATH_HEADER)
> +
>  # Test if LD_LIBRARY_PATH contains the notation for the current directory
>  # since this would lead to problems installing/building glibc.
>  # LD_LIBRARY_PATH contains the current directory if one of the following
  

Patch

Avoid running $(CXX) during build to obtain header file paths

This reduces the build time somewhat and is particularly noticeable
during rebuilds with few code changes.

2016-09-20  Florian Weimer  <fweimer@redhat.com>

	Avoid running $(CXX) during build to obtain header file paths.
	* configure.ac (CXX_SYSINCLUDES, CXX_CMATH_HEADER): Set.
	* config.make.in (c++-cstdlib-header, c++-cmath-header): Define.
	* Makerules (cstdlib, cmath): Remove variables.  Use
	$(c++-cstdlib-header), $(c++-cmath-header) instead.
	* configure: Regenerate.

diff --git a/Makerules b/Makerules
index 748790b..e865782 100644
--- a/Makerules
+++ b/Makerules
@@ -121,14 +121,10 @@  ifneq (,$(CXX))
 # will be used instead of /usr/include/stdlib.h and /usr/include/math.h.
 before-compile := $(common-objpfx)cstdlib $(common-objpfx)cmath \
 	          $(before-compile)
-cstdlib=$(shell echo "\#include <cstdlib>" | $(CXX) -M -MP -x c++ - \
-		| sed -n "/cstdlib:/{s/:$$//;p}")
-$(common-objpfx)cstdlib: $(cstdlib)
+$(common-objpfx)cstdlib: $(c++-cstdlib-header)
 	$(INSTALL_DATA) $< $@T
 	$(move-if-change) $@T $@
-cmath=$(shell echo "\#include <cmath>" | $(CXX) -M -MP -x c++ - \
-		| sed -n "/cmath:/{s/:$$//;p}")
-$(common-objpfx)cmath: $(cmath)
+$(common-objpfx)cmath: $(c++-cmath-header)
 	$(INSTALL_DATA) $< $@T
 	$(move-if-change) $@T $@
 endif
diff --git a/config.make.in b/config.make.in
index 95c6f36..04a8b3e 100644
--- a/config.make.in
+++ b/config.make.in
@@ -45,6 +45,8 @@  defines = @DEFINES@
 sysheaders = @sysheaders@
 sysincludes = @SYSINCLUDES@
 c++-sysincludes = @CXX_SYSINCLUDES@
+c++-cstdlib-header = @CXX_CSTDLIB_HEADER@
+c++-cmath-header = @CXX_CMATH_HEADER@
 all-warnings = @all_warnings@
 enable-werror = @enable_werror@
 
diff --git a/configure b/configure
index 17625e1..6ff2527 100755
--- a/configure
+++ b/configure
@@ -635,6 +635,8 @@  BISON
 INSTALL_INFO
 PERL
 BASH_SHELL
+CXX_CMATH_HEADER
+CXX_CSTDLIB_HEADER
 CXX_SYSINCLUDES
 SYSINCLUDES
 AUTOCONF
@@ -5054,6 +5056,18 @@  fi
 
 
 
+# Obtain some C++ header file paths.  This is used to make a local
+# copy of those headers in Makerules.
+if test -n "$CXX"; then
+  find_cxx_header () {
+    echo "#include <$1>" | $CXX -M -MP -x c++ - | sed -n "/$1:/{s/:\$//;p}"
+  }
+  CXX_CSTDLIB_HEADER="$(find_cxx_header cstdlib)"
+  CXX_CMATH_HEADER="$(find_cxx_header cmath)"
+fi
+
+
+
 # Test if LD_LIBRARY_PATH contains the notation for the current directory
 # since this would lead to problems installing/building glibc.
 # LD_LIBRARY_PATH contains the current directory if one of the following
diff --git a/configure.ac b/configure.ac
index 33bcd62..9938ab0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1039,6 +1039,18 @@  fi
 AC_SUBST(SYSINCLUDES)
 AC_SUBST(CXX_SYSINCLUDES)
 
+# Obtain some C++ header file paths.  This is used to make a local
+# copy of those headers in Makerules.
+if test -n "$CXX"; then
+  find_cxx_header () {
+    echo "#include <$1>" | $CXX -M -MP -x c++ - | sed -n "/$1:/{s/:\$//;p}"
+  }
+  CXX_CSTDLIB_HEADER="$(find_cxx_header cstdlib)"
+  CXX_CMATH_HEADER="$(find_cxx_header cmath)"
+fi
+AC_SUBST(CXX_CSTDLIB_HEADER)
+AC_SUBST(CXX_CMATH_HEADER)
+
 # Test if LD_LIBRARY_PATH contains the notation for the current directory
 # since this would lead to problems installing/building glibc.
 # LD_LIBRARY_PATH contains the current directory if one of the following