[RFC] external compiler support

Alfred Perlstein bright at mu.org
Wed Feb 27 03:05:03 UTC 2013


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.



More information about the freebsd-arch mailing list