TL;DR
$cd ~/.plenv/plugins/perl-build; git pull
PerlのBigSur問題
plenvはPerlのソースコードをローカルに持ってきて、ビルドを行う仕組みになっています。 BigSur以前のmacOSでは正常にビルドができましたが、BigSurでは次のようなエラーが出てしまいビルド出来ないケースがあります。
Which of these apply, if any? [darwin] *** Unexpected product version 11.0. *** *** Try running sw_vers and see what its ProductVersion says. Installation failure: sh Configure -Dprefix=/Users/anatofuz/.plenv/versions/debug-32 -de -Dversiononly -DDEBUGGING=-g -Doptimize=-O0 -A'eval:scriptdir=/Users/anatofuz/.plenv/versions/debug-32/bin' at /Users/anatofuz/.plenv/plugins/perl-build/bin/perl-build line 12763. ABORT
この問題は、PerlのビルドスクリプトのConfiguer
でmacOSのバージョンが決め打ちされている為です。
ほどなくしてパッチが作成され、Perl5本体には取り込まれていますが、5.32などの過去のバージョンには当然取り込まれていません。
Devel::PatchPerl
過去のリリースにもパッチを当てたい場合、手動でやるのはめんどうなのでよしなにパッチを当ててくれるDevel::PatchPerlというライブラリがあります。
Devel::PatchPerlはpatch_sourceというAPIが提供されていて、これを叩くとバージョンごとによしなにパッチを当ててくれます。
パッチを当てるPerlのバージョンと内容は、この様にハッシュリファレンスで、Perlのバージョンを正規表現で、あてるパッチをサブルーチンで指定します。
{ perl => [ qr/^5\.004_05$/, qr/^5\.005(?:_0[1-4])?$/, qr/^5\.6\.[01]$/, ], subs => [ [ \&_patch_configure ], [ \&_patch_makedepend_lc ], ], },
今回のBigsurの問題はhints/darwin.sh
ファイルの問題なのですが、実は数日前のcommitで、すべてのバージョンに対してhintsのパッチを当てるようになっていました。
さらによく見てみると、hintsに関してはパッチ形式ではなく、hintsファイルをbase64でPerlモジュールに直接埋め込んでおり、それに差し替えるという方法でした。(macOSのパッチ)
埋め込まれているこのhintsをbase64で戻したところ、上記のPerl5に取り込まれたパッチがあたっている状態でした。
この変更があるDevel::PatchPerlのバージョンは2.04です。
Perl-Build
plenvがデフォルトで呼び出す(であろう)PerlのビルドツールはPerl-Buildです。 Perl-Buildが内部的にConfigureとかを呼び出すようになっています。
実はデフォルトでPerl-BuildはDevel::PatchPerlを当てるようになっています
さらにPerl-Buildがデフォルトで使うDevel::PatchPerlのバージョンは、数日前のcommitで最新版に変更されています。
またPerl-Buildの中身をplenvはfatpack(Perlモジュールを1枚スクリプトに圧縮)したものを使うようになっています。 Devel::PatchPerlの内容も現在のPerl-Buildのfatpackされたperl-buildに含まれている為、pullして更新すると最新のDevel::PatchPerlを使うことになり、問題が解決されます。
ということで
plenvを使っている皆さんは今すぐ $cd ~/.plenv/plugins/perl-build; git pull
しましょう!!!!!