From ca95e9dd775aa54600004edbcd9d70f6e6710c5b Mon Sep 17 00:00:00 2001 From: Bryan Drewery Date: Wed, 25 Oct 2017 21:46:36 +0000 Subject: [PATCH] Fix native-xtools build to use a proper sysroot. This takes longer but should reliably produce working binaries. The old version linked against system libraries and headers which would be a problem if building a native-xtools against a newer source than the host system. With a proper sysroot made first this is not a problem. This also allows: - NXBDIRS to be built in parallel - NXBDIRS to be installed to NXBDESTDIR in parallel - SYSTEM_COMPILER logic to work again. Note that because this change is adding a sysroot phase the compiler may be built up to twice now. The first is the "cross-compiler" even though it is for the native architecture, but it is still built to ensure the latest compiler is used to generate the binaries, unless SYSTEM_COMPILER allows /usr/bin/cc to be used. Then the target compiler is built which is actually a cross-compiler since it runs on native host but generates TARGET.TARGET_ARCH binaries. Note this also changes the path used for the OBJDIR. It used to use /usr/obj/target.target_arch/nxb/ for objects and /usr/obj/target.target_arch/nxb-bin for installed files, but now uses /usr/obj/nxb/target.target_arch/ for objects and /usr/obj/nxb/target.target_arch//nxb-bin for installed files. - NXBDESTDIR can be specified for where to install or queried with `make -f Makefile.inc1 TARGET=... TARGET_ARCH=... -V NXBDESTDIR` This could potentially be improved to reuse an existing sysroot. The problem is with building the SUBDIR_OVERRIDE list it needs to use a different OBJDIR since it is building all statically. We don't want to pollute the existing 'buildworld' OBJDIR and cause confusion on the next build. Using a separate OBJDIR for the 'everything' phase mostly works except for some things like linking in INTERNALLIBS that exist in the other OBJDIR. MFC after: 1 month Sponsored by: Dell EMC Isilon --- Makefile.inc1 | 154 +++++++++++++++++++++++++++++++------------------- 1 file changed, 97 insertions(+), 57 deletions(-) diff --git a/Makefile.inc1 b/Makefile.inc1 index 285718c77a76..94c0f7190c3e 100644 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -637,6 +637,8 @@ XCXXFLAGS+= -isystem ${WORLDTMP}/usr/include/c++/v1 -std=c++11 \ .endif .elif ${WANT_COMPILER_TYPE} == clang || \ (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == clang) +MACHINE_ABI?= unknown +MACHINE_TRIPLE?=${MACHINE_ARCH:C/amd64/x86_64/}-${MACHINE_ABI}-freebsd12.0 TARGET_ABI?= unknown TARGET_TRIPLE?= ${TARGET_ARCH:C/amd64/x86_64/}-${TARGET_ABI}-freebsd12.0 XCFLAGS+= -target ${TARGET_TRIPLE} @@ -2111,47 +2113,20 @@ cross-tools: .MAKE .PHONY ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install .endfor -NXBDESTDIR= ${OBJTREE}/nxb-bin -NXBENV= MAKEOBJDIRPREFIX=${OBJTREE}/nxb \ - TOOLS_PREFIX= \ - INSTALL="sh ${.CURDIR}/tools/install.sh" \ - PATH=${PATH}:${OBJTREE}/gperf_for_gcc/usr/bin -NXBMAKE= ${NXBENV} ${MAKE} \ - LLVM_TBLGEN=${NXBDESTDIR}/usr/bin/llvm-tblgen \ - CLANG_TBLGEN=${NXBDESTDIR}/usr/bin/clang-tblgen \ - MACHINE=${TARGET} MACHINE_ARCH=${TARGET_ARCH} \ - MK_GDB=no MK_TESTS=no \ - SSP_CFLAGS= \ - MK_HTML=no NO_LINT=yes MK_MAN=no MK_MAN_UTILS=yes \ - -DNO_PIC MK_PROFILE=no -DNO_SHARED \ - -DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \ - MK_CLANG_EXTRAS=no MK_CLANG_FULL=no \ - MK_LLDB=no MK_DEBUG_FILES=no - +# # native-xtools is the current target for qemu-user cross builds of ports # via poudriere and the imgact_binmisc kernel module. -# For non-clang enabled targets that are still using the in tree gcc -# we must build a gperf binary for one instance of its Makefiles. On -# clang-enabled systems, the gperf binary is obsolete. -native-xtools: .PHONY -.if ${MK_GCC_BOOTSTRAP} != "no" - mkdir -p ${OBJTREE}/gperf_for_gcc/usr/bin - ${_+_}@${ECHODIR} "===> ${_gperf} (obj,all,install)"; \ - cd ${.CURDIR}/${_gperf}; \ - if [ -z "${NO_OBJ}" ]; then ${NXBMAKE} DIRPRFX=${_gperf}/ obj; fi; \ - ${NXBMAKE} DIRPRFX=${_gperf}/ all; \ - ${NXBMAKE} DIRPRFX=${_gperf}/ DESTDIR=${OBJTREE}/gperf_for_gcc install -.endif - mkdir -p ${NXBDESTDIR}/bin ${NXBDESTDIR}/sbin ${NXBDESTDIR}/usr - mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \ - -p ${NXBDESTDIR}/usr >/dev/null - mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ - -p ${NXBDESTDIR}/usr/include >/dev/null -.if ${MK_DEBUG_FILES} != "no" - mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \ - -p ${NXBDESTDIR}/usr/lib >/dev/null -.endif -.for _tool in \ +# This target merely builds a toolchan/sysroot, then builds the tools it wants +# with the options it wants in a special MAKEOBJDIRPREFIX, using the toolchain +# already built. It then installs the static tools to NXBDESTDIR for Poudriere +# to pickup. +# +NXBOBJDIR= ${MAKEOBJDIRPREFIX}/nxb/${TARGET}.${TARGET_ARCH} +NXBDESTDIR= ${NXBOBJDIR}${.CURDIR}/nxb-bin + +# This is the list of tools to be built/installed as static and where +# appropriate to build for the given TARGET.TARGET_ARCH. +NXBDIRS+= \ bin/cat \ bin/chmod \ bin/cp \ @@ -2169,24 +2144,18 @@ native-xtools: .PHONY bin/rmdir \ bin/sh \ bin/sleep \ - ${_clang_tblgen} \ - usr.bin/ar \ - ${_binutils} \ - ${_elftctools} \ - ${_gcc} \ - ${_gcc_tools} \ - ${_clang_libs} \ - ${_clang} \ - ${_lld} \ sbin/md5 \ sbin/sysctl \ - usr.bin/diff \ + usr.bin/addr2line \ + usr.bin/ar \ usr.bin/awk \ usr.bin/basename \ usr.bin/bmake \ usr.bin/bzip2 \ usr.bin/cmp \ + usr.bin/diff \ usr.bin/dirname \ + usr.bin/elfcopy \ usr.bin/env \ usr.bin/fetch \ usr.bin/find \ @@ -2196,14 +2165,16 @@ native-xtools: .PHONY usr.bin/lex \ usr.bin/limits \ usr.bin/lorder \ - ${_libopenbsd} \ - ${_makewhatis} \ + usr.bin/mandoc \ usr.bin/mktemp \ usr.bin/mt \ + usr.bin/nm \ usr.bin/patch \ usr.bin/readelf \ usr.bin/sed \ + usr.bin/size \ usr.bin/sort \ + usr.bin/strings \ usr.bin/tar \ usr.bin/touch \ usr.bin/tr \ @@ -2215,12 +2186,81 @@ native-xtools: .PHONY usr.bin/xz \ usr.bin/yacc \ usr.sbin/chown - ${_+_}@${ECHODIR} "===> ${_tool} (obj,all,install)"; \ - cd ${.CURDIR}/${_tool}; \ - if [ -z "${NO_OBJ}" ]; then ${NXBMAKE} DIRPRFX=${_tool}/ obj; fi; \ - ${NXBMAKE} DIRPRFX=${_tool}/ all; \ - ${NXBMAKE} DIRPRFX=${_tool}/ DESTDIR=${NXBDESTDIR} install -.endfor + +.if ${MK_CLANG} != "no" +NXBDIRS+= lib/clang +SUBDIR_DEPEND_usr.bin/clang= lib/clang +NXBDIRS+= usr.bin/clang +.elif ${MK_GCC} != "no" +NXBDIRS+= gnu/usr.bin/cc +.endif +.if ${MK_BINUTILS} != "no" +NXBDIRS+= gnu/usr.bin/binutils +.endif + +NXBMAKEENV+= \ + MAKEOBJDIRPREFIX=${NXBOBJDIR:Q} + +NXBMAKEARGS+= \ + OBJTREE=${NXBOBJDIR:Q} \ + -DNO_SHARED \ + -DNO_CPU_CFLAGS \ + -DNO_PIC \ + SSP_CFLAGS= \ + MK_CLANG_EXTRAS=no \ + MK_CLANG_FULL=no \ + MK_CTF=no \ + MK_DEBUG_FILES=no \ + MK_GDB=no \ + MK_HTML=no \ + MK_LLDB=no \ + MK_MAN=no \ + MK_MAN_UTILS=yes \ + MK_OFED=no \ + MK_OPENSSH=no \ + MK_PROFILE=no \ + MK_SENDMAIL=no \ + MK_SVNLITE=no \ + MK_TESTS=no \ + MK_WARNS=no \ + MK_ZFS=no + + +# For 'toolchain' we want to produce native binaries that themselves generate +# native binaries. +NXBTMAKE= ${NXBMAKEENV} ${MAKE} ${NXBMAKEARGS:N-DNO_PIC:N-DNO_SHARED} \ + TARGET=${MACHINE} TARGET_ARCH=${MACHINE_ARCH} +# For 'everything' we want to produce native binaries (hence -target to +# be MACHINE) that themselves generate TARGET.TARGET_ARCH binaries. +# TARGET/TARGET_ARCH are still passed along from user. +NXBMAKE= ${NXBMAKEENV} ${MAKE} ${NXBMAKEARGS} \ + TARGET_TRIPLE=${MACHINE_TRIPLE:Q} +native-xtools: .PHONY + # Build the bootstrap/host/cross tools that produce native binaries + ${_+_}cd ${.CURDIR}; ${NXBTMAKE} kernel-toolchain + # Populate includes/libraries sysroot that produce native binaries. + # This is split out from 'toolchain' above mostly so that target LLVM + # libraries have a proper LLVM_DEFAULT_TARGET_TRIPLE without + # polluting the cross-compiler build. The LLVM/GCC libs are skipped + # here to avoid the problem but are kept in 'toolchain' so that + # needed build tools are built. + ${_+_}cd ${.CURDIR}; ${NXBTMAKE} _includes MK_CLANG=no MK_GCC=no + ${_+_}cd ${.CURDIR}; ${NXBTMAKE} _libraries MK_CLANG=no MK_GCC=no +.if !defined(NO_OBJ) + ${_+_}cd ${.CURDIR}; ${NXBMAKE} SUBDIR_OVERRIDE="${NXBDIRS:M*}" _obj +.endif + ${_+_}cd ${.CURDIR}; ${NXBMAKE} SUBDIR_OVERRIDE="${NXBDIRS:M*}" \ + everything + mkdir -p ${NXBDESTDIR}/bin ${NXBDESTDIR}/sbin ${NXBDESTDIR}/usr + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \ + -p ${NXBDESTDIR}/usr >/dev/null + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ + -p ${NXBDESTDIR}/usr/include >/dev/null + ${_+_}cd ${.CURDIR}; ${NXBMAKE} -f Makefile.inc1 \ + DESTDIR=${NXBDESTDIR} \ + SUBDIR_OVERRIDE="${NXBDIRS:M*}" \ + -DNO_ROOT \ + install # # hierarchy - ensure that all the needed directories are present