chiark / gitweb /
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 f7186defb7b481bc82c3a0080cebfc7377210a83..77d55991b2eb015d1b071367f7d55cf41b72efa7 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 d01dc6dd3d1d0aa3e3e2d5ea9a7ef6ad787da592..b3530438083086532450c7289e2531abb43c3c8d 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 1df89a7c999a40d5cee49302434e622d936c5fbe..af7ffd116044bf5e2bd2d37bd2c69d8aef2e3016 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 e6f080ec4f4de581fd5ba2d0a6915b5496beed83..c4e1f476c35cf1d6926cdb2659ee9f945e65028f 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 4e684c18d0a512a130821ea91d7e8f5144b593c9..94c0732ce044f7dc3d6a2de7df2178f33377f45c 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 bf9a221558ba74ec328ba9f015ed94cc54f97e72..23fdecd11cef95255e71f6e51f7af8460e930015 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