ひとことで言うと、MacPorts から Homebrew へ移行したときは Ruby 再インストールしましょう、ということです。
- MacPorts から Homebrew に移行後、json gem をインストールしようとしたら
No such file or directory: /opt/local/bin/gmkdir
などと言われて失敗。 -
/opt/local
は MacPorts がいろいろインストールするとこなので、いまの環境には存在してない。なんでそんなとこ見てるの? - json gem の
json-1.7.3/ext/json/ext/parser/Makefile
をみるとMAKEDIRS = /opt/local/bin/gmkdir -p
と記述されてる。 - この Makefile は同じディレクトリの extconf.rb で生成されたもの。生成には mkmf ライブラリによって追加される
Kernel#create_makefile
を使用している。 - mkmf のソースをみてみると
create_makefile -> configuration -> config_string
と呼ばれ、結局RbConfig::CONFIG["MAKEDIRS"]
をみていることがわかる。 - RbConfig は rbconfig ライブラリで追加される。このソースを見てみると
CONFIG["MAKEDIRS"] = "/opt/local/gmkdir -p"
とハードコードされてる! - これはたぶん Ruby のインストール時に環境に応じて生成するんだろうと思って Ruby 再インストール。
- 再度 rbconfig.rb 見てみると
CONFIG["MAKEDIRS"] = "mkdir -p"
になってる! - gem install json 再実行したら成功!