php5.5.28+Oracle Clientでコンパイルエラー

最近は環境構築もほとんどchef経由のyumでやっつけてしまうことが多いのですが、たまに今やっているようになんだかいろんな依存性が解決できなくて手動でソースから環境を構築することがあります。
今回はphp5.5.28とOracleクライアントを組み合わせた環境でエラーが出た話。

Oracleクライアントインストール

Oracleクライアントはrpmでインストール。このブログのどこかに載ってると思う。

phpldapサポートでconfigure

ソースをダウンロードしてきて展開。configureはこんな。

$ ./configure --with-gd --enable-mbstring --with-mcrypt --with-pear --enable-opcache --with-pgsql --with-tidy --with-ldap --with-oci8

configureそのものはするっと終わる。

makeするとエラーが

ところがmakeするとエラーがでます。
一番末尾はこんな。

In file included from /tmp/php-5.5.28.tar.bz2/php-5.5.28/ext/ldap/php_ldap.h:30:0,
from /tmp/php-5.5.28.tar.bz2/php-5.5.28/ext/ldap/ldap.c:45:
/usr/include/oracle/12.1/client64/ldap.h:1014:18: error: conflicting types for 'ber_scanf'
LDAPFUNCDECL int ber_scanf ( BerElement *ber, char * fmt, ... );
^
In file included from /tmp/php-5.5.28.tar.bz2/php-5.5.28/ext/ldap/php_ldap.h:27:0,
from /tmp/php-5.5.28.tar.bz2/php-5.5.28/ext/ldap/ldap.c:45:
/usr/include/lber.h:335:1: note: previous declaration of 'ber_scanf' was here
ber_scanf LDAP_P((
^
make: *** [ext/ldap/ldap.lo] Error 1
make: *** Waiting for unfinished jobs....
[root@fc5ffbc8f35a php-5.5.28]# 

つまり、Oracleクライアント中にあるldap.hとOpenLDAPで入ってくるldap.hで同じマクロを定義していますよーってことです。

で、どうするかというと

ここには掲載していませんが、エラーをよくみると他にも同じマクロがいろいろと重複されて定義されているようです。偶然か必然かわかりませんが同じ値だったりするのでwarningですんでいますが。
やっつけで、こんなふうにして回避。

# mv /usr/include/oracle/12.1/client64/ldap.h /usr/include/oracle/12.1/client64/_ldap.h

Oracleクライアントに入っていたldap.hをなき者として扱ってmake。
実はこのあと別件でリンクエラーがでたりするのですが、それは明日。