buildworld: Add support to skip toolchain if requested.
authorzrj <rimvydas.jasinskas@gmail.com>
Fri, 25 May 2018 07:50:12 +0000 (10:50 +0300)
committerzrj <zrj@dragonflybsd.org>
Fri, 25 May 2018 17:43:57 +0000 (20:43 +0300)
These two new features are mainly aimed at developers, to speed up their
rebuilds on development branches. Often there are no changes that would
influence the toolchain components in any way. So it is reasonable to
skip rebuild of certain parts (mostly to avoid building c++ sources).

Previously we were rebuilding both main and alternative compilers twice
during buildworld for a full bootstrap that allowed us to avoid certain
breakages and not to keep adding lots of backwards compatibility hacks.

The new additions:
  * -DNO_CROSSTOOLS - skip compiler and binutils bootstrap;
  * -DNO_TOOLCHAINS - do not build compilers/binutils for installworld.

Both features are aimed for testing DESTDIR targets. Decision to
activate any of these features is left to the user's own discretion
based on reviewing the commits to the git repository or local clone.

The NO_CROSSTOOLS feature is implemented by installing the shell script
wrappers that add a sysroot and patch the specs. Idea is not to disturb
in any way the Makefile.inc1 or objformat logic at this moment. Since
all the main toolchain tools are installed as shell scripts this has a
nice bonus for quick hooks/probes and other hacky/pretty stuff without
disturbing the rest of the buildworld. You can even add your favorite
static analyser tool, just don't forget to change default include path
to /usr/obj/../world_x86_64/usr/include for it.

The objformat changes for sysroot would only make sense when we make a
port for another architecture. None of the new features are considered
to be guessTM enabled automatically at this moment. To be sure that
nothing has changed since previous buildworld from other changes in the
source tree one would have to compile and hex-diff the final products.
Keep in mind that libraries coming with the compilers will be rebuilt
even with both knobs passed. This should help catching most of the
issues before installworld step and not on the next {build,quick}world.

Both knobs are not documented in make.conf(5) on purpose. It is highly
advised *not* adding any of these knobs into make.conf, sooner or later
you will forget it and *will* get yourself in world recovery situation:
 a) world backup machinery (unless you had NO_BACKUP=true in make.conf);
 b) perform manual bootstrap to fix up the breakage;
 c) restore from H1/H2 snapshots (toolchain components are located in
    /usr/libexec/* and /usr/lib/${CCVER}/ directories);
 d) clean overwrite by mounting from other system (like usb img stick).

Features should work with quickworld too.
To put things in perspective here is a little chart of the cleaned
fresh 'make -jX buildworld' times impact on few setups:

 netbook:      hw.model: Intel(R) Core(TM) i3 CPU  U380  @ 1.33GHz
 compiler:     gcc50 as cc(1) (4gb usb stick for /, ironlake cpu)
 make -j3  buildworld [-DNO_CROSSTOOLS] [-DNO_TOOLCHAIN]

      min:sec      | STANDARD |   NO_C   |   NO_T   | NO_C/NO_T |
 ----------------------------------------------------------------
 gcc50             |   73:56  |   59:57  |   54:11  |   39:38   |
 gcc47 (host+world)|    N/I   |    N/I   |    N/I   |   37:51   |
 ----------------------------------------------------------------

 laptop setup: hw.model: Intel(R) Core(TM) i7-4712MQ CPU @ 2.30GHz
 compiler:     gcc50 as cc(1) (default)
 make -j9  buildworld [-DNO_CROSSTOOLS] [-DNO_TOOLCHAIN]

      min:sec      | STANDARD |   NO_C   |   NO_T   | NO_C/NO_T |
 ----------------------------------------------------------------
 gcc50             |   17:06  |   13:57  |   12:58  |   09:42   |
 gcc50 gcc47 (def) |   20:18  |   16:03  |   14:58  |   10:37   |
 gcc50 gcc80       |   24:24  |   18:06  |   17:31  |   11:23   |
 gcc50 gcc47 gcc80 |   27:47  |   20:17  |   19:23  |   12:00   |
 ----------------------------------------------------------------

 blade setup:  dual hw.model: Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
 compiler:     gcc80 as cc(1) (soon gcc80 will replace gcc50 in master)
 make -j32 buildworld [-DNO_CROSSTOOLS] [-DNO_TOOLCHAIN]

      min:sec      | STANDARD |   NO_C   |   NO_T   | NO_C/NO_T |
 ----------------------------------------------------------------
 gcc80             |   06:58  |   05:19  |   05:33  |   03:51   |
 gcc80 gcc47 (def*)|   08:03  |   06:06  |   06:02  |   04:05   |
 gcc80 gcc50       |   08:23  |   06:12  |   06:19  |   04:08   |
 gcc80 gcc47 gcc50 |   09:24  |   06:59  |   06:51  |   04:21   |
 ----------------------------------------------------------------

18 files changed:
gnu/usr.bin/binutils225/Makefile
gnu/usr.bin/binutils225/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/binutils227/Makefile
gnu/usr.bin/binutils227/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/cc47/Makefile
gnu/usr.bin/cc47/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/cc50/Makefile
gnu/usr.bin/cc50/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/cc80/Makefile
gnu/usr.bin/cc80/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/gdb/Makefile
gnu/usr.bin/gdb/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/gmp/Makefile
gnu/usr.bin/gmp/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/mpc/Makefile
gnu/usr.bin/mpc/Makefile.zhack [new file with mode: 0644]
gnu/usr.bin/mpfr/Makefile
gnu/usr.bin/mpfr/Makefile.zhack [new file with mode: 0644]

index 5346065..433813f 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 # Binutils 2.25 builds 3 blocks in series
 SUBDIR=        block1 block2
 
@@ -11,3 +18,4 @@ SUBDIR+=      block3
 SUBDIR_ORDERED= ${SUBDIR}
 
 .include <bsd.subdir.mk>
+.endif
diff --git a/gnu/usr.bin/binutils225/Makefile.zhack b/gnu/usr.bin/binutils225/Makefile.zhack
new file mode 100644 (file)
index 0000000..1726b6a
--- /dev/null
@@ -0,0 +1,27 @@
+.if defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)
+
+SCRIPTS=       ${GENTOOLS}
+GENTOOLS=      ar.sh as.sh elfedit.sh ld.bfd.sh ld.gold.sh \
+               nm.sh ranlib.sh objcopy.sh strip.sh
+NOMAN=
+BINDIR?=       ${REALBINUTILS}
+
+REALBINUTILS=  /usr/libexec/binutils225/elf
+
+.for _tool in ${GENTOOLS}
+${_tool}:
+       echo "#!/bin/sh" > ${.TARGET}
+       echo "" >> ${.TARGET}
+       echo "exec ${REALBINUTILS}/${.TARGET:T:R}" '"$$@"' >> ${.TARGET}
+.endfor
+
+.if !defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/"
+.error "refusing to install wrappers to base"
+.endif
+
+CLEANFILES= ${GENTOOLS}
+
+.else
+# dummy
+.endif
+.include <bsd.prog.mk>
index e47c45f..80f6b64 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 # Binutils 2.27 builds 3 blocks in series
 SUBDIR=        block1 block2
 
@@ -11,3 +18,4 @@ SUBDIR+=      block3
 SUBDIR_ORDERED= ${SUBDIR}
 
 .include <bsd.subdir.mk>
+.endif
diff --git a/gnu/usr.bin/binutils227/Makefile.zhack b/gnu/usr.bin/binutils227/Makefile.zhack
new file mode 100644 (file)
index 0000000..750a02a
--- /dev/null
@@ -0,0 +1,27 @@
+.if defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)
+
+SCRIPTS=       ${GENTOOLS}
+GENTOOLS=      ar.sh as.sh elfedit.sh ld.bfd.sh ld.gold.sh \
+               nm.sh ranlib.sh objcopy.sh strip.sh
+NOMAN=
+BINDIR?=       ${REALBINUTILS}
+
+REALBINUTILS=  /usr/libexec/binutils227/elf
+
+.for _tool in ${GENTOOLS}
+${_tool}:
+       echo "#!/bin/sh" > ${.TARGET}
+       echo "" >> ${.TARGET}
+       echo "exec ${REALBINUTILS}/${.TARGET:T:R}" '"$$@"' >> ${.TARGET}
+.endfor
+
+.if !defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/"
+.error "refusing to install wrappers to base"
+.endif
+
+CLEANFILES= ${GENTOOLS}
+
+.else
+# dummy
+.endif
+.include <bsd.prog.mk>
index ba28da9..24f5ee4 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 SUBDIR=        cc_prep
 SUBDIR+=       libiberty
 SUBDIR+=       libdecnumber
@@ -20,3 +27,4 @@ SUBDIR+=      cc1obj
 .ORDER: ${SUBDIR}
 
 .include <bsd.subdir.mk>
+.endif
diff --git a/gnu/usr.bin/cc47/Makefile.zhack b/gnu/usr.bin/cc47/Makefile.zhack
new file mode 100644 (file)
index 0000000..9534109
--- /dev/null
@@ -0,0 +1,42 @@
+.if defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)
+
+SCRIPTS=       ${GENTOOLS}
+GENTOOLS=      cc.sh cpp.sh c++.sh gcc.sh
+NOMAN=
+BINDIR?=       ${REALGCC}
+
+FILES=         cross_specs
+FILESDIR=      /usr/libexec/gcc47
+
+REALGCC=       /usr/libexec/gcc47
+CROSS_SPECS=   ${DESTDIR}/${REALGCC}/cross_specs
+CSPECS=                --sysroot=${USRDATA_PREFIX} -specs ${CROSS_SPECS}
+SEDLIB=                s@-L/usr/@-L${USRDATA_PREFIX}/usr/@g
+SEDSYS=                /--eh-frame/s@^@--sysroot=${USRDATA_PREFIX} @g
+
+.for _tool in ${GENTOOLS}
+${_tool}:
+       echo "#!/bin/sh" > ${.TARGET}
+       echo "" >> ${.TARGET}
+       echo "exec ${REALGCC}/${.TARGET:T:R} ${CSPECS}" '"$$@"' >> ${.TARGET}
+.endfor
+
+cross_specs:
+       echo "*link:" > ${.TARGET}
+       ${REALGCC}/cc -dumpspecs | grep eh-frame-hdr | sed \
+           -e "${SEDLIB}" -e "${SEDSYS}" >> ${.TARGET}
+
+.if !defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/"
+.error "refusing to install wrappers to base"
+.endif
+
+CLEANFILES= ${GENTOOLS} cross_specs
+
+.include <bsd.prog.mk>
+
+.else
+# these must be left alone
+SUBDIR_ORDERED=        cc_prep cc_tools
+SUBDIR=                cc_prep cc_tools
+.include <bsd.subdir.mk>
+.endif
index bbba510..2b324fb 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 # This build order provides more parallelism that gcc47, and is almost as
 # efficient as possible.  Most of the support libraries could be built
 # without cc_tools and the backend could be built at the same time as the
@@ -18,3 +25,4 @@ SUBDIR+=      libbackend
 SUBDIR+=       backends
 
 .include <bsd.subdir.mk>
+.endif
diff --git a/gnu/usr.bin/cc50/Makefile.zhack b/gnu/usr.bin/cc50/Makefile.zhack
new file mode 100644 (file)
index 0000000..b8b89a3
--- /dev/null
@@ -0,0 +1,42 @@
+.if defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)
+
+SCRIPTS=       ${GENTOOLS}
+GENTOOLS=      cc.sh cpp.sh c++.sh gcc.sh
+NOMAN=
+BINDIR?=       ${REALGCC}
+
+FILES=         cross_specs
+FILESDIR=      /usr/libexec/gcc50
+
+REALGCC=       /usr/libexec/gcc50
+CROSS_SPECS=   ${DESTDIR}/${REALGCC}/cross_specs
+CSPECS=                --sysroot=${USRDATA_PREFIX} -specs ${CROSS_SPECS}
+SEDLIB=                s@-L/usr/@-L${USRDATA_PREFIX}/usr/@g
+SEDSYS=                /--eh-frame/s@^@--sysroot=${USRDATA_PREFIX} @g
+
+.for _tool in ${GENTOOLS}
+${_tool}:
+       echo "#!/bin/sh" > ${.TARGET}
+       echo "" >> ${.TARGET}
+       echo "exec ${REALGCC}/${.TARGET:T:R} ${CSPECS}" '"$$@"' >> ${.TARGET}
+.endfor
+
+cross_specs:
+       echo "*link:" > ${.TARGET}
+       ${REALGCC}/cc -dumpspecs | grep eh-frame-hdr | sed \
+           -e "${SEDLIB}" -e "${SEDSYS}" >> ${.TARGET}
+
+.if !defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/"
+.error "refusing to install wrappers to base"
+.endif
+
+CLEANFILES= ${GENTOOLS} cross_specs
+
+.include <bsd.prog.mk>
+
+.else
+# these must be left alone
+SUBDIR_ORDERED=        cc_prep cc_tools
+SUBDIR=                cc_prep cc_tools
+.include <bsd.subdir.mk>
+.endif
index 0d88b0c..a153d20 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 # This build order provides more parallelism that gcc47, and is almost as
 # efficient as possible.  Most of the support libraries could be built
 # without cc_tools and the backend could be built at the same time as the
@@ -18,3 +25,4 @@ SUBDIR+=      libbackend
 SUBDIR+=       backends
 
 .include <bsd.subdir.mk>
+.endif
diff --git a/gnu/usr.bin/cc80/Makefile.zhack b/gnu/usr.bin/cc80/Makefile.zhack
new file mode 100644 (file)
index 0000000..b6d2f95
--- /dev/null
@@ -0,0 +1,42 @@
+.if defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)
+
+SCRIPTS=       ${GENTOOLS}
+GENTOOLS=      cc.sh cpp.sh c++.sh gcc.sh
+NOMAN=
+BINDIR?=       ${REALGCC}
+
+FILES=         cross_specs
+FILESDIR=      /usr/libexec/gcc80
+
+REALGCC=       /usr/libexec/gcc80
+CROSS_SPECS=   ${DESTDIR}/${REALGCC}/cross_specs
+CSPECS=                --sysroot=${USRDATA_PREFIX} -specs ${CROSS_SPECS}
+SEDLIB=                s@-L/usr/@-L${USRDATA_PREFIX}/usr/@g
+SEDSYS=                /--eh-frame/s@^@--sysroot=${USRDATA_PREFIX} @g
+
+.for _tool in ${GENTOOLS}
+${_tool}:
+       echo "#!/bin/sh" > ${.TARGET}
+       echo "" >> ${.TARGET}
+       echo "exec ${REALGCC}/${.TARGET:T:R} ${CSPECS}" '"$$@"' >> ${.TARGET}
+.endfor
+
+cross_specs:
+       echo "*link:" > ${.TARGET}
+       ${REALGCC}/cc -dumpspecs | grep eh-frame-hdr | sed \
+           -e "${SEDLIB}" -e "${SEDSYS}" >> ${.TARGET}
+
+.if !defined(DESTDIR) || ${DESTDIR} == "" || ${DESTDIR} == "/"
+.error "refusing to install wrappers to base"
+.endif
+
+CLEANFILES= ${GENTOOLS} cross_specs
+
+.include <bsd.prog.mk>
+
+.else
+# these must be left alone
+SUBDIR_ORDERED=        cc_prep cc_tools
+SUBDIR=                cc_prep cc_tools
+.include <bsd.subdir.mk>
+.endif
index da5c840..2671d80 100644 (file)
@@ -1,4 +1,11 @@
+# if wrapper mode
+.if defined(NO_TOOLCHAIN)
+.include "Makefile.zhack"
+.else
+
+# normal mode
 SUBDIR=        libbfd libiberty libgnu libopcodes libdecnumber libreadline
 SUBDIR+=       libgdb gdb kgdb gdbtui
 
 .include <bsd.subdir.mk>
+.endif
diff --git a/gnu/usr.bin/gdb/Makefile.zhack b/gnu/usr.bin/gdb/Makefile.zhack
new file mode 100644 (file)
index 0000000..a36cd98
--- /dev/null
@@ -0,0 +1,2 @@
+# dummy
+.include <bsd.prog.mk>
index 2b8d67e..374c4e0 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 LIB=   gmp
 INTERNALLIB=   # yes
 
@@ -273,3 +280,4 @@ mkdirs:
        mkdir -p ${GENDIRS}
 
 .include <bsd.lib.mk>
+.endif
diff --git a/gnu/usr.bin/gmp/Makefile.zhack b/gnu/usr.bin/gmp/Makefile.zhack
new file mode 100644 (file)
index 0000000..a36cd98
--- /dev/null
@@ -0,0 +1,2 @@
+# dummy
+.include <bsd.prog.mk>
index 759b619..d53aa31 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 CONTRIBDIR=    ${.CURDIR}/../../../contrib/mpc/src
 .PATH:         ${CONTRIBDIR}
 
@@ -25,3 +32,4 @@ SRCS= mpc-impl.h abs.c acos.c acosh.c add.c add_fr.c                       \
   ui_div.c ui_ui_sub.c
 
 .include <bsd.lib.mk>
+.endif
diff --git a/gnu/usr.bin/mpc/Makefile.zhack b/gnu/usr.bin/mpc/Makefile.zhack
new file mode 100644 (file)
index 0000000..a36cd98
--- /dev/null
@@ -0,0 +1,2 @@
+# dummy
+.include <bsd.prog.mk>
index cc808b6..f5c1ec3 100644 (file)
@@ -1,3 +1,10 @@
+# if wrapper mode
+.if (defined(NO_CROSSTOOLS) && defined(BOOTSTRAPPING)) || \
+    (!defined(BOOTSTRAPPING) && defined(NO_TOOLCHAIN))
+.include "Makefile.zhack"
+.else
+
+# normal mode
 CONTRIBDIR=    ${.CURDIR}/../../../contrib/mpfr/src
 .PATH: ${CONTRIBDIR}
 
@@ -69,3 +76,4 @@ SRCS = mpfr.h mpf2mpfr.h mpfr-gmp.h mpfr-impl.h mpfr-intmax.h \
 #SRCS+= set_d64.c get_d64.c
 
 .include <bsd.lib.mk>
+.endif
diff --git a/gnu/usr.bin/mpfr/Makefile.zhack b/gnu/usr.bin/mpfr/Makefile.zhack
new file mode 100644 (file)
index 0000000..a36cd98
--- /dev/null
@@ -0,0 +1,2 @@
+# dummy
+.include <bsd.prog.mk>