Hi,
I would like to introduce a list of architectures that use Clang instead
of gcc. This will probably be helpful for specifying when and when not
to compile libraries for clang and clang itself. Additionally I would
like to add it to make it useful for cross-compile bootstrap of arm64.
The second part of the diff adds arm64 to the cross-compile Makefile.
Considering we don't have binutils for aarch64 in base, I also added
a check to skip binutils for aarch64.
Comments?
Patrick
diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk
index d2db1871218b..030551f708e2 100644
--- a/share/mk/bsd.own.mk
+++ b/share/mk/bsd.own.mk
@@ -15,6 +15,7 @@ SKEY?= yes
# Set `YP' to `yes' to build with support for NIS/YP.
YP?= yes
+CLANG_ARCH=aarch64
GCC3_ARCH=m88k
# m88k: ?
@@ -22,7 +23,9 @@ PIE_ARCH=alpha amd64 arm hppa i386 mips64 mips64el powerpc sh
sparc64
STATICPIE_ARCH=alpha amd64 arm hppa i386 mips64 mips64el powerpc sh sparc64
.for _arch in ${MACHINE_ARCH}
-.if !empty(GCC3_ARCH:M${_arch})
+.if !empty(CLANG_ARCH:M${_arch})
+COMPILER_VERSION?=clang
+.elif !empty(GCC3_ARCH:M${_arch})
COMPILER_VERSION?=gcc3
.else
COMPILER_VERSION?=gcc4
diff --git a/Makefile.cross b/Makefile.cross
index cfb6d2f1e546..002bbcc40e30 100644
--- a/Makefile.cross
+++ b/Makefile.cross
@@ -6,7 +6,9 @@ cross-distrib: cross-tools cross-bin cross-share cross-sys
cross-etc-root-var
# Have to compute TARGET_ARCH directly in the Makefile, for .if tests involving
# this variable to work.
-.if (${TARGET} == "armv7")
+.if (${TARGET} == "arm64")
+TARGET_ARCH= aarch64
+.elif (${TARGET} == "armv7")
TARGET_ARCH= arm
.elif (${TARGET} == "luna88k")
TARGET_ARCH= m88k
@@ -26,7 +28,7 @@ TARGET_CPU?= ${TARGET_ARCH}
# List of LP64 archs
# XXX move to bsd.*.mk?
-LP64_ARCH = amd64 alpha mips64 sparc64
+LP64_ARCH = aarch64 amd64 alpha mips64 sparc64
TARGET_IS_LP64 =
MACHINE_IS_LP64 =
@@ -77,7 +79,9 @@ CROSSGCC= ${CROSSDIR}/.gcc_done
.include <bsd.own.mk>
.for _arch in ${TARGET_ARCH}
-.if !empty(GCC3_ARCH:M${_arch})
+.if !empty(CLANG_ARCH:M${_arch})
+COMPILER_VERSION=clang
+.elif !empty(GCC3_ARCH:M${_arch})
COMPILER_VERSION=gcc3
.else
COMPILER_VERSION=gcc4
@@ -174,6 +178,7 @@ ${CROSSINCLUDES}: ${CROSSOBJ}
@touch ${CROSSINCLUDES}
${CROSSBINUTILS}: ${CROSSINCLUDES}
+.if ${TARGET_ARCH} != "aarch64"
(cd ${.CURDIR}/${BINUTILS_DIR}; \
MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
PIE_DEFAULT=${PIE_DEFAULT} \
@@ -208,11 +213,36 @@ ${CROSSBINUTILS}: ${CROSSINCLUDES}
${CROSSDIR}/usr/bin/${TARGET_CANON}-$$cmd ;\
fi ;\
done
+.endif
@touch ${CROSSBINUTILS}
${CROSSGCC}: ${CROSSBINUTILS}
-.if ${COMPILER_VERSION:L} == "gcc3"
+.if ${COMPILER_VERSION:L} == "clang"
+ (cd ${.CURDIR}/gnu/usr.bin/clang; \
+ MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
+ MACHINE_ARCH=${TARGET_ARCH} \
+ ${MAKE} obj)
+ (cd ${.CURDIR}/gnu/usr.bin/clang; \
+ MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
+ MACHINE_ARCH=${TARGET_ARCH} \
+ ${MAKE} depend)
+ (cd ${.CURDIR}/gnu/usr.bin/clang; \
+ MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
+ MACHINE_ARCH=${TARGET_ARCH} \
+ ${MAKE} all)
+ (cd ${.CURDIR}/gnu/usr.bin/clang; \
+ DESTDIR=${CROSSDIR} \
+ MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
+ MACHINE_ARCH=${TARGET_ARCH} \
+ ${MAKE} install)
+ mv ${CROSSDIR}/usr/bin/clang ${CROSSDIR}/usr/bin/${TARGET_CANON}-clang
+ mv ${CROSSDIR}/usr/bin/clang++
${CROSSDIR}/usr/bin/${TARGET_CANON}-clang++
+ cp -f ${CROSSDIR}/usr/bin/${TARGET_CANON}-clang
${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-cc
+ cp -f ${CROSSDIR}/usr/bin/${TARGET_CANON}-clang++
${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-c++
+ ln -sf ${TARGET_CANON}-cc ${CROSSDIR}/usr/${TARGET_CANON}/bin/cc
+ ln -sf ${TARGET_CANON}-c++ ${CROSSDIR}/usr/${TARGET_CANON}/bin/c++
+.elif ${COMPILER_VERSION:L} == "gcc3"
(cd ${.CURDIR}/gnu/usr.bin/gcc; \
MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \