Joakim Bech | 427dd63 | 2015-05-04 15:52:33 +0200 | [diff] [blame] | 1 | ################################################################################ |
| 2 | # Toolchains |
| 3 | ################################################################################ |
Yunli Liu | 904f148 | 2021-01-22 11:08:08 +0800 | [diff] [blame] | 4 | SHELL = /bin/bash |
Joakim Bech | c960663 | 2017-01-27 11:50:49 +0100 | [diff] [blame] | 5 | ROOT ?= $(CURDIR)/.. |
Joakim Bech | 427dd63 | 2015-05-04 15:52:33 +0200 | [diff] [blame] | 6 | TOOLCHAIN_ROOT ?= $(ROOT)/toolchains |
Sean Gilligan | 4d33afe | 2024-05-19 18:20:11 -0700 | [diff] [blame] | 7 | RUST_TOOLCHAIN_PATH ?= $(TOOLCHAIN_ROOT)/rust |
Jens Wiklander | 68f7f8d | 2021-06-07 16:02:24 +0000 | [diff] [blame] | 8 | UNAME_M := $(shell uname -m) |
Alvin Chang | 344f771 | 2023-07-25 23:28:32 +0800 | [diff] [blame] | 9 | ARCH ?= arm |
Joakim Bech | 427dd63 | 2015-05-04 15:52:33 +0200 | [diff] [blame] | 10 | |
Joakim Bech | c960663 | 2017-01-27 11:50:49 +0100 | [diff] [blame] | 11 | # 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 |
| 15 | define dltc |
| 16 | @if [ ! -d "$(1)" ]; then \ |
Joakim Bech | c960663 | 2017-01-27 11:50:49 +0100 | [diff] [blame] | 17 | echo "Downloading $(3) ..."; \ |
Aleksey Kazantsev | c551e2a | 2021-07-15 11:08:47 +0300 | [diff] [blame] | 18 | mkdir -p $(1); \ |
Jerome Forissier | 3408c89 | 2023-05-04 13:58:35 +0200 | [diff] [blame] | 19 | curl --retry 5 -k -s -S -L $(2) -o $(TOOLCHAIN_ROOT)/$(3).tar.xz || \ |
Aleksey Kazantsev | c551e2a | 2021-07-15 11:08:47 +0300 | [diff] [blame] | 20 | { 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 Chang | 4a1fef8 | 2023-05-17 00:18:01 +0800 | [diff] [blame] | 24 | (cd $(1)/bin && shopt -s nullglob && for f in *-none-linux*; do ln -s $$f $${f//-none} ; done;) \ |
Joakim Bech | c960663 | 2017-01-27 11:50:49 +0100 | [diff] [blame] | 25 | fi |
| 26 | endef |
| 27 | |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 28 | # 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 |
| 32 | define build_toolchain |
| 33 | @echo Building $1 toolchain |
| 34 | @mkdir -p ../out-$1-sdk $2 |
Imre Kis | dc34f49 | 2023-04-11 16:53:06 +0200 | [diff] [blame] | 35 | @(cd .. && $(PYTHON3) build/br-ext/scripts/make_def_config.py \ |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 36 | --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 Forissier | 8016498 | 2022-08-03 14:59:39 +0000 | [diff] [blame] | 41 | +@$(MAKE) -C ../out-$1-sdk clean |
| 42 | +@$(MAKE) -C ../out-$1-sdk sdk |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 43 | @tar xf ../out-$1-sdk/images/$3-buildroot-linux-$4_sdk-buildroot.tar.gz \ |
| 44 | -C $2 --strip-components=1 |
| 45 | @touch $2/.done |
| 46 | endef |
| 47 | |
Sean Gilligan | 4d33afe | 2024-05-19 18:20:11 -0700 | [diff] [blame] | 48 | # Download the Rust toolchain |
| 49 | define 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 |
| 56 | endef |
| 57 | |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 58 | ifeq ($(UNAME_M),x86_64) |
Alvin Chang | 344f771 | 2023-07-25 23:28:32 +0800 | [diff] [blame] | 59 | ifeq ($(ARCH),arm) |
Jens Wiklander | 5f64ee7 | 2024-07-04 10:07:09 +0000 | [diff] [blame] | 60 | # Please keep in sync with br-ext/configs/toolchain-aarch32 |
| 61 | # and below for aarch64 host |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 62 | AARCH32_PATH ?= $(TOOLCHAIN_ROOT)/aarch32 |
| 63 | AARCH32_CROSS_COMPILE ?= $(AARCH32_PATH)/bin/arm-linux-gnueabihf- |
Jerome Forissier | 19b7b07 | 2023-02-09 16:10:13 +0100 | [diff] [blame] | 64 | AARCH32_GCC_VERSION ?= arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf |
| 65 | SRC_AARCH32_GCC ?= https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/$(AARCH32_GCC_VERSION).tar.xz |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 66 | |
Jens Wiklander | 5f64ee7 | 2024-07-04 10:07:09 +0000 | [diff] [blame] | 67 | # Please keep in sync with br-ext/configs/toolchain-aarch64 |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 68 | AARCH64_PATH ?= $(TOOLCHAIN_ROOT)/aarch64 |
| 69 | AARCH64_CROSS_COMPILE ?= $(AARCH64_PATH)/bin/aarch64-linux-gnu- |
Jerome Forissier | 19b7b07 | 2023-02-09 16:10:13 +0100 | [diff] [blame] | 70 | AARCH64_GCC_VERSION ?= arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu |
| 71 | SRC_AARCH64_GCC ?= https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/$(AARCH64_GCC_VERSION).tar.xz |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 72 | |
Joakim Bech | c960663 | 2017-01-27 11:50:49 +0100 | [diff] [blame] | 73 | .PHONY: toolchains |
Sumit Garg | 857eaa0 | 2024-01-25 11:43:29 +0530 | [diff] [blame] | 74 | toolchains: aarch32-toolchain aarch64-toolchain rust-toolchain |
Joakim Bech | 427dd63 | 2015-05-04 15:52:33 +0200 | [diff] [blame] | 75 | |
Sumit Garg | 5045891 | 2024-01-25 11:37:50 +0530 | [diff] [blame] | 76 | .PHONY: aarch32-toolchain |
| 77 | aarch32-toolchain: |
Joakim Bech | c960663 | 2017-01-27 11:50:49 +0100 | [diff] [blame] | 78 | $(call dltc,$(AARCH32_PATH),$(SRC_AARCH32_GCC),$(AARCH32_GCC_VERSION)) |
Joakim Bech | 427dd63 | 2015-05-04 15:52:33 +0200 | [diff] [blame] | 79 | |
Sumit Garg | 5045891 | 2024-01-25 11:37:50 +0530 | [diff] [blame] | 80 | .PHONY: aarch64-toolchain |
| 81 | aarch64-toolchain: |
Joakim Bech | c960663 | 2017-01-27 11:50:49 +0100 | [diff] [blame] | 82 | $(call dltc,$(AARCH64_PATH),$(SRC_AARCH64_GCC),$(AARCH64_GCC_VERSION)) |
Jerome Forissier | c3cd9f5 | 2020-05-25 18:47:00 +0200 | [diff] [blame] | 83 | |
Sumit Garg | 857eaa0 | 2024-01-25 11:43:29 +0530 | [diff] [blame] | 84 | .PHONY: rust-toolchain |
| 85 | rust-toolchain: |
| 86 | $(call dl-rust-toolchain,$(RUST_TOOLCHAIN_PATH)) |
| 87 | |
Jerome Forissier | c09d34c | 2021-04-15 17:09:44 +0200 | [diff] [blame] | 88 | CLANG_VER ?= 12.0.0 |
Jerome Forissier | 0ae3f0a | 2021-04-15 17:09:44 +0200 | [diff] [blame] | 89 | CLANG_PATH ?= $(ROOT)/clang-$(CLANG_VER) |
Jerome Forissier | c3cd9f5 | 2020-05-25 18:47:00 +0200 | [diff] [blame] | 90 | |
| 91 | # Download the Clang compiler with LLVM tools and compiler-rt libraries |
| 92 | define dl-clang |
Jerome Forissier | 0ae3f0a | 2021-04-15 17:09:44 +0200 | [diff] [blame] | 93 | @if [ ! -d "$(2)" ]; then \ |
| 94 | ./get_clang.sh $(1) $(2); \ |
Jerome Forissier | c3cd9f5 | 2020-05-25 18:47:00 +0200 | [diff] [blame] | 95 | else \ |
Jerome Forissier | 0ae3f0a | 2021-04-15 17:09:44 +0200 | [diff] [blame] | 96 | echo "$(2) already exists"; \ |
Jerome Forissier | c3cd9f5 | 2020-05-25 18:47:00 +0200 | [diff] [blame] | 97 | fi |
| 98 | endef |
| 99 | |
Alvin Chang | 344f771 | 2023-07-25 23:28:32 +0800 | [diff] [blame] | 100 | else ifeq ($(ARCH),riscv) |
Alvin Chang | 6902e46 | 2023-07-19 14:37:25 +0800 | [diff] [blame] | 101 | RISCV64_PATH ?= $(TOOLCHAIN_ROOT)/riscv64 |
| 102 | RISCV64_CROSS_COMPILE ?= $(RISCV64_PATH)/bin/riscv64-unknown-linux-gnu- |
| 103 | RISCV64_GCC_RELEASE_DATE ?= 2023.07.07 |
| 104 | RISCV64_GCC_VERSION ?= riscv64-glibc-ubuntu-22.04-gcc-nightly-$(RISCV64_GCC_RELEASE_DATE)-nightly |
| 105 | SRC_RISCV64_GCC ?= https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/$(RISCV64_GCC_RELEASE_DATE)/$(RISCV64_GCC_VERSION).tar.gz |
| 106 | |
| 107 | .PHONY: toolchains |
Sumit Garg | 5045891 | 2024-01-25 11:37:50 +0530 | [diff] [blame] | 108 | toolchains: riscv64-toolchain |
Alvin Chang | 6902e46 | 2023-07-19 14:37:25 +0800 | [diff] [blame] | 109 | |
Sumit Garg | 5045891 | 2024-01-25 11:37:50 +0530 | [diff] [blame] | 110 | .PHONY: riscv64-toolchain |
| 111 | riscv64-toolchain: |
Alvin Chang | 6902e46 | 2023-07-19 14:37:25 +0800 | [diff] [blame] | 112 | $(call dltc,$(RISCV64_PATH),$(SRC_RISCV64_GCC),$(RISCV64_GCC_VERSION)) |
| 113 | |
| 114 | endif |
| 115 | |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 116 | else ifeq ($(UNAME_M),aarch64) |
| 117 | |
Jens Wiklander | 5f64ee7 | 2024-07-04 10:07:09 +0000 | [diff] [blame] | 118 | # Please keep in sync with br-ext/configs/toolchain-aarch32 |
| 119 | # and above for x86_64 host |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 120 | AARCH32_PATH ?= $(TOOLCHAIN_ROOT)/aarch32 |
| 121 | AARCH32_CROSS_COMPILE ?= $(AARCH32_PATH)/bin/arm-linux-gnueabihf- |
Jens Wiklander | 9edc5be | 2024-07-04 07:47:48 +0000 | [diff] [blame] | 122 | AARCH32_GCC_VERSION ?= arm-gnu-toolchain-11.3.rel1-aarch64-arm-none-linux-gnueabihf |
| 123 | SRC_AARCH32_GCC ?= https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/$(AARCH32_GCC_VERSION).tar.xz |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 124 | |
| 125 | # There isn't any native aarch64 toolchain released from Arm and buildroot |
| 126 | # doesn't support distribution toolchain [1]. So we are left with no choice |
| 127 | # but to build buildroot toolchain from source and use it. |
| 128 | # |
| 129 | # [1] https://buildroot.org/downloads/manual/manual.html#_cross_compilation_toolchain |
| 130 | AARCH64_PATH ?= $(TOOLCHAIN_ROOT)/aarch64 |
| 131 | AARCH64_CROSS_COMPILE ?= $(AARCH64_PATH)/bin/aarch64-linux- |
| 132 | |
| 133 | .PHONY: toolchains |
Sean Gilligan | 4d33afe | 2024-05-19 18:20:11 -0700 | [diff] [blame] | 134 | toolchains: aarch32-toolchain $(AARCH64_PATH)/.done rust-toolchain |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 135 | |
Sumit Garg | 5045891 | 2024-01-25 11:37:50 +0530 | [diff] [blame] | 136 | .PHONY: aarch32-toolchain |
| 137 | aarch32-toolchain: |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 138 | $(call dltc,$(AARCH32_PATH),$(SRC_AARCH32_GCC),$(AARCH32_GCC_VERSION)) |
| 139 | |
| 140 | $(AARCH64_PATH)/.done: |
| 141 | $(call build_toolchain,aarch64,$(AARCH64_PATH),aarch64,gnu) |
| 142 | |
Sean Gilligan | 4d33afe | 2024-05-19 18:20:11 -0700 | [diff] [blame] | 143 | .PHONY: rust-toolchain |
| 144 | rust-toolchain: |
| 145 | $(call dl-rust-toolchain,$(RUST_TOOLCHAIN_PATH)) |
| 146 | |
Sumit Garg | 495dc6a | 2021-12-23 14:45:36 +0530 | [diff] [blame] | 147 | else # $(UNAME_M) != x86_64 or $(UNAME_M) != aarch64 |
Jens Wiklander | 68f7f8d | 2021-06-07 16:02:24 +0000 | [diff] [blame] | 148 | AARCH32_PATH := $(TOOLCHAIN_ROOT)/aarch32 |
| 149 | AARCH32_CROSS_COMPILE := $(AARCH32_PATH)/bin/arm-linux- |
| 150 | AARCH64_PATH := $(TOOLCHAIN_ROOT)/aarch64 |
| 151 | AARCH64_CROSS_COMPILE := $(AARCH64_PATH)/bin/aarch64-linux- |
| 152 | |
| 153 | .PHONY: toolchains |
| 154 | toolchains: $(AARCH64_PATH)/.done $(AARCH32_PATH)/.done |
| 155 | |
Jens Wiklander | 68f7f8d | 2021-06-07 16:02:24 +0000 | [diff] [blame] | 156 | $(AARCH64_PATH)/.done: |
| 157 | $(call build_toolchain,aarch64,$(AARCH64_PATH),aarch64,gnu) |
| 158 | |
| 159 | $(AARCH32_PATH)/.done: |
| 160 | $(call build_toolchain,aarch32,$(AARCH32_PATH),arm,gnueabihf) |
| 161 | endif |