You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2024/03/01 13:30:09 UTC

(nuttx) branch master updated: tools/ci: Modify cibuild.sh to adapt to new platforms.

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new fd86cf70cc tools/ci: Modify cibuild.sh to adapt to new platforms.
fd86cf70cc is described below

commit fd86cf70cc9e4c7645686e66ce2a894642f3fcbb
Author: simbit18 <10...@users.noreply.github.com>
AuthorDate: Thu Feb 8 17:33:44 2024 +0100

    tools/ci: Modify cibuild.sh to adapt to new platforms.
    
    cibuild.sh -> modify scripts
    platforms -> new folder +scripts
    add header
    
    tools/ci/platforms: Set the execute permissions on the updated files.
    
    tools/ci/platforms/linux.sh: fix header
    
    Corrected Apache Foundation copyright header.
    
    tools/ci: Modify cibuild.sh to adapt to new platforms.
    
    cibuild.sh -> modify scripts
    platforms -> new folder +scripts
    add header
    
    tools/ci/platforms: Set the execute permissions on the updated files.
    
    tools/ci: Modify cibuild.sh to adapt to new platforms.
    
    cibuild.sh -> modify scripts
    platforms -> new folder +scripts
    add header
    
    tools/ci/platforms: Set the execute permissions on the updated files.
    
    tools/ci: Kept the common code in cibuild.sh.
    
    Kept the common code in cibuild.sh.
    
    tools/ci: Storing all Environment Variables in env.sh script.
    
    Added in cibuild.sh this command "source "${CIWORKSPACE}"/tools/env.sh" to activate installed tools.
    
    tools/ci: shared the tools path in cibuild.sh
    
    Added in cibuild.sh enviroment variable "NUTTXTOOLS" for installed tools.
    
    Removed bashisms from scripts darwin.sh, linux.sh, msys2.sh and ubuntu.sh.
    
    tools/ci: Fixed build problems with macOS
    
    Fix Error: /Users/runner/work/nuttx/nuttx/sources/tools/bloaty-src/build is not a directory
---
 tools/ci/cibuild.sh          | 658 +++++--------------------------------------
 tools/ci/platforms/darwin.sh | 358 +++++++++++++++++++++++
 tools/ci/platforms/linux.sh  | 380 +++++++++++++++++++++++++
 tools/ci/platforms/msys2.sh  | 295 +++++++++++++++++++
 tools/ci/platforms/ubuntu.sh | 450 +++++++++++++++++++++++++++++
 5 files changed, 1561 insertions(+), 580 deletions(-)

diff --git a/tools/ci/cibuild.sh b/tools/ci/cibuild.sh
index 20c2858e09..a9c7e8d494 100755
--- a/tools/ci/cibuild.sh
+++ b/tools/ci/cibuild.sh
@@ -1,527 +1,92 @@
 #!/usr/bin/env bash
-
-# 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
+############################################################################
+# tools/ci/cibuild.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
+#   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
+# 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.
-
-# Prerequisites for macOS
-#  - Xcode (cc, etc)
-#  - homebrew
-#  - autoconf
-#  - wget
-
+#
+############################################################################
 set -e
 set -o xtrace
 
-WD=$(cd "$(dirname "$0")" && pwd)
-WORKSPACE=$(cd "${WD}"/../../../ && pwd -P)
-nuttx=${WORKSPACE}/nuttx
-apps=${WORKSPACE}/apps
-tools=${WORKSPACE}/tools
-os=$(uname -s)
-EXTRA_PATH=
-
-function add_path {
-  PATH=$1:${PATH}
-  EXTRA_PATH=$1:${EXTRA_PATH}
-}
-
-function arm-clang-toolchain {
-  add_path "${tools}"/clang-arm-none-eabi/bin
-
-  if [ ! -f "${tools}/clang-arm-none-eabi/bin/clang" ]; then
-    local flavor
-    case ${os} in
-      Linux)
-        flavor=Linux
-        ;;
-    esac
-    cd "${tools}"
-    curl -O -L -s https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-17.0.1/LLVMEmbeddedToolchainForArm-17.0.1-${flavor}-x86_64.tar.xz
-    xz -d LLVMEmbeddedToolchainForArm-17.0.1-${flavor}.tar.xz
-    mv LLVMEmbeddedToolchainForArm-17.0.1 clang-arm-none-eabi
-    cp /usr/bin/clang-extdef-mapping-10 clang-arm-none-eabi/bin/clang-extdef-mapping
-    rm LLVMEmbeddedToolchainForArm-17.0.1-${flavor}.tar.xz
-  fi
-
-  command clang --version
-}
-
-function arm-gcc-toolchain {
-  add_path "${tools}"/gcc-arm-none-eabi/bin
-
-  if [ ! -f "${tools}/gcc-arm-none-eabi/bin/arm-none-eabi-gcc" ]; then
-    local archivetool
-    local basefile
-    case ${os} in
-      Darwin)
-        archivetool=tar
-        basefile=arm-gnu-toolchain-13.2.rel1-darwin-x86_64-arm-none-eabi
-        ;;
-      Linux)
-       archivetool=tar
-        basefile=arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi
-        ;;
-      MSYS*)
-        archivetool=unzip
-        basefile=arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-arm-none-eabi
-        ;;
-    esac
-    cd "${tools}"
-    if [ "$archivetool" == "tar" ]; then
-      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
-    else
-      wget --quiet https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/${basefile}.zip
-      unzip -qo ${basefile}.zip
-      mv ${basefile} gcc-arm-none-eabi
-      rm ${basefile}.zip
-    fi
-  fi
-
-  command arm-none-eabi-gcc --version
-}
-
-function arm64-gcc-toolchain {
-  add_path "${tools}"/gcc-aarch64-none-elf/bin
-
-  if [ ! -f "${tools}/gcc-aarch64-none-elf/bin/aarch64-none-elf-gcc" ]; then
-    local flavor
-    case ${os} in
-      Darwin)
-        flavor=-darwin
-        ;;
-      Linux)
-        flavor=
-        ;;
-    esac
-    cd "${tools}"
-    wget --quiet https://developer.arm.com/-/media/Files/downloads/gnu/13.2.Rel1/binrel/arm-gnu-toolchain-13.2.Rel1${flavor}-x86_64-aarch64-none-elf.tar.xz
-    xz -d arm-gnu-toolchain-13.2.Rel1${flavor}-x86_64-aarch64-none-elf.tar.xz
-    tar xf arm-gnu-toolchain-13.2.Rel1${flavor}-x86_64-aarch64-none-elf.tar
-    mv arm-gnu-toolchain-13.2.Rel1${flavor}-x86_64-aarch64-none-elf gcc-aarch64-none-elf
-    rm arm-gnu-toolchain-13.2.Rel1${flavor}-x86_64-aarch64-none-elf.tar
-  fi
-
-  command aarch64-none-elf-gcc --version
-}
-
-function avr-gcc-toolchain {
-  if ! type avr-gcc &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew tap osx-cross/avr
-        brew install avr-gcc
-        ;;
-      Linux)
-        apt-get install -y avr-libc gcc-avr
-        ;;
-    esac
-  fi
-
-  command avr-gcc --version
-}
-
-function binutils {
-  mkdir -p "${tools}"/bintools/bin
-  add_path "${tools}"/bintools/bin
-
-  if ! type objcopy &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew install binutils
-        # It is possible we cached prebuilt but did brew install so recreate
-        # symlink if it exists
-        rm -f "${tools}"/bintools/bin/objcopy
-        ln -s /usr/local/opt/binutils/bin/objcopy "${tools}"/bintools/bin/objcopy
-        ;;
-    esac
-  fi
-
-  command objcopy --version
-}
-
-function bloaty {
-  add_path "${tools}"/bloaty/bin
-
-  if [ ! -f "${tools}/bloaty/bin/bloaty" ]; then
-    git clone --branch main https://github.com/google/bloaty "${tools}"/bloaty-src
-    cd "${tools}"/bloaty-src
-    # Due to issues with latest MacOS versions use pinned commit.
-    # https://github.com/google/bloaty/pull/326
-    git checkout 52948c107c8f81045e7f9223ec02706b19cfa882
-    mkdir -p "${tools}"/bloaty
-    cmake -D BLOATY_PREFER_SYSTEM_CAPSTONE=NO -DCMAKE_SYSTEM_PREFIX_PATH="${tools}"/bloaty
-    make install -j 6
-    cd "${tools}"
-    rm -rf bloaty-src
-  fi
-
-  command bloaty --version
-}
 
-function c-cache {
-  add_path "${tools}"/ccache/bin
+CID=$(cd "$(dirname "$0")" && pwd)
+CIWORKSPACE=$(cd "${CID}"/../../../ && pwd -P)
+CIPLAT=${CIWORKSPACE}/nuttx/tools/ci/platforms
+nuttx=${CIWORKSPACE}/nuttx
+apps=${CIWORKSPACE}/apps
 
-  if ! type ccache &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew install ccache
-        ;;
-      Linux)
-        cd "${tools}";
-        wget https://github.com/ccache/ccache/releases/download/v3.7.7/ccache-3.7.7.tar.gz
-        tar zxf ccache-3.7.7.tar.gz
-        cd ccache-3.7.7; ./configure --prefix="${tools}"/ccache; make; make install
-        cd "${tools}"; rm -rf ccache-3.7.7; rm ccache-3.7.7.tar.gz
-        ;;
-      MSYS*)
-        pacman -S --noconfirm --needed ccache
-        pacman -Q
-        ;;
-    esac
-  fi
-
-  command ccache --version
-}
-
-function clang-tidy {
-  if ! type clang-tidy &> /dev/null; then
-    case ${os} in
-      Linux)
-        apt-get install -y clang clang-tidy
-        ;;
-    esac
-  fi
-
-  command clang-tidy --version
-}
-
-function elf-toolchain {
-  if ! type x86_64-elf-gcc &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew install x86_64-elf-gcc
-        ;;
-    esac
-  fi
-
-  command x86_64-elf-gcc --version
-}
-
-function util-linux {
-  if ! type flock &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew tap discoteq/discoteq
-        brew install flock
-        ;;
-      Linux)
-        apt-get install -y util-linux
-        ;;
-    esac
-  fi
-
-  command flock --version
-}
-
-function gen-romfs {
-  if ! type genromfs &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew tap PX4/px4
-        brew install genromfs
-        ;;
-      Linux)
-        apt-get install -y genromfs
-        ;;
-    esac
-  fi
-}
-
-function gperf {
-  add_path "${tools}"/gperf/bin
-
-  if [ ! -f "${tools}/gperf/bin/gperf" ]; then
-    cd "${tools}"
-    wget --quiet http://ftp.gnu.org/pub/gnu/gperf/gperf-3.1.tar.gz
-    tar zxf gperf-3.1.tar.gz
-    cd "${tools}"/gperf-3.1
-    ./configure --prefix="${tools}"/gperf; make; make install
-    cd "${tools}"
-    rm -rf gperf-3.1; rm gperf-3.1.tar.gz
-  fi
-
-  command gperf --version
-}
-
-function kconfig-frontends {
-  add_path "${tools}"/kconfig-frontends/bin
+os=$(uname -s)
+if [ -f /etc/os-release ]; then
+  osname=$(grep "^ID=" /etc/os-release | cut -d'=' -f2 | tr -d '"')
+else
+  osname=${os}
+fi
 
-  if [ ! -f "${tools}/kconfig-frontends/bin/kconfig-conf" ]; then
-    git clone https://bitbucket.org/nuttx/tools.git "${tools}"/nuttx-tools
-    cd "${tools}"/nuttx-tools/kconfig-frontends
-    ./configure --prefix="${tools}"/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 "${tools}"
-    rm -rf nuttx-tools
-  fi
+function to_do {
+  echo ""
+  echo "NuttX TODO: $1"
+  echo "The $1 platform does not appear to have been added to this project."
+  echo ""
+  exit 1
 }
 
-function mips-gcc-toolchain {
-  if [ ! -d "${tools}/pinguino-compilers" ]; then
-    cd "${tools}"
-    git clone https://github.com/PinguinoIDE/pinguino-compilers
-  fi
+function install_tools {
+  export NUTTXTOOLS=${CIWORKSPACE}/tools
+  mkdir -p "${NUTTXTOOLS}"
 
-  case ${os} in
+  case ${osname} in
+    alpine)
+      to_do "alpine"
+      ;;
+    arch)
+      to_do "arch"
+      ;;
+    CYGWIN*)
+      to_do "CYGWIN"
+      ;;
+    debian)
+      to_do "debian"
+      ;;
+    fedora)
+      to_do "fedora"
+      ;;
+    freebsd)
+      to_do "freebsd"
+      ;;
     Darwin)
-      add_path "${tools}"/pinguino-compilers/macosx/p32/bin
-      command mips-elf-gcc --version
+      "${CIPLAT}"/darwin.sh
       ;;
     Linux)
-      add_path "${tools}"/pinguino-compilers/linux64/p32/bin
-      command p32-gcc --version
+      "${CIPLAT}"/linux.sh
+      ;;
+    manjaro)
+      to_do "manjaro"
+      ;;
+    msys2)
+      "${CIPLAT}"/msys2.sh
+      ;;
+    ubuntu)
+      "${CIPLAT}"/ubuntu.sh
+      ;;
+    *)
+      to_do "unknown"
       ;;
   esac
-}
-
-function python-tools {
-  # Python User Env
-  export PIP_USER=yes
-  export PYTHONUSERBASE=${tools}/pylocal
-  add_path "${PYTHONUSERBASE}"/bin
-
-  # workaround for Cython issue
-  # https://github.com/yaml/pyyaml/pull/702#issuecomment-1638930830
-  pip3 install "Cython<3.0"
-  git clone https://github.com/yaml/pyyaml.git && \
-  cd pyyaml && \
-  git checkout release/5.4.1 && \
-  sed -i.bak 's/Cython/Cython<3.0/g' pyproject.toml && \
-  python setup.py sdist && \
-  pip3 install --pre dist/PyYAML-5.4.1.tar.gz
-  cd ..
-
-  pip3 install \
-    cmake-format \
-    CodeChecker \
-    cvt2utf \
-    cxxfilt \
-    esptool==4.5.1 \
-    imgtool==1.9.0 \
-    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
-}
-
-function riscv-gcc-toolchain {
-  add_path "${tools}"/riscv-none-elf-gcc/bin
-
-  if [ ! -f "${tools}/riscv-none-elf-gcc/bin/riscv-none-elf-gcc" ]; then
-    local flavor
-    case ${os} in
-      Darwin)
-        flavor=darwin-x64
-        ;;
-      Linux)
-        flavor=linux-x64
-        ;;
-    esac
-    cd "${tools}"
-    wget --quiet https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-${flavor}.tar.gz
-    tar zxf xpack-riscv-none-elf-gcc-13.2.0-2-${flavor}.tar.gz
-    mv xpack-riscv-none-elf-gcc-13.2.0-2 riscv-none-elf-gcc
-    rm xpack-riscv-none-elf-gcc-13.2.0-2-${flavor}.tar.gz
-  fi
-
-  command riscv-none-elf-gcc --version
-}
-
-function rust {
-  mkdir -p "${tools}"/rust/bin
-  add_path "${tools}"/rust/bin
-
-  if ! type rustc &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew install rust
-        ;;
-      Linux)
-        # Currently Debian installed rustc doesn't support 2021 edition.
-        export CARGO_HOME=${tools}/rust
-        curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
-        ;;
-    esac
-  fi
-
-  command rustc --version
-}
-
-function rx-gcc-toolchain {
-  add_path "${tools}"/renesas-toolchain/rx-elf-gcc/bin
-
-  if [ ! -f "${tools}/renesas-toolchain/rx-elf-gcc/bin/rx-elf-gcc" ]; then
-    case ${os} in
-      Linux)
-        # 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.
-        mkdir -p "${tools}"/renesas-tools/rx/source; cd "${tools}"/renesas-tools/rx/source
-        wget --quiet https://gcc-renesas.com/downloads/d.php?f=rx/binutils/4.8.4.201803-gnurx/rx_binutils2.24_2018Q3.tar.gz \
-          -O rx_binutils2.24_2018Q3.tar.gz
-        tar zxf rx_binutils2.24_2018Q3.tar.gz
-        wget --quiet https://gcc-renesas.com/downloads/d.php?f=rx/gcc/4.8.4.201803-gnurx/rx_gcc_4.8.4_2018Q3.tar.gz \
-          -O rx_gcc_4.8.4_2018Q3.tar.gz
-        tar zxf rx_gcc_4.8.4_2018Q3.tar.gz
-        wget --quiet https://gcc-renesas.com/downloads/d.php?f=rx/newlib/4.8.4.201803-gnurx/rx_newlib2.2.0_2018Q3.tar.gz \
-          -O rx_newlib2.2.0_2018Q3.tar.gz
-        tar zxf rx_newlib2.2.0_2018Q3.tar.gz
-
-        # Install binutils
-        cd "${tools}"/renesas-tools/rx/source/binutils; chmod +x ./configure ./mkinstalldirs
-        mkdir -p "${tools}"/renesas-tools/rx/build/binutils; cd "${tools}"/renesas-tools/rx/build/binutils
-        "${tools}"/renesas-tools/rx/source/binutils/configure --target=rx-elf --prefix="${tools}"/renesas-toolchain/rx-elf-gcc \
-          --disable-werror
-        make; make install
-
-        # Install gcc
-        cd "${tools}"/renesas-tools/rx/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 "${tools}"/renesas-tools/rx/build/gcc; cd "${tools}"/renesas-tools/rx/build/gcc
-        "${tools}"/renesas-tools/rx/source/gcc/configure --target=rx-elf --prefix="${tools}"/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 "${tools}"/renesas-tools/rx/source/newlib; chmod +x ./configure
-        mkdir -p "${tools}"/renesas-tools/rx/build/newlib; cd "${tools}"/renesas-tools/rx/build/newlib
-        "${tools}"/renesas-tools/rx/source/newlib/configure --target=rx-elf --prefix="${tools}"/renesas-toolchain/rx-elf-gcc
-        make; make install
-        rm -rf "${tools}"/renesas-tools/
-        ;;
-    esac
-  fi
-
-  command rx-elf-gcc --version
-}
-
-function sparc-gcc-toolchain {
-  add_path "${tools}"/sparc-gaisler-elf-gcc/bin
-
-  if [ ! -f "${tools}/sparc-gaisler-elf-gcc/bin/sparc-gaisler-elf-gcc" ]; then
-    case ${os} in
-      Linux)
-        cd "${tools}"
-        wget --quiet https://www.gaisler.com/anonftp/bcc2/bin/bcc-2.1.0-gcc-linux64.tar.xz
-        xz -d bcc-2.1.0-gcc-linux64.tar.xz
-        tar xf bcc-2.1.0-gcc-linux64.tar
-        mv bcc-2.1.0-gcc sparc-gaisler-elf-gcc
-        rm bcc-2.1.0-gcc-linux64.tar
-        ;;
-    esac
-  fi
-
-  command sparc-gaisler-elf-gcc --version
-}
-
-function xtensa-esp32-gcc-toolchain {
-  add_path "${tools}"/xtensa-esp32-elf/bin
-
-  if [ ! -f "${tools}/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc" ]; then
-    cd "${tools}"
-    case ${os} in
-      Darwin)
-        wget --quiet https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32-elf-12.2.0_20230208-x86_64-apple-darwin.tar.xz
-        xz -d xtensa-esp32-elf-12.2.0_20230208-x86_64-apple-darwin.tar.xz
-        tar xf xtensa-esp32-elf-12.2.0_20230208-x86_64-apple-darwin.tar
-        rm xtensa-esp32-elf-12.2.0_20230208-x86_64-apple-darwin.tar
-        ;;
-      Linux)
-        wget --quiet https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz
-        xz -d xtensa-esp32-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz
-        tar xf xtensa-esp32-elf-12.2.0_20230208-x86_64-linux-gnu.tar
-        rm xtensa-esp32-elf-12.2.0_20230208-x86_64-linux-gnu.tar
-        ;;
-    esac
-  fi
-
-  command xtensa-esp32-elf-gcc --version
-}
-
-function u-boot-tools {
-  if ! type mkimage &> /dev/null; then
-    case ${os} in
-      Darwin)
-        brew install u-boot-tools
-        ;;
-      Linux)
-        apt-get install -y u-boot-tools
-        ;;
-    esac
-  fi
-}
-
-function wasi-sdk {
-  add_path "${tools}"/wamrc
-
-  if [ ! -f "${tools}/wasi-sdk/bin/clang" ]; then
-    cd "${tools}"
-    mkdir wamrc
-
-    case ${os} in
-      Darwin)
-        wget --quiet https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/wasi-sdk-19.0-macos.tar.gz
-        tar xzf wasi-sdk-19.0-macos.tar.gz
-        mv wasi-sdk-19.0 wasi-sdk
-        cd wamrc
-        wget --quiet https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/WAMR-1.1.2/wamrc-1.1.2-x86_64-macos-latest.tar.gz
-        tar xzf wamrc-1.1.2-x86_64-macos-latest.tar.gz
-        ;;
-      Linux)
-        wget --quiet https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/wasi-sdk-19.0-linux.tar.gz
-        tar xzf wasi-sdk-19.0-linux.tar.gz
-        mv wasi-sdk-19.0 wasi-sdk
-        cd wamrc
-        wget --quiet https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/WAMR-1.1.2/wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz
-        tar xzf wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz
-        ;;
-    esac
-  fi
-
-  export WASI_SDK_PATH="${tools}/wasi-sdk"
 
-  command ${WASI_SDK_PATH}/bin/clang --version
-  command wamrc --version
+  source "${CIWORKSPACE}"/tools/env.sh
 }
 
 function usage {
@@ -534,38 +99,14 @@ function usage {
   echo "  -s setup repos"
   echo "  -c enable ccache"
   echo "  -* support all options in testbuild.sh"
-  echo "  -h will show this help test and terminate"
+  echo "  -h will show this help text and terminate"
   echo "  <testlist> select testlist file"
   echo ""
   exit 1
 }
 
 function enable_ccache {
-  export CCACHE_DIR="${tools}"/ccache
-}
-
-function setup_links {
-  mkdir -p "${tools}"/ccache/bin/
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/aarch64-none-elf-gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/aarch64-none-elf-g++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/arm-none-eabi-gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/arm-none-eabi-g++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/avr-gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/avr-g++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/cc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/c++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/clang
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/clang++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/g++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/p32-gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/riscv64-unknown-elf-gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/riscv64-unknown-elf-g++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/sparc-gaisler-elf-gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/sparc-gaisler-elf-g++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/x86_64-elf-gcc
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/x86_64-elf-g++
-  ln -sf "$(which ccache)" "${tools}"/ccache/bin/xtensa-esp32-elf-gcc
+  export CCACHE_DIR="${CIWORKSPACE}"/tools/ccache
 }
 
 function setup_repos {
@@ -588,57 +129,13 @@ function setup_repos {
   popd
 }
 
-function install_tools {
-  mkdir -p "${tools}"
-
-case ${os} in
-  Darwin)
-    install="arm-gcc-toolchain arm64-gcc-toolchain avr-gcc-toolchain binutils bloaty elf-toolchain gen-romfs gperf kconfig-frontends mips-gcc-toolchain python-tools riscv-gcc-toolchain rust xtensa-esp32-gcc-toolchain u-boot-tools util-linux wasi-sdk c-cache"
-    mkdir -p "${tools}"/homebrew
-    export HOMEBREW_CACHE=${tools}/homebrew
-    # https://github.com/apache/arrow/issues/15025
-    rm -f /usr/local/bin/2to3* || :
-    rm -f /usr/local/bin/idle3* || :
-    rm -f /usr/local/bin/pydoc3* || :
-    rm -f /usr/local/bin/python3* || :
-    rm -f /usr/local/bin/python3-config || :
-    # same for openssl
-    rm -f /usr/local/bin/openssl || :
-    ;;
-  Linux)
-    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 rx-gcc-toolchain sparc-gcc-toolchain xtensa-esp32-gcc-toolchain u-boot-tools util-linux wasi-sdk c-cache"
-    ;;
-  MSYS*)
-    install="arm-gcc-toolchain kconfig-frontends"
-    ;;
-esac
-
-  pushd .
-  for func in ${install}; do
-    ${func}
-  done
-  popd
-
-  if [ -d "${CCACHE_DIR}" ]; then
-    setup_links
-  fi
-  echo PATH="${EXTRA_PATH}"/"${PATH}" > "${tools}"/env.sh
-}
-
 function run_builds {
   local ncpus
-
-  case ${os} in
-    Darwin)
-      ncpus=$(sysctl -n hw.ncpu)
-      ;;
-    Linux)
-      ncpus=$(grep -c ^processor /proc/cpuinfo)
-      ;;
-    MSYS*)
-      ncpus=$(grep -c ^processor /proc/cpuinfo)
-      ;;
-  esac
+  if [ "X$osname" == "XDarwin" ]; then
+    ncpus=$(sysctl -n hw.ncpu)
+  else
+    ncpus=$(grep -c ^processor /proc/cpuinfo)
+  fi
 
   options+="-j ${ncpus}"
 
@@ -647,6 +144,7 @@ function run_builds {
   done
 
   if [ -d "${CCACHE_DIR}" ]; then
+    # Print a summary of configuration and statistics counters
     ccache -s
   fi
 }
diff --git a/tools/ci/platforms/darwin.sh b/tools/ci/platforms/darwin.sh
new file mode 100755
index 0000000000..87d6c02e59
--- /dev/null
+++ b/tools/ci/platforms/darwin.sh
@@ -0,0 +1,358 @@
+#!/usr/bin/env sh
+############################################################################
+# tools/ci/platforms/darwin.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.
+#
+############################################################################
+
+# Darwin
+# Prerequisites for macOS
+#  - Xcode (cc, etc)
+#  - homebrew
+#  - autoconf
+#  - wget
+
+set -e
+set -o xtrace
+
+add_path() {
+  PATH=$1:${PATH}
+}
+
+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-darwin-x86_64-arm-none-eabi
+    cd "${NUTTXTOOLS}"
+    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-darwin-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
+    brew tap osx-cross/avr
+    brew install avr-gcc
+  fi
+
+  command avr-gcc --version
+}
+
+binutils() {
+  mkdir -p "${NUTTXTOOLS}"/bintools/bin
+  add_path "${NUTTXTOOLS}"/bintools/bin
+
+  if ! type objcopy > /dev/null 2>&1; then
+    brew install binutils
+    # It is possible we cached prebuilt but did brew install so recreate
+    # symlink if it exists
+    rm -f "${NUTTXTOOLS}"/bintools/bin/objcopy
+    ln -s /usr/local/opt/binutils/bin/objcopy "${NUTTXTOOLS}"/bintools/bin/objcopy
+  fi
+
+  command objcopy --version
+}
+
+bloaty() {
+  add_path "${NUTTXTOOLS}"/bloaty/bin
+
+  if [ ! -f "${NUTTXTOOLS}/bloaty/bin/bloaty" ]; then
+    git clone --branch main https://github.com/google/bloaty "${NUTTXTOOLS}"/bloaty-src
+    cd "${NUTTXTOOLS}"/bloaty-src
+    # Due to issues with latest MacOS versions use pinned commit.
+    # https://github.com/google/bloaty/pull/326
+    git checkout 52948c107c8f81045e7f9223ec02706b19cfa882
+    mkdir -p "${NUTTXTOOLS}"/bloaty
+    cmake -D BLOATY_PREFER_SYSTEM_CAPSTONE=NO -DCMAKE_SYSTEM_PREFIX_PATH="${NUTTXTOOLS}"/bloaty
+    make install -j 4
+    cd "${NUTTXTOOLS}"
+    rm -rf bloaty-src
+  fi
+
+  command bloaty --version
+}
+
+c_cache() {
+  add_path "${NUTTXTOOLS}"/ccache/bin
+
+  if ! type ccache > /dev/null 2>&1; then
+    brew install ccache
+  fi
+  setup_links
+  command ccache --version
+}
+
+elf_toolchain() {
+  if ! type x86_64-elf-gcc > /dev/null 2>&1; then
+    brew install x86_64-elf-gcc
+  fi
+
+  command x86_64-elf-gcc --version
+}
+
+gen_romfs() {
+  if ! type genromfs > /dev/null 2>&1; then
+    brew tap PX4/px4
+    brew install genromfs
+  fi
+}
+
+gperf() {
+  add_path "${NUTTXTOOLS}"/gperf/bin
+
+  if [ ! -f "${NUTTXTOOLS}/gperf/bin/gperf" ]; then
+    local basefile
+    basefile=gperf-3.1
+
+    cd "${NUTTXTOOLS}"
+    wget --quiet http://ftp.gnu.org/pub/gnu/gperf/${basefile}.tar.gz
+    tar zxf ${basefile}.tar.gz
+    cd "${NUTTXTOOLS}"/${basefile}
+    ./configure --prefix="${NUTTXTOOLS}"/gperf; make; make install
+    cd "${NUTTXTOOLS}"
+    rm -rf ${basefile}; rm ${basefile}.tar.gz
+  fi
+
+  command gperf --version
+}
+
+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/macosx/p32/bin
+
+  if [ ! -d "${NUTTXTOOLS}/pinguino-compilers" ]; then
+    cd "${NUTTXTOOLS}"
+    git clone https://github.com/PinguinoIDE/pinguino-compilers
+  fi
+
+  command mips-elf-gcc --version
+}
+
+python_tools() {
+  # Python User Env
+  export PIP_USER=yes
+  export PYTHONUSERBASE=${NUTTXTOOLS}/pylocal
+  echo "export PIP_USER=yes" >> "${NUTTXTOOLS}"/env.sh
+  echo "export PYTHONUSERBASE=${NUTTXTOOLS}/pylocal" >> "${NUTTXTOOLS}"/env.sh
+  add_path "${PYTHONUSERBASE}"/bin
+
+  # workaround for Cython issue
+  # https://github.com/yaml/pyyaml/pull/702#issuecomment-1638930830
+  pip3 install "Cython<3.0"
+  git clone https://github.com/yaml/pyyaml.git && \
+  cd pyyaml && \
+  git checkout release/5.4.1 && \
+  sed -i.bak 's/Cython/Cython<3.0/g' pyproject.toml && \
+  python setup.py sdist && \
+  pip3 install --pre dist/PyYAML-5.4.1.tar.gz
+  cd ..
+
+  pip3 install \
+    cmake-format \
+    CodeChecker \
+    cvt2utf \
+    cxxfilt \
+    esptool==4.5.1 \
+    imgtool==1.9.0 \
+    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-darwin-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
+    brew install rust
+  fi
+
+  command rustc --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-apple-darwin
+    cd "${NUTTXTOOLS}"
+    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
+}
+
+u_boot_tools() {
+  if ! type mkimage > /dev/null 2>&1; then
+    brew install u-boot-tools
+  fi
+}
+
+util_linux() {
+  if ! type flock > /dev/null 2>&1; then
+    brew tap discoteq/discoteq
+    brew install flock
+  fi
+
+  command flock --version
+}
+
+wasi_sdk() {
+  add_path "${NUTTXTOOLS}"/wamrc
+
+  if [ ! -f "${NUTTXTOOLS}/wamrc/wasi-sdk/bin/clang" ]; then
+    local wasibasefile
+    local wasmbasefile
+    wasibasefile=wasi-sdk-19.0-macos
+    wasmbasefile=wamrc-1.1.2-x86_64-macos-latest
+    cd "${NUTTXTOOLS}"
+    mkdir wamrc
+    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
+    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/riscv64-unknown-elf-gcc
+  ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/riscv64-unknown-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
+}
+
+install_build_tools() {
+  mkdir -p "${NUTTXTOOLS}"
+  echo "#!/usr/bin/env sh" > "${NUTTXTOOLS}"/env.sh
+
+  install="arm_gcc_toolchain arm64_gcc_toolchain avr_gcc_toolchain binutils bloaty elf_toolchain gen_romfs gperf kconfig_frontends mips_gcc_toolchain python_tools riscv_gcc_toolchain rust xtensa_esp32_gcc_toolchain u_boot_tools util_linux wasi_sdk c_cache"
+
+  mkdir -p "${NUTTXTOOLS}"/homebrew
+  export HOMEBREW_CACHE=${NUTTXTOOLS}/homebrew
+  echo "export HOMEBREW_CACHE=${NUTTXTOOLS}/homebrew" >> "${NUTTXTOOLS}"/env.sh
+  # https://github.com/apache/arrow/issues/15025
+  rm -f /usr/local/bin/2to3* || :
+  rm -f /usr/local/bin/idle3* || :
+  rm -f /usr/local/bin/pydoc3* || :
+  rm -f /usr/local/bin/python3* || :
+  rm -f /usr/local/bin/python3-config || :
+  # same for openssl
+  rm -f /usr/local/bin/openssl || :
+
+  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
diff --git a/tools/ci/platforms/linux.sh b/tools/ci/platforms/linux.sh
new file mode 100755
index 0000000000..683bded476
--- /dev/null
+++ b/tools/ci/platforms/linux.sh
@@ -0,0 +1,380 @@
+#!/usr/bin/env bash
+############################################################################
+# tools/ci/platforms/linux.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.
+#
+############################################################################
+
+# 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
+    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
+}
+
+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 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 \
+    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
+}
+
+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
+}
+
+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 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 bloaty kconfig_frontends mips_gcc_toolchain python_tools riscv_gcc_toolchain rx_gcc_toolchain sparc_gcc_toolchain xtensa_esp32_gcc_toolchain util_linux wasi_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
diff --git a/tools/ci/platforms/msys2.sh b/tools/ci/platforms/msys2.sh
new file mode 100755
index 0000000000..f5230e778c
--- /dev/null
+++ b/tools/ci/platforms/msys2.sh
@@ -0,0 +1,295 @@
+#!/usr/bin/env sh
+############################################################################
+# tools/ci/platforms/msys2.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.
+#
+############################################################################
+
+# MSYS2
+
+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-Windows-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}.zip
+    unzip -qo ${basefile}.zip
+    mv ${basefile} clang-arm-none-eabi
+    rm ${basefile}.zip
+  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-mingw-w64-i686-arm-none-eabi
+    cd "${NUTTXTOOLS}"
+    wget --quiet https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/${basefile}.zip
+    unzip -qo ${basefile}.zip
+    mv ${basefile} gcc-arm-none-eabi
+    rm ${basefile}.zip
+  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-mingw-w64-i686-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}.zip
+    unzip -qo ${basefile}.zip
+    mv ${basefile} gcc-aarch64-none-elf
+    rm ${basefile}.zip
+  fi
+
+  command aarch64-none-elf-gcc --version
+}
+
+c_cache() {
+  add_path "${NUTTXTOOLS}"/ccache/bin
+
+  if ! type ccache > /dev/null 2>&1; then
+    pacman -S --noconfirm --needed ccache
+  fi
+  setup_links
+  command ccache --version
+}
+
+esp_tool() {
+  add_path "${NUTTXTOOLS}"/esp-tool
+
+  if ! type esptool > /dev/null 2>&1; then
+    local basefile
+    basefile=esptool-v4.7.0-win64
+    cd "${NUTTXTOOLS}"
+    curl -O -L -s https://github.com/espressif/esptool/releases/download/v4.7.0/${basefile}.zip
+    unzip -qo ${basefile}.zip
+    mv esptool-win64 esp-tool
+    rm ${basefile}.zip
+  fi
+  command esptool version
+}
+
+gen_romfs() {
+  add_path "${NUTTXTOOLS}"/genromfs/usr/bin
+
+  if ! type genromfs > /dev/null 2>&1; then
+    git clone https://bitbucket.org/nuttx/tools.git "${NUTTXTOOLS}"/nuttx-tools
+    cd "${NUTTXTOOLS}"/nuttx-tools
+    tar zxf genromfs-0.5.2.tar.gz
+    cd genromfs-0.5.2
+    make install PREFIX="${NUTTXTOOLS}"/genromfs
+    cd "${NUTTXTOOLS}"
+    rm -rf nuttx-tools
+  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/windows64/p32/bin
+
+  if [ ! -d "${NUTTXTOOLS}/pinguino-compilers" ]; then
+    cd "${NUTTXTOOLS}"
+    git clone https://github.com/PinguinoIDE/pinguino-compilers
+  fi
+
+  command p32-gcc --version
+}
+
+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-win32-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}.zip
+    unzip -qo ${basefile}.zip
+    mv xpack-riscv-none-elf-gcc-13.2.0-2 riscv-none-elf-gcc
+    rm ${basefile}.zip
+  fi
+  command riscv-none-elf-gcc --version
+}
+
+rust() {
+  add_path "${NUTTXTOOLS}"/rust/cargo/bin
+  # Configuring the PATH environment variable
+  export CARGO_HOME=${NUTTXTOOLS}/rust/cargo
+  export RUSTUP_HOME=${NUTTXTOOLS}/rust/rustup
+  echo "export CARGO_HOME=${NUTTXTOOLS}/rust/cargo" >> "${NUTTXTOOLS}"/env.sh
+  echo "export RUSTUP_HOME=${NUTTXTOOLS}/rust/rustup" >> "${NUTTXTOOLS}"/env.sh
+  if ! type rustc > /dev/null 2>&1; then
+    local basefile
+    basefile=x86_64-pc-windows-gnu
+    mkdir -p "${NUTTXTOOLS}"/rust
+    cd "${NUTTXTOOLS}"
+    # Download tool rustup-init.exe
+    curl -O -L -s https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-gnu/rustup-init.exe
+    # Install Rust target x86_64-pc-windows-gnu
+    ./rustup-init.exe -y --default-host ${basefile} --no-modify-path
+    # Install targets supported from NuttX
+    "$CARGO_HOME"/bin/rustup target add thumbv6m-none-eabi
+    "$CARGO_HOME"/bin/rustup target add thumbv7m-none-eabi
+    rm rustup-init.exe
+  fi
+  command rustc --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-mingw64
+    cd "${NUTTXTOOLS}"
+    # Download the SPARC GCC toolchain prebuilt by Gaisler
+    wget --quiet https://www.gaisler.com/anonftp/bcc2/bin/${basefile}.zip
+    unzip -qo ${basefile}.zip
+    mv bcc-2.1.0-gcc sparc-gaisler-elf-gcc
+    rm ${basefile}.zip
+  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-w64-mingw32
+    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}.zip
+    unzip -qo ${basefile}.zip
+    rm ${basefile}.zip
+  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-w64-mingw32
+    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}.zip
+    unzip -qo ${basefile}.zip
+    rm ${basefile}.zip
+  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-w64-mingw32
+    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}.zip
+    unzip -qo ${basefile}.zip
+    rm ${basefile}.zip
+  fi
+
+  command xtensa-esp32s3-elf-gcc --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/riscv64-unknown-elf-gcc
+  ln -sf "$(which ccache)" "${NUTTXTOOLS}"/ccache/bin/riscv64-unknown-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
+}
+
+install_build_tools() {
+  mkdir -p "${NUTTXTOOLS}"
+  echo "#!/usr/bin/env sh" > "${NUTTXTOOLS}"/env.sh
+
+  install="arm_clang_toolchain arm_gcc_toolchain arm64_gcc_toolchain kconfig_frontends riscv_gcc_toolchain rust"
+
+  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
diff --git a/tools/ci/platforms/ubuntu.sh b/tools/ci/platforms/ubuntu.sh
new file mode 100755
index 0000000000..eaafe751a3
--- /dev/null
+++ b/tools/ci/platforms/ubuntu.sh
@@ -0,0 +1,450 @@
+#!/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 \
+    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
+  fi
+
+  command rustc --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
+    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 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 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