Mac OSX 10.9 MavericksにChef(knife-solo)をインストールするとエラー(解決)
Chefやろう!Chef覚えよう!と思って早速macにインストールするもエラーが発生したので、そのトラブルシューティング記録です。
(ちなみにChefはシェフと読むわけですが、今までずっとチーフ(Chief)だと思ってました・・・)
Chefインストール
公式に従って以下のコマンドを叩きます。
curl -L https://www.opscode.com/chef/install.sh | sudo bash
ここまではOKです。installer: The install was successful.が出て無事終了。
knife-soloインストールとエラー
次のコマンドを叩くと・・・
sudo gem install knife-solo
エラー
Fetching: mixlib-config-2.1.0.gem (100%)
Successfully installed mixlib-config-2.1.0
Fetching: mixlib-cli-1.4.0.gem (100%)
Successfully installed mixlib-cli-1.4.0
Fetching: mixlib-log-1.6.0.gem (100%)
Successfully installed mixlib-log-1.6.0
Fetching: mixlib-authentication-1.3.0.gem (100%)
Successfully installed mixlib-authentication-1.3.0
Fetching: mixlib-shellout-1.4.0.gem (100%)
Successfully installed mixlib-shellout-1.4.0
Fetching: systemu-2.5.2.gem (100%)
Successfully installed systemu-2.5.2
Fetching: yajl-ruby-1.2.0.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing knife-solo:
ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
creating Makefile
make "DESTDIR="
compiling yajl.c
compiling yajl_alloc.c
compiling yajl_buf.c
compiling yajl_encode.c
compiling yajl_ext.c
compiling yajl_gen.c
yajl_gen.c:295:5: warning: implicit conversion from enumeration type 'yajl_gen_state' to different enumeration type 'yajl_gen_status' [-Wenum-conversion]
DECREMENT_DEPTH;
^~~~~~~~~~~~~~~
yajl_gen.c:181:48: note: expanded from macro 'DECREMENT_DEPTH'
if (--(g->depth) >= YAJL_MAX_DEPTH) return yajl_gen_error;
~~~~~~ ^~~~~~~~~~~~~~
yajl_gen.c:321:5: warning: implicit conversion from enumeration type 'yajl_gen_state' to different enumeration type 'yajl_gen_status' [-Wenum-conversion]
DECREMENT_DEPTH;
^~~~~~~~~~~~~~~
yajl_gen.c:181:48: note: expanded from macro 'DECREMENT_DEPTH'
if (--(g->depth) >= YAJL_MAX_DEPTH) return yajl_gen_error;
~~~~~~ ^~~~~~~~~~~~~~
2 warnings generated.
compiling yajl_lex.c
compiling yajl_parser.c
compiling yajl_version.c
linking shared-object yajl/yajl.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [yajl.bundle] Error 1
Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/yajl-ruby-1.2.0 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/yajl-ruby-1.2.0/ext/yajl/gem_make.out
意味が分かりませんでしたが、気になる点がいくつか。
gemなのに.cとか。あと、error吐いてるコマンドがclangとか。gccじゃないの?
トラブルシューティング
少し調べるとこんな投稿が見つかりました。
OSX Mavericks にしたら gdb と gcc が消えた時の対処法
Mavericksからはclangに変わったようです。だから普通は出ないはずのwarningが出たり、unknown argumentが出たりするのだと思います。
ここでclangではなくgccに差し替えれば上手く行くと思ったのですが、残念ながら失敗に終わりました。brewでgcc-4.9を入れて/usr/bin/gcc(実態はclang)をgcc-4.9に差し替えて上手く行くはずが、なぜかgem installで使われるgccは相変わらずclangでした。
もしかしてスクリプト内部でgccじゃなくてclang直接使ってるのかも知れません。それでエラー吐いてるとかいう状況だと悲しいですが・・・。今思えば/usr/bin/clangをgcc-4.9に差し替える方法もありだったのかな?と思います。
とにかくgccインストール作戦は上手く行かなかったので方針を変えました。curl経由じゃなくて、普通にgem installしようと。
# curl経由で入れたchefを一旦削除
sudo gem uninstall chef
# curlではなく普通に入れる
sudo gem install chef
sudo gem install knife-solo
これで正常に入りました。
curl版と比べるといくつかインストールされていないものがありますが、まあ大丈夫でしょう。適当にknife使ってVagrantに適当にアプリ入れたりサービス切ったりしましたが、普通に使えていました。
以上です。