Author: bdrewery
Date: Thu Apr 13 22:07:34 2017
New Revision: 316794
URL: https://svnweb.freebsd.org/changeset/base/316794

Log:
  Cache compiler metadata and reuse it at installworld time.
  
  Right after cross-tools, a compiler-metadata.mk file is created that
  stores all of the bsd.compiler.mk metadata.  It is then read in
  with a fail-safe during installworld time.
  
  The file is explicitly removed when invoking cross-tools to ensure that
  a stale file is not left around from odd manual 'make _cross-tools' ->
  'make installworld' invocations.
  
  This fixes several issues:
      - With WITH_SYSTEM_COMPILER (default yes on head and no on releng/11.0):
        If you build on a system where the bootstrap compiler does not
        build due to the host compiler matching the in-tree one, but then
        installworld on another system where that logic fails (a
        bootstrap compiler is needed), the installworld immediately fails
        with:
             sh: cc: not found
        Note that fixing this logic may then hit a case where a rebuild is
        attempted in installworld.  Normally cc would be ran with
        'CFLAGS+=ERROR-tried-to-rebuild-during-make-install' to cause an
        error such as:
            cc: error: no such file or directory: 
'ERROR-tried-to-rebuild-during-make-install'
        However, now it will just fail with the 'cc: not found' error.
        Inspection of the compile line will show
        'ERROR-tried-to-rebuild-during-make-install';  It's not useful to
        set CC to anything other than 'cc' during install as it is more
        helpful to see the attempted compile rather than some other bogus
        error.
      - This now avoids running bsd.compiler.mk (cc executions) even more
        during installworld.  There are compiler-dependent SUBDIR in the
        tree which required having a compiler during install.
  
  There is at least 1 case where CC is still executed in the install,
  such as from a LOOKUP!= in secure/lib/libcrypto/Makefile.inc checking
  for 'vzeroall' support.  This is not significant for installworld
  as the lookup has a fallback (and hides its error) and only modifies CFLAGS,
  thus it's not worth fixing.
  
  PR:           212877
  MFC after:    2 weeks
  Sponsored by: Dell EMC Isilon

Modified:
  head/Makefile
  head/Makefile.inc1

Modified: head/Makefile
==============================================================================
--- head/Makefile       Thu Apr 13 22:05:24 2017        (r316793)
+++ head/Makefile       Thu Apr 13 22:07:34 2017        (r316794)
@@ -127,7 +127,7 @@ TGTS=       all all-man buildenv buildenvvars 
        installworld kernel-toolchain libraries lint maninstall \
        obj objlink rerelease showconfig tags toolchain update \
        _worldtmp _legacy _bootstrap-tools _cleanobj _obj \
-       _build-tools _cross-tools _includes _libraries \
+       _build-tools _compiler-metadata _cross-tools _includes _libraries \
        build32 distribute32 install32 buildsoft distributesoft installsoft \
        builddtb xdev xdev-build xdev-install \
        xdev-links native-xtools stageworld stagekernel stage-packages \

Modified: head/Makefile.inc1
==============================================================================
--- head/Makefile.inc1  Thu Apr 13 22:05:24 2017        (r316793)
+++ head/Makefile.inc1  Thu Apr 13 22:07:34 2017        (r316794)
@@ -78,6 +78,19 @@ MK_CLANG_BOOTSTRAP=  no
 MK_GCC_BOOTSTRAP=      no
 .endif
 
+MAKEOBJDIRPREFIX?=     /usr/obj
+.if ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && 
!defined(CROSS_BUILD_TESTING)
+OBJTREE=       ${MAKEOBJDIRPREFIX}
+.else
+OBJTREE=       ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}
+.endif
+
+# Pull in compiler metadata from buildworld/toolchain if possible to avoid
+# running CC from bsd.compiler.mk.
+.if make(installworld) || make(install)
+.-include "${OBJTREE}${.CURDIR}/compiler-metadata.mk"
+.endif
+
 # Pull in COMPILER_TYPE and COMPILER_FREEBSD_VERSION early.
 .include <bsd.compiler.mk>
 .include "share/mk/src.opts.mk"
@@ -163,6 +176,20 @@ CROSSENV+= COMPILER_VERSION=${X_COMPILER
                COMPILER_FREEBSD_VERSION=${X_COMPILER_FREEBSD_VERSION}
 .endif
 .endif
+# Store some compiler metadata for use in installworld where we don't
+# want to invoke CC at all.
+_COMPILER_METADATA_VARS=       COMPILER_VERSION \
+                               COMPILER_TYPE \
+                               COMPILER_FEATURES \
+                               COMPILER_FREEBSD_VERSION
+compiler-metadata.mk: .PHONY .META
+       @: > ${.TARGET}
+       @echo ".info Using cached compiler metadata from build at $$(hostname) 
on $$(date)" \
+           > ${.TARGET}
+.for v in ${_COMPILER_METADATA_VARS}
+       @echo "${v}=${${v}}" >> ${.TARGET}
+.endfor
+       @echo ".export ${_COMPILER_METADATA_VARS}" >> ${.TARGET}
 
 # Handle external binutils.
 .if defined(CROSS_TOOLCHAIN_PREFIX)
@@ -304,7 +331,6 @@ SVN=   ${_P}/${_S}
 .endif
 SVNFLAGS?=     -r HEAD
 
-MAKEOBJDIRPREFIX?=     /usr/obj
 .if !defined(OSRELDATE)
 .if exists(/usr/include/osreldate.h)
 OSRELDATE!=    awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
@@ -401,11 +427,6 @@ BUILD_ARCH!=       uname -p
 .error To cross-build, set TARGET_ARCH.
 .endif
 .endif
-.if ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && 
!defined(CROSS_BUILD_TESTING)
-OBJTREE=       ${MAKEOBJDIRPREFIX}
-.else
-OBJTREE=       ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}
-.endif
 WORLDTMP=      ${OBJTREE}${.CURDIR}/tmp
 BPATH=         
${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/bin
 XPATH=         ${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin
@@ -766,8 +787,15 @@ _cross-tools:
        @echo "--------------------------------------------------------------"
        @echo ">>> stage 3: cross tools"
        @echo "--------------------------------------------------------------"
+       @rm -f ${.OBJDIR}/compiler-metadata.mk
        ${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools
        ${_+_}cd ${.CURDIR}; ${XMAKE} kernel-tools
+_compiler-metadata:
+       @echo
+       @echo "--------------------------------------------------------------"
+       @echo ">>> stage 3.1: recording compiler metadata"
+       @echo "--------------------------------------------------------------"
+       ${_+_}cd ${.CURDIR}; ${WMAKE} compiler-metadata.mk
 _includes:
        @echo
        @echo "--------------------------------------------------------------"
@@ -801,6 +829,7 @@ WMAKE_TGTS+=        _worldtmp _legacy
 WMAKE_TGTS+=   _bootstrap-tools
 .endif
 WMAKE_TGTS+=   _cleanobj _obj _build-tools _cross-tools
+WMAKE_TGTS+=   _compiler-metadata
 WMAKE_TGTS+=   _includes _libraries
 WMAKE_TGTS+=   everything
 .if defined(LIBCOMPAT) && empty(SUBDIR_OVERRIDE)
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to