1#!/bin/bash
2
3declare -A download_urls=(
4["arm-none-eabi-gcc"]="https://github.com/RT-Thread/toolchains-ci/releases/download/v1.3/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2"
5["mips-sde-elf-gcc"]="https://github.com/RT-Thread/toolchains-ci/releases/download/v1.1/mips-2016.05-7-mips-sde-elf-i686-pc-linux-gnu.tar.bz2"
6["aarch64-none-elf-gcc"]="https://github.com/RT-Thread/toolchains-ci/releases/download/v1.6/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz"
7["riscv64-unknown-elf-gcc"]="https://github.com/RT-Thread/toolchains-ci/releases/download/v1.4/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz"
8["riscv32-unknown-elf-gcc"]="https://github.com/hpmicro/riscv-gnu-toolchain/releases/download/2022.05.15/riscv32-unknown-elf-newlib-multilib_2022.05.15_linux.tar.gz"
9["riscv-none-embed-gcc"]="https://github.com/RT-Thread/toolchains-ci/releases/download/v1.5/xpack-riscv-none-embed-gcc-8.3.0-2.3-linux-x64.tar.gz"
10["riscv32-esp-elf-gcc"]="https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-amd64.tar.xz"
11["clang"]="https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-16.0.0/LLVMEmbeddedToolchainForArm-16.0.0-Linux-x86_64.tar.gz"
12
13)
14
15show_help() {
16	echo "Available toolchains:"
17	for key in "${!download_urls[@]}"; do
18		echo "  - $key"
19	done
20}
21
22extract_file() {
23	local file_name=$1
24	local destination=$2
25	echo "Extracting $file_name to $destination..."
26	case "$file_name" in
27		*.tar.bz2) tar -xjf "$file_name" -C "$destination" --strip-components=1;;
28		*.tar.gz)  tar -xzf "$file_name" -C "$destination" --strip-components=1;;
29		*.tar.xz)  tar -xJf "$file_name" -C "$destination" --strip-components=1;;
30		*) echo "Unsupported file format: $file_name"; exit 1;;
31	esac
32	echo "Extracted to $destination"
33}
34
35
36install_toolchain() {
37	local toolchain_name=$1
38	local url="${download_urls[$toolchain_name]}"
39	if [ -z "$url" ]; then
40		echo "Toolchain not found."
41		exit 1
42	fi
43	local file_name=$(basename "$url")
44	echo "Downloading $file_name..."
45	wget -q "$url"
46	echo "Extracting $file_name..."
47
48	local target_dir="/opt/$toolchain_name"
49	echo "target_dir $target_dir..."
50	mkdir -p "$target_dir"
51	extract_file "$file_name" "$target_dir"
52
53	rm $file_name
54
55	echo "Installed: $target_dir"
56
57	local toolchain_bin="$target_dir/bin"
58	if [[ ":$PATH:" != *":$toolchain_bin:"* ]]; then
59		echo "Adding $toolchain_bin to PATH..."
60		export PATH="$PATH:$toolchain_bin"
61		echo "export PATH=\$PATH:$toolchain_bin" >> ~/.bashrc
62	fi
63	#need source toolchain.sh or source ~/.bashrc to work
64
65	#local toolchain_exec=$(find "$toolchain_bin" -type f -executable | head -n 1)
66	local toolchain_exec=$(which "$toolchain_name")
67	if [ -x "$toolchain_exec" ]; then
68		echo "Testing executable: $toolchain_exec"
69		$toolchain_exec --version
70	else
71		echo "No executable found in $toolchain_bin"
72	fi
73}
74
75if [[ $# -eq 1 ]]; then
76	if [[ "$1" == "help" ]]; then
77		show_help
78	elif [ "$1" == "all" ]; then
79		for toolchain in "${!download_urls[@]}"; do
80			install_toolchain "$toolchain"
81		done
82	else
83		install_toolchain "$1"
84	fi
85else
86	show_help
87fi
88