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