blob: 4dc859a92c041c0804b885294c13e460ec95fa72 [file] [log] [blame]
Joakim Bech427dd632015-05-04 15:52:33 +02001################################################################################
2# Toolchains
3################################################################################
Yunli Liu904f1482021-01-22 11:08:08 +08004SHELL = /bin/bash
Joakim Bechc9606632017-01-27 11:50:49 +01005ROOT ?= $(CURDIR)/..
Joakim Bech427dd632015-05-04 15:52:33 +02006TOOLCHAIN_ROOT ?= $(ROOT)/toolchains
Sean Gilligan4d33afe2024-05-19 18:20:11 -07007RUST_TOOLCHAIN_PATH ?= $(TOOLCHAIN_ROOT)/rust
Jens Wiklander68f7f8d2021-06-07 16:02:24 +00008UNAME_M := $(shell uname -m)
Alvin Chang344f7712023-07-25 23:28:32 +08009ARCH ?= arm
Joakim Bech427dd632015-05-04 15:52:33 +020010
Joakim Bechc9606632017-01-27 11:50:49 +010011# Download toolchain macro for saving some repetition
12# $(1) is $AARCH.._PATH : i.e., path to the destination
13# $(2) is $SRC_AARCH.._GCC : is the downloaded tar.gz file
14# $(3) is $.._GCC_VERSION : the name of the file to download
15define dltc
16 @if [ ! -d "$(1)" ]; then \
Joakim Bechc9606632017-01-27 11:50:49 +010017 echo "Downloading $(3) ..."; \
Aleksey Kazantsevc551e2a2021-07-15 11:08:47 +030018 mkdir -p $(1); \
Jerome Forissier3408c892023-05-04 13:58:35 +020019 curl --retry 5 -k -s -S -L $(2) -o $(TOOLCHAIN_ROOT)/$(3).tar.xz || \
Aleksey Kazantsevc551e2a2021-07-15 11:08:47 +030020 { rm -f $(TOOLCHAIN_ROOT)/$(3).tar.xz; cd $(TOOLCHAIN_ROOT) && rmdir $(1); echo Download failed; exit 1; }; \
21 tar xf $(TOOLCHAIN_ROOT)/$(3).tar.xz -C $(1) --strip-components=1 || \
22 { rm $(TOOLCHAIN_ROOT)/$(3).tar.xz; echo Downloaded file is damaged; \
23 cd $(TOOLCHAIN_ROOT) && rm -rf $(1); exit 1; }; \
Alvin Chang4a1fef82023-05-17 00:18:01 +080024 (cd $(1)/bin && shopt -s nullglob && for f in *-none-linux*; do ln -s $$f $${f//-none} ; done;) \
Joakim Bechc9606632017-01-27 11:50:49 +010025 fi
26endef
27
Sumit Garg495dc6a2021-12-23 14:45:36 +053028# Build buildroot toolchain macro for saving some repetition
29# $(1) is $ARCH : target architecture
30# $(2) is $AARCH.._PATH : i.e., path to the destination
31# $(3) & $(4) : parts of toolchain target triplet
32define build_toolchain
33 @echo Building $1 toolchain
34 @mkdir -p ../out-$1-sdk $2
Imre Kisdc34f492023-04-11 16:53:06 +020035 @(cd .. && $(PYTHON3) build/br-ext/scripts/make_def_config.py \
Sumit Garg495dc6a2021-12-23 14:45:36 +053036 --br buildroot --out out-$1-sdk --br-ext build/br-ext \
37 --top-dir "$(ROOT)" \
38 --br-defconfig build/br-ext/configs/sdk-$1 \
39 --br-defconfig build/br-ext/configs/sdk-common \
40 --make-cmd $(MAKE))
Jerome Forissier80164982022-08-03 14:59:39 +000041 +@$(MAKE) -C ../out-$1-sdk clean
42 +@$(MAKE) -C ../out-$1-sdk sdk
Sumit Garg495dc6a2021-12-23 14:45:36 +053043 @tar xf ../out-$1-sdk/images/$3-buildroot-linux-$4_sdk-buildroot.tar.gz \
44 -C $2 --strip-components=1
45 @touch $2/.done
46endef
47
Sean Gilligan4d33afe2024-05-19 18:20:11 -070048# Download the Rust toolchain
49define dl-rust-toolchain
50 @if [ ! -d "$(1)" ]; then \
51 mkdir -p $(1) && \
52 export RUSTUP_HOME=$(1)/.rustup && \
53 export CARGO_HOME=$(1)/.cargo && \
54 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path; \
55 fi
56endef
57
Sumit Garg495dc6a2021-12-23 14:45:36 +053058ifeq ($(UNAME_M),x86_64)
Alvin Chang344f7712023-07-25 23:28:32 +080059ifeq ($(ARCH),arm)
Sumit Garg495dc6a2021-12-23 14:45:36 +053060AARCH32_PATH ?= $(TOOLCHAIN_ROOT)/aarch32
61AARCH32_CROSS_COMPILE ?= $(AARCH32_PATH)/bin/arm-linux-gnueabihf-
Jerome Forissier19b7b072023-02-09 16:10:13 +010062AARCH32_GCC_VERSION ?= arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf
63SRC_AARCH32_GCC ?= https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/$(AARCH32_GCC_VERSION).tar.xz
Sumit Garg495dc6a2021-12-23 14:45:36 +053064
65AARCH64_PATH ?= $(TOOLCHAIN_ROOT)/aarch64
66AARCH64_CROSS_COMPILE ?= $(AARCH64_PATH)/bin/aarch64-linux-gnu-
Jerome Forissier19b7b072023-02-09 16:10:13 +010067AARCH64_GCC_VERSION ?= arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu
68SRC_AARCH64_GCC ?= https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/$(AARCH64_GCC_VERSION).tar.xz
Sumit Garg495dc6a2021-12-23 14:45:36 +053069
Joakim Bechc9606632017-01-27 11:50:49 +010070.PHONY: toolchains
Sumit Garg857eaa02024-01-25 11:43:29 +053071toolchains: aarch32-toolchain aarch64-toolchain rust-toolchain
Joakim Bech427dd632015-05-04 15:52:33 +020072
Sumit Garg50458912024-01-25 11:37:50 +053073.PHONY: aarch32-toolchain
74aarch32-toolchain:
Joakim Bechc9606632017-01-27 11:50:49 +010075 $(call dltc,$(AARCH32_PATH),$(SRC_AARCH32_GCC),$(AARCH32_GCC_VERSION))
Joakim Bech427dd632015-05-04 15:52:33 +020076
Sumit Garg50458912024-01-25 11:37:50 +053077.PHONY: aarch64-toolchain
78aarch64-toolchain:
Joakim Bechc9606632017-01-27 11:50:49 +010079 $(call dltc,$(AARCH64_PATH),$(SRC_AARCH64_GCC),$(AARCH64_GCC_VERSION))
Jerome Forissierc3cd9f52020-05-25 18:47:00 +020080
Sumit Garg857eaa02024-01-25 11:43:29 +053081.PHONY: rust-toolchain
82rust-toolchain:
83 $(call dl-rust-toolchain,$(RUST_TOOLCHAIN_PATH))
84
Jerome Forissierc09d34c2021-04-15 17:09:44 +020085CLANG_VER ?= 12.0.0
Jerome Forissier0ae3f0a2021-04-15 17:09:44 +020086CLANG_PATH ?= $(ROOT)/clang-$(CLANG_VER)
Jerome Forissierc3cd9f52020-05-25 18:47:00 +020087
88# Download the Clang compiler with LLVM tools and compiler-rt libraries
89define dl-clang
Jerome Forissier0ae3f0a2021-04-15 17:09:44 +020090 @if [ ! -d "$(2)" ]; then \
91 ./get_clang.sh $(1) $(2); \
Jerome Forissierc3cd9f52020-05-25 18:47:00 +020092 else \
Jerome Forissier0ae3f0a2021-04-15 17:09:44 +020093 echo "$(2) already exists"; \
Jerome Forissierc3cd9f52020-05-25 18:47:00 +020094 fi
95endef
96
97.PHONY: clang-toolchains
98clang-toolchains:
Jerome Forissier0ae3f0a2021-04-15 17:09:44 +020099 $(call dl-clang,$(CLANG_VER),$(CLANG_PATH))
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000100
Alvin Chang344f7712023-07-25 23:28:32 +0800101else ifeq ($(ARCH),riscv)
Alvin Chang6902e462023-07-19 14:37:25 +0800102RISCV64_PATH ?= $(TOOLCHAIN_ROOT)/riscv64
103RISCV64_CROSS_COMPILE ?= $(RISCV64_PATH)/bin/riscv64-unknown-linux-gnu-
104RISCV64_GCC_RELEASE_DATE ?= 2023.07.07
105RISCV64_GCC_VERSION ?= riscv64-glibc-ubuntu-22.04-gcc-nightly-$(RISCV64_GCC_RELEASE_DATE)-nightly
106SRC_RISCV64_GCC ?= https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/$(RISCV64_GCC_RELEASE_DATE)/$(RISCV64_GCC_VERSION).tar.gz
107
108.PHONY: toolchains
Sumit Garg50458912024-01-25 11:37:50 +0530109toolchains: riscv64-toolchain
Alvin Chang6902e462023-07-19 14:37:25 +0800110
Sumit Garg50458912024-01-25 11:37:50 +0530111.PHONY: riscv64-toolchain
112riscv64-toolchain:
Alvin Chang6902e462023-07-19 14:37:25 +0800113 $(call dltc,$(RISCV64_PATH),$(SRC_RISCV64_GCC),$(RISCV64_GCC_VERSION))
114
115endif
116
Sumit Garg495dc6a2021-12-23 14:45:36 +0530117else ifeq ($(UNAME_M),aarch64)
118
119AARCH32_PATH ?= $(TOOLCHAIN_ROOT)/aarch32
120AARCH32_CROSS_COMPILE ?= $(AARCH32_PATH)/bin/arm-linux-gnueabihf-
Jens Wiklander9edc5be2024-07-04 07:47:48 +0000121AARCH32_GCC_VERSION ?= arm-gnu-toolchain-11.3.rel1-aarch64-arm-none-linux-gnueabihf
122SRC_AARCH32_GCC ?= https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/$(AARCH32_GCC_VERSION).tar.xz
Sumit Garg495dc6a2021-12-23 14:45:36 +0530123
124# There isn't any native aarch64 toolchain released from Arm and buildroot
125# doesn't support distribution toolchain [1]. So we are left with no choice
126# but to build buildroot toolchain from source and use it.
127#
128# [1] https://buildroot.org/downloads/manual/manual.html#_cross_compilation_toolchain
129AARCH64_PATH ?= $(TOOLCHAIN_ROOT)/aarch64
130AARCH64_CROSS_COMPILE ?= $(AARCH64_PATH)/bin/aarch64-linux-
131
132.PHONY: toolchains
Sean Gilligan4d33afe2024-05-19 18:20:11 -0700133toolchains: aarch32-toolchain $(AARCH64_PATH)/.done rust-toolchain
Sumit Garg495dc6a2021-12-23 14:45:36 +0530134
Sumit Garg50458912024-01-25 11:37:50 +0530135.PHONY: aarch32-toolchain
136aarch32-toolchain:
Sumit Garg495dc6a2021-12-23 14:45:36 +0530137 $(call dltc,$(AARCH32_PATH),$(SRC_AARCH32_GCC),$(AARCH32_GCC_VERSION))
138
139$(AARCH64_PATH)/.done:
140 $(call build_toolchain,aarch64,$(AARCH64_PATH),aarch64,gnu)
141
Sean Gilligan4d33afe2024-05-19 18:20:11 -0700142.PHONY: rust-toolchain
143rust-toolchain:
144 $(call dl-rust-toolchain,$(RUST_TOOLCHAIN_PATH))
145
Sumit Garg495dc6a2021-12-23 14:45:36 +0530146else # $(UNAME_M) != x86_64 or $(UNAME_M) != aarch64
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000147AARCH32_PATH := $(TOOLCHAIN_ROOT)/aarch32
148AARCH32_CROSS_COMPILE := $(AARCH32_PATH)/bin/arm-linux-
149AARCH64_PATH := $(TOOLCHAIN_ROOT)/aarch64
150AARCH64_CROSS_COMPILE := $(AARCH64_PATH)/bin/aarch64-linux-
151
152.PHONY: toolchains
153toolchains: $(AARCH64_PATH)/.done $(AARCH32_PATH)/.done
154
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000155$(AARCH64_PATH)/.done:
156 $(call build_toolchain,aarch64,$(AARCH64_PATH),aarch64,gnu)
157
158$(AARCH32_PATH)/.done:
159 $(call build_toolchain,aarch32,$(AARCH32_PATH),arm,gnueabihf)
160endif
Jerome Forissiere8ee8212024-06-18 13:38:50 +0200161
162# Recipe to build Clang from sources and install it in
163# $(TOOLCHAIN_ROOT)/clang-x.y.z/bin
164
165CLANG_BUILD_VER_MAJ=18
166CLANG_BUILD_VER=$(CLANG_BUILD_VER_MAJ).1.7
167CLANG_BUILD_IMAGE=clang-$(CLANG_BUILD_VER)-$(UNAME_M)
168
169clang-toolchains-build:
170 docker build --build-arg VER_MAJ=$(CLANG_BUILD_VER_MAJ) --build-arg VER=$(CLANG_BUILD_VER) -t $(CLANG_BUILD_IMAGE) clang/
171 id=$$(docker create $(CLANG_BUILD_IMAGE)) && \
172 docker cp $${id}:/root/clang-$(CLANG_BUILD_VER) $(TOOLCHAIN_ROOT) && \
173 docker rm $${id}