LoginSignup
5

More than 3 years have passed since last update.

Spackでドツボに嵌った話

Last updated at Posted at 2019-11-27

はじめに

世の中には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.0gcc@4.8.5でビルドされた依存パッケージです。どうせなら全部gcc@9.2.0でコンパイルし直したほうが気持ちいいですよね。

$ spack load gcc
$ spack compiler find
$ spack install gcc

これで目出度くgcc@9.2.0でビルドされたgcc@9.2.0gcc@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で入れたものになります。なのでこのperlgcc@9.2.0でコンパルされたものということになります。しかもどうやら、
このperlは自分がgcc@4.8.5でビルドされたgcc@9.2.0でビルドされたということを覚えているようなのです!!
そして自身をコンパイルしたgccのパスを件のMakefileに書いてしまったらしい。いや君をコンパイルしたgcc@9.2.0%gcc@4.8.51ではなく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のビルドを通し切ってはいません。ただ、下手に古いコンパイラの削除とかをするとドツボに嵌まるということがよくわかりました。上手くいきますように🙏


  1. どうもspackでは@後置でバージョン番号、%後置でビルドしたコンパイラのような表記をするみたいです。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5