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
This commit is contained in:
Bryan Drewery 2017-04-13 22:07:34 +00:00
parent 19625f29fe
commit 848d5e929b
2 changed files with 36 additions and 7 deletions

View File

@ -127,7 +127,7 @@ TGTS= all all-man buildenv buildenvvars buildkernel buildworld \
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 \

View File

@ -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_VERSION} \
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)