improving bootstrapping of WITH_CLANG_IS_CC

Brooks Davis brooks at freebsd.org
Mon Sep 10 21:57:01 UTC 2012


Currently, when WITH_CLANG_IS_CC is set for the first time (/usr/bin/cc
is gcc) you must also set CC=clang, CXX=clang++, and CPP=clang-cpp.
This is due to the fact that we currently hardcode knowledge of which
compiler cc is and key if off of WITH_CLANG_IS_CC.  Thus while building
things required to build clang as a cross compiler we end up passing
clang CFLAGS to gcc.

I propose that we correct this by adding a new internal variable
COMPILER_TYPE which indicates which compiler we are using.  For now it
just supports two values gcc and clang.  Further refinement will be
required as we add support for external toolchains.

The following patch implements this feature.  It allows me to complete
"make -DWITH_CLANG_IS_CC buildworld" and "make -DWITH_CLANG_IS_CC
installworld" on amd64 and survives a "make tinderbox".

The core logic lives in the new bsd.compiler.mk which determines which
type our compiler is from ${CC}.  If ${CC} isn't a known compiler name
it is run with --version and we attempt to determine it from there.  To
compensate for the fact that this is a) slow and b) the default case I
have patched Makefile.inc1 to set COMPILER_TYPE appropriately in the
environment of the submakes.  In the stages leading up to cross build I
rely on bsd.compiler.mk.  For the world stage I rely on knowing what
compiler will be built as a cross compiler.  With these optimizations
we end up with four extra invocations of ${CC} which should not be
noticeable in practice.

The rest of the patch replaces things like:

.if ${MK_CLANG_IS_CC} == "no" && ${CC:T:Mclang} != "clang"

with things like:

.if ${COMPILER_TYPE} != "clang"

I'd like to commit this in the next few days unless there are objections
requiring a major redesign.

-- Brooks

Index: share/mk/Makefile
===================================================================
--- share/mk/Makefile	(revision 240210)
+++ share/mk/Makefile	(working copy)
@@ -3,7 +3,8 @@
 
 FILES=	bsd.README
 FILES+=	bsd.arch.inc.mk
-FILES+=	bsd.compat.mk bsd.cpu.mk bsd.dep.mk bsd.doc.mk bsd.dtrace.mk
+FILES+=	bsd.compat.mk bsd.compiler.mk bsd.cpu.mk
+FILES+=	bsd.dep.mk bsd.doc.mk bsd.dtrace.mk
 FILES+=	bsd.endian.mk
 FILES+=	bsd.files.mk bsd.crunchgen.mk bsd.incs.mk bsd.info.mk bsd.init.mk
 FILES+=	bsd.kmod.mk
Index: share/mk/bsd.compiler.mk
===================================================================
--- share/mk/bsd.compiler.mk	(revision 0)
+++ share/mk/bsd.compiler.mk	(working copy)
@@ -0,0 +1,20 @@
+# $FreeBSD$
+
+.if !defined(COMPILER_TYPE)
+. if ${CC:T:Mgcc} == "gcc"
+COMPILER_TYPE:=	gcc  
+. elif ${CC:T:Mclang} == "clang"
+COMPILER_TYPE:=	clang
+. else
+_COMPILER_VERSION       != ${CC} --version
+.  if ${_COMPILER_VERSION:Mgcc} == "gcc"
+COMPILER_TYPE:=	gcc
+.  elif ${_COMPILER_VERSION:M\(GCC\)} == "(GCC)"
+COMPILER_TYPE:=	gcc
+.  elif ${_COMPILER_VERSION:Mclang} == "clang"
+COMPILER_TYPE:=	clang
+.  else
+.error Unable to determing compiler type for ${CC}
+.  endif
+. endif
+.endif
Index: share/mk/bsd.sys.mk
===================================================================
--- share/mk/bsd.sys.mk	(revision 240210)
+++ share/mk/bsd.sys.mk	(working copy)
@@ -8,6 +8,8 @@
 
 # for GCC:   http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Warning-Options.html
 
+.include <bsd.compiler.mk>
+
 # the default is gnu99 for now
 CSTD?=		gnu99
 
@@ -28,8 +30,8 @@
 .if defined(WARNS)
 .if ${WARNS} >= 1
 CWARNFLAGS+=	-Wsystem-headers
-.if !defined(NO_WERROR) && ((${MK_CLANG_IS_CC} == "no" && \
-    ${CC:T:Mclang} != "clang") || !defined(NO_WERROR.clang))
+.if !defined(NO_WERROR) && (${COMPILER_TYPE} != "clang" \
+    || !defined(NO_WERROR.clang))
 CWARNFLAGS+=	-Werror
 .endif # !NO_WERROR && (!CLANG || !NO_WERROR.clang)
 .endif # WARNS >= 1
@@ -43,8 +45,8 @@
 .if ${WARNS} >= 4
 CWARNFLAGS+=	-Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow\
 		-Wunused-parameter
-.if !defined(NO_WCAST_ALIGN) && ((${MK_CLANG_IS_CC} == "no" && \
-    ${CC:T:Mclang} != "clang") || !defined(NO_WCAST_ALIGN.clang))
+.if !defined(NO_WCAST_ALIGN) && (${COMPILER_TYPE} != "clang" \
+    || !defined(NO_WCAST_ALIGN.clang))
 CWARNFLAGS+=	-Wcast-align
 .endif # !NO_WCAST_ALIGN && (!CLANG || !NO_WCAST_ALIGN.clang)
 .endif # WARNS >= 4
@@ -61,8 +63,7 @@
 CWARNFLAGS+=	-Wno-pointer-sign
 # Clang has more warnings enabled by default, and when using -Wall, so if WARNS
 # is set to low values, these have to be disabled explicitly.
-.if (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") && \
-    !defined(EARLY_BUILD)
+.if ${COMPILER_TYPE} == "clang" && !defined(EARLY_BUILD)
 .if ${WARNS} <= 6
 CWARNFLAGS+=	-Wno-empty-body -Wno-string-plus-int
 .endif # WARNS <= 6
@@ -89,20 +90,18 @@
 .if ${WFORMAT} > 0
 #CWARNFLAGS+=	-Wformat-nonliteral -Wformat-security -Wno-format-extra-args
 CWARNFLAGS+=	-Wformat=2 -Wno-format-extra-args
-.if (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") && \
-    !defined(EARLY_BUILD)
+.if ${COMPILER_TYPE} == "clang" && !defined(EARLY_BUILD)
 .if ${WARNS} <= 3
 CWARNFLAGS+=	-Wno-format-nonliteral
 .endif # WARNS <= 3
 .endif # CLANG
-.if !defined(NO_WERROR) && ((${MK_CLANG_IS_CC} == "no" && \
-    ${CC:T:Mclang} != "clang") || !defined(NO_WERROR.clang))
+.if !defined(NO_WERROR) && (${COMPILER_TYPE} != "clang" \
+    || !defined(NO_WERROR.clang))
 CWARNFLAGS+=	-Werror
 .endif # !NO_WERROR && (!CLANG || !NO_WERROR.clang)
 .endif # WFORMAT > 0
 .endif # WFORMAT
-.if defined(NO_WFORMAT) || ((${MK_CLANG_IS_CC} != "no" || \
-    ${CC:T:Mclang} == "clang") && defined(NO_WFORMAT.clang))
+.if defined(NO_WFORMAT) || (${COMPILER_TYPE} == "clang" && defined(NO_WFORMAT.clang))
 CWARNFLAGS+=	-Wno-format
 .endif # NO_WFORMAT || (CLANG && NO_WFORMAT.clang)
 .endif # !NO_WARNS
@@ -111,8 +110,7 @@
 CWARNFLAGS+=	-Wno-unknown-pragmas
 .endif # IGNORE_PRAGMA
 
-.if (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") && \
-    !defined(EARLY_BUILD)
+.if ${COMPILER_TYPE} == "clang" && !defined(EARLY_BUILD)
 CLANG_NO_IAS=	 -no-integrated-as
 CLANG_OPT_SMALL= -mstack-alignment=8 -mllvm -inline-threshold=3\
 		 -mllvm -enable-load-pre=false -mllvm -simplifycfg-dup-ret
Index: Makefile.inc1
===================================================================
--- Makefile.inc1	(revision 240210)
+++ Makefile.inc1	(working copy)
@@ -46,6 +46,7 @@
 
 .include <bsd.own.mk>
 .include <bsd.arch.inc.mk>
+.include <bsd.compiler.mk>
 
 # We must do share/info early so that installation of info `dir'
 # entries works correctly.  Do it first since it is less likely to
@@ -235,7 +236,8 @@
 		PATH=${BPATH}:${PATH} \
 		WORLDTMP=${WORLDTMP} \
 		VERSION="${VERSION}" \
-		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
+		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}" \
+		COMPILER_TYPE=${COMPILER_TYPE}
 BMAKE=		MAKEOBJDIRPREFIX=${WORLDTMP} \
 		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
 		DESTDIR= \
@@ -270,6 +272,16 @@
 .if ${MK_CDDL} == "no"
 WMAKEENV+=	NO_CTF=1
 .endif
+.if ${CC:T:Mgcc} == "gcc"
+WMAKECOMPILER_TYPE=	gcc
+.elif ${CC:T:Mclang} == "clang"
+WMAKECOMPILER_TYPE=	clang
+.elif ${MK_CLANG_IS_CC} == "no"
+WMAKECOMPILER_TYPE=	gcc
+.else
+WMAKECOMPILER_TYPE=	clang
+.endif
+WMAKEENV+=	COMPILER_TYPE=${WMAKE_COMPILER_TYPE}
 WMAKE=		${WMAKEENV} ${MAKE} -f Makefile.inc1 DESTDIR=${WORLDTMP}
 
 .if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64"
@@ -313,7 +325,8 @@
 		CC="${CC} ${LIB32FLAGS}" \
 		CXX="${CXX} ${LIB32FLAGS}" \
 		LIBDIR=/usr/lib32 \
-		SHLIBDIR=/usr/lib32
+		SHLIBDIR=/usr/lib32 \
+		COMPILER_TYPE=${WMAKE_COMPILER_TYPE}
 
 LIB32WMAKE=	${LIB32WMAKEENV} ${MAKE} -DNO_CPU_CFLAGS -DCOMPAT_32BIT \
 		-DWITHOUT_BIND -DWITHOUT_MAN -DWITHOUT_INFO \
Index: sys/conf/kmod.mk
===================================================================
--- sys/conf/kmod.mk	(revision 240210)
+++ sys/conf/kmod.mk	(working copy)
@@ -73,6 +73,7 @@
 .endif
 
 .include <bsd.init.mk>
+.include <bsd.compiler.mk>
 
 .SUFFIXES: .out .o .c .cc .cxx .C .y .l .s .S
 
@@ -108,7 +109,7 @@
 # for example.
 CFLAGS+=	-I@/contrib/altq
 
-.if ${MK_CLANG_IS_CC} == "no" && ${CC:T:Mclang} != "clang"
+.if ${COMPILER_TYPE} != "clang"
 CFLAGS+=	-finline-limit=${INLINE_LIMIT}
 CFLAGS+= --param inline-unit-growth=100
 CFLAGS+= --param large-function-growth=1000
Index: sys/conf/kern.pre.mk
===================================================================
--- sys/conf/kern.pre.mk	(revision 240210)
+++ sys/conf/kern.pre.mk	(working copy)
@@ -4,6 +4,7 @@
 # of the definitions that need to be before %BEFORE_DEPEND.
 
 .include <bsd.own.mk>
+.include <bsd.compiler.mk>
 
 # backwards compat option for older systems.
 MACHINE_CPUARCH?=${MACHINE_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
@@ -34,7 +35,7 @@
 .endif
 .endif
 .if ${MACHINE_CPUARCH} == "amd64"
-.if ${MK_CLANG_IS_CC} == "no" && ${CC:T:Mclang} != "clang"
+.if ${COMPILER_TYPE} != "clang"
 COPTFLAGS?=-O2 -frename-registers -pipe
 .else
 COPTFLAGS?=-O2 -pipe
@@ -84,7 +85,7 @@
 
 CFLAGS=	${COPTFLAGS} ${C_DIALECT} ${DEBUG} ${CWARNFLAGS}
 CFLAGS+= ${INCLUDES} -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h
-.if ${MK_CLANG_IS_CC} == "no" && ${CC:T:Mclang} != "clang"
+.if ${COMPILER_TYPE} != "clang"
 CFLAGS+= -fno-common -finline-limit=${INLINE_LIMIT}
 .if ${MACHINE_CPUARCH} != "mips"
 CFLAGS+= --param inline-unit-growth=100
@@ -101,7 +102,7 @@
 # XXX LOCORE means "don't declare C stuff" not "for locore.s".
 ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${CFLAGS}
 
-.if ${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang"
+.if ${COMPILER_TYPE} == "clang"
 CLANG_NO_IAS= -no-integrated-as
 .endif
 
Index: sys/conf/kern.mk
===================================================================
--- sys/conf/kern.mk	(revision 240210)
+++ sys/conf/kern.mk	(working copy)
@@ -15,7 +15,7 @@
 # Disable a few warnings for clang, since there are several places in the
 # kernel where fixing them is more trouble than it is worth, or where there is
 # a false positive.
-.if ${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang"
+.if ${COMPILER_TYPE} == "clang"
 NO_WCONSTANT_CONVERSION=	-Wno-constant-conversion
 NO_WARRAY_BOUNDS=		-Wno-array-bounds
 NO_WSHIFT_COUNT_NEGATIVE=	-Wno-shift-count-negative
@@ -52,7 +52,7 @@
 # Setting -mno-sse implies -mno-sse2, -mno-sse3, -mno-ssse3, -mno-sse41 and -mno-sse42
 #
 .if ${MACHINE_CPUARCH} == "i386"
-.if ${MK_CLANG_IS_CC} == "no" && ${CC:T:Mclang} != "clang"
+.if ${COMPILER_TYPE} != "clang"
 CFLAGS+=	-mno-align-long-strings -mpreferred-stack-boundary=2
 .else
 CFLAGS+=	-mno-aes -mno-avx
@@ -100,7 +100,7 @@
 # (-mfpmath= is not supported)
 #
 .if ${MACHINE_CPUARCH} == "amd64"
-.if ${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang"
+.if ${COMPILER_TYPE} == "clang"
 CFLAGS+=	-mno-aes -mno-avx
 .endif
 CFLAGS+=	-mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -msoft-float \
-------------- 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-toolchain/attachments/20120910/0def7d9a/attachment.pgp


More information about the freebsd-toolchain mailing list