AnsibleをMacでpipからインストール出来ないときの1つの解決方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーモン大好き横山です。

今回はMacでansibleをpip installするときに少し嵌った出来事を紹介します。

準備

virtualenvで環境作成します。

$ virtualenv venv
$ . venv/bin/activate
$ pip install -U pip

pycryptoが入らない

んじゃ、さくっと pip install ansible==2.1 で入れていきましょう。

$ pip install ansible==2.1
... (省略) ...

clang -fno-strict-aliasing -fno-common -dynamic -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -fwrapv -Wall -Wstrict-prototypes -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/usr/include/ -I/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/_fastmath.c -o build/temp.macosx-10.11-x86_64-2.7/src/_fastmath.o
  src/_fastmath.c:36:11: fatal error: 'gmp.h' file not found
  # include <gmp.h>
            ^
  1 error generated.
  error: command 'clang' failed with exit status 1

  ----------------------------------------
  Failed building wheel for pycrypto

... (省略) ...  

エラーを見る限り、 gmp のパッケージ関連が足りない、見つけられないって出てます。

gmpを探そう

Homebrewにあるか確認。 Homebrewで見つからないどころか、既にインストール済でした。

$ brew search gmp
gmp ✔
homebrew/versions/gmp4
homebrew/php/php53-gmp
homebrew/php/php54-gmp
homebrew/php/php55-gmp
homebrew/php/php56-gmp
homebrew/php/php70-gmp

$ brew list | grep gmp
gmp

んじゃどこにあるの?ということで、 find コマンドで gmp.h 探して見ましょう。

$ sudo find /usr -name gmp.h
/usr/local/Cellar/gmp/6.0.0a/include/gmp.h
/usr/local/Cellar/gmp/6.1.0/include/gmp.h
/usr/local/include/gmp.h

/usr/local/include/gmp.h あるんじゃん!
正確には /usr/local/include/gmp.h/usr/local/Cellar/gmp/6.1.0/include/gmp.h を見ているリンクファイルでした。
じゃぁ、このディレクトリパスをCFLAGSにインクルードパスとして追加して、実行しよう。

今度は -lgmp がない

では先ほどのディレクトリをCFLAGSにインクルードパスを追加して再度コマンド実行します。

$ env "CFLAGS=-I/usr/local/include" pip install ansible==2.1"
... (省略) ...
    clang -fwrapv -Wall -Wstrict-prototypes -I/usr/local/include -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/usr/include/ -I/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/_fastmath.c -o build/temp.macosx-10.11-x86_64-2.7/src/_fastmath.o
    src/_fastmath.c:1545:20: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
                            else if (result < 0)
                                     ~~~~~~ ^ ~
    src/_fastmath.c:1621:20: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
                            else if (result < 0)
                                     ~~~~~~ ^ ~
    2 warnings generated.
    clang -bundle -undefined dynamic_lookup -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -I/usr/local/include build/temp.macosx-10.11-x86_64-2.7/src/_fastmath.o -lgmp -o build/lib.macosx-10.11-x86_64-2.7/Crypto/PublicKey/_fastmath.so
    ld: library not found for -lgmp
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    error: command 'clang' failed with exit status 1

    ----------------------------------------
... (省略) ...

Warningが出つつも、コンパイルは通ったみたいですが、今度はライブラリ -lgmp が解決出来ないご様子。
では、 libgmp あたりをファイル内で探してみましょう。

$ sudo find /usr -name "libgmp*"
/usr/local/Cellar/gmp/6.0.0a/lib/libgmp.10.dylib
/usr/local/Cellar/gmp/6.0.0a/lib/libgmp.a
/usr/local/Cellar/gmp/6.0.0a/lib/libgmp.dylib
/usr/local/Cellar/gmp/6.0.0a/lib/libgmpxx.4.dylib
/usr/local/Cellar/gmp/6.0.0a/lib/libgmpxx.a
/usr/local/Cellar/gmp/6.0.0a/lib/libgmpxx.dylib
/usr/local/Cellar/gmp/6.1.0/lib/libgmp.10.dylib
/usr/local/Cellar/gmp/6.1.0/lib/libgmp.a
/usr/local/Cellar/gmp/6.1.0/lib/libgmp.dylib
/usr/local/Cellar/gmp/6.1.0/lib/libgmpxx.4.dylib
/usr/local/Cellar/gmp/6.1.0/lib/libgmpxx.a
/usr/local/Cellar/gmp/6.1.0/lib/libgmpxx.dylib
/usr/local/Cellar/openssl/1.0.1k/lib/engines/libgmp.dylib
/usr/local/Cellar/openssl/1.0.2/lib/engines/libgmp.dylib
/usr/local/Cellar/openssl/1.0.2a-1/lib/engines/libgmp.dylib
/usr/local/Cellar/openssl/1.0.2d_1/lib/engines/libgmp.dylib
/usr/local/Cellar/openssl/1.0.2e_1/lib/engines/libgmp.dylib
/usr/local/Cellar/openssl/1.0.2f/lib/engines/libgmp.dylib
/usr/local/Cellar/openssl/1.0.2h_1/lib/engines/libgmp.dylib
/usr/local/lib/libgmp.10.dylib
/usr/local/lib/libgmp.a
/usr/local/lib/libgmp.dylib
/usr/local/lib/libgmpxx.4.dylib
/usr/local/lib/libgmpxx.a
/usr/local/lib/libgmpxx.dylib

/usr/local/lib に有りますね、では、これもCFLAGSにライブラリ検索パスとして含めて再度実行します。

結果

ライブラリ検索のパスをCFLAGSに追加して再度実行します。

$ env "CFLAGS=-I/usr/local/include -L/usr/local/lib" pip install ansible==2.1
... (省略) ...
Building wheels for collected packages: pycrypto
  Running setup.py bdist_wheel for pycrypto ... done
  Stored in directory: /Users/yokoyamafumihito/Library/Caches/pip/wheels/80/1f/94/f76e9746864f198eb0e304aeec319159fa41b082f61281ffce
Successfully built pycrypto
Installing collected packages: pycrypto, ansible
Successfully installed ansible-2.1.0.0 pycrypto-2.6.1

ansible==2.1がインストールできました。
因みに ansible==2.1 だけの問題ではなく ansible (1.9)で実行しても pycrypto のインストールでコケます。

まとめ

CFLAGSでpipのビルドするときのパス追加出来ることを知れたのが個人的に大きかった。
「macでpipでインストールしたansible使いたいのに…」という人の参考になれば幸いです。