Message ID | 0193b73d-2ccb-b92d-e86e-0a2f4bb8d7bd@redhat.com |
---|---|
State | New |
Headers | show |
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
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