シミュレータのビルドでドツボにハマって泣いた
やっほ~!
この記事はcoins Advent Calender 2025、13日目の記事です♡
このところはさむ~いですね💦これは2025年の思い出ランキング2位、、、技術素人なので、こうすると🆗なことがあれば教えてください🙇♀️
ビルドの依存関係ってなんであんなめんどくさいの、、
みなさんはめちゃでかなプロジェクトをビルドするとき、ドツボにハマって泣いちゃったことはありませんか??
私は~あります😭
泣いちゃいました🥲(かわいそうな私)
gem5のビルド
gem5とは、主にC++で書かれたCPU等のハードをまるっとシミュレートできちゃうソフトウェアです!この記事では、私がgem5のビルドした時に直面した(個人的な)魔境ポイントをまとめました。ちなみに、gem5はSConsをビルドツールに使用しています。gem5.debugという種類もあるのですが、今回は実行速度が速くなるようにコンパイラが最適化してくれるビルドgem5.optで実行します。
コンパイラとC++のバージョン違い
まずgccコンパイラについて、自分のローカルと使用したサーバでgcc のバージョンが違い、混乱が生じました。
また、C++はバージョンの差によって記法の厳しさが違うため(そんなことあるの!?)、エラーに直面しました。
template-id not allowed for constructor in C++20
コンパイラが C++17 はOKだけど C++20 ではエラーになる部分があると言っています。私が使ったgem5のバージョンにはあったようです。サーバーに入っていた新しいGCCが、デフォルトで最新のC++20の規格を適用してビルドしようとしたため、古い記法がエラーとして弾かれてしまいました。じゃあローカルに古いコンパイラを立てて環境変数でそれを使わせようとしましたが、SConsが自分でCC/CCXを決めたり、gem5は独自のConfigureロジックを使用したりしているせいでそれが難しかったです。
そもそもgem5を最新版ではなく少し前のバージョンを使っていたので(その方が安定してるかなと思って、、)、この時点でバージョンを切り替えるべきでした。
pipインストールが再起動で消える
使用していたサーバはpipインストールしても再起動すると環境がすべて消えるようになっていました。というか、グローバル環境にインストールしようとしてしまっていたので、PATHにぶら下がる一時的なインストールを繰り返して毎日ビルドしていました(マヌケ)。こういう時は仮想環境を使おうと思いました。
ファイル直接編集の始まり(地獄)
さらに魔境だったのが、zlibはきちんとインストールされているはずなのにgem5がそれを認識してくれなかったことです。
Did not find needed zlib compression library and/or zlib.h header file.
これはpip系ではなく zlib-dev 系で、OS側に入ってないといけないものだったようですが、サーバの権限が私にはありませんでした。そこで私はパスを通すためにSConstructを編集してしまい、少し構造を書き換えたことで連鎖的にエラーが発生しました。依存関係のチェック機能CheckLibWithHeaderがない、初期化の順番がおかしくなりkeyError、gem5版のConfigureを標準のもので上書きしてしまいエラー、などが起こりました。ちなみに、gem5はSConstructの構造をそのまま使わず、gem5専用のラッパー処理等を行った後にenvに注入する形で、SConstructはビルドフレームワークの一部になっていました。なので壊れると終わりなのですが、私はふつうの設定ファイルSConstructだと思って沼にハマりました。
Dockerの存在を知る
結局すべてをアンインストールし、一から構成立てることで実行できましたが、どうやらこういうことを解決するためにDockerというものがあるらしいです😭
アプリケーションと実行環境をまるごとコンテナに入れて実行できるらしいです。他のアプリやOSから独立していて、どんな環境でも動くのはすごいですね。知るのが遅かった、、これから使っていきます。
安定した動作環境の固定って大事なんだ~と思いました。
ばいば~い🎀
Discussion