Build needed cross toolchain with buildroot for non-x86_64 hosts

The needed precompiled toolchains provided by Arm are only available for
x86_64 hosts. For all other host architectures we build it with
Buildroot itself.

Reviewed-by: Jerome Forissier <jerome@forissier.org>
Tested-by: Jerome Forissier <jerome@forissier.org> (QEMUv8 64/64, host uname -m: aarch64)
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/br-ext/configs/sdk-aarch32 b/br-ext/configs/sdk-aarch32
new file mode 100644
index 0000000..6811f03
--- /dev/null
+++ b/br-ext/configs/sdk-aarch32
@@ -0,0 +1,5 @@
+BR2_arm=y
+BR2_ARM_ENABLE_VFP=y
+BR2_ARM_EABIHF=y
+BR2_ARM_FPU_VFPV2=y
+BR2_GCC_TARGET_FLOAT_ABI="hard"
diff --git a/br-ext/configs/sdk-aarch64 b/br-ext/configs/sdk-aarch64
new file mode 100644
index 0000000..1c77147
--- /dev/null
+++ b/br-ext/configs/sdk-aarch64
@@ -0,0 +1 @@
+BR2_aarch64=y
diff --git a/br-ext/configs/sdk-common b/br-ext/configs/sdk-common
new file mode 100644
index 0000000..ae88533
--- /dev/null
+++ b/br-ext/configs/sdk-common
@@ -0,0 +1,10 @@
+BR2_CCACHE=y
+BR2_CCACHE_USE_BASEDIR=y
+BR2_GCC_VERSION_9_X=y
+BR2_INIT_NONE=y
+BR2_KERNEL_HEADERS_5_10=y
+BR2_PACKAGE_BUSYBOX=n
+BR2_SYSTEM_BIN_SH_NONE=y
+BR2_TARGET_ROOTFS_TAR=n
+BR2_TOOLCHAIN_BUILDROOT_CXX=y
+BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
diff --git a/br-ext/configs/toolchain-aarch32-sdk b/br-ext/configs/toolchain-aarch32-sdk
new file mode 100644
index 0000000..62d6e4b
--- /dev/null
+++ b/br-ext/configs/toolchain-aarch32-sdk
@@ -0,0 +1,9 @@
+BR2_TOOLCHAIN_EXTERNAL=y
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
+BR2_TOOLCHAIN_EXTERNAL_PATH="%TOP_DIR%/toolchains/aarch32"
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="arm-linux"
+BR2_TOOLCHAIN_EXTERNAL_GCC_9=y
+BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_10=y
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
+BR2_TOOLCHAIN_EXTERNAL_CXX=y
+BR2_TOOLCHAIN_EXTERNAL_INET_RPC=n
diff --git a/br-ext/configs/toolchain-aarch64-sdk b/br-ext/configs/toolchain-aarch64-sdk
new file mode 100644
index 0000000..bdab79a
--- /dev/null
+++ b/br-ext/configs/toolchain-aarch64-sdk
@@ -0,0 +1,9 @@
+BR2_TOOLCHAIN_EXTERNAL=y
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
+BR2_TOOLCHAIN_EXTERNAL_PATH="%TOP_DIR%/toolchains/aarch64"
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="aarch64-linux"
+BR2_TOOLCHAIN_EXTERNAL_GCC_9=y
+BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_10=y
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
+BR2_TOOLCHAIN_EXTERNAL_CXX=y
+BR2_TOOLCHAIN_EXTERNAL_INET_RPC=n
diff --git a/common.mk b/common.mk
index 4a36d0b..2d2e43b 100644
--- a/common.mk
+++ b/common.mk
@@ -26,6 +26,7 @@
 BASH ?= bash
 ROOT ?= $(shell pwd)/..
 
+UNAME_M				:= $(shell uname -m)
 BUILD_PATH			?= $(ROOT)/build
 LINUX_PATH			?= $(ROOT)/linux
 OPTEE_OS_PATH			?= $(ROOT)/optee_os
@@ -103,9 +104,17 @@
 # Mandatory for autotools (for specifying --host)
 ################################################################################
 ifeq ($(COMPILE_NS_USER),64)
+ifeq ($(UNAME_M),x86_64)
 MULTIARCH			:= aarch64-linux-gnu
 else
+MULTIARCH			:= aarch64-linux
+endif
+else
+ifeq ($(UNAME_M),x86_64)
 MULTIARCH			:= arm-linux-gnueabihf
+else
+MULTIARCH			:= arm-linux
+endif
 endif
 
 ################################################################################
@@ -240,11 +249,15 @@
 DEFCONFIG_GDBSERVER=--br-defconfig build/br-ext/configs/gdbserver.conf
 else
 # Local toolchains (downloaded by "make toolchains")
+ifeq ($(UNAME_M),x86_64)
 ifeq ($(COMPILE_LEGACY),)
 BUILDROOT_TOOLCHAIN=toolchain-aarch$(COMPILE_NS_USER)
 else
 BUILDROOT_TOOLCHAIN=toolchain-aarch$(COMPILE_NS_USER)-legacy
 endif
+else
+BUILDROOT_TOOLCHAIN=toolchain-aarch$(COMPILE_NS_USER)-sdk
+endif
 endif
 
 BR2_PACKAGE_LIBOPENSSL ?= y
diff --git a/toolchain.mk b/toolchain.mk
index 1eb7a04..ecf5068 100644
--- a/toolchain.mk
+++ b/toolchain.mk
@@ -4,7 +4,9 @@
 SHELL				= /bin/bash
 ROOT				?= $(CURDIR)/..
 TOOLCHAIN_ROOT 			?= $(ROOT)/toolchains
+UNAME_M				:= $(shell uname -m)
 
+ifeq ($(UNAME_M),x86_64)
 AARCH32_PATH 			?= $(TOOLCHAIN_ROOT)/aarch32
 AARCH32_CROSS_COMPILE 		?= $(AARCH32_PATH)/bin/arm-linux-gnueabihf-
 AARCH32_GCC_VERSION 		?= gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf
@@ -55,3 +57,35 @@
 .PHONY: clang-toolchains
 clang-toolchains:
 	$(call dl-clang,$(CLANG_VER),$(CLANG_PATH))
+
+else # $(UNAME_M) != x86_64
+AARCH32_PATH 			:= $(TOOLCHAIN_ROOT)/aarch32
+AARCH32_CROSS_COMPILE 		:= $(AARCH32_PATH)/bin/arm-linux-
+AARCH64_PATH 			:= $(TOOLCHAIN_ROOT)/aarch64
+AARCH64_CROSS_COMPILE 		:= $(AARCH64_PATH)/bin/aarch64-linux-
+
+.PHONY: toolchains
+toolchains: $(AARCH64_PATH)/.done $(AARCH32_PATH)/.done
+
+define build_toolchain
+	@echo Building $1 toolchain
+	@mkdir -p ../out-$1-sdk $2
+	@(cd .. && python build/br-ext/scripts/make_def_config.py \
+		--br buildroot --out out-$1-sdk --br-ext build/br-ext \
+		--top-dir "$(ROOT)" \
+		--br-defconfig build/br-ext/configs/sdk-$1 \
+		--br-defconfig build/br-ext/configs/sdk-common \
+		--make-cmd $(MAKE))
+	@$(MAKE) -C ../out-$1-sdk clean
+	@$(MAKE) -C ../out-$1-sdk sdk
+	@tar xf ../out-$1-sdk/images/$3-buildroot-linux-$4_sdk-buildroot.tar.gz \
+		-C $2 --strip-components=1
+	@touch $2/.done
+endef
+
+$(AARCH64_PATH)/.done:
+	$(call build_toolchain,aarch64,$(AARCH64_PATH),aarch64,gnu)
+
+$(AARCH32_PATH)/.done:
+	$(call build_toolchain,aarch32,$(AARCH32_PATH),arm,gnueabihf)
+endif