SML#のebuild書きました、もしくはmultilibとの戦い

流行ってるらしいので。

https://github.com/unarist/unarist-overlay/blob/master/dev-lang/smlsharp/smlsharp-2.0.0.ebuild

licenseとかpatchとかちらばってるのでlayman使うといいかも。

作った

また,SML#は現時点での最新版であるLLVM3.4 32bitを必要としますので,多くのディストリビューションで自力ビルドが必要かと思います.

http://d.hatena.ne.jp/keita44_f4/20140412/1397279451

Gentooだからそんなの余裕ですね^^と思っていたんですが、見事にLLVM 32bitではまりました。

  • そもそもmultilibが面倒だった
    • 時代はemul-linuxじゃなくてgx86-multilibらしい。というかLLVMは後者でないと無理
    • 今emul-linux使ってる人
      • emul-linuxにabi_x86_32付けるとメタパッケージみたいになるので、入れ替えることは可能
      • ただし実際の移行は依存関係があれで面倒でした。subslotの件と似てる
    • emul-linux使ってないひと
      • 上のebuildならautounmaskで解決できるはず
      • もしくはWiki通りにmake.confにUSE_X86=32で全パッケージに指定
  • ebuild
    • DEPENDに[abi_x86_32]つけて、toolchain切り替えるだけなので簡単
    • 基本的にはmultilib_toolchain_setupがconfigureのパラメータをうまく設定してくれます
    • llvm[abi_x86_32]はx86用のllvm-configを違う名前でインストールするのでconfigureの修正が必要
    • 今のところ{triple}-llvm-configとllvm-config.x86にインストールされるが、前者は「# Backwards compat, will be happily removed someday.」とか書いてあったので、llvm-config.x86 llvm-configの順に検索させるようにした*1

とはいえ調査や環境の調整に手間取っただけで、ebuild書くの自体は簡単でいいですね。ビルドバッチみたいなものだから応用も効くし。

emul-linuxからgx86-multilibへの移行

stable.use.maskじゃ駄目なの? -> 理由はわかっていないけどuse.maskで。
emul-linux-*消さない方法ないの? -> 依存関係無視していいから一度消した方が多分簡単。

  1. use.maskに-abi_x86_32を書く
  2. 一旦emul-linuxを全部emerge -Cで消す
  3. そのままuDNすると[-abi_x86_32]が優先されるのかコンフリクトの嵐なので、package.useでemul-linuxにだけabi_x86_32付けてしまう
  4. emerge --autounmask-write -uDN worldを繰り返して必要なUSEフラグや~外しをする
  5. ここまで来るとコンフリクトも4つぐらいにまで減ったので、指摘されたパッケージを適当にemergeしていく

autounmaskがあるとはいえ、なるべくそういった変更を避けた提案をしようとしてコンフリクトするケースが多いみたい。というかそりゃそうだ。
なのでバージョンを明示してあげると、USEフラグ変えろ!キーワード変えろ!となり話が進む。

ところで

SML#書いたことないです。

*1:x86環境だとllvm-config.x86にならない気がしたので。修正はconfigure.acで行い、configureを再生成してパッチに