| #!/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 |
| # |
| # 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. |
| |
| # 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 |
| prebuilt=$WORKSPACE/prebuilt |
| os=$(uname -s) |
| EXTRA_PATH= |
| |
| case $os in |
| Darwin) |
| install="python-tools u-boot-tools elf-toolchain gen-romfs kconfig-frontends arm-gcc-toolchain riscv-gcc-toolchain xtensa-esp32-gcc-toolchain avr-gcc-toolchain c-cache binutils" |
| mkdir -p ${prebuilt}/homebrew |
| export HOMEBREW_CACHE=${prebuilt}/homebrew |
| # https://github.com/actions/virtual-environments/issues/2322#issuecomment-749211076 |
| rm -rf /usr/local/bin/2to3 |
| # https://github.com/osx-cross/homebrew-avr/issues/205#issuecomment-760637996 |
| brew update --quiet |
| ;; |
| Linux) |
| install="python-tools gen-romfs gperf kconfig-frontends arm-gcc-toolchain mips-gcc-toolchain riscv-gcc-toolchain xtensa-esp32-gcc-toolchain rx-gcc-toolchain c-cache" |
| ;; |
| esac |
| |
| function add_path { |
| PATH=$1:$PATH |
| EXTRA_PATH=$1:$EXTRA_PATH |
| } |
| |
| function python-tools { |
| # Python User Env |
| PIP_USER=yes |
| export PIP_USER |
| PYTHONUSERBASE=$prebuilt/pylocal |
| export PYTHONUSERBASE |
| add_path $PYTHONUSERBASE/bin |
| pip3 install pexpect |
| } |
| |
| function u-boot-tools { |
| if ! type mkimage > /dev/null; then |
| case $os in |
| Darwin) |
| brew install u-boot-tools |
| ;; |
| esac |
| fi |
| } |
| |
| function elf-toolchain { |
| if ! type x86_64-elf-gcc > /dev/null; then |
| case $os in |
| Darwin) |
| brew install x86_64-elf-gcc |
| ;; |
| esac |
| fi |
| x86_64-elf-gcc --version |
| } |
| |
| function gen-romfs { |
| add_path $prebuilt/genromfs/usr/bin |
| |
| if [ ! -f "$prebuilt/genromfs/usr/bin/genromfs" ]; then |
| if [ ! -d "$tools" ]; then |
| git clone https://bitbucket.org/nuttx/tools.git $tools |
| fi |
| mkdir -p $prebuilt; cd $tools |
| tar zxf genromfs-0.5.2.tar.gz -C $prebuilt |
| cd $prebuilt/genromfs-0.5.2 |
| make install PREFIX=$prebuilt/genromfs |
| cd $prebuilt |
| rm -rf genromfs-0.5.2 |
| fi |
| } |
| |
| function gperf { |
| add_path $prebuilt/gperf/bin |
| |
| if [ ! -f "$prebuilt/gperf/bin/gperf" ]; then |
| cd $prebuilt |
| wget --quiet http://ftp.gnu.org/pub/gnu/gperf/gperf-3.1.tar.gz |
| tar zxf gperf-3.1.tar.gz |
| cd $prebuilt/gperf-3.1 |
| ./configure --prefix=$prebuilt/gperf; make; make install |
| cd $prebuilt |
| rm -rf gperf-3.1; rm gperf-3.1.tar.gz |
| fi |
| } |
| |
| function kconfig-frontends { |
| add_path $prebuilt/kconfig-frontends/bin |
| |
| if [ ! -f "$prebuilt/kconfig-frontends/bin/kconfig-conf" ]; then |
| cd $tools/kconfig-frontends |
| ./configure --prefix=$prebuilt/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; git clean -xfd |
| fi |
| } |
| |
| function bloaty { |
| add_path $prebuilt/bloaty/bin |
| if [ ! -f "$prebuilt/bloaty/bin/bloaty" ]; then |
| git clone --depth 1 --branch v1.1 https://github.com/google/bloaty bloaty-src |
| cd bloaty-src |
| mkdir -p $prebuilt/bloaty |
| cmake -DCMAKE_SYSTEM_PREFIX_PATH=$prebuilt/bloaty |
| make install -j 6 |
| cd $prebuilt |
| rm -rf bloaty-src |
| fi |
| } |
| |
| function arm-gcc-toolchain { |
| add_path $prebuilt/gcc-arm-none-eabi/bin |
| |
| if [ ! -f "$prebuilt/gcc-arm-none-eabi/bin/arm-none-eabi-gcc" ]; then |
| local flavor |
| case $os in |
| Darwin) |
| flavor=mac |
| ;; |
| Linux) |
| flavor=x86_64-linux |
| ;; |
| esac |
| cd $prebuilt |
| wget --quiet https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/RC2.1/gcc-arm-none-eabi-9-2019-q4-major-${flavor}.tar.bz2 |
| tar jxf gcc-arm-none-eabi-9-2019-q4-major-${flavor}.tar.bz2 |
| mv gcc-arm-none-eabi-9-2019-q4-major gcc-arm-none-eabi |
| rm gcc-arm-none-eabi-9-2019-q4-major-${flavor}.tar.bz2 |
| fi |
| arm-none-eabi-gcc --version |
| } |
| |
| function mips-gcc-toolchain { |
| add_path $prebuilt/pinguino-compilers/linux64/p32/bin |
| |
| if [ ! -f "$prebuilt/pinguino-compilers/linux64/p32/bin/p32-gcc" ]; then |
| cd $prebuilt |
| git clone https://github.com/PinguinoIDE/pinguino-compilers |
| fi |
| p32-gcc --version |
| } |
| |
| function riscv-gcc-toolchain { |
| add_path $prebuilt/riscv64-unknown-elf-gcc/bin |
| |
| if [ ! -f "$prebuilt/riscv64-unknown-elf-gcc/bin/riscv64-unknown-elf-gcc" ]; then |
| local flavor |
| case $os in |
| Darwin) |
| flavor=x86_64-apple-darwin |
| ;; |
| Linux) |
| flavor=x86_64-linux-ubuntu14 |
| ;; |
| esac |
| cd $prebuilt |
| wget --quiet https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-${flavor}.tar.gz |
| tar zxf riscv64-unknown-elf-gcc-8.3.0-2019.08.0-${flavor}.tar.gz |
| mv riscv64-unknown-elf-gcc-8.3.0-2019.08.0-${flavor} riscv64-unknown-elf-gcc |
| rm riscv64-unknown-elf-gcc-8.3.0-2019.08.0-${flavor}.tar.gz |
| fi |
| riscv64-unknown-elf-gcc --version |
| } |
| |
| function xtensa-esp32-gcc-toolchain { |
| add_path $prebuilt/xtensa-esp32-elf/bin |
| |
| if [ ! -f "$prebuilt/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc" ]; then |
| cd $prebuilt |
| case $os in |
| Darwin) |
| wget --quiet https://dl.espressif.com/dl/xtensa-esp32-elf-gcc8_2_0-esp-2019r2-macos.tar.gz |
| tar xzf xtensa-esp32-elf-gcc8_2_0-esp-2019r2-macos.tar.gz |
| rm xtensa-esp32-elf-gcc8_2_0-esp-2019r2-macos.tar.gz |
| ;; |
| Linux) |
| wget --quiet https://dl.espressif.com/dl/xtensa-esp32-elf-gcc8_2_0-esp32-2019r1-rc2-linux-amd64.tar.xz |
| xz -d xtensa-esp32-elf-gcc8_2_0-esp32-2019r1-rc2-linux-amd64.tar.xz |
| tar xf xtensa-esp32-elf-gcc8_2_0-esp32-2019r1-rc2-linux-amd64.tar |
| rm xtensa-esp32-elf-gcc8_2_0-esp32-2019r1-rc2-linux-amd64.tar |
| ;; |
| esac |
| fi |
| xtensa-esp32-elf-gcc --version |
| pip3 install esptool |
| } |
| |
| function avr-gcc-toolchain { |
| if ! type avr-gcc > /dev/null; then |
| case $os in |
| Darwin) |
| brew tap osx-cross/avr |
| brew install avr-gcc |
| ;; |
| esac |
| fi |
| } |
| |
| function rx-gcc-toolchain { |
| add_path $prebuilt/renesas-toolchain/rx-elf-gcc/bin |
| |
| if [ ! -f "$prebuilt/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 $prebuilt/renesas-tools/rx/source; cd $prebuilt/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 $prebuilt/renesas-tools/rx/source/binutils; chmod +x ./configure ./mkinstalldirs |
| mkdir -p $prebuilt/renesas-tools/rx/build/binutils; cd $prebuilt/renesas-tools/rx/build/binutils |
| $prebuilt/renesas-tools/rx/source/binutils/configure --target=rx-elf --prefix=$prebuilt/renesas-toolchain/rx-elf-gcc \ |
| --disable-werror |
| make; make install |
| |
| # Install gcc |
| cd $prebuilt/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 $prebuilt/renesas-tools/rx/build/gcc; cd $prebuilt/renesas-tools/rx/build/gcc |
| $prebuilt/renesas-tools/rx/source/gcc/configure --target=rx-elf --prefix=$prebuilt/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 $prebuilt/renesas-tools/rx/source/newlib; chmod +x ./configure |
| mkdir -p $prebuilt/renesas-tools/rx/build/newlib; cd $prebuilt/renesas-tools/rx/build/newlib |
| $prebuilt/renesas-tools/rx/source/newlib/configure --target=rx-elf --prefix=$prebuilt/renesas-toolchain/rx-elf-gcc |
| make; make install |
| rm -rf $prebuilt/renesas-tools/ |
| ;; |
| esac |
| fi |
| rx-elf-gcc --version |
| } |
| |
| function c-cache { |
| add_path $prebuilt/ccache/bin |
| |
| if ! type ccache > /dev/null; then |
| case $os in |
| Darwin) |
| brew install ccache |
| ;; |
| Linux) |
| cd $prebuilt; |
| 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=$prebuilt/ccache; make; make install |
| cd $prebuilt; rm -rf ccache-3.7.7; rm ccache-3.7.7.tar.gz |
| ;; |
| esac |
| fi |
| |
| ccache --version |
| mkdir -p $prebuilt/ccache/bin/ |
| ln -sf `which ccache` $prebuilt/ccache/bin/x86_64-elf-gcc |
| ln -sf `which ccache` $prebuilt/ccache/bin/x86_64-elf-g++ |
| ln -sf `which ccache` $prebuilt/ccache/bin/cc |
| ln -sf `which ccache` $prebuilt/ccache/bin/c++ |
| ln -sf `which ccache` $prebuilt/ccache/bin/clang |
| ln -sf `which ccache` $prebuilt/ccache/bin/clang++ |
| ln -sf `which ccache` $prebuilt/ccache/bin/gcc |
| ln -sf `which ccache` $prebuilt/ccache/bin/g++ |
| ln -sf `which ccache` $prebuilt/ccache/bin/arm-none-eabi-gcc |
| ln -sf `which ccache` $prebuilt/ccache/bin/arm-none-eabi-g++ |
| ln -sf `which ccache` $prebuilt/ccache/bin/p32-gcc |
| ln -sf `which ccache` $prebuilt/ccache/bin/riscv64-unknown-elf-gcc |
| ln -sf `which ccache` $prebuilt/ccache/bin/riscv64-unknown-elf-g++ |
| ln -sf `which ccache` $prebuilt/ccache/bin/xtensa-esp32-elf-gcc |
| ln -sf `which ccache` $prebuilt/ccache/bin/avr-gcc |
| ln -sf `which ccache` $prebuilt/ccache/bin/avr-g++ |
| } |
| |
| function binutils { |
| mkdir -p $prebuilt/bintools/bin |
| add_path $prebuilt/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 |
| # simlink if it exists |
| rm -f $prebuilt/bintools/bin/objcopy |
| ln -s /usr/local/opt/binutils/bin/objcopy $prebuilt/bintools/bin/objcopy |
| ;; |
| esac |
| fi |
| } |
| |
| function usage { |
| echo "" |
| echo "USAGE: $0 [-i] [-s] [-c] [-*] <testlist>" |
| echo " $0 -h" |
| echo "" |
| echo "Where:" |
| echo " -i install tools" |
| 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 " <testlist> select testlist file" |
| echo "" |
| exit 1 |
| } |
| |
| function enable_ccache { |
| export USE_CCACHE=1; |
| ccache -z |
| ccache -M 5G; |
| ccache -s |
| } |
| |
| function setup_repos { |
| pushd . |
| if [ -d "$nuttx" ]; then |
| cd $nuttx; git pull |
| else |
| git clone https://github.com/apache/incubator-nuttx.git $nuttx |
| cd $nuttx |
| fi |
| git log -1 |
| |
| if [ -d "$apps" ]; then |
| cd $apps; git pull |
| else |
| git clone https://github.com/apache/incubator-nuttx-apps.git $apps |
| cd $apps |
| fi |
| git log -1 |
| popd |
| } |
| |
| function install_tools { |
| pushd . |
| for func in $install; do |
| $func |
| done |
| popd |
| |
| echo PATH=$EXTRA_PATH\$PATH > $prebuilt/env.sh |
| } |
| |
| function run_builds { |
| local ncpus |
| |
| case $os in |
| Darwin) |
| ncpus=$(sysctl -n hw.ncpu) |
| ;; |
| Linux) |
| ncpus=`grep -c ^processor /proc/cpuinfo` |
| ;; |
| esac |
| |
| options+="-j $ncpus" |
| |
| for build in $builds; do |
| $nuttx/tools/testbuild.sh $options -e "-Wno-cpp -Werror" $build |
| done |
| } |
| |
| if [ -z "$1" ]; then |
| usage |
| fi |
| |
| while [ ! -z "$1" ]; do |
| case "$1" in |
| -h ) |
| usage |
| ;; |
| -i ) |
| install_tools |
| ;; |
| -c ) |
| enable_ccache |
| ;; |
| -s ) |
| setup_repos |
| ;; |
| -* ) |
| options+="$1 " |
| ;; |
| * ) |
| builds=$@ |
| break |
| ;; |
| esac |
| shift |
| done |
| |
| run_builds |