はじめに
世の中にはSpackというパッケージマネージャーがありまして
- OSがCentOS7等でgcc等のパッケージが古め
- ユーザー権限だけで最新のgccやclangを入れて使いたい
というような人には魅力的な選択肢です。
ただやっぱり落とし穴はあります。
ここではSpack初心者の私が嵌った落とし穴を紹介していこうと思います。
clangがみつからない!
最新版のgccとclangが欲しかったのでした。最小限のセットアップが済んでいれば
$ spack install gcc
10分かそこらの時間はかかりますが、依存するパッケージを含めてgcc@9.2.0
が入ってくれます。いやこれは楽チン。この要領でclangも:
$ spack install clang
==> Error: Package 'clang' not found.
残念無念、標準のリポジトリにclangは入っていないのでしょうか。
実は名前が違うだけです。
$ spack install llvm
...
$ spack load llvm
これで(ビルドが問題なく通れば)最新のclang/clang++が使えるようになります。
初心者には厳しいですねこれ。
でもビルドが通らない
llvm
のインストール中に、perl-data-dumper
というパッケージのビルドで必ずコケてしまうようになってしまいました。
なにをやったらそんなことになってしまったのか、順を追ってみます(原因が判明して直ってしまったので、再現実験と詳細な画面コピペはまた後日)。
CentOS7に入っているgccはversion 4.8.5です。この状態で
$ spack install gcc
とすることでgcc@9.2.0
が依存パッケージを含めて入ります。これをこのまま使っても別によいのですが、これで入ったのはgcc@4.8.5でビルドされたgcc@9.2.0
とgcc@4.8.5でビルドされた依存パッケージ
です。どうせなら全部gcc@9.2.0
でコンパイルし直したほうが気持ちいいですよね。
$ spack load gcc
$ spack compiler find
$ spack install gcc
これで目出度くgcc@9.2.0でビルドされたgcc@9.2.0
とgcc@9.2.0でビルドされた依存パッケージ
が入ります。
$ spack find -l
とすれば全てのパッケージが綺麗に重複して入っていることがわかります。gcc@4.8.5
でビルドされた方を残しておく理由もないだろうとspack uninstall
で全部消してしまいました。新しいコンパイラパスをspackに登録しておくため
$ spack compiler remove gcc@9.2.0
$ sparc load gcc
$ spack compiler find
としました。gccの方は準備できたということで次はclangなのですが、依存パッケージのperl-data-dumper
のビルドが通らない。
$ spack install perl-data-dumper
が必ずコケてしまいます。どうやら/tmp
以下でビルドしているようなのでそこを見に行くとMakefile
があってその中身に
CC = `gcc@4.8.5でビルドしたgcc@9.2.0のパス`/gcc
などと書かれています。gcc@4.8.5でビルドしたgcc@9.2.0
はとっくに削除されているので、そりゃmakeすれば「そんなファイルない」で即死するわ。問題は
- 誰がどうやってこんなMakefileを生成できたのか
- 削除済みのコンパイラのパスなんて文字列を何処から拾ってこれたのか
ちなみに.spack/linux/compilers.yaml
を調べても古いパスは残っていませんでした。
#何が問題だったか
どうやら一部のperl系のパッケージはビルド時に
$ perl Makefile.PL
のようにしてMakefile
を作っているようです。ただしこのperl
もspackで入れたものになります。なのでこのperl
はgcc@9.2.0
でコンパルされたものということになります。しかもどうやら、
このperl
は自分がgcc@4.8.5でビルドされたgcc@9.2.0
でビルドされたということを覚えているようなのです!!
そして自身をコンパイルしたgccのパスを件のMakefile
に書いてしまったらしい。いや君をコンパイルしたgcc@9.2.0%gcc@4.8.5
1ではなくspackに登録されてるgcc@9.2.0%gcc@9.2.0
を使わなきゃ駄目でしょうに。
といわけで対処療法、というかこのやり方で治ったから上述のような推論にいたったわけですが、一度依存パッケージを含めてperl%gcc@9.2.0%gcc@4.8.5
をアンインストール、perl@gcc@9.2.0%gcc@9.2.0
を再インストールすることでperl-data-dumper
のビルドも成功するようになりました。
実はまだllvm@9.0.0
のビルドを通し切ってはいません。ただ、下手に古いコンパイラの削除とかをするとドツボに嵌まるということがよくわかりました。上手くいきますように🙏
-
どうもspackでは
@
後置でバージョン番号、%
後置でビルドしたコンパイラのような表記をするみたいです。 ↩