ちょっと自分の環境にLiteXの環境が乱立しすぎて、どれがどれだかわからなくなってきたので、Docker環境を構築して中に押し込んでみようと思う。
まずはDockerfileの記述から。基本的にRISC-Vのツールと必要なパッケージのインストール。 Dockerの外からLiteXのファイルは見えてほしいので、外部にダウンロードしてマウントする形にしたい。
以下のような感じで、Docker実行時に外部にダウンロードしているLiteX環境をマウントする形だ。
その時に問題となるのは、litex_setup.pyで用意すべきツールセットをどこに置くかという話。
litex_setupを後から実行してしまうと、Dockerファイル内に押し込むことができないが、後から実行しないと外部からマウントした場所に対してリポジトリを用意できない。
しかし、litex_setup.pyが用意するスクリプト群はDockerの中に押し込めておきたいので、2段階の戦略をとる。
- まず、Dockerコンテナ構築時に、
litex_setup.pyをダウンロードして内部でビルドを走らせる。インストール先をDocker内にして、スクリプト群がすべてDockerファイル内に押し込まれるようにする。 - Dockerコンテナ実行時に、再度
litex_setup.pyを走らせたうえで、マウントしてディレクトリにインストールされるように調整する。
こうすることによって、litexのコマンド群はDocker内に押し込まれ、作業用のファイルは外部ディスクからマウントされるようになる。
FROM ubuntu:22.04
ARG DEBIAN_FRONTEND=noninteractive
ENV LITEX_VERSION 309f012d2c670dffdc285fe49d15c3f8b29dfce4
RUN apt-get -y update && \
apt-get install -y \
git \
python3 \
python3-pip \
python3-setuptools \
wget \
tar \
automake \
autoconf \
make \
curl \
gzip && \
rm -rf /var/lib/apt/lists/*
ENV RISCV /work/riscv
WORKDIR /work/
RUN chmod 777 /work -R
RUN curl -L https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2022.08.08/riscv64-elf-ubuntu-20.04-nightly-2022.08.08-nightly.tar.gz | tar xz
# RUN curl -L https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2022.08.08/riscv64-glibc-ubuntu-20.04-nightly-2022.08.08-nightly.tar.gz | tar xz
# RUN curl -L https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2022.08.08/riscv64-musl-ubuntu-20.04-nightly-2022.08.08-nightly.tar.gz | tar xz
ENV PATH $RISCV/bin:$PATH
ENV LD_LIBRARY_PATH $RISCV/lib:$LD_LIBRARY_PATH
RUN apt update -y && \
apt install -y ninja-build \
libevent-dev \
libjson-c-dev \
verilator && \
rm -rf /var/lib/apt/lists/*
RUN pip3 install meson
ENV HOME /work
ENV PATH $PATH:$HOME/.local/bin
RUN wget https://raw.githubusercontent.com/enjoy-digital/litex/${LITEX_VERSION}/litex_setup.py && \
python3 ./litex_setup.py --init --user --config=minimal --install
RUN chmod 777 /work -R
これで何とかうまくいっているように見えるが、どうもまだ調整がだめらしい。
docker/litex$ litex_sim --help
Traceback (most recent call last):
File "/work/.local/bin/litex_sim", line 33, in <module>
sys.exit(load_entry_point('litex', 'console_scripts', 'litex_sim')())
File "/work/.local/bin/litex_sim", line 25, in importlib_load_entry_point
return next(matches).load()
File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load
module = import_module(match.group('module'))
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/work/litex/litex/tools/litex_sim.py", line 29, in <module>
from litedram import modules as litedram_modules
ModuleNotFoundError: No module named 'litedram'