Rearrange everything.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 24 Nov 2018 17:58:14 +0000 (17:58 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 24 Nov 2018 18:19:01 +0000 (18:19 +0000)
  * Have `setup.sh' define `CROSS_ARCH', which is the GNU triplet for
    the target architecture.  This is then exported and can be used by
    `config.site' to define further things.

  * Factor out the common machinery between Android and Linux
    `config.site' files.  This is, in fact, exactly the Linux
    `config.site', so have `mdw-cross' select this as a default if
    nothing more specific can be found.

  * Factor out the common machinery for Android `config.site' files,
    which was basically all of it.

  * Move the compiler flags into the new `android-cross-config.site'
    file.

  * Replace `$ANDROID_CC' by `$CROSS_ARCH-gcc'.  Factor out the
    mandatory compiler flags into `$CROSS_gcc_FLAGS', and generalize this
    so that we also set `$CROSS_gxx_FLAGS' for C++.

  * Introduce a new program `crosstool' intended to be invoked via a
    symlink, which just execs the appropriate cross-toolchain tool with
    any necessary extra flags.  Include a bunch of useful symlinks and
    have `mdw-cross' hook them onto the path.

  * Add a Makefile to build the `...-setup.sh' files for each target
    architecture from skeletons.  The Makefile is unnecessarily hairy
    but I like them that way.

42 files changed:
.gitignore
Makefile [new file with mode: 0644]
android-cross-setup.sh.in [new file with mode: 0644]
bin/crosstool [new file with mode: 0755]
bin/mdw-cross
etc/android-arm-config.site [deleted file]
etc/android-arm-setup.sh [deleted file]
etc/android-arm64-config.site [deleted file]
etc/android-arm64-setup.sh [deleted file]
etc/android-cross-config.site [new file with mode: 0644]
etc/android-x86-config.site [deleted file]
etc/android-x86-setup.sh [deleted file]
etc/android-x86_64-config.site [deleted file]
etc/android-x86_64-setup.sh [deleted file]
etc/android.sh
etc/arm64-setup.sh [deleted file]
etc/armel-config.site [deleted file]
etc/armel-setup.sh [deleted file]
etc/armhf-config.site [deleted file]
etc/armhf-setup.sh [deleted file]
etc/common-cross-config.site [moved from etc/arm64-config.site with 71% similarity]
linux-cross-setup.sh.in [new file with mode: 0644]
tools/cross-addr2line [new symlink]
tools/cross-ar [new symlink]
tools/cross-as [new symlink]
tools/cross-c++filt [new symlink]
tools/cross-cpp [new symlink]
tools/cross-dwp [new symlink]
tools/cross-elfedit [new symlink]
tools/cross-g++ [new symlink]
tools/cross-gcc [new symlink]
tools/cross-gcov [new symlink]
tools/cross-gprof [new symlink]
tools/cross-ld [new symlink]
tools/cross-nm [new symlink]
tools/cross-objcopy [new symlink]
tools/cross-objdump [new symlink]
tools/cross-ranlib [new symlink]
tools/cross-readelf [new symlink]
tools/cross-size [new symlink]
tools/cross-strings [new symlink]
tools/cross-strip [new symlink]

index fc64fe3..047b29a 100644 (file)
@@ -1 +1,3 @@
-inst.*/
+/inst.*/
+/etc/*-setup.sh
+
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..268ff6d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,36 @@
+### -*-makefile-*-
+
+.SECONDEXPANSION: #sorry
+all::
+
+FLAVOURS               += linux
+linux_ARCHS             = armel armhf arm64
+linux/armel_ARCH        = arm-linux-gnueabi
+linux/armhf_ARCH        = arm-linux-gnueabihf
+linux/arm64_ARCH        = aarch64-linux-gnu
+
+FLAVOURS               += android
+android_ARCHS           = arm arm64 x86 x86_64
+android/arm_ARCH        = arm-linux-androideabi
+android/arm64_ARCH      = aarch64-linux-android
+android/x86_ARCH        = i686-linux-android
+android/x86_64_ARCH     = x86_64-linux-android
+
+V                       = 0
+v_tag                   = $(call v_tag_$V,$1)
+v_tag_0                         = @printf "  %-8s %s\n" "$1" "$@";
+
+SETUPS                  = \
+       $(foreach f,$(FLAVOURS),\
+               $(foreach a,$($f_ARCHS),etc/$f-$a-setup.sh))
+TARGETS                        += $(SETUPS)
+setup-flavour           = $(word 1,$(subst -, ,$1))
+setup-arch              = $(word 2,$(subst -, ,$1))
+
+$(SETUPS): etc/%-setup.sh: $$(call setup-flavour,$$*)-cross-setup.sh.in Makefile
+       $(call v_tag,GEN)sed 's/@arch@/$($(call setup-flavour,$*)/$(call setup-arch,$*)_ARCH)/g' $< >$@.new && mv $@.new $@
+
+all:: $(TARGETS)
+
+CLEANFILES             += $(TARGETS)
+clean::; rm -f $(CLEANFILES)
diff --git a/android-cross-setup.sh.in b/android-cross-setup.sh.in
new file mode 100644 (file)
index 0000000..4da5d85
--- /dev/null
@@ -0,0 +1,6 @@
+### -*-sh-*-
+
+ANDROID_NDK_TARGETARCH=@arch@
+. $CROSSDIR/etc/android.sh
+CONFIG_SITE=$CROSSDIR/etc/android-cross-config.site
+PATH=$PATH:$ANDROID_NDK_TOOLS
diff --git a/bin/crosstool b/bin/crosstool
new file mode 100755 (executable)
index 0000000..cfb800c
--- /dev/null
@@ -0,0 +1,6 @@
+#! /bin/sh -ex
+
+tool=${0##*/cross-}
+xtool=$(printf %s "$tool" | tr -c a-zA-Z0-9 x)
+eval flags=\$CROSS_${xtool}_FLAGS
+exec $CROSS_COMPILER_PREFIX $CROSS_ARCH-$tool $flags "$@"
index 61c2456..16ba6f7 100755 (executable)
@@ -29,10 +29,37 @@ if ! [ -f "$CROSSDIR/etc/$env-setup.sh" ]; then
   echo 2>&1 "${0##*/}: cross environment \`$env' unknown"; exit 2
 fi
 
+p=$PATH CROSS_COMPILER_PREFIX=""
+while :; do
+  case $p in
+    "") break ;;
+    *:*) d=${p%%:*} p=${p#*:} ;;
+    *) d=$p p="" ;;
+  esac
+  if [ -e "$d/ccache" ]; then CROSS_COMPILER_PREFIX="ccache "; break; fi
+done
+export CROSS_COMPILER_PREFIX
+
 MDW_BUILDENV=$env; export MDW_BUILDENV
-if [ -f "$CROSSDIR/etc/$env-config.site" ]; then
-  CONFIG_SITE=$CROSSDIR/etc/$env-config.site; export CONFIG_SITE
+
+if [ -f "$CROSSDIR/etc/$env-config.site" ]
+then CONFIG_SITE=$CROSSDIR/etc/$env-config.site
+else CONFIG_SITE=$CROSSDIR/etc/common-cross-config.site
 fi
+export CONFIG_SITE
+
 CROSS_PREFIX=$CROSSDIR/inst.$env; export CROSS_PREFIX
 . "$CROSSDIR/etc/$env-setup.sh"
+
+case ${CROSS_ARCH+t} in
+  t) ;;
+  *) echo 2>&1 "${0##*/}: setup script didn't set \`CROSS_ARCH'"; exit 2 ;;
+esac
+export CROSS_ARCH
+
+case :$PATH: in
+  *:"$CROSSDIR/tools:"*) ;;
+  *) PATH=$CROSSDIR/tools:$PATH ;;
+esac
+
 exec "$@"
diff --git a/etc/android-arm-config.site b/etc/android-arm-config.site
deleted file mode 100644 (file)
index 88e5929..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-### -*-sh-*-
-
-ANDROID_NDK_TARGETARCH=arm-linux-androideabi
-. $CROSSDIR/etc/android.sh
-
-prefix=$CROSS_PREFIX
-libexecdir=\${exec_prefix}/lib
-sysconfdir=\${prefix}/etc
-
-host=$ANDROID_NDK_TARGETARCH; host_alias=$host
-cross_compiling=yes
-CC="ccache $ANDROID_CC"
-
-PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
-export PKG_CONFIG_PATH
diff --git a/etc/android-arm-setup.sh b/etc/android-arm-setup.sh
deleted file mode 100644 (file)
index 6a4912b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#! /bin/sh
-
-ANDROID_NDK_TARGETARCH=arm-linux-androideabi
-. $CROSSDIR/etc/android.sh
-PATH=$PATH:$ANDROID_NDK_TOOLS
diff --git a/etc/android-arm64-config.site b/etc/android-arm64-config.site
deleted file mode 100644 (file)
index c8919a5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-### -*-sh-*-
-
-ANDROID_NDK_TARGETARCH=aarch64-linux-android
-. $CROSSDIR/etc/android.sh
-
-prefix=$CROSS_PREFIX
-libexecdir=\${exec_prefix}/lib
-sysconfdir=\${prefix}/etc
-
-host=$ANDROID_NDK_TARGETARCH; host_alias=$host
-cross_compiling=yes
-CC="ccache $ANDROID_CC"
-
-PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
-export PKG_CONFIG_PATH
diff --git a/etc/android-arm64-setup.sh b/etc/android-arm64-setup.sh
deleted file mode 100644 (file)
index 3be7950..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#! /bin/sh
-
-ANDROID_NDK_TARGETARCH=aarch64-linux-android
-. $CROSSDIR/etc/android.sh
-PATH=$PATH:$ANDROID_NDK_TOOLS
diff --git a/etc/android-cross-config.site b/etc/android-cross-config.site
new file mode 100644 (file)
index 0000000..5bd822e
--- /dev/null
@@ -0,0 +1,16 @@
+### -*-sh-*-
+
+ANDROID_NDK_TARGETARCH=$CROSS_ARCH
+. $CROSSDIR/etc/android.sh
+. $CROSSDIR/etc/common-cross-config.site
+
+CROSS_gcc_FLAGS=" --sysroot=$ANDROID_NDK_SYSROOT \
+       -D__ANDROID_API__=$ANDROID_NDK_TARGETVER \
+       -isystem $ANDROID_NDK/sysroot/usr/include \
+       -isystem $ANDROID_NDK/sysroot/usr/include/$ANDROID_NDK_TARGETARCH \
+       -fPIE -pie"
+CROSS_gxx_FLAGS=$CROSS_gcc_FLAGS
+export CROSS_gcc_FLAGS
+
+CC="$CROSS_ARCH-gcc $CROSS_gcc_FLAGS"
+CXX="$CROSS_ARCH-g++ $CROSS_gxx_FLAGS"
diff --git a/etc/android-x86-config.site b/etc/android-x86-config.site
deleted file mode 100644 (file)
index 8336b84..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-### -*-sh-*-
-
-ANDROID_NDK_TARGETARCH=i686-linux-android
-. $CROSSDIR/etc/android.sh
-
-prefix=$CROSS_PREFIX
-libexecdir=\${exec_prefix}/lib
-sysconfdir=\${prefix}/etc
-
-host=$ANDROID_NDK_TARGETARCH; host_alias=$host
-cross_compiling=yes
-CC="ccache $ANDROID_CC"
-
-PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
-export PKG_CONFIG_PATH
diff --git a/etc/android-x86-setup.sh b/etc/android-x86-setup.sh
deleted file mode 100644 (file)
index 3fec185..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#! /bin/sh
-
-ANDROID_NDK_TARGETARCH=i686-linux-android
-. $CROSSDIR/etc/android.sh
-PATH=$PATH:$ANDROID_NDK_TOOLS
diff --git a/etc/android-x86_64-config.site b/etc/android-x86_64-config.site
deleted file mode 100644 (file)
index 4b1d822..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-### -*-sh-*-
-
-ANDROID_NDK_TARGETARCH=x86_64-linux-android
-. $CROSSDIR/etc/android.sh
-
-prefix=$CROSS_PREFIX
-libexecdir=\${exec_prefix}/lib
-sysconfdir=\${prefix}/etc
-
-host=$ANDROID_NDK_TARGETARCH; host_alias=$host
-cross_compiling=yes
-CC="ccache $ANDROID_CC"
-
-PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
-export PKG_CONFIG_PATH
diff --git a/etc/android-x86_64-setup.sh b/etc/android-x86_64-setup.sh
deleted file mode 100644 (file)
index e599727..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#! /bin/sh
-
-ANDROID_NDK_TARGETARCH=x86_64-linux-android
-. $CROSSDIR/etc/android.sh
-PATH=$PATH:$ANDROID_NDK_TOOLS
index 5e1f1b0..1df89a7 100644 (file)
@@ -1,5 +1,7 @@
 ### -*-sh-*-
 
+CROSS_ARCH=$ANDROID_NDK_TARGETARCH
+
 : ${ANDROID_SDK=/usr/local/android/sdk}
 : ${ANDROID_NDK=$ANDROID_SDK/ndk-bundle}
 : ${ANDROID_NDK_TOOLVER=4.9}
@@ -25,13 +27,10 @@ case $ANDROID_NDK_TARGETARCH in
     ANDROID_NDK_TARGETSHORTARCH=x86_64
     : ${ANDROID_NDK_TARGETVER=21}
     ;;
+  *)
+    echo 2>&1 "${0##*/}: unexpected Android arch \`$ANDROID_NDK_TARGETARCH'"
+    exit 2
+    ;;
 esac
 : ${ANDROID_NDK_TOOLS=$ANDROID_NDK/toolchains/$ANDROID_NDK_TARGETARCHDIR-$ANDROID_NDK_TOOLVER/prebuilt/$ANDROID_NDK_HOSTARCH/bin}
 : ${ANDROID_NDK_SYSROOT=$ANDROID_NDK/platforms/android-$ANDROID_NDK_TARGETVER/arch-$ANDROID_NDK_TARGETSHORTARCH}
-
-ANDROID_CC="$ANDROID_NDK_TARGETARCH-gcc \
-       --sysroot=$ANDROID_NDK_SYSROOT \
-       -D__ANDROID_API__=$ANDROID_NDK_TARGETVER \
-       -isystem $ANDROID_NDK/sysroot/usr/include \
-       -isystem $ANDROID_NDK/sysroot/usr/include/$ANDROID_NDK_TARGETARCH \
-       -fPIE -pie"
diff --git a/etc/arm64-setup.sh b/etc/arm64-setup.sh
deleted file mode 100644 (file)
index 22eb452..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#! /bin/sh
-
-QEMU_LD_PREFIX=/usr/aarch64-linux-gnu; export QEMU_LD_PREFIX
diff --git a/etc/armel-config.site b/etc/armel-config.site
deleted file mode 100644 (file)
index 9cfac77..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-### -*-sh-*-
-
-prefix=$CROSS_PREFIX
-libexecdir=\${exec_prefix}/lib
-sysconfdir=\${prefix}/etc
-
-host=arm-linux-gnueabi; host_alias=$host
-cross_compiling=yes
-CC="ccache arm-linux-gnueabi-gcc"
-
-PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
-export PKG_CONFIG_PATH
diff --git a/etc/armel-setup.sh b/etc/armel-setup.sh
deleted file mode 100644 (file)
index 8caf1cd..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#! /bin/sh
-
-QEMU_LD_PREFIX=/usr/arm-linux-gnueabi; export QEMU_LD_PREFIX
diff --git a/etc/armhf-config.site b/etc/armhf-config.site
deleted file mode 100644 (file)
index 4a6c34b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-### -*-sh-*-
-
-prefix=$CROSS_PREFIX
-libexecdir=\${exec_prefix}/lib
-sysconfdir=\${prefix}/etc
-
-host=arm-linux-gnueabihf; host_alias=$host
-cross_compiling=yes
-CC="ccache arm-linux-gnueabihf-gcc"
-
-PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
-export PKG_CONFIG_PATH
diff --git a/etc/armhf-setup.sh b/etc/armhf-setup.sh
deleted file mode 100644 (file)
index 01bdf3a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#! /bin/sh
-
-QEMU_LD_PREFIX=/usr/arm-linux-gnueabihf; export QEMU_LD_PREFIX
similarity index 71%
rename from etc/arm64-config.site
rename to etc/common-cross-config.site
index 393ce77..b1d01da 100644 (file)
@@ -4,9 +4,9 @@ prefix=$CROSS_PREFIX
 libexecdir=\${exec_prefix}/lib
 sysconfdir=\${prefix}/etc
 
-host=aarch64-linux-gnu; host_alias=$host
+host_alias=$CROSS_ARCH
 cross_compiling=yes
-CC="ccache aarch64-linux-gnu-gcc"
+CC="$CROSS_COMPILER_PREFIX$CROSS_ARCH-gcc$CROSS_CFLAGS"
 
 PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
 export PKG_CONFIG_PATH
diff --git a/linux-cross-setup.sh.in b/linux-cross-setup.sh.in
new file mode 100644 (file)
index 0000000..5335d59
--- /dev/null
@@ -0,0 +1,4 @@
+### -*-sh-*-
+
+CROSS_ARCH=@arch@
+QEMU_LD_PREFIX=/usr/$CROSS_ARCH; export QEMU_LD_PREFIX
diff --git a/tools/cross-addr2line b/tools/cross-addr2line
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-ar b/tools/cross-ar
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-as b/tools/cross-as
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-c++filt b/tools/cross-c++filt
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-cpp b/tools/cross-cpp
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-dwp b/tools/cross-dwp
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-elfedit b/tools/cross-elfedit
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-g++ b/tools/cross-g++
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-gcc b/tools/cross-gcc
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-gcov b/tools/cross-gcov
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-gprof b/tools/cross-gprof
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-ld b/tools/cross-ld
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-nm b/tools/cross-nm
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-objcopy b/tools/cross-objcopy
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-objdump b/tools/cross-objdump
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-ranlib b/tools/cross-ranlib
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-readelf b/tools/cross-readelf
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-size b/tools/cross-size
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-strings b/tools/cross-strings
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-strip b/tools/cross-strip
new file mode 120000 (symlink)
index 0000000..ee678c4
--- /dev/null
@@ -0,0 +1 @@
+../bin/crosstool
\ No newline at end of file