[RFC] external compiler support

Brooks Davis brooks at FreeBSD.org
Thu Feb 28 00:02:43 UTC 2013


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

--- ../../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}}
+.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}}
+.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}
+
+.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}
+.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.
-------------- 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/20130227/21835951/attachment.sig>


More information about the freebsd-arch mailing list