macOS Big Sur で plenv を使って Perl 5.32.0 をインストールする

# Big Sur で Perl がインストールできない

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Big Sur に Perl 5.32.0 入れようとすると Unexpected product version 11.0 とか言われて入らないのしぶいな。</p>&mdash; nipotan (谷口公一) (@nipotan) <a href="https://twitter.com/nipotan/status/1339013242320867328?ref_src=twsrc%5Etfw">December 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Configure (インストールスクリプト) で darwin のバージョンが `10.*` かどうかをチェックしているようで、`11.x` な Big Sur を入れようとするとインストールが止まる。

# 解決方法

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Configueのエラーのようなので、このPRのパッチをいれるとビルド出来るかなと思います<a href="https://t.co/8rWoZBxBya">https://t.co/8rWoZBxBya</a></p>&mdash; 八雲アナグラ (@AnaTofuZ) <a href="https://twitter.com/AnaTofuZ/status/1339014441740865537?ref_src=twsrc%5Etfw">December 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

八雲アナグラさんより教えていただきました。

# pull request の patch

GitHub の pull request の差分を patch ファイルとして手に入れる場合は、pull request の URL の末尾に `.patch` を付けてアクセスすると patch ファイルへとリダイレクトされるので、https://github.com/Perl/perl5/pull/17946 の patch ファイルは、コマンドラインから

```
$ curl -LO https://github.com/Perl/perl5/pull/17946.patch
```

と `curl` に `-L` オプションをつけると取得できる。

# patch をあててインストール

展開して patch をあてたら、いつものおまじない

```
$ tar zxvf perl-5.32.0.tar.gz
$ cd perl-5.32.0
$ patch -p1 < 17946.patch
$ sh Configure -de && make && make test && sudo make install
```

こんな感じでイケるよう。

# plenv で入れたい

plenv で install したいので、自動で tarball を取得し、自動でいつものおまじないが行われるまでの間に介入して patch をあてたいが、介入が許されない。

ただ plenv の場合、一度取得した tarball があればそれを再利用する。なので、**わざと一度失敗して**その後再利用される tarball を展開して patch をあてて固めて install するとかならいけそうと睨んだ。


# やってみる

## plenv install を一度失敗してみる

```
$ plenv install 5.32.0 --as 5.32
```

`Unexpected product version 11.0` で怒られて**予定通り**失敗。

## 保存された tarball を展開し patch をあてて固める

```
$ cd ~/.plenv/cache
$ tar zxvf perl-5.32.0.tar.gz
$ cd perl-5.32.0
```

ここはさっき patch 当てたのと同じ手順

```
$ curl -LO https://github.com/Perl/perl5/pull/17946.patch
$ patch -p1 < 17946.patch
```

そして `~/.plenv/cache` の下で tarball に固める

```
$ cd ..
$ rm -f perl-5.32.0.tar.gz
$ tar zcvf perl-5.32.0.tar.gz perl-5.32.0
$ cd ~
```

これで、`perl-5.32.0.tar.gz` は patch があてられたものになってる。
そして、そうとは知らない plenv は騙されて (?)、これを再利用してインストールしてくれるだろう。

## plenv install 今度こそ成功を願う

```
$ plenv install 5.32.0 --as 5.32
```

がんばえぱーるえんゔ

## 確認

```
$ plenv versions
* system (set by /Users/nipotan/.plenv/version)
  5.32
$ plenv global 5.32
$ perl -v

This is perl 5, version 32, subversion 0 (v5.32.0) built for darwin-2level

Copyright 1987-2020, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
```

はい。
やったね。

めでたしめでたし。

# perlbrew は？

perlbrew の場合は対応済みで、install 時に自動的に `hints/darwin.sh` に対し上記 patch をあてた上で install が実行されますので、普通にインストールできます。

```
$ perlbrew install perl-5.32.0 --as perl-5.32
$ perlbrew list
  perl-5.32
$ perlbrew switch perl-5.32
$ perl -v

This is perl 5, version 32, subversion 0 (v5.32.0) built for darwin-2level

Copyright 1987-2020, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
```