nuttx/tools/ci/platforms/ubuntu.sh
Matheus Catarino 25bd3be167 tools/ci: add zig, ldc and swift
The main objective is to determine if the examples really work or if they have been obsoleted.
The languages included in the list promote good interoperability with the NuttX API (C predominant).

This will show if they are worth integrating in NuttX.

**FFI method**

- Rust: bindgen or c2rust
- D: importC
- Swift: Bridging header or clang modulemap.
- Zig: `@cImport/@cInclude` or translate-c
2024-08-26 10:25:54 +08:00

460 lines
15 KiB
Bash
Executable File

#!/usr/bin/env sh
############################################################################
# tools/ci/platforms/ubuntu.sh
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
# Ubuntu
set -e
set -o xtrace
add_path() {
PATH=$1:${PATH}
}
arm_clang_toolchain() {
add_path "${NUTTXTOOLS}"/clang-arm-none-eabi/bin
if [ ! -f "${NUTTXTOOLS}/clang-arm-none-eabi/bin/clang" ]; then
local basefile
basefile=LLVMEmbeddedToolchainForArm-17.0.1-Linux-x86_64
cd "${NUTTXTOOLS}"
# Download the latest ARM clang toolchain prebuilt by ARM
curl -O -L -s https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-17.0.1/${basefile}.tar.xz
xz -d ${basefile}.tar.xz
tar xf ${basefile}.tar
mv ${basefile} clang-arm-none-eabi
rm ${basefile}.tar
fi
command clang --version
}
arm_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/gcc-arm-none-eabi/bin
if [ ! -f "${NUTTXTOOLS}/gcc-arm-none-eabi/bin/arm-none-eabi-gcc" ]; then
local basefile
basefile=arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi
cd "${NUTTXTOOLS}"
# Download the latest ARM GCC toolchain prebuilt by ARM
wget --quiet https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/${basefile}.tar.xz
xz -d ${basefile}.tar.xz
tar xf ${basefile}.tar
mv ${basefile} gcc-arm-none-eabi
rm ${basefile}.tar
fi
command arm-none-eabi-gcc --version
}
arm64_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/gcc-aarch64-none-elf/bin
if [ ! -f "${NUTTXTOOLS}/gcc-aarch64-none-elf/bin/aarch64-none-elf-gcc" ]; then
local basefile
basefile=arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-elf
cd "${NUTTXTOOLS}"
# Download the latest ARM64 GCC toolchain prebuilt by ARM
wget --quiet https://developer.arm.com/-/media/Files/downloads/gnu/13.2.Rel1/binrel/${basefile}.tar.xz
xz -d ${basefile}.tar.xz
tar xf ${basefile}.tar
mv ${basefile} gcc-aarch64-none-elf
rm ${basefile}.tar
fi
command aarch64-none-elf-gcc --version
}
avr_gcc_toolchain() {
if ! type avr-gcc > /dev/null 2>&1; then
sudo apt-get install -y binutils-avr gcc-avr avr-libc
fi
command avr-gcc --version
}
binutils() {
if ! type objcopy > /dev/null 2>&1; then
sudo apt-get install -y binutils-dev
fi
command objcopy --version
}
bloaty() {
add_path "${NUTTXTOOLS}"/bloaty/bin
if [ ! -f "${NUTTXTOOLS}/bloaty/bin/bloaty" ]; then
git clone --depth 1 --branch v1.1 https://github.com/google/bloaty "${NUTTXTOOLS}"/bloaty-src
mkdir -p "${NUTTXTOOLS}"/bloaty
cd "${NUTTXTOOLS}"/bloaty-src
cmake -B build -DCMAKE_INSTALL_PREFIX="${NUTTXTOOLS}"/bloaty
cmake --build build
cmake --build build --target install
cd "${NUTTXTOOLS}"
rm -rf bloaty-src
ls -a "${NUTTXTOOLS}"/bloaty
fi
command bloaty --version
}
c_cache() {
if ! type ccache > /dev/null 2>&1; then
sudo apt-get install -y ccache
fi
setup_links
command ccache --version
}
clang_tidy() {
if ! type clang-tidy > /dev/null 2>&1; then
sudo apt-get install -y clang clang-tidy
fi
command clang-tidy --version
}
util_linux() {
if ! type flock > /dev/null 2>&1; then
sudo apt-get install -y util-linux
fi
command flock --version
}
gen_romfs() {
if ! type genromfs > /dev/null 2>&1; then
sudo apt-get install -y genromfs
fi
}
gperf() {
if ! type gperf > /dev/null 2>&1; then
sudo apt-get install -y gperf
fi
}
kconfig_frontends() {
add_path "${NUTTXTOOLS}"/kconfig-frontends/bin
if [ ! -f "${NUTTXTOOLS}/kconfig-frontends/bin/kconfig-conf" ]; then
git clone https://bitbucket.org/nuttx/tools.git "${NUTTXTOOLS}"/nuttx-tools
cd "${NUTTXTOOLS}"/nuttx-tools/kconfig-frontends
./configure --prefix="${NUTTXTOOLS}"/kconfig-frontends \
--disable-kconfig --disable-nconf --disable-qconf \
--disable-gconf --disable-mconf --disable-static \
--disable-shared --disable-L10n
# Avoid "aclocal/automake missing" errors
touch aclocal.m4 Makefile.in
make install
cd "${NUTTXTOOLS}"
rm -rf nuttx-tools
fi
}
mips_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/pinguino-compilers/p32/bin
if [ ! -d "${NUTTXTOOLS}/pinguino-compilers/p32/bin/p32-gcc" ]; then
local basefile
basefile=pinguino-linux64-p32
mkdir -p "${NUTTXTOOLS}"/pinguino-compilers
cd "${NUTTXTOOLS}"
# Download the latest pinguino toolchain prebuilt by 32bit
curl -O -L -s https://github.com/PinguinoIDE/pinguino-compilers/releases/download/v20.10/${basefile}.zip
unzip -qo ${basefile}.zip
mv p32 "${NUTTXTOOLS}"/pinguino-compilers/p32
rm ${basefile}.zip
fi
command p32-gcc --version
}
python_tools() {
pip3 install \
cmake-format \
CodeChecker \
cvt2utf \
cxxfilt \
esptool==4.8.dev4 \
imgtool \
kconfiglib \
pexpect==4.8.0 \
pyelftools \
pyserial==3.5 \
pytest==6.2.5 \
pytest-json==0.4.0 \
pytest-ordering==0.6 \
pytest-repeat==0.9.1
}
riscv_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/riscv-none-elf-gcc/bin
if [ ! -f "${NUTTXTOOLS}/riscv-none-elf-gcc/bin/riscv-none-elf-gcc" ]; then
local basefile
basefile=xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64
cd "${NUTTXTOOLS}"
# Download the latest RISCV GCC toolchain prebuilt by xPack
wget --quiet https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/${basefile}.tar.gz
tar zxf ${basefile}.tar.gz
mv xpack-riscv-none-elf-gcc-13.2.0-2 riscv-none-elf-gcc
rm ${basefile}.tar.gz
fi
command riscv-none-elf-gcc --version
}
rust() {
if ! type rustc > /dev/null 2>&1; then
sudo apt-get install rustc
# Install targets supported from NuttX
rustup target add thumbv6m-none-eabi
rustup target add thumbv7m-none-eabi
rustup target add riscv64gc-unknown-none-elf
fi
command rustc --version
}
dlang() {
if ! type ldc2 > /dev/null 2>&1; then
sudo apt-get install ldc
fi
command ldc2 --version | head -n 5
}
rx_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/renesas-toolchain/rx-elf-gcc/bin
if [ ! -f "${NUTTXTOOLS}/renesas-toolchain/rx-elf-gcc/bin/rx-elf-gcc" ]; then
# Download toolchain source code
# RX toolchain is built from source code. Once prebuilt RX toolchain is made available, the below code snippet can be removed.
local basefilebinutils
local basefilegcc
local basefilenewlib
basefilebinutils=binutils-2.36.1
basefilegcc=gcc-8.3.0
basefilenewlib=newlib-4.1.0
mkdir -p "${NUTTXTOOLS}"/renesas-tools/source
curl -L -s "https://llvm-gcc-renesas.com/downloads/d.php?f=rx/binutils/8.3.0.202305-gnurx/binutils-2.36.1.tar.gz" -o ${basefilebinutils}.tar.gz
tar zxf ${basefilebinutils}.tar.gz
mv ${basefilebinutils} "${NUTTXTOOLS}"/renesas-tools/source/binutils
rm ${basefilebinutils}.tar.gz
curl -L -s "https://llvm-gcc-renesas.com/downloads/d.php?f=rx/gcc/8.3.0.202305-gnurx/gcc-8.3.0.tar.gz" -o ${basefilegcc}.tar.gz
tar zxf ${basefilegcc}.tar.gz
mv ${basefilegcc} "${NUTTXTOOLS}"/renesas-tools/source/gcc
rm ${basefilegcc}.tar.gz
curl -L -s "https://llvm-gcc-renesas.com/downloads/d.php?f=rx/newlib/8.3.0.202305-gnurx/newlib-4.1.0.tar.gz" -o ${basefilenewlib}.tar.gz
tar zxf ${basefilenewlib}.tar.gz
mv ${basefilenewlib} "${NUTTXTOOLS}"/renesas-tools/source/newlib
rm ${basefilenewlib}.tar.gz
# Install binutils
cd "${NUTTXTOOLS}"/renesas-tools/source/binutils; chmod +x ./configure ./mkinstalldirs
mkdir -p "${NUTTXTOOLS}"/renesas-tools/build/binutils; cd "${NUTTXTOOLS}"/renesas-tools/build/binutils
"${NUTTXTOOLS}"/renesas-tools/source/binutils/configure --target=rx-elf --prefix="${NUTTXTOOLS}"/renesas-toolchain/rx-elf-gcc \
--disable-werror
make; make install
# Install gcc
cd "${NUTTXTOOLS}"/renesas-tools/source/gcc
chmod +x ./contrib/download_prerequisites ./configure ./move-if-change ./libgcc/mkheader.sh
./contrib/download_prerequisites
sed -i '1s/^/@documentencoding ISO-8859-1\n/' ./gcc/doc/gcc.texi
sed -i 's/@tex/\n&/g' ./gcc/doc/gcc.texi && sed -i 's/@end tex/\n&/g' ./gcc/doc/gcc.texi
mkdir -p "${NUTTXTOOLS}"/renesas-tools/build/gcc; cd "${NUTTXTOOLS}"/renesas-tools/build/gcc
"${NUTTXTOOLS}"/renesas-tools/source/gcc/configure --target=rx-elf --prefix="${NUTTXTOOLS}"/renesas-toolchain/rx-elf-gcc \
--disable-shared --disable-multilib --disable-libssp --disable-libstdcxx-pch --disable-werror --enable-lto \
--enable-gold --with-pkgversion=GCC_Build_1.02 --with-newlib --enable-languages=c
make; make install
# Install newlib
cd "${NUTTXTOOLS}"/renesas-tools/source/newlib; chmod +x ./configure
mkdir -p "${NUTTXTOOLS}"/renesas-tools/build/newlib; cd "${NUTTXTOOLS}"/renesas-tools/build/newlib
"${NUTTXTOOLS}"/renesas-tools/source/newlib/configure --target=rx-elf --prefix="${NUTTXTOOLS}"/renesas-toolchain/rx-elf-gcc
make; make install
rm -rf "${NUTTXTOOLS}"/renesas-tools/
fi
command rx-elf-gcc --version
}
sparc_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/sparc-gaisler-elf-gcc/bin
if [ ! -f "${NUTTXTOOLS}/sparc-gaisler-elf-gcc/bin/sparc-gaisler-elf-gcc" ]; then
local basefile
basefile=bcc-2.1.0-gcc-linux64
cd "${NUTTXTOOLS}"
# Download the SPARC GCC toolchain prebuilt by Gaisler
wget --quiet https://www.gaisler.com/anonftp/bcc2/bin/${basefile}.tar.xz
xz -d ${basefile}.tar.xz
tar xf ${basefile}.tar
mv bcc-2.1.0-gcc sparc-gaisler-elf-gcc
rm ${basefile}.tar
fi
command sparc-gaisler-elf-gcc --version
}
xtensa_esp32_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/xtensa-esp32-elf/bin
if [ ! -f "${NUTTXTOOLS}/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc" ]; then
local basefile
basefile=xtensa-esp32-elf-12.2.0_20230208-x86_64-linux-gnu
cd "${NUTTXTOOLS}"
# Download the latest ESP32 GCC toolchain prebuilt by Espressif
wget --quiet https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/${basefile}.tar.xz
xz -d ${basefile}.tar.xz
tar xf ${basefile}.tar
rm ${basefile}.tar
fi
command xtensa-esp32-elf-gcc --version
}
xtensa_esp32s2_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/xtensa-esp32s2-elf/bin
if [ ! -f "${NUTTXTOOLS}/xtensa-esp32s2-elf/bin/xtensa-esp32s2-elf-gcc" ]; then
local basefile
basefile=xtensa-esp32s2-elf-12.2.0_20230208-x86_64-linux-gnu
cd "${NUTTXTOOLS}"
# Download the latest ESP32 S2 GCC toolchain prebuilt by Espressif
wget --quiet https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/${basefile}.tar.xz
xz -d ${basefile}.tar.xz
tar xf ${basefile}.tar
rm ${basefile}.tar
fi
command xtensa-esp32s2-elf-gcc --version
}
xtensa_esp32s3_gcc_toolchain() {
add_path "${NUTTXTOOLS}"/xtensa-esp32s3-elf/bin
if [ ! -f "${NUTTXTOOLS}/xtensa-esp32s3-elf/bin/xtensa-esp32s3-elf-gcc" ]; then
local basefile
basefile=xtensa-esp32s3-elf-12.2.0_20230208-x86_64-linux-gnu
cd "${NUTTXTOOLS}"
# Download the latest ESP32 S3 GCC toolchain prebuilt by Espressif
wget --quiet https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/${basefile}.tar.xz
xz -d ${basefile}.tar.xz
tar xf ${basefile}.tar
rm ${basefile}.tar
fi
command xtensa-esp32s3-elf-gcc --version
}
u_boot_tools() {
if ! type mkimage > /dev/null 2>&1; then
sudo apt-get install -y u-boot-tools
fi
}
wasi_sdk() {
add_path "${NUTTXTOOLS}"/wamrc
if [ ! -f "${NUTTXTOOLS}/wasi-sdk/bin/clang" ]; then
local wasibasefile
local wasmbasefile
wasibasefile=wasi-sdk-19.0-linux
wasmbasefile=wamrc-1.1.2-x86_64-ubuntu-20.04
cd "${NUTTXTOOLS}"
mkdir -p wamrc
# Download the latest WASI-enabled WebAssembly C/C++ toolchain prebuilt by WASM
wget --quiet https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/${wasibasefile}.tar.gz
tar xzf ${wasibasefile}.tar.gz
mv wasi-sdk-19.0 wasi-sdk
rm ${wasibasefile}.tar.gz
cd wamrc
# Download the latest "wamrc" AOT compiler prebuilt by WAMR
wget --quiet https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/WAMR-1.1.2/${wasmbasefile}.tar.gz
tar xzf ${wasmbasefile}.tar.gz
rm ${wasmbasefile}.tar.gz
fi
export WASI_SDK_PATH="${NUTTXTOOLS}/wasi-sdk"
echo "export WASI_SDK_PATH=${NUTTXTOOLS}/wasi-sdk" >> "${NUTTXTOOLS}"/env.sh
command "${WASI_SDK_PATH}"/bin/clang --version
command wamrc --version
}
setup_links() {
# Configure ccache
mkdir -p "${NUTTXTOOLS}"/ccache/bin/
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/aarch64-none-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/aarch64-none-elf-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/arm-none-eabi-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/arm-none-eabi-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/avr-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/avr-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/cc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/c++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/clang
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/clang++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/p32-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/rx-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/riscv-none-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/riscv-none-elf-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/sparc-gaisler-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/sparc-gaisler-elf-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/x86_64-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/x86_64-elf-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/xtensa-esp32-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/xtensa-esp32-elf-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/xtensa-esp32s2-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/xtensa-esp32s2-elf-g++
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/xtensa-esp32s3-elf-gcc
ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/xtensa-esp32s3-elf-g++
}
install_build_tools() {
mkdir -p "${NUTTXTOOLS}"
echo "#!/usr/bin/env sh" > "${NUTTXTOOLS}"/env.sh
install="arm_clang_toolchain arm_gcc_toolchain arm64_gcc_toolchain avr_gcc_toolchain binutils bloaty clang_tidy gen_romfs gperf kconfig_frontends mips_gcc_toolchain python_tools riscv_gcc_toolchain rust dlang rx_gcc_toolchain sparc_gcc_toolchain xtensa_esp32_gcc_toolchain u_boot_tools util_linux wasi_sdk c_cache"
oldpath=$(cd . && pwd -P)
for func in ${install}; do
${func}
done
cd "${oldpath}"
echo "PATH=${PATH}" >> "${NUTTXTOOLS}"/env.sh
echo "export PATH" >> "${NUTTXTOOLS}"/env.sh
}
install_build_tools