tools: Dockerfile for ESP-IDF with Rust support (#12)

* tools: Dockerfile for ESP-IDF with Rust support
* tools: add Rust support build for Ubuntu 18 Bionic
This commit is contained in:
Juraj Michálek 2021-06-30 08:20:58 +02:00 committed by GitHub
parent 8c94733638
commit bc610399e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 245 additions and 4 deletions

View File

@ -14,3 +14,12 @@ jobs:
submodules: 'recursive'
- name: esp-idf build
uses: espressif/esp-idf-ci-action@rust-latest
- name: Archive binaries
run: |
mkdir binaries
cp build/*.bin build/bootloader/*.bin build/partition_table/*.bin support/esptool/* binaries/
- name: Archive artifact
uses: actions/upload-artifact@v2
with:
name: binaries
path: binaries

37
Dockerfile Normal file
View File

@ -0,0 +1,37 @@
FROM espressif/idf
#RUN apt update \
# && apt install -y build-essential curl
ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8
ENV RUSTUP_HOME=/opt/rust
ENV CARGO_HOME=/opt/cargo
ENV PATH=/opt/cargo/bin:/opt/rust/bin:/opt/xtensa-esp32-elf-clang/bin:/opt/llvm-patch/bin:$PATH
RUN curl https://sh.rustup.rs -sSf | bash -s -- --profile minimal --default-toolchain nightly -y
WORKDIR /opt
RUN wget -q https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/bionic/rust-1.50.0-dev-x86_64-unknown-linux-gnu-bionic.tar.xz \
&& tar xvf rust-1.50.0-dev-x86_64-unknown-linux-gnu-bionic.tar.xz \
&& cd rust-1.50.0-dev-x86_64-unknown-linux-gnu \
&& ./install.sh --destdir=/opt/xtensa --prefix="" --without=rust-docs \
&& cd /opt \
&& rm -rf rust-1.50.0-dev-x86_64-unknown-linux-gnu*
RUN wget -q https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/rust-src-1.50.0-dev.tar.xz \
&& tar xvf rust-src-1.50.0-dev.tar.xz \
&& cd rust-src-1.50.0-dev \
&& ./install.sh --destdir=/opt/xtensa --prefix="" --without=rust-docs \
&& cd /opt \
&& rm -rf rust-src-1.50.0-dev* \
&& rustup toolchain link xtensa /opt/xtensa \
&& rustup default xtensa
RUN wget -q https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/xtensa-esp32-elf-llvm11_0_0-llvmorg-11-init-21247-g65ed48e-linux-amd64.tar.xz \
&& tar xf xtensa-esp32-elf-llvm11_0_0-llvmorg-11-init-21247-g65ed48e-linux-amd64.tar.xz \
&& rm xtensa-esp32-elf-llvm11_0_0-llvmorg-11-init-21247-g65ed48e-linux-amd64.tar.xz \
&& wget -q https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/bionic/llvm-patch-0.1.x86_64-unknown-linux-gnu-bionic.tar.gz \
&& tar xzf llvm-patch-0.1.x86_64-unknown-linux-gnu-bionic.tar.gz \
&& rm llvm-patch-0.1.x86_64-unknown-linux-gnu-bionic.tar.gz
RUN git clone https://github.com/espressif/rust-esp32-example.git
WORKDIR /opt/rust-esp32-example

View File

@ -0,0 +1,44 @@
# Rust on Xtensa Installation for Linux x64
Tested OS: Ubuntu 18 x64
## Prerequisites
- rustup - installed with nightly toolchain - https://rustup.rs/
## Commands
```
sudo apt install gcc wget xz-utils
rustup toolchain install nightly
mkdir -p ~/.rustup/toolchains/xtensa
wget https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/bionic/rust-1.50.0-dev-x86_64-unknown-linux-gnu-bionic.tar.xz
tar xvf rust-1.50.0-dev-x86_64-unknown-linux-gnu-bionic.tar.xz
pushd rust-1.50.0-dev-x86_64-unknown-linux-gnu
./install.sh --destdir=~/.rustup/toolchains/xtensa --prefix="" --without=rust-docs
popd
wget https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/rust-src-1.50.0-dev.tar.xz
tar xvf rust-src-1.50.0-dev.tar.xz
pushd rust-src-1.50.0-dev
./install.sh --destdir=~/.rustup/toolchains/xtensa --prefix="" --without=rust-docs
popd
rustup default xtensa
wget https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/xtensa-esp32-elf-llvm11_0_0-llvmorg-11-init-21247-g65ed48e-linux-amd64.tar.xz
tar xf xtensa-esp32-elf-llvm11_0_0-llvmorg-11-init-21247-g65ed48e-linux-amd64.tar.xz
export PATH="`pwd`/xtensa-esp32-elf-clang/bin/:$PATH"
wget https://dl.espressif.com/dl/idf-rust/dist/x86_64-unknown-linux-gnu/llvm-patch-0.1.x86_64-unknown-linux-gnu.tar.gz
tar xzf llvm-patch-0.1.x86_64-unknown-linux-gnu.tar.gz
export PATH="`pwd`/llvm-patch/bin/:$PATH"
wget --continue https://github.com/espressif/rust-esp32-example/archive/refs/heads/main.zip
unzip main.zip
cd rust-esp32-example-main
idf.py build
```

View File

@ -1,8 +1,8 @@
# Rust on Xtensa Installation for Linux x64
Tested OS: Ubuntu 20 x64, Mint x64
Tested OS: Ubuntu 20 x64, Mint 20 x64
Limitation: Does not work with Ubuntu 18 Bionic - GLIBC problem in cargo: `/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found.`
Ubuntu 18: Please follow instructions for [Linux Ubuntu 18 x64](rust-on-xtensa-installation-x86_64-unknown-linux-gnu-bionic.md) to avoid problem with `GLIBC_2.29' not found.
## Prerequisites

View File

@ -2,9 +2,10 @@
## Quick start
The installation process of ready to use custom build of Rust and LLVM is described here:
The installation process of ready to use custom build of Rust and LLVM is described here:
* [Linux Ubuntu x64/Mint x64](rust-on-xtensa-installation-x86_64-unknown-linux-gnu.md)
* [Linux Ubuntu 20 x64/Mint 20 x64](rust-on-xtensa-installation-x86_64-unknown-linux-gnu.md)
* [Linux Ubuntu 18 x64](rust-on-xtensa-installation-x86_64-unknown-linux-gnu-bionic.md)
* [macOS Big Sur x64](rust-on-xtensa-installation-x86_64-apple-darwin.md)
* [macOS Big Sur arm64](rust-on-xtensa-installation-aarch64-apple-darwin.md)
* [Windows 10 x64](rust-on-xtensa-installation-x86_64-pc-windows-msvc.md)

19
support/README.md Normal file
View File

@ -0,0 +1,19 @@
# Support files
## Rust
The directory `rust` contains Dockerfile to build custom version of rust compiler with enabled Xtensa support.
### Usage
Building and starting container:
```
cd support/rust
docker build -t rust-xtensa:bionic -f Dockerfile .
docker run --rm --name rust-xtensa -it rust-xtensa:bionic /bin/bash
```
Copy Rust dist file from running container:
```
docker cp rust-xtensa /opt/rust/build/dist/rust-dev-1.50.0-dev-x86_64-unknown-linux-gnu.tar.xz rust-1.50.0-dev-x86_64-unknown-linux-gnu-bionic.tar.xz
```

View File

@ -0,0 +1,16 @@
$Command = "esptool.exe"
if (Test-Path -Path ".\esptool-v3.1-win64\esptool-v3.1-win64\esptool.exe" -PathType Leaf) {
$Command = ".\esptool-v3.1-win64\esptool-v3.1-win64\esptool.exe"
}
$OldPreference = $ErrorActionPreference
$ErrorActionPreference = 'stop'
try {if(Get-Command $Command){"$Command exists"}}
Catch {
"$Command not found. Downloading"
Invoke-WebRequest https://github.com/espressif/esptool/releases/download/v3.1/esptool-v3.1-win64.zip -OutFile esptool-v3.1-win64.zip
Expand-Archive -Path esptool-v3.1-win64.zip
$Command = ".\esptool-v3.1-win64\esptool-v3.1-win64\esptool.exe"
$ErrorActionPreference=$OldPreference
}
&$Command -b 460800 --before default_reset --after hard_reset --chip esp32 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 bootloader.bin 0x8000 partition-table.bin 0x10000 esp32-hello-rust.bin

View File

@ -0,0 +1,11 @@
FROM ubuntu:bionic
WORKDIR /opt
RUN apt update \
&& apt install -y gcc cmake ccache ninja-build git python3 curl g++ pkg-config libssl-dev
RUN git clone https://github.com/espressif/llvm-project.git
ADD cmake/caches /opt/cmake/caches
RUN mkdir -p llvm-project/build \
&& cd llvm-project/build \
&& cmake -C /opt/cmake/caches/DistributionEspressif.cmake ../llvm -G "Ninja" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="Xtensa" -DCMAKE_BUILD_TYPE=Release \
&& ninja stage2-distribution || echo "Build failed - silencing error to persist current build artifacts"

View File

@ -0,0 +1,37 @@
# This file sets up a CMakeCache for the second stage of a simple distribution
# bootstrap build.
#set(LLVM_ENABLE_PROJECTS "clang" CACHE STRING "")
set(LLVM_ENABLE_PROJECTS "clang;clang-tools-extra;lld" CACHE STRING "")
set(LLVM_ENABLE_RUNTIMES "" CACHE STRING "")
#set(LLVM_ENABLE_PROJECTS "clang;clang-tools-extra;lld" CACHE STRING "")
#set(LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx;libcxxabi" CACHE STRING "")
set(LLVM_TARGETS_TO_BUILD X86;AArch64 CACHE STRING "")
#set(LLVM_TARGETS_TO_BUILD X86;ARM;AArch64 CACHE STRING "")
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -gline-tables-only -DNDEBUG" CACHE STRING "")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -gline-tables-only -DNDEBUG" CACHE STRING "")
# setup toolchain
set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "")
set(LLVM_TOOLCHAIN_TOOLS
#dsymutil
#llvm-cov
#llvm-dwarfdump
#llvm-profdata
#llvm-objdump
#llvm-nm
#llvm-size
CACHE STRING "")
set(LLVM_DISTRIBUTION_COMPONENTS
clang
#LTO
#clang-format
#clang-resource-headers
#builtins
#runtimes
${LLVM_TOOLCHAIN_TOOLS}
CACHE STRING "")

View File

@ -0,0 +1,55 @@
# This file sets up a CMakeCache for a simple distribution bootstrap build.
#Enable LLVM projects and runtimes
#set(LLVM_ENABLE_PROJECTS "clang" CACHE STRING "")
set(LLVM_ENABLE_PROJECTS "clang;clang-tools-extra;lld" CACHE STRING "")
set(LLVM_ENABLE_RUNTIMES "compiler-rt" CACHE STRING "")
#set(LLVM_ENABLE_PROJECTS "clang;clang-tools-extra;lld" CACHE STRING "")
#set(LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx;libcxxabi" CACHE STRING "")
# Only build the native target in stage1 since it is a throwaway build.
set(LLVM_TARGETS_TO_BUILD Native CACHE STRING "")
# Optimize the stage1 compiler, but don't LTO it because that wastes time.
set(CMAKE_BUILD_TYPE Release CACHE STRING "")
# Setup vendor-specific settings.
set(PACKAGE_VENDOR LLVM.org CACHE STRING "")
# Setting up the stage2 LTO option needs to be done on the stage1 build so that
# the proper LTO library dependencies can be connected.
set(BOOTSTRAP_LLVM_ENABLE_LTO OFF CACHE BOOL "")
#set(BOOTSTRAP_LLVM_ENABLE_LTO ON CACHE BOOL "")
if (NOT APPLE)
# Since LLVM_ENABLE_LTO is ON we need a LTO capable linker
#set(BOOTSTRAP_LLVM_ENABLE_LLD ON CACHE BOOL "")
set(BOOTSTRAP_LLVM_ENABLE_LLD OFF CACHE BOOL "")
endif()
# Expose stage2 targets through the stage1 build configuration.
set(CLANG_BOOTSTRAP_TARGETS
check-all
check-llvm
check-clang
llvm-config
test-suite
test-depends
llvm-test-depends
clang-test-depends
distribution
install-distribution
clang CACHE STRING "")
# Setup the bootstrap build.
set(CLANG_ENABLE_BOOTSTRAP ON CACHE BOOL "")
if(STAGE2_CACHE_FILE)
set(CLANG_BOOTSTRAP_CMAKE_ARGS
-C ${STAGE2_CACHE_FILE}
CACHE STRING "")
else()
set(CLANG_BOOTSTRAP_CMAKE_ARGS
-C ${CMAKE_CURRENT_LIST_DIR}/DistributionEspressif-stage2.cmake
CACHE STRING "")
endif()

12
support/rust/Dockerfile Normal file
View File

@ -0,0 +1,12 @@
FROM ubuntu:bionic
WORKDIR /opt
RUN apt update \
&& apt install -y gcc cmake ccache ninja-build git python3 curl g++ pkg-config libssl-dev
RUN git clone https://github.com/ivmarkov/rust.git \
&& cd rust \
&& git checkout stable \
&& ./configure --experimental-targets=Xtensa --enable-extended --tools=rustfmt --disable-docs --disable-compiler-docs --set="build.python=python3" \
&& python3 x.py dist --stage 2 || echo "Build failed - silencing error to persist current build artifacts"
# speed-up rebuild: --set="local-rebuild=true"