久保@茅ヶ崎市です。

KUBO Takehiro <kubo / jiubao.org> writes:

>> 【環境】
>> (1) Solaris8 (sparc)
>> (2) % gcc -v
>>     Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.3/specs
>>     gcc version 2.95.3 20010315 (release)
>>     sunSITE から入手した package でインストール
(snip)
>> 【実行結果】
>> % make
>> cd src && ruby extconf.rb
>> Get the version of Oracle from SQL*Plus... 920
>> try  -I/app/oracle/product/9.2.0.1.0/rdbms/demo
>> checking for oci.h... no
>> try  -I/app/oracle/product/9.2.0.1.0/rdbms/demo -I/app/oracle/product/9.2.0.1.0/
>> rdbms/public
>> checking for oci.h... yes
>> Running make for $ORACLE_HOME/rdbms/demo/demo_rdbms.mk ...OK
>> checking for OCIInitialize()... no
>> ./oraconf.rb:95:in `initialize': cannot compile OCI (RuntimeError)
>>         from extconf.rb:21:in `new'
>>         from extconf.rb:21
>> *** Error code 1
>> make: Fatal error: Command failed for target `src/Makefile'
>
> src/mkmf.log を送ってもらえませんか?
> ファイルサイズが大きいようでしたら、直メールでお願いします。

メール、受け取りました。ありがとうございます。

結論からいうと、$ORACLE_HOME/rdbme/demo/demo_rdbms.mk が gcc に対応し
てないからでした。おそらく SUN の cc なら大丈夫ではないかと思います。
具体的には、SUN の cc のオプション '-K PIC' を gcc にわたしてエラーに
なってました。これは gcc では -fPIC に相当します。

Ruby/OCI8 は $ORACLE_HOME/rdbms/demo/demo_rdbms.mk を実際に動かしてみ
て、C コンパイラにわたすオプションを決めています。どうしてこういうこと
をしているかというと、昔の Oracle は OS によって、また Oracle のバー
ジョンが変わるごとにリンクするライブラリがいろいろ変わってしまうためで
す。OS毎・バージョン毎に cc にわたすオプションを列挙するのは面倒なので、
demo_rdbms.mk から自動的にオプションをとってしまおうというわけです。

問題は、Solaris 版 Oracle の demo_rdbms.mk は SUN の cc でコンパイルす
ることを前提にしていて、gcc でコンパイルすることは考慮されてないという
ことです。
# というか、gcc でコンパイルしたものは Oracle の保証外になるでしょう。

うーむ。Oracle 保証外になっても良いなら gcc でコンパイルする手もありま
す。 Oracle 8 以降は Oracle 7 のように様々なライブラリをリンクしなくて
も、libclntsh.so さえリンクすればだいたい動くようになっています。
# Linux 版 Oracle の特定の version では -lwtc8 が必要だったりと例外が
# あります。Solaris 版の Oracle 9.2.0 がその例外じゃなければ動くでしょ
# う。

具体的には、src/oraconf.rb の 94-96行目

      unless have_func("OCIInitialize", "oci.h")
        raise 'cannot compile OCI' 
      end

を

      unless have_func("OCIInitialize", "oci.h")
        @libs = " -L#{@oracle_home}/lib -lclntsh"
        $libs += " -L#{CONFIG["libdir"]} " + @libs
        puts 'try again'
        unless have_func("OCIInitialize", "oci.h")
          raise 'cannot compile OCI'
        end
      end

に変えてもう一度やってみてください。
# 手元に Oracle がないのでテストしてません。

では、再見
-- 
神奈川県茅ヶ崎市在住 久保 健洋
email: kubo / jiubao.org
web:   http://www.jiubao.org
GnuPG fingerprint = 5F7B C8EF CA16 57D0 FDE1  9F47 C001 1F93 AC08 2262