[RFC] external compiler support
Warner Losh
imp at bsdimp.com
Wed Feb 27 16:08:09 UTC 2013
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.
>
More information about the freebsd-arch
mailing list