Support Clang as a `cross-tool' and use it under Android.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 18 Sep 2019 18:50:03 +0000 (19:50 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 18 Sep 2019 21:25:30 +0000 (22:25 +0100)
Add the necessary machinery to use Clang instead.  Annoyingly, the
Android NDK doesn't name its Clang wrappers with the usual GNU
architecture triples, so there's an exciting amount of hacking to be
done.

What I don't have yet is a principled way to configure which compiler
should get chosen for a given build.

android-cross-setup.sh.in
etc/android-cross-config.site
etc/android.sh
linux-cross-setup.sh.in
linux-native-setup.sh.in
src/crosstool.in
tools/cross-clang [new symlink]
tools/cross-clang++ [new symlink]

index f7186de..77d5599 100644 (file)
@@ -3,7 +3,7 @@
 ANDROID_NDK_TARGETARCH=@arch@
 . $CROSSDIR/etc/android.sh
 CONFIG_SITE=$CROSSDIR/etc/android-cross-config.site
-PATH=$PATH:$ANDROID_NDK_TOOLS; export PATH
+PATH=$PATH:$ANDROID_NDK_TOOLS:$ANDROID_NDK_LLVM; export PATH
 
 CROSS_gcc_FLAGS=" --sysroot=$ANDROID_NDK_SYSROOT \
        -D__ANDROID_API__=$ANDROID_NDK_TARGETVER \
@@ -13,5 +13,11 @@ CROSS_gcc_FLAGS=" --sysroot=$ANDROID_NDK_SYSROOT \
 CROSS_gxx_FLAGS=$CROSS_gcc_FLAGS
 export CROSS_gcc_FLAGS CROSS_gxx_FLAGS
 
+CROSS_clang_TOOL=$ANDROID_NDK_CLANGARCH$ANDROID_NDK_TARGETVER-clang
+CROSS_clang_FLAGS=""
+CROSS_clangxx_TOOL=$CROSS_clang_TOOL++ CROSS_clangxx_FLAGS=$CROSS_clang_FLAGS
+export CROSS_clang_TOOL CROSS_clang_FLAGS
+export CROSS_clangxx_TOOL CROSS_clangxx_FLAGS
+
 PKG_CONFIG_PATH=$CROSS_PREFIX/lib/pkgconfig:/usr/lib/pkgconfig
 export PKG_CONFIG_PATH
index d01dc6d..b353043 100644 (file)
@@ -4,5 +4,6 @@ ANDROID_NDK_TARGETARCH=$CROSS_ARCH
 . $CROSSDIR/etc/android.sh
 . $CROSSDIR/etc/common-cross-config.site
 
-CC="$CROSS_COMPILER_PREFIX$CROSS_ARCH-gcc $CROSS_gcc_FLAGS"
-CXX="$CROSS_COMPILER_PREFIX$CROSS_ARCH-g++ $CROSS_gxx_FLAGS"
+CC="$CROSS_COMPILER_PREFIX $CROSS_clang_TOOL $CROSS_clang_FLAGS"
+CXX="$CROSS_COMPILER_PREFIX RCROSS_clang_TOOL $CROSS_clang_FLAGS"
+CCASFLAGS="-no-integrated-as -Wno-unicode"
index 1df89a7..af7ffd1 100644 (file)
@@ -9,21 +9,25 @@ CROSS_ARCH=$ANDROID_NDK_TARGETARCH
 case $ANDROID_NDK_TARGETARCH in
   arm-linux-androideabi)
     ANDROID_NDK_TARGETARCHDIR=arm-linux-androideabi
+    ANDROID_NDK_CLANGARCH=armv7a-linux-androideabi
     ANDROID_NDK_TARGETSHORTARCH=arm
-    : ${ANDROID_NDK_TARGETVER=15}
+    : ${ANDROID_NDK_TARGETVER=16}
     ;;
   aarch64-linux-android)
     ANDROID_NDK_TARGETARCHDIR=aarch64-linux-android
+    ANDROID_NDK_CLANGARCH=aarch64-linux-android
     ANDROID_NDK_TARGETSHORTARCH=arm64
     : ${ANDROID_NDK_TARGETVER=21}
     ;;
   i686-linux-android)
     ANDROID_NDK_TARGETARCHDIR=x86
+    ANDROID_NDK_CLANGARCH=i686-linux-android
     ANDROID_NDK_TARGETSHORTARCH=x86
-    : ${ANDROID_NDK_TARGETVER=15}
+    : ${ANDROID_NDK_TARGETVER=16}
     ;;
   x86_64-linux-android)
     ANDROID_NDK_TARGETARCHDIR=x86_64
+    ANDROID_NDK_CLANGARCH=x86_64-linux-android
     ANDROID_NDK_TARGETSHORTARCH=x86_64
     : ${ANDROID_NDK_TARGETVER=21}
     ;;
@@ -33,4 +37,5 @@ case $ANDROID_NDK_TARGETARCH in
     ;;
 esac
 : ${ANDROID_NDK_TOOLS=$ANDROID_NDK/toolchains/$ANDROID_NDK_TARGETARCHDIR-$ANDROID_NDK_TOOLVER/prebuilt/$ANDROID_NDK_HOSTARCH/bin}
+: ${ANDROID_NDK_LLVM=$ANDROID_NDK/toolchains/llvm/prebuilt/$ANDROID_NDK_HOSTARCH/bin}
 : ${ANDROID_NDK_SYSROOT=$ANDROID_NDK/platforms/android-$ANDROID_NDK_TARGETVER/arch-$ANDROID_NDK_TARGETSHORTARCH}
index e6f080e..c4e1f47 100644 (file)
@@ -3,6 +3,12 @@
 CROSS_ARCH=@arch@
 QEMU_LD_PREFIX=/usr/$CROSS_ARCH; export QEMU_LD_PREFIX
 
+CROSS_clang_TOOL=clang
+CROSS_clang_FLAGS="--target=$CROSS_ARCH -I/usr/$CROSS_ARCH/include"
+CROSS_clangxx_TOOL=$CROSS_clang_TOOL++ CROSS_clangxx_FLAGS=$CROSS_clang_FLAGS
+export CROSS_clang_TOOL CROSS_clang_FLAGS
+export CROSS_clangxx_TOOL CROSS_clangxx_FLAGS
+
 PKG_CONFIG_PATH=$CROSS_PREFIX/lib/pkgconfig:/usr/lib/pkgconfig
 export PKG_CONFIG_PATH
 
index 4e684c1..94c0732 100644 (file)
@@ -12,6 +12,10 @@ esac
 CROSS_gxx_FLAGS=$CROSS_gcc_FLAGS
 export CROSS_gcc_FLAGS CROSS_gxx_FLAGS
 
+CROSS_clang_FLAGS=$CROSS_gcc_FLAGS
+CROSS_clangxx_FLAGS=$CROSS_gxx_FLAGS
+export CROSS_clang_FLAGS CROSS_clangxx_FLAGS
+
 PKG_CONFIG_PATH=$CROSS_PREFIX/lib/pkgconfig:/usr/lib/pkgconfig
 export PKG_CONFIG_PATH
 
index bf9a221..23fdecd 100644 (file)
@@ -3,8 +3,9 @@
 tool=${0##*/cross-}
 xtool=$(printf %s "$tool" | tr -c a-zA-Z0-9 x)
 eval flags=\$CROSS_${xtool}_FLAGS
+eval crosstool=\${CROSS_${xtool}_TOOL-\$CROSS_ARCH-\$tool}
 
 case ${CROSS_NATIVE_P-nil} in
   t) exec $CROSS_COMPILER_PREFIX $tool $flags "$@" ;;
-  nil) exec $CROSS_COMPILER_PREFIX $CROSS_ARCH-$tool $flags "$@" ;;
+  nil) exec $CROSS_COMPILER_PREFIX $crosstool $flags "$@" ;;
 esac
diff --git a/tools/cross-clang b/tools/cross-clang
new file mode 120000 (symlink)
index 0000000..ee678c4
--- /dev/null
@@ -0,0 +1 @@
+../bin/crosstool
\ No newline at end of file
diff --git a/tools/cross-clang++ b/tools/cross-clang++
new file mode 120000 (symlink)
index 0000000..ee678c4
--- /dev/null
@@ -0,0 +1 @@
+../bin/crosstool
\ No newline at end of file