Date: Wed, 27 Feb 2013 09:08:05 -0700 From: Warner Losh <imp@bsdimp.com> To: Warner Losh <imp@bsdimp.com> Cc: Brooks Davis <brooks@FreeBSD.org>, freebsd-arch@freebsd.org Subject: Re: [RFC] external compiler support Message-ID: <51BB3E17-128A-4989-B272-D8B40D4B854B@bsdimp.com> In-Reply-To: <28404C12-67F3-44F0-AB28-02B749472873@bsdimp.com> References: <20130227003517.GB7348@lor.one-eyed-alien.net> <28404C12-67F3-44F0-AB28-02B749472873@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Ooops, forgot to add one item.. On Feb 27, 2013, at 8:57 AM, Warner Losh wrote: > > On Feb 26, 2013, at 5: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. > > Cool! > >> The patch is untested with gcc. > > I'd like to see it tested 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. > > The patches I posted a few months ago had that as well... > >> 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. > > I think this will work, but it is kludgy. I had created a __X=<prefix-path> which was prepended to ${CC}, et al, in sys.mk. It was only defined when you set CROSS_COMPILER_PATH (or EXTERNAL_COMPILER_PATH, I forget) during the cross building stage. It also had the advantage of making external cross binutils available. Your patch could fairly easily use this interface instead of having to set 3 different variables, which will morph to 10 when you add binutil support. I've also started looking into using clang --mumble to doing cross builds too, so I don't have to have 4 compilers configured and laying around for the different platforms I play with. That isn't reflected in the port. I also am having trouble finding my full patch, but a partial patch can be found at http://people.freebsd.org/~imp/simple-ext.diff. A patch that looks to be contaminated with other patches but that seems to have all the bits in it is in http://people.freebsd.org/~imp/ext_comp.diff. I've not tried to apply either of these patches, and they are about 9 months old at this point. Should be easy enough to merge forward by hand if patch just doesn't do it. Warner >> -- 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. > > This change is likely good as-is. > >> To facilitate the use of unmodified external compilers, a >> WITHOUT_FORMAT_EXTENSIONS option is available to supress printf format >> checking. > > This one definitely is good as-is. > >> 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} > > I don't like having three different variables to set. I don't think this will work with gcc, unless we've fixed all the instances in the tree where we called AS or LD directly. The patches that I had would set ${CC}, etc based on a CROSS_COMPILER_PATH=xxx variable. I'd rather see us do that than have this hacky set 3 variables thing. > >> +.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 > > Is there any way to set the WMAKE_COMPILER_TYPE with these patches? XCC might be something like mips-cavium-cc which won't trigger any of the above, unless you also have set WITHOUT_CLANG_IS_CC... > >> -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 > > We need to fix the gnueabi issue with arm. machine_arch should always be enough to be self-hosting, and while I fixed the armv6 issue, this has cropped up in its place :(. > >> +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. >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51BB3E17-128A-4989-B272-D8B40D4B854B>
