【番外編】新しい Mac を手に入れたらやること一式【続々ターミナル編・phpenvのインストールで詰んだ の巻】

さて、もう開催されてからだいぶ経ってしまったが先日 Apple 恒例の WWDC があった。なにか興味を引く発表はあっただろうか?「Apple Silicon」が発表になったからって、泣いたりしないんだからね…!
それよりも、これで新しい OS が出るとなると、次回こういった環境設定をするのってまたイチからになっちゃうの…ツライ( ꒪⌓꒪)

前の記事の公開からちょっと時間が経ってしまったのには理由があって、この記事のタイトルにもあるとおり設定にハマってしまったから…。
今回の記事は『やること一式』とすると必要ない記事になってしまうのだが、何がどうしたから『使うのを止めたのか』の備忘録として残しておく。
一連の記事を読みながら新しい Mac の設定を進めている人がいたら、この記事は読み飛ばしてください(笑

「**env」の管理

Web の開発をしているといろいろ面倒なことがあって(笑)、例えば環境によって『使うバージョンが違う』ものを自分の Mac の中で共存させておかないといけないようなことがある。

例えばAというプロジェクトは結構長く管理していて、PHP のバージョンは 5.6 のままでnode のバージョンも 8.9.4、別のBというプロジェクトは去年始まったので PHP のバージョンは7.3、node のバージョンは10.15.0でとか、これから開発を始めるなら PHP のバージョンは7.4で node のバージョンはいまの LTS なら12.18.1かなーとか。もちろん、継続して運用しているようなサイトであれば、それぞれの環境をアップデートしてエラーや表示の崩れなどがないか確認したりということも必須。

anyenv

こういうプロジェクトごとに違っているプログラムのバージョンの管理をひとまとめにして、簡単に切り替えを可能にするアプリケーションがある。

それが「anyenv」だ。

先ほどの例で言えば、PHP のバージョンの管理は「phpenv」、node.js のバージョンの管理は「nodenv」で、という具合に、「anyenv」経由でそれぞれのプログラムのバージョン管理するアプリケーションをインストールし、一括で管理するというもの。最初にインストールしておけばその後の管理がとても楽になるし、新しいバージョンに対応させるのも簡単だったので、だいぶ長くこの環境を使っていた。

anyenv のインストール

anyenv」のインストールの手順は anyenv のリンク先に詳しく書いてあるので迷うことはない。この手順どおりに進めていこう。

$ brew install anyenv
Homebrew 経由で anyenv をインストール

以前は git clone したりとかだったはずなので、このあたりも便利になってる…!Homebrew がインストールされていたらこれだけで済む。

anyenv がインストールされた

続いて

$ anyenv init

と入力する。

続いて「anyenv init
# Load anyenv automatically by adding
# the following to ~/.zshrc

eval '$(anyenv init -)"

と表示されるので、それに従う。

anyenv init したらこのように表示される
エディタで開いて編集
Vim.zshrc を開いて編集する

.zshrc ファイルに追記をしたら、マニュアルに従って

3. Close your Terminal window and open a new one so your changes take effect.

ターミナルのウィンドウを一度閉じて再度開く。

このあとで何度も出てくるように、.zshrc ファイルに追記をしたときは

$ source ~/.zshrc

を入力して .zshrc ファイルを再読み込みすれば大丈夫、なはず。まぁここはマニュアルどおりにウィンドウを一度閉じて再度開いておこう。

.zshrc を編集したら iTerm2 を再起動

これもマニュアルのとおりに

ANYENV_DEFINITION_ROOT(/Users/riywo/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
> anyenv install --init

と表示されるので、指定のコマンドを入力する。

コマンドを入力
return すると「ないけど作る?」と聞かれる
作るので「y」と入力
return すると anyenv-install がインストールされる

anyenv のプラグインのインストール

anyenv がインストールできたら、anyenv を便利にするプラグインもインストールしておこう。

それは anyenv-updateanyenv-git
anyenv-updateanyenv 経由でインストールしたアプリケーションを一括でアップデートできるようにするプラグイン、anyenv-gitanyenv 経由でインストールしたアプリケーションの中で git コマンドを使えるようにするプラグインだ。

まずは anyenv-update をインストール。

anyenv-update をインストール
anyenv-update がインストールできた

続いて anyenv-git をインストール。

anyenv-git をインストール
anyenv-git がインストールできた

これらのインストールはすぐに終わる。

終わったら最期に確認のコマンドを入れてみる。

コマンド anyenv を入力したところ

anyenv から **env のインストール

さて、 anyenv がインストールできたら早速それぞれの **env をインストールしていこう。

rbenv

まず最初に rbenv をインストールする。rbenv は ruby のバージョンの切り替えを管理できる。

rbenv をインストールする

anyenv からインストールするときのコマンドは

$ anyenv install *****

なので、rbenv ならば

$ anyenv install rbenv

となる。
return でインストールが始まる。

これで rbenv がインストールできた

ここでコマンドを入力してみる。

rbenv versions を入力してみる
command not found て怒られたので、書いてあるとおり exec $SHELL -l と入力
Please reload your profile (exec $SHELL -l) or open a new session.

と書いてあるので、rbenv がインストールできたらプロファイルをリロードするか、ターミナルの新しいセッションを開始する必要がある。

これで無事 rbenv が動く。

rbenv が動いた

ここで

* system

と表示されているのは Mac に最初からインストールされている ruby が選択されている状態、ということ。
まずはこれで。

phpenv

では続いて phpenv をインストール。手順は rbenv と変わらない。

インストールのコマンドを入力
インストールができた

プロファイルをリロード
リロードしたらインストールの確認
デフォルトのバージョンが読まれているのがわかる
インストールできるバージョンのリストを表示

phpenv からインストールできる php のバージョンをリスト表示するコマンドは

$ phpenv install -l
phpenv からインストールできる php のバージョンがリスト表示される

ここまではスムーズに進められる。

phpenv で php 5.6.40 をインストール

さて、問題はここから(笑

以前の設定のときもここは鬼門で、phpenv をインストールしてから別途インストールしなければいけないものが多数あって結構手間取った覚えがあったので、「まぁまたあれこれエラーを解消したらいけるんだろう」くらいに考えていた。

まずは順を追って。

もともと利用していた Mac に phpenv でインストールしていた PHP のバージョンは

5.3.3
5.4.9
5.6.9
5.6.32
7.0.27
7.1.13
7.2.1

の7バージョン。

いまインストールされている PHP のバージョンを一覧表示するコマンドは

$ phpenv versions

となる。
これと同様に複数のバージョンの PHP をインストールしていくわけだが、いま(2020年6月)現在の最新の PHP のバージョンが 7.4.7 であるということもあって、5.5 以前のバージョンはもう必要性を感じない。
いま現在 PHP 5.x の環境はもう残り少なく、今後もどんどん減っていくのでその環境が最低限再現できれば充分、と考えられる。どうしても必要になるとすれば「まだ PHP 5.x で運用されているサイトを新たに管理するようになって、まず現状をローカルで再現したい」というケースくらいなので、PHP 5.x の環境は PHP 5.6.x がひとつあればいいだろう。

PHP 5.x 系の最新(最終)バージョンは 5.6.40。ちなみに、すでに PHP 7.1 まではセキュリティサポート含め公式サポートは終了している。このバージョン 5.6.40 は、サポートが終了していたにもかかわらずセキュリティ対応されたPHP 5.x 系の最終バージョンだ。PHP 5.x 系をインストールするならこれだけあればいいだろう。PHP 7.x 系も 7.1 までは公式サポートが終了しているので 7.2.x 以降がインストールできれば充分だ。

ということでインストール開始。まずは

phpenv で php 5.6.0 をインストール
$ phpenv install 5.6.0
You need autoconf version 2.59 or newer installed to build PHP from Git. のエラーが
You need autoconf version 2.59 or newer installed to build PHP from Git.

と表示されてビルドエラーになる。ということで autoconf をインストール。

1. 「autoconf」をインストール

brew install autoconf をコピペ
autoconf をインストール

autoconf をインストールしたので再度挑戦。

いろいろとエラーが…

ここで以前の環境設定のときのエラー解消方法を参考にすることにした。必要なパッケージ(Homenbrew で言うところのフォーミュラ)をひととおりインストールしてみる。
まず最初に

$ brew tap homebrew/versions
$ brew search bison
$ brew install bison@2.7

をやってみる。

2. 「bison@2.7」をインストール

brew tap homebrew/versions をコピペ
homebrew/versions was deprecated と怒られた…
$ brew tap homebrew/versions

と入力してみたところ、

homebrew/versions was deprecated.

と怒られてしまったので、改めて

$ brew tap homebrew/core

と入力。

アップデートできた。

アップデートできたので、続けて

$ brew search bison
brew search bison と入力

と入力。これでインストールできるバージョンを確認できる。

bison で検索
bison     bison@2.7

と表示されるので、 bison@2.7 をインストールする。

bison@2.7 をインストール
bison@2.7 がインストールできた
Vim で .zshrc を編集する
Vim で .zshrc を開いたところ

bison の PATH を追記
:wq で上書き保存
Vim を閉じたら source ~/.zshrc で設定を読み込ませる

これで bison@2.7 の PATH が設定された。ここで Vim を開いて設定しているが、これはコメント( # phpenv bison)を一緒に追記したかったからで、それを気にしなければ出力されているように

$ echo 'export PATH="/usr/local/opt/bison@2.7/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc

でもちろん問題ない。

続いても以前の環境設定のときのエラー解消方法に従って re2c をインストールする。

3. 「re2c」をインストール

brew search re2cre2c を確認して、コマンド brew install re2c でインストール
re2c がインストールできた

4. 「libxml2」をインストール

このあたりからスクショを撮り忘れているところが多数あるので(笑)、その辺は省略で…。このあたりからもうだいぶ怪しい。

$ brew install libxml2

リンクを更新

$ brew link --force libxml2

 .zshrcでpathを通す

$ echo 'export PATH="/usr/local/opt/libxml2/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc

5. 「mcrypt」をインストール

$ brew install mcrypt

6. 「icu4c」をインストール

$ brew instal icu4c

リンクを更新

$ brew link icu4c --force

.zshrcでpathを通す

$ echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.zshrc
$ echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc

7. 「automake」をインストール

$ brew install automake

8.「jpeglib.h」 インストール

$ brew install jpeg

9.「png.h」 インストール

$ brew install libpng

ここまでで以前の環境設定のときのエラー解消方法はひととおり済ませられた。

さあこれで php 5.6.40 をインストールできるのか?

やっぱりビルドエラーが出る(笑

エラーが出るとき、基本的にそのエラーに対する「エラーメッセージ」が表示される。そのエラーを解消していけば最終的に問題なく動作する、はず。

エラーメッセージが表示されたらそのエラーメッセージの文言でググって解決方法を探す、というのを繰り返していくことになる。

まだ出るエラー「Cannot find libz」

configure: error: Cannot find libz

と表示される。「libz」ってなに?ということでこのエラー文でググる。
ヒットしたこちらの記事の該当部分に

$ brew install bison@2.7 re2c zlib bzip2 curl libiconv libedit mcrypt

の記述がある。
既にインストール済みのフォーミュラも含まれているので、まだインストールしていないものだけを選んでインストール。

$ brew install zlib bzip2 curl libiconv libedit

続けて、やはりこちらの記事に続けて記述してある

$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/64555220bfbf4a25598523c2e4d3a232560eaad7/Formula/openssl.rb

で OpenSSL 1.0.2t をインストール。こちらの記事では「これでもまだエラーが出る」と書いてある。もうなんやねん(笑
最終的に以下のコマンドでインストールできたとのことなので試してみる。

$ YACC=$(brew --prefix bison@2.7)/bin/bison \
  PHP_RPATHS="/usr/local/Cellar/openssl/1.0.2t/lib /usr/local/opt/zlib/lib /usr/local/opt/bzip2/lib /usr/local/opt/curl/lib  /usr/local/opt/libedit/lib /usr/local/opt/libiconv/lib /usr/local/opt/mcrypt/lib" \
  PHP_BUILD_CONFIGURE_OPTS="--with-openssl=/usr/local/Cellar/openssl/1.0.2t --with-zlib-dir=/usr/local/opt/zlib --with-bz2=/usr/local/opt/bzip2 --with-curl=/usr/local/opt/curl --with-libedit=/usr/local/opt/libedit --with-iconv=/usr/local/opt/libiconv --with-mcrypt=/usr/local/opt/mcrypt --with-tidy" \
  PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 \
  phpenv install -i development 5.6.40

何なんこのコマンド(笑

もうこのあたりでだいぶ挫けているのだが、なんとか先が見えてきたと思ってもうひと踏ん張り。

次のエラー「Cannot find libtidy」

またなんか来たぞ…。ということで、またこのエラーメッセージでググる。

$ configure: error: Cannot find libtidy

これで同様にググってヒットしたこちらの記事から

tidy-html5

というフォーミュラがあることがわかるのでこれをインストール。

$ brew install tidy-html5

これで tidy-html5 がインストールできたらもう一度先ほどの長いコマンドを入力。

$ YACC=$(brew --prefix bison@2.7)/bin/bison \
  PHP_RPATHS="/usr/local/Cellar/openssl/1.0.2t/lib /usr/local/opt/zlib/lib /usr/local/opt/bzip2/lib /usr/local/opt/curl/lib  /usr/local/opt/libedit/lib /usr/local/opt/libiconv/lib /usr/local/opt/mcrypt/lib" \
  PHP_BUILD_CONFIGURE_OPTS="--with-openssl=/usr/local/Cellar/openssl/1.0.2t --with-zlib-dir=/usr/local/opt/zlib --with-bz2=/usr/local/opt/bzip2 --with-curl=/usr/local/opt/curl --with-libedit=/usr/local/opt/libedit --with-iconv=/usr/local/opt/libiconv --with-mcrypt=/usr/local/opt/mcrypt --with-tidy" \
  PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 \
  phpenv install -i development 5.6.40

今度こそどうだ!?

そして「fatal error: ‘buffio.h’ file not found」

これまではすべて

[Preparing]: /var/tmp/php-build/source/5.6.40

の途中でエラーで止まってしまっていたのだが、ここで

[Preparing]: /var/tmp/php-build/source/5.6.40
[Compiling]: /var/tmp/php-build/source/5.6.40

まで進んだのでちょっと期待!したのだが…。
次のエラーでまた止まった。

/var/tmp/php-build/source/5.6.40/ext/tidy/tidy.c:34:10: fatal error: 'buffio.h' file not found

おーい、まだかよ(笑

「fatal error: ‘buffio.h’ file not found」でググる

ところが、今度はあれこれググってみても同様の情報がヒットしない。
そこで先ほどの長いインストールコマンドの中に --with-tidy と書いてあることに気づいたので、ここにも PATH を追記してみる。

$ YACC=$(brew --prefix bison@2.7)/bin/bison \
  PHP_RPATHS="/usr/local/Cellar/openssl/1.0.2t/lib /usr/local/opt/zlib/lib /usr/local/opt/bzip2/lib /usr/local/opt/curl/lib  /usr/local/opt/libedit/lib /usr/local/opt/libiconv/lib /usr/local/opt/mcrypt/lib" \
  PHP_BUILD_CONFIGURE_OPTS="--with-openssl=/usr/local/Cellar/openssl/1.0.2t --with-zlib-dir=/usr/local/opt/zlib --with-bz2=/usr/local/opt/bzip2 --with-curl=/usr/local/opt/curl --with-libedit=/usr/local/opt/libedit --with-iconv=/usr/local/opt/libiconv --with-mcrypt=/usr/local/opt/mcrypt --with-tidyt=/usr/local/opt/tidy-html5" \
  PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 \
  phpenv install -i development 5.6.40

どうだ?…あかんかったかorz

しかもこれまで見たことないエラーも出た(笑

Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/cmake not present or broken
Please reinstall cmake. Sorry :(

いや Sorry 言われましても…。そこで

$ brew reinstall cmake

してから再度 PHP 5.6.40 のインストールをしてみるが結果はやはり失敗。

ここで、そもそも「tidy-html5」と「buffio.h」がよくわかっていないので、こっちでググってみる。

「tidy-html5」と「buffio.h」でググる

あれこれ調べていってみると、「buffio.h」は「tidy-html5」のなかに含まれているファイルらしい。

あれ、じゃあなんで見つからないの…?

実際に自分のローカルマシンの 「tidy-html5」のインストール先を見に行くとたしかにインストールされている。

えーと…?PATHは指定したよね?…こりゃわからんわ…

というところで詰んだ、という長いおはなし

ここまで読んでくださった方、お付き合いいただいて本当にありがとうございます(笑

いやー、疲れました。
エセエンジニアの僕としてはググってわからないのはツラい…。

ググった記事一覧

これらを調べるのに参照した記事は以下。

ありがとうございました…。

さて、でどうする?

というところだが、あれこれ調べている途中で brew-php-switcher というのをみつけた。

Homebrew 経由でインストールできて、phpenv 同様に PHP のバージョンを切り替えられるというもの。
まだ詳しくは調べられていないのだが、プロジェクトごとに PHP のバージョンを切り替えるのに使えそう。

まずは色々調べてみることにする。詳しくは次の記事で!(笑