Date: Tue, 26 Feb 2013 19:04:57 -0800 From: Alfred Perlstein <bright@mu.org> To: Brooks Davis <brooks@freebsd.org> Cc: freebsd-arch@freebsd.org Subject: Re: [RFC] external compiler support Message-ID: <512D77D9.9020205@mu.org> In-Reply-To: <20130227003517.GB7348@lor.one-eyed-alien.net>
index | next in thread | previous in thread | raw e-mail
On 2/26/13 4:35 PM, Brooks Davis wrote: > Below (and at http://people.freebsd.org/~brooks/patches/xcc.diff) you > can find an initial patch with proposed commit for external compiler > support. It relies on the existing cross binutils as I'm finding that > the two are fairly separable. With this patch I've been able to build > from amd64 to arm, amd64, and i386 using clang from the lang/clang-devel > port. I've also compiled the tree with a customized clang being > developed at the University of Cambridge. > > The patch is untested with gcc. > > Does this seem like a reasonable approach? I do plan to look at external > binutils support, but it's not on the critical path for our current work > so I've opted to avoid it for now. > > As a bonus for those who don't need an external compiler, but do run > make buildworld frequently, the XCC, XCXX, and XCPP variables can be set > to the location of the installed base system compiler to avoid building > the compiler twice during buildworld. This is very cool work and it's non-invasive. Are there any downsides to bringing it in? (I can't see any). -Alfred > -- Brooks > > ----- > MFP4 222356, 222371, 222375, 222391, 222403, 222407, 222411 > > Add support for an external cross compiler. The cross compiler is > specified by passing the XCC, XCXX, and XCPP variables (corresponding to > CC, CXX, and CPP) to buildworld/buildkernel. The compiler must be clang > or be configured to target the appropriate architecture. > > To speed build times, if XCC is an absolute path or > WITHOUT_CROSS_COMPILER is defined then no cross compiler will be built > during the cross-tools stage. > > To facilitate the use of unmodified external compilers, a > WITHOUT_FORMAT_EXTENSIONS option is available to supress printf format > checking. > > As a short-term measure, supress a few new clang warnings during kernel > builds. > > Sponsored by: DARPA, AFRL > Reviewed by: xxx > > --- ../../freebsd/src/Makefile.inc1 2013-02-26 21:31:09.000000000 +0000 > +++ ./Makefile.inc1 2013-02-26 21:10:50.000000000 +0000 > @@ -280,16 +280,34 @@ > .if ${MK_CDDL} == "no" > WMAKEENV+= NO_CTF=1 > .endif > -.if ${CC:T:Mgcc} == "gcc" > +XCC?= ${CC} > +XCXX?= ${CXX} > +XCPP?= ${CPP} > +.if ${XCC:T:Mgcc} == "gcc" > WMAKE_COMPILER_TYPE= gcc > -.elif ${CC:T:Mclang} == "clang" > +.elif ${XCC:T:Mclang} == "clang" > WMAKE_COMPILER_TYPE= clang > .elif ${MK_CLANG_IS_CC} == "no" > WMAKE_COMPILER_TYPE= gcc > .else > WMAKE_COMPILER_TYPE= clang > .endif > -WMAKEENV+= COMPILER_TYPE=${WMAKE_COMPILER_TYPE} > +.if ${XCC:M/*} > +XFLAGS= --sysroot=${WORLDTMP} -B${WORLDTMP}/usr/bin > +.if ${TARGET_ARCH} != ${MACHINE_ARCH} && ${WMAKE_COMPILER_TYPE} == "clang" > +.if (${TARGET_ARCH} == "arm" || ${TARGET_ARCH} == "armv6") && \ > +${MK_ARM_EABI} != "no" > +TARGET_ABI= gnueabi > +.else > +TARGET_ABI= unknown > +.endif > +TARGET_TRIPLE?= ${TARGET_ARCH:C/amd64/x86_64/}-${TARGET_ABI}-freebsd10.0 > +XFLAGS+= -target ${TARGET_TRIPLE} > +.endif > +.endif > +WMAKEENV+= CC="${XCC} ${XFLAGS}" CXX="${XCXX} ${XFLAGS}" \ > + CPP="${XCPP} ${XFLAGS}" \ > + COMPILER_TYPE=${WMAKE_COMPILER_TYPE} > WMAKE= ${WMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 DESTDIR=${WORLDTMP} > > .if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64" > @@ -321,6 +339,7 @@ > > > LIB32FLAGS= -m32 ${LIB32CPUFLAGS} -DCOMPAT_32BIT \ > + --sysroot=${WORLDTMP} \ > -isystem ${LIB32TMP}/usr/include/ \ > -L${LIB32TMP}/usr/lib32 \ > -B${LIB32TMP}/usr/lib32 > @@ -336,8 +355,8 @@ > SHLIBDIR=/usr/lib32 \ > COMPILER_TYPE=${WMAKE_COMPILER_TYPE} > LIB32WMAKEFLAGS+= \ > - CC="${CC} ${LIB32FLAGS}" \ > - CXX="${CXX} ${LIB32FLAGS}" \ > + CC="${XCC} ${LIB32FLAGS}" \ > + CXX="${XCXX} ${LIB32FLAGS}" \ > DESTDIR=${LIB32TMP} \ > -DCOMPAT_32BIT \ > -DLIBRARIES_ONLY \ > @@ -1288,6 +1307,9 @@ > _binutils= gnu/usr.bin/binutils > .endif > > +# If an full path to an external cross compiler is given, don't build > +# a cross compiler. > +.if ${XCC:M/*} == "" && ${MK_CROSS_COMPILER} != "no" > .if ${MK_CLANG} != "no" && (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") > _clang= usr.bin/clang > _clang_libs= lib/clang > @@ -1296,6 +1318,7 @@ > .if ${MK_GCC} != "no" && (${MK_CLANG_IS_CC} == "no" || ${TARGET} == "pc98") > _cc= gnu/usr.bin/cc > .endif > +.endif > > cross-tools: > .for _tool in \ > --- ../../freebsd/src/share/mk/bsd.own.mk 2013-02-15 18:49:13.000000000 +0000 > +++ share/mk/bsd.own.mk 2013-02-26 21:10:50.000000000 +0000 > @@ -262,6 +262,7 @@ > CAPSICUM \ > CDDL \ > CPP \ > + CROSS_COMPILER \ > CRYPT \ > CTM \ > CVS \ > @@ -271,6 +272,7 @@ > ED_CRYPTO \ > EXAMPLES \ > FLOPPY \ > + FORMAT_EXTENSIONS \ > FORTH \ > FP_LIBC \ > FREEBSD_UPDATE \ > --- ../../freebsd/src/sys/conf/kern.mk 2012-11-11 22:15:16.000000000 +0000 > +++ sys/conf/kern.mk 2013-02-26 20:35:48.000000000 +0000 > @@ -5,7 +5,7 @@ > # > CWARNFLAGS?= -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes \ > -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual \ > - -Wundef -Wno-pointer-sign -fformat-extensions \ > + -Wundef -Wno-pointer-sign ${FORMAT_EXTENTIONS} \ > -Wmissing-include-dirs -fdiagnostics-show-option \ > ${CWARNEXTRA} > # > @@ -29,7 +29,18 @@ > # enough to error out the whole kernel build. Display them anyway, so there is > # some incentive to fix them eventually. > CWARNEXTRA?= -Wno-error-tautological-compare -Wno-error-empty-body \ > - -Wno-error-parentheses-equality > + -Wno-error-parentheses-equality \ > + -Wno-sizeof-pointer-memaccess \ > + -Wno-unused-command-line-argument \ > + ${NO_WFORMAT} > +.endif > + > +# External compilers may not support our format extensions. Allow them > +# to be disabled. WARNING: format checking is disabled in this case. > +.if ${MK_FORMAT_EXTENSIONS} == "no" > +NO_WFORMAT= -Wno-format > +.else > +FORMAT_EXTENTIONS= -fformat-extensions > .endif > > # > diff -uN ../../freebsd/src/tools/build/options/WITHOUT_CROSS_COMPILER tools/build/options/WITHOUT_CROSS_COMPILER > --- ../../freebsd/src/tools/build/options/WITHOUT_CROSS_COMPILER 1970-01-01 00:00:00.000000000 +0000 > +++ tools/build/options/WITHOUT_CROSS_COMPILER 2013-02-26 21:10:50.000000000 +0000 > @@ -0,0 +1,3 @@ > +.\" $FreeBSD$ > +Set to not build a cross compiler in the cross-tools stage of > +buildworld, buildkernel, etc. > diff -uN ../../freebsd/src/tools/build/options/WITHOUT_FORMAT_EXTENSIONS tools/build/options/WITHOUT_FORMAT_EXTENSIONS > --- ../../freebsd/src/tools/build/options/WITHOUT_FORMAT_EXTENSIONS 1970-01-01 00:00:00.000000000 +0000 > +++ tools/build/options/WITHOUT_FORMAT_EXTENSIONS 2013-02-26 20:35:48.000000000 +0000 > @@ -0,0 +1,5 @@ > +.\" $FreeBSD$ > +Set to not enable > +.Fl fformat-extensions > +when compiling the kernel. > +Also disables all format checking.help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?512D77D9.9020205>
