[RFC] external compiler support

Brooks Davis brooks at freebsd.org
Wed Feb 27 00:35:22 UTC 2013


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.

-- 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 188 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-arch/attachments/20130226/ddbbef97/attachment.sig>


More information about the freebsd-arch mailing list