ちょっと自分の環境に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'