CHICKEN Scheme で Eggs の openssl が Mac にインストールできないときの対処法

Mac OS X 10.11 (El Capitan) にアップグレードしました。 それが災いしてかどうかはわかりませんが、CHICKEN Scheme で Eggs の openssl ライブラリを Mac にインストールしようとしたところ、次のようなコンパイルエラーが出て chicken-install に失敗しました。

$ chicken-install openssl
...

installing openssl:1.7.0 ...
changing current directory to /var/folders/m4/T/temp/openssl
  '/usr/local/Cellar/chicken/4.9.0.1/bin/csi' -bnq -setup-mode -e "(require-library setup-api)" -e "(import setup-api)" -e "(setup-error-handling)" -e "(extension-name-and-version '(\"openssl\" \"1.7.0\"))" 'openssl.setup'
  '/usr/local/Cellar/chicken/4.9.0.1/bin/csc' -feature compiling-extension -setup-mode    -O2 -d0 -s -j openssl openssl.scm -lssl -lcrypto
openssl.c:33:10: fatal error: 'openssl/err.h' file not found
#include <openssl/err.h>
         ^
1 error generated.

Error: shell command terminated with non-zero exit status 256: 'clang' 'openssl.c' -o 'openssl.o' -c  -fno-strict-aliasing -fwrapv -fno-common -DHAVE_CHICKEN_CONFIG_H -m64 -DC_ENABLE_PTABLES -Os -fomit-frame-pointer -fPIC -DPIC -DC_SHARED -I"/usr/local/Cellar/chicken/4.9.0.1/include/chicken"

...

Error: shell command terminated with nonzero exit code
17920
"'/usr/local/Cellar/chicken/4.9.0.1/bin/csi' -bnq -setup-mode -e \"(require-libr...

どうやら、Eggs の openssl をコンパイルするときに OpenSSL のヘッダーファイルが上手く見つけられないようです。 そこで次の手順を試してみました:

  1. Homebrew で OpenSSL をインストール
  2. CPATHLIBRARY_PATH でヘッダーファイルとライブラリファイルのディレクトリパスを指定する
  3. chicken-install openssl を実行する
brew install openssl
export CPATH=$CPATH:/usr/local/opt/openssl/include
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib
chicken-install openssl

これで無事にコンパイルとリンクが通り、インストールできました。 事前に CPATHLIBRARY_PATH でパスを外からコンパイラに教えてあげることで、chicken-install の中で clang のコンパイルが走るときにサーチパスの解決が上手くできたようです。

変なところでつまづいてしまったので忘れないよう、こまめに日記をつけていこうと思います。

追記 (Oct 27, 2015)

CSC_OPTIONS という環境変数に C コンパイラのコンパイルオプションを直接指定できるそうです。

export CSC_OPTIONS='-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib'
chicken-install openssl

または、次のように環境変数 CHICKEN_C_INCLUDE_PATHCHICKEN_C_LIBRARY_PATH にそれぞれインクルードパスとライブラリパスを渡しても同様のようです。

export CHICKEN_C_INCLUDE_PATH=/usr/local/opt/openssl/include
export CHICKEN_C_LIBRARY_PATH=/usr/local/opt/openssl/lib
chicken-install openssl

後からドキュメント1を読んでいたら見つけました。(今度からちゃんと確認します…。)


  1. http://wiki.call-cc.org/man/4/Extensions#installing-extensions - "Installing extensions that use libraries" の項目に載っています。 

Leave a Reply