FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LiteX実験用のDocker環境を作る

ちょっと自分の環境にLiteXの環境が乱立しすぎて、どれがどれだかわからなくなってきたので、Docker環境を構築して中に押し込んでみようと思う。

まずはDockerfileの記述から。基本的にRISC-Vのツールと必要なパッケージのインストール。 Dockerの外からLiteXのファイルは見えてほしいので、外部にダウンロードしてマウントする形にしたい。

以下のような感じで、Docker実行時に外部にダウンロードしているLiteX環境をマウントする形だ。

その時に問題となるのは、litex_setup.pyで用意すべきツールセットをどこに置くかという話。 litex_setupを後から実行してしまうと、Dockerファイル内に押し込むことができないが、後から実行しないと外部からマウントした場所に対してリポジトリを用意できない。

しかし、litex_setup.pyが用意するスクリプト群はDockerの中に押し込めておきたいので、2段階の戦略をとる。

  1. まず、Dockerコンテナ構築時に、litex_setup.pyをダウンロードして内部でビルドを走らせる。インストール先をDocker内にして、スクリプト群がすべてDockerファイル内に押し込まれるようにする。
  2. 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'