さて、もう開催されてからだいぶ経ってしまったが先日 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

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

続いて
$ 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-update と anyenv-git 。
anyenv-update は anyenv 経由でインストールしたアプリケーションを一括でアップデートできるようにするプラグイン、anyenv-git は anyenv 経由でインストールしたアプリケーションの中で git
コマンドを使えるようにするプラグインだ。
まずは anyenv-update をインストール。


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


これらのインストールはすぐに終わる。
終わったら最期に確認のコマンドを入れてみる。

anyenv
を入力したところanyenv から **env のインストール
さて、 anyenv がインストールできたら早速それぞれの **env をインストールしていこう。
rbenv
まず最初に rbenv をインストールする。rbenv は ruby のバージョンの切り替えを管理できる。

rbenv
をインストールするanyenv からインストールするときのコマンドは
$ anyenv install *****
なので、rbenv ならば
$ anyenv install rbenv
となる。return
でインストールが始まる。

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

rbenv versions
を入力してみる
command not found
て怒られたので、書いてあるとおり exec $SHELL -l
と入力Please reload your profile (exec $SHELL -l) or open a new session.
と書いてあるので、rbenv がインストールできたらプロファイルをリロードするか、ターミナルの新しいセッションを開始する必要がある。
これで無事 rbenv が動く。

ここで
* system
と表示されているのは Mac に最初からインストールされている ruby が選択されている状態、ということ。
まずはこれで。
phpenv
では続いて phpenv をインストール。手順は rbenv と変わらない。






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

ここまではスムーズに進められる。
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 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
がインストールできた
.zshrc
を編集する
.zshrc
を開いたところ
bison
の PATH を追記
:wq
で上書き保存
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 re2c
で re2c
を確認して、コマンド 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は指定したよね?…こりゃわからんわ…
というところで詰んだ、という長いおはなし
ここまで読んでくださった方、お付き合いいただいて本当にありがとうございます(笑
いやー、疲れました。
エセエンジニアの僕としてはググってわからないのはツラい…。
ググった記事一覧
これらを調べるのに参照した記事は以下。
- Macでphpenvによるphpのインストールにハマりにハマった件 – Qiita
- Macのphpenv(php-build)でビルドしようとしたら出るエラーと解決まとめ – Qiita
- Mac(Mojave)にphpenvでphpをinstallするまでの道のり | エンジニアノート-Engineer Note-
- macOS Mojaveでphpenv installを使ってphpが入らない問題について · polidog lab++
- Install failed, “zlib not available” on macOS Mojave · Issue #1219 · pyenv/pyenv
- Versions — Homebrew Documentation
- configure: error: Cannot find OpenSSL’s <evp.h> – Qiita
- macOS 10.15 Catalina 上で phpenv を使って PHP 5.6 を build するのにものすごく苦労した話 – Qiita
- alpineでPHP-intlインストール時にエラーが起きる原因 | ハックノート
- composer install で the requested PHP extension intl is missing from your system と言われる解決方法 in Docker image – Qiita
- mac の phpenv で php 7.1.9 をインストールするメモ – Qiita
- phpenv/phpenv: Simple PHP version management
- MacOS に anyenv + phpenv で PHP 7.4.1 をインストールする – Qiita
- ひとりごと:[PHP] tidy のインストールにはまった – livedoor Blog(ブログ)
- ios – the file tidy.h and buffio.h not found – Stack Overflow
- buffio.h
- HTML Tidy: buffio.h Source File
- HTML Tidy: buffio.h File Reference
- HTML Tidy: buffio.h Source File
- HTML Tidy: About HTML Tidy
- HTML Tidy – Wikipedia
- HTML Tidy
- tidy-html5/src at release/5.6 · htacg/tidy-html5
- phpenv/php-build の小ネタ集 – Qiita
- anyenv+phpenv+php-buildでphp管理 – Qiita
- tidy-html5 — Homebrew Formulae
- tidy-html5/include at next · htacg/tidy-html5
ありがとうございました…。
さて、でどうする?
というところだが、あれこれ調べている途中で brew-php-switcher というのをみつけた。
Homebrew 経由でインストールできて、phpenv 同様に PHP のバージョンを切り替えられるというもの。
まだ詳しくは調べられていないのだが、プロジェクトごとに PHP のバージョンを切り替えるのに使えそう。
まずは色々調べてみることにする。詳しくは次の記事で!(笑