From 782ca2698a5c3f06ab595f901b417492cf053b1b Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Wed, 18 Sep 2019 19:50:03 +0100 Subject: [PATCH] Support Clang as a `cross-tool' and use it under Android. 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 | 8 +++++++- etc/android-cross-config.site | 5 +++-- etc/android.sh | 9 +++++++-- linux-cross-setup.sh.in | 6 ++++++ linux-native-setup.sh.in | 4 ++++ src/crosstool.in | 3 ++- tools/cross-clang | 1 + tools/cross-clang++ | 1 + 8 files changed, 31 insertions(+), 6 deletions(-) create mode 120000 tools/cross-clang create mode 120000 tools/cross-clang++ diff --git a/android-cross-setup.sh.in b/android-cross-setup.sh.in index f7186de..77d5599 100644 --- a/android-cross-setup.sh.in +++ b/android-cross-setup.sh.in @@ -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 diff --git a/etc/android-cross-config.site b/etc/android-cross-config.site index d01dc6d..b353043 100644 --- a/etc/android-cross-config.site +++ b/etc/android-cross-config.site @@ -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" diff --git a/etc/android.sh b/etc/android.sh index 1df89a7..af7ffd1 100644 --- a/etc/android.sh +++ b/etc/android.sh @@ -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} diff --git a/linux-cross-setup.sh.in b/linux-cross-setup.sh.in index e6f080e..c4e1f47 100644 --- a/linux-cross-setup.sh.in +++ b/linux-cross-setup.sh.in @@ -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 diff --git a/linux-native-setup.sh.in b/linux-native-setup.sh.in index 4e684c1..94c0732 100644 --- a/linux-native-setup.sh.in +++ b/linux-native-setup.sh.in @@ -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 diff --git a/src/crosstool.in b/src/crosstool.in index bf9a221..23fdecd 100644 --- a/src/crosstool.in +++ b/src/crosstool.in @@ -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 index 0000000..ee678c4 --- /dev/null +++ b/tools/cross-clang @@ -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 index 0000000..ee678c4 --- /dev/null +++ b/tools/cross-clang++ @@ -0,0 +1 @@ +../bin/crosstool \ No newline at end of file -- 2.11.0