[RFC] external compiler support
Warner Losh
imp at bsdimp.com
Thu Feb 28 06:02:51 UTC 2013
On Feb 27, 2013, at 5:02 PM, Brooks Davis wrote:
> On Wed, Feb 27, 2013 at 04:15:52PM -0600, Brooks Davis wrote:
>> On Wed, Feb 27, 2013 at 02:47:59PM -0700, Warner Losh wrote:
>>>
>>> On Feb 27, 2013, at 2:44 PM, Brooks Davis wrote:
>>>>>> As a strawman, let's say we add a CROSS_COMPILER_PATH and a
>>>>>> CROSS_BINUTILS_PATH. The former will set XCC, XCXX, and XCPP if they
>>>>>> are unset. The latter will control -B and set the various binutils
>>>>>> variables (XNM, XLD, etc).
>>>>>
>>>>> I'm not sure I like splitting things like that. It is unnatural.
>>>>
>>>> That's the traditional view with lots of historic merit. At least in
>>>> the short term it's not a useful view for me. I want to be able to
>>>> use our existing infrastructure to build a cross binutils and then use
>>>> it with an external compiler. In a clang world, we currently have one
>>>> compiler and many binutils unless we gratuitously build many compilers
>>>> as the FreeBSD build system currently does. Some day we will likely have
>>>> an all-llvm toolchain available and then we will have one toolchain for
>>>> all supported architectures.
>>>>
>>>> I suppose could hack what I want to do into the traditional single
>>>> toolchain world view by build a mips64 xdev toolchain and then building
>>>> a linkfarm and/or set of wrapper scripts to it and the clang I want to
>>>> include, but that seems problematic from a reproducability perspective
>>>> (not to mention performance if I need wrappers to set -B).
>>>>
>>>> Having a CROSS_TOOLCHAIN_PATH path that sets both would probably be a
>>>> useful compromise in this regard.
>>>
>>> Are you suggesting something like:
>>>
>>> CROSS_COMPILER_PATH?=${CROSS_TOOLCHAIN_PATH}
>>> CROSS_BINUTILS_PATH?=${CROSS_TOOLCHAIN_PATH}
>>>
>>> If so, I'd agree, that would be a very useful compromise: hits my ease of use issues, and lets you do what you need on the theory that others will likely need it too.
>>
>> That's exactly what I'm thinking.
>
> Here's a rework with that implemented. I'm not 100% sure I got the list
> of binutils right, but it notionally supports both my usecase and a more
> classic cross compiler set.
>
> -- Brooks
>
> MFP4 222356, 222371, 222375, 222391, 222403, 222407, 222411, 222446
>
> 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
Looks a lot better, some minor comments..
> --- ../../freebsd/src/Makefile.inc1 2013-02-26 21:31:09.000000000 +0000
> +++ ./Makefile.inc1 2013-02-27 23:31:46.000000000 +0000
> @@ -280,15 +280,61 @@
> .if ${MK_CDDL} == "no"
> WMAKEENV+= NO_CTF=1
> .endif
> -.if ${CC:T:Mgcc} == "gcc"
> +
> +.if defined(CROSS_TOOLCHAIN_PATH)
> +CROSS_COMPILER_PATH?=${CROSS_TOOLCHAIN_PATH}
> +CROSS_BINUTILS_PATH?=${CROSS_TOOLCHAIN_PATH}
> +.endif
> +XCOMPILERS= CC CXX CPP
> +.for COMPILER in ${XCOMPILERS}
> +.if defined(CROSS_COMPILER_PATH)
> +X${COMPILER}?= ${CROSS_COMPILER_PATH}/${${COMPILER}}
This makes it harder to support FreeBSD make xdev-built compilers. Can you lose the / and require it to be specified if someone wants to use just a path?
> +.else
> +X${COMPILER}?= ${${COMPILER}}
> +.endif
> +.endfor
> +XBINUTILS= AS AR LD NM OBJDUMP RANLIB STRINGS
> +.for BINUTIL in ${XBINUTILS}
> +.if defined(CROSS_BINUTILS_PATH)
> +X${BINUTIL}?= ${CROSS_BINUTILS_PATH}/${${BINUTIL}}
Same.
> +.else
> +X${BINUTIL}?= ${${BINUTIL}}
> +.endif
> +.endfor
> +WMAKEENV+= CC="${XCC} ${XFLAGS}" CXX="${XCXX} ${XFLAGS}" \
> + CPP="${XCPP} ${XFLAGS}" \
> + AS="${XAS}" AR="${XAR}" LD="${XLD}" NM=${XNM} \
> + OBJDUMP=${XOBJDUMP} RANLIB=${RANLIB} STRINGS=${XSTRINGS}
XRANLIB maybe?
> +
> +.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
> +
> +.if ${XCC:M/*}
> +XFLAGS= --sysroot=${WORLDTMP}
> +.if defined(CROSS_BINUTILS_PATH)
> +XFLAGS+= -B${CROSS_BINUTILS_PATH}
Hmmm, but this would need to change somehow...
> +.else
> +XFLAGS+= -B${WORLDTMP}/usr/bin
> +.endif
> +.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+= COMPILER_TYPE=${WMAKE_COMPILER_TYPE}
> WMAKE= ${WMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 DESTDIR=${WORLDTMP}
>
> @@ -321,6 +367,7 @@
>
>
> LIB32FLAGS= -m32 ${LIB32CPUFLAGS} -DCOMPAT_32BIT \
> + --sysroot=${WORLDTMP} \
> -isystem ${LIB32TMP}/usr/include/ \
> -L${LIB32TMP}/usr/lib32 \
> -B${LIB32TMP}/usr/lib32
> @@ -336,8 +383,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 \
> @@ -1284,10 +1331,13 @@
> .endif
> .endif
>
> -.if ${MK_BINUTILS} != "no"
> +.if ${XAS:M/*} == "" && ${MK_BINUTILS} != "no"
> _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 +1346,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