| #!/usr/bin/env bash |
| ############################################################################ |
| # tools/ci/platforms/linux.sh |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # 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. |
| # |
| ############################################################################ |
| |
| # Linux |
| |
| 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 |
| curl -O -L -s 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 |
| curl -O -L -s 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 |
| } |
| |
| 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 |
| } |
| |
| kconfig_frontends() { |
| add_path "${NUTTXTOOLS}"/kconfig-frontends/bin |
| |
| if [ ! -f "${NUTTXTOOLS}/kconfig-frontends/bin/kconfig-conf" ]; then |
| git clone --depth 1 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 \ |
| construct \ |
| 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-14.2.0-3-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/v14.2.0-3/${basefile}.tar.gz |
| tar zxf ${basefile}.tar.gz |
| mv xpack-riscv-none-elf-gcc-14.2.0-3 riscv-none-elf-gcc |
| rm ${basefile}.tar.gz |
| fi |
| command riscv-none-elf-gcc --version |
| } |
| |
| 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 |
| curl -O -L -s 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_esp_gcc_toolchain() { |
| add_path "${NUTTXTOOLS}"/xtensa-esp-elf/bin |
| |
| if [ ! -f "${NUTTXTOOLS}/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc" ]; then |
| local basefile |
| basefile=xtensa-esp-elf-14.2.0_20241119-x86_64-linux-gnu |
| cd "${NUTTXTOOLS}" |
| # Download the latest ESP32, ESP32-S2 and ESP32-S3 GCC toolchain prebuilt by Espressif |
| curl -O -L -s https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/${basefile}.tar.xz |
| xz -d ${basefile}.tar.xz |
| tar xf ${basefile}.tar |
| rm ${basefile}.tar |
| fi |
| |
| command xtensa-esp32-elf-gcc --version |
| } |
| |
| 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 |
| curl -O -L -s 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 |
| curl -O -L -s 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 |
| } |
| |
| raspberrypi_pico_sdk() { |
| if [ ! -f "${NUTTXTOOLS}/pico-sdk" ]; then |
| local release |
| local basefile |
| release="2.2.0" |
| basefile="pico-sdk-${release}" |
| cd "${NUTTXTOOLS}" |
| mkdir -p pico-sdk |
| |
| # Download the latest pico-sdk source archive |
| curl -O -L -s https://github.com/raspberrypi/pico-sdk/releases/download/${release}/${basefile}.tar.gz |
| tar xzf "${basefile}.tar.gz" |
| mv "${basefile}" pico-sdk |
| rm "${basefile}.tar.gz" |
| |
| fi |
| |
| export PICO_SDK_PATH="${NUTTXTOOLS}/pico-sdk" |
| echo "export PICO_SDK_PATH=${NUTTXTOOLS}/pico-sdk" >> "${NUTTXTOOLS}"/env.sh |
| } |
| |
| 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 bloaty kconfig_frontends mips_gcc_toolchain python_tools riscv_gcc_toolchain rx_gcc_toolchain sparc_gcc_toolchain xtensa_esp_gcc_toolchain util_linux wasi_sdk raspberrypi_pico_sdk" |
| |
| 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 |