2021年2月1日月曜日

古い gcc が欲しくて CentOS 5 の docker image を作った話

はじめに
なぜ古い GCC が必要になったのか?
個人開発している iutest では古の環境でもなるべく使えるように頑張りたいなーという気持ちがあります。(なんかこう制約をかいくぐってなんとかするの楽しいし)
Google Test の最新版で C++11 が要求されるようになったこともあり、今後昔の言語バージョンをサポートするライブラリは減っていくのかなーと思います。
当然、新しい言語バージョンを使っているのなら、そのバージョンをターゲットとしたライブラリのほうが効率が良いと思います。
iutest でももちろんなるべく新しい言語バージョンの機能を取り込んでいくつもりです。

ここで問題になってくるのはテストです。
今までは古の環境を想定して、iutest 側で言語機能がないと Config をセットしてテストしていました。
ライブラリ内部での undefined とかシンタックスエラーはこれでも検出できるのですが、やはり「ないと仮定」しても「実際にはある」ので、実は対応してなかったってのがいくらでも出てきちゃいます。

そんな感じで、一応サポートする気持ちはあるけどテストはできる限りという状態だったため、テストのカバー範囲を広げるために日々 OS やコンパイラのテスト環境を増やしている次第です。

なぜ CentOS 5 なのか?
はじめに、古い GCC が欲しいと思ったときに Ubuntu のパッケージからできるだけ古いものをインストールしようとしました。
しかし、そこまで古いものは取ってこれませんでした。

つぎに、ソースコードからビルド・インストールすることを試しました。
こちらはなかなかビルドが通らない、あと古い環境だと認証通らなくて(GPG key とか)必要な依存物が取ってくるのも大変でした。
(H8 クロスコンパイラはネット上の情報から作ることはできましたが)

で、CentOS の古いバージョンなら取ってこれるんじゃないとアドバイスもらったところ、本家のパッケージは EoL で取ってこれなかったのですが、アーカイブがあってそこからすんなりインストールすることができました。

と、いうわけで以下。そのときの手順をまとめます。

完成形 Dockerfile
その前に先に完成した Dockerfile を載せておきます。
以下、説明の参考にしてください。



CentOS 5 で gcc 3.4.6 と pyenv を使う
Python 3 系も使いたかったので pyenv のインストールまでしました。
GCC のインストールよりもこっちが大変だった。
では、見ていきましょう。

COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
まず、CentOS 5 は既に EoL なのでリポジトリファイルを編集して、アーカイブされたパッケージを参照するように変更します。

ネットの力を借りて、それっぽく動くようにはなりましたが、「libselinux」でエラーになってしまいました。
↑の変更に加えて「libselinux」の変更も必要みたいだったので、↓を参考に設定。
無事に yum update できるようになりました。
gcc 3.4.6 のインストール
RUN yum update -y && \
    yum -y install epel-release && \
    yum install -y make gcc g++ nkf wget perl gettext libffi-devel \
        compat-gcc-34-3.4.6-4.1.x86_64 compat-gcc-34-c++-3.4.6-4.1.x86_64
gcc 3.4.6 のインストールはこのレイヤーで終わりです。
ポイントは↑のレイヤーで対応した、パッケージ参照先の変更だけです。

アーカイブされたパッケージ群から gcc と g++ をインストールしています。
pyenv のインストール
↑の方法では Python 3 系をインストールできなかったので pyenv 使って 3 系を使えるようにしました。
というわけで、pyenv のためにいろいろソースビルドしました。
以下の記事を参考にして、ソースビルド・インストールができました!ありがとうございます。

最後に
過去のものをビルドして使うのは大変だなと学びました。
そして、そういったものを Docker image にしておくことで少しでも苦労から開放されるなーと思いました。
Docker 素晴らしい。

今回作ったイメージは DockerHub にアップしてあります。
では。











0 件のコメント:

コメントを投稿