Project

General

Profile

Actions

Backport #7101

closed

拡張ライブラリの質問

Added by ko1 (Koichi Sasada) almost 9 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
[ruby-dev:46105]

Description

 ささだです.

 trunk では,拡張ライブラリをビルドするとき,下記のようなオプションがつ
きます.

gcc -I. (snip) -Wall -Wextra -Wno-unused-parameter -Wno-parentheses
-Wno-long-long -Wno-missing-field-initializers -Wunused-variable
-Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement
-Wimplicit-function-declaration -ansi -std=iso9899:199409 (snip)

 -ansi -std=iso9899:199409 のあたりで,inline や // でのコメントアウト
を利用している拡張ライブラリがビルド出来ない感じです.
(inline については,ruby.h を include していれば適切に入れ替えられるん
ですが,ruby.h を include していない *.c をビルドする可能性もあり,そこ
でこけてる感じです)

 これは,仕様でしょうか.ぎゃっという人は多そうなので,拡張ライブラリの
CC のオプションは,以前に外した方が良さそうに思いますが.

# 目の前でマンガを読んでいる須藤さんから
# 何とかしろと言われたのでご相談した次第です.

--
// SASADA Koichi at atdot dot net

Updated by shyouhei (Shyouhei Urabe) almost 9 years ago

  • Status changed from Open to Assigned
  • Assignee set to sorah (Sorah Fukumori)
  • Category set to build
  • Target version set to 2.0.0
  • ruby -v set to trunk

Updated by ko1 (Koichi Sasada) almost 9 years ago

(2012/09/05 13:58), SASADA Koichi wrote:

(2012/09/05 12:55), Urabe Shyouhei wrote:

他の警告はまだメリットデメリットでメリットが勝ってるように思いますけれど、
-std=iso9899:199409 はデメリットが大きいんじゃないかなぁ。
travisで動かすときだけとかでいいんじゃないかと思うんですが。
Travisの警告なんて誰も読んでないじゃないですか。できないことを言うのはやめましょうよ。

 警告じゃなくて,Travis でエラーが出たら気づく,という意味じゃないで
しょうか.

 そういう意味で,Travis ではきついオプション,そうじゃないところでは,
ゆるいオプションというのは選択肢に入りそうですね.

ちょっと,宙ぶらりんになっているんですが,拡張ライブラリのビルド時にはゆ
るくする,という感じでよろしいんじゃないかと思います.

中田さん,こちらお願い出来ますか?

--
// SASADA Koichi at atdot dot net

Updated by kou (Kouhei Sutou) almost 9 years ago

須藤です。

In 506AD646.8050001@atdot.net
"[ruby-dev:46191] Re: 拡張ライブラリの質問" on Tue, 2 Oct 2012 20:55:55 +0900,
SASADA Koichi ko1@atdot.net wrote:

 そういう意味で,Travis ではきついオプション,そうじゃないところでは,
ゆるいオプションというのは選択肢に入りそうですね.

ちょっと,宙ぶらりんになっているんですが,拡張ライブラリのビルド時にはゆ
るくする,という感じでよろしいんじゃないかと思います.

中田さん,こちらお願い出来ますか?

あれ、これ入っていませんか?札幌でなかださんにお願いして入れ
てもらったつもりでした。

これじゃ足りないんでしたっけ。(まだ試していない。)
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=36981&view=revision

Updated by hsbt (Hiroshi SHIBATA) almost 9 years ago

柴田です。

ちょっと,宙ぶらりんになっているんですが,拡張ライブラリのビルド時にはゆ
るくする,という感じでよろしいんじゃないかと思います.

中田さん,こちらお願い出来ますか?

あれ、これ入っていませんか?札幌でなかださんにお願いして入れ
てもらったつもりでした。

これじゃ足りないんでしたっけ。(まだ試していない。)
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=36981&view=revision

笹田さん、須藤さん
r36981 以前のバージョンで拡張ライブラリのビルドエラーが発生を確認したのち、
本日の r37049 でビルド可能となっていることを確認しました。

この現象に困っていた一人ですので対応助かりました。
中田さんありがとうございます。

--
SHIBATA Hiroshi shibata.hiroshi@gmail.com
http://www.hsbt.org/

Updated by ko1 (Koichi Sasada) almost 9 years ago

  • Status changed from Assigned to Closed

直ってたらしいので close します.

Updated by knu (Akinori MUSHA) over 8 years ago

  • Status changed from Closed to Open
  • Assignee changed from sorah (Sorah Fukumori) to ko1 (Koichi Sasada)

これって何がどう直ったんでしたっけ。

現在の trunk や ruby_2_0_0 では拡張ライブラリをビルドするときにも -ansi -std=iso9899:199409 が付くようです。

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

=begin
これは拡張ライブラリという言葉の使い方が不正確なんですが、付かなくしたのは外部のライブラリのときだけです。
それとも、外部のライブラリのときでもまだ付いているなら、そのライブラリとmkmf.log、できたMakefile、以下の出力を教えて下さい。

$ ruby -e 'p RbConfig::CONFIG.values_at(*%w[warnflags strict_warnflags])'
=end

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

失礼、記憶違いでした。
添付の拡張ライブラリでもつかないはずですが、環境とwarnflagsの出力を教えて下さい。

Updated by knu (Akinori MUSHA) over 8 years ago

そもそもrbconfig.rbのCFLAGSが

CONFIG["CFLAGS"] = "-O3 -fno-fast-math -ggdb3 -ansi -std=iso9899:199409 -fno-omit-frame-pointer -fPIC"

のように展開されてしまっているので、mkmf.rb以前の問題のようです。

切り分けを試みたところ、rubyのconfigureで --with-opt-dir="..." を指定すると $(cflags) が展開されてしまうようです。

Updated by knu (Akinori MUSHA) over 8 years ago

--with-opt-dirを付けてもOS X (10.8)だと展開されませんでした。
問題のある当該マシンはFreeBSD 9.1なんですが、何が違うんだろう。もう少し調べます。

Actions #11

Updated by knu (Akinori MUSHA) over 8 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r39255.
Koichi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


Fix CFLAGS and CXXFLAGS in RbConfig::CONFIG on FreeBSD and NetBSD/amd64.

  • configure.in: Fix a bug introduced in r38342 that the cflagspat substitution is messed up by the way CFLAGS and optflags are modified, which affected FreeBSD and NetBSD/amd64 when configured to use libexecinfo. This bug resulted in CFLAGS and CXXFLAGS in RbConfig::CONFIG having warnflags expanded in them, forcing third-party C/C++ extensions to follow what warnflags demands, like ANSI/ISO-C90 conformance. ref [Bug #7101]

Updated by knu (Akinori MUSHA) over 8 years ago

FreeBSDとNetBSD/amd64でlibexecinfoを使う場合に限って、configureスクリプトの中でCFLAGS/CXXFLAGSの置換(逆展開)に失敗するバグでした。

2.0.0にもバックポートが必要です。

Updated by knu (Akinori MUSHA) over 8 years ago

  • Status changed from Closed to Open
  • Assignee changed from ko1 (Koichi Sasada) to mame (Yusuke Endoh)

該当環境では1.8や1.9でビルドできていたC拡張がビルドできないという事態が発生しているのでバックポート希望です。

Updated by mame (Yusuke Endoh) over 8 years ago

問題的にはバックポートしてよいと思うのですが、誰かパッチレビューして「おk」の一言をくれませんでしょうか。
パッチを理解しているのが knu さんしかいないように見えるのが若干不安です。
まあ knu さんなら大丈夫だと思うし、最悪でも freebsd と netbsd しか影響を受けないパッチだとは思うんですが、ビルド周りは慎重に行かせてください。

--
Yusuke Endoh mame@tsg.ne.jp

Updated by knu (Akinori MUSHA) over 8 years ago

configure.inのコメントに説明を書いたのですが、config.statusに書き出すCFLAGSの値を "${cflags} ..." のように置換(いわばunexpand)する処理が下の方にあるんですが、こいつはCFLAGSの値が $optflags $debugflags $warnflags という並びになっていることが前提になっています。

修正前のコードでは、CFLAGSとoptflagsそれぞれの末尾に -fno-omit-frame-pointer に追加してしまっていたのでこの置換が機能せず、rubyをコンパイルするとき用のCFLAGSの値、すなわちoptflags/debugflags/warnflagsが展開された状態の値がconfig.statusに書き込まれ、それがrbconfig.rbに反映され、mkmf.rbで生成されるMakefileにもその値が入り、C拡張のビルド時に(warnflagsに入っている) -ansi -std=iso9899:199409 が指定されてしまっていました。

本修正は、CFLAGSの値から先頭の $optflags 部分を除去し、optflagsに -fno-omit-frame-pointer を追加し、改めてCFLAGSの先頭に $optflags を追加するようにすることで、並びを保ち置換を機能させるようにするものです。

Updated by knu (Akinori MUSHA) over 8 years ago

これがバグが顕在化するのは、

  • プラットフォームがFreeBSDまたはNetBSD/amd64
  • execinfo.h が存在する -- NetBSD current, FreeBSD+portsのlibexecinfo(ruby 1.9以上のユーザはほぼ100%が入れている)およびNetBSD =<6.1+pkgsrc-wipのlibexecinfo(ややマイノリティ?)
  • CCが -ansi -std=iso9899:199409 等を受け付ける -- NetBSD/amd64やFreeBSD(<10.0)は標準でgccなので該当

FreeBSDについては、9.1/amd64で確認済みです。
一方のNetBSDは、pkgsrc-wipから入れたlibexecinfoを使うには--with-opt-dir=/usr/pkgが必要となりますが、別のバグがあってこの修正単体では直らない(もちろん悪影響もない)ことがわかったので後ほど修正します。
NetBSD 6.0/amd64については、その修正が入ってやっと一人前です。NetBSD currentではこれがないと問題があったはずで、この修正単体で直ったはずなのでもし環境を持っている人がいればテストしてみてください。

Updated by knu (Akinori MUSHA) over 8 years ago

  • CCが -ansi -std=iso9899:199409 等を受け付ける -- NetBSD/amd64やFreeBSD(<10.0)は標準でgccなので該当

あ、NetBSDはgccだけど-ansi ...を付ける処理がスキップされるので関係ないですね。
とはいえ、rubyビルド時のoptflags/debugflags/warnflagsがC拡張のビルド時にも使われることで悪影響を与える可能性は-ansi ...以外にもいろいろあるはずです。C拡張側で-Werrorを指定している場合等。

Updated by knu (Akinori MUSHA) over 8 years ago

#16で触れた「別のバグ」の修正を r39281 に入れました。
(NetBSDではLIBRUBY_DLDFLAGSに --with-opt-dir が反映されなかったので execinfo を有効にしてビルドできなかった)

これでNetBSDでビルドできるようになったかと思いきや、先ほどチケット化していただいた[Bug #7864](rc1で報告されていた問題)のせいで、そもそもNetBSDではtrunkもruby_2_0_0もビルドできていませんでした。

で、それらの修正を入れた上で、NetBSD/amd64で正常にビルドでき、rbconfig.rbのCFLAGS/CXXFLAGSも正常になりました。
念のため、NetBSDを常用している方にも確認をお願いします。

Updated by mame (Yusuke Endoh) over 8 years ago

  • Status changed from Open to Assigned
  • Assignee changed from mame (Yusuke Endoh) to naruse (Yui NARUSE)

このチケットとしては r39255 と r39281 のバックポート希望ということでいいんですかね。

BSD 関係ということで、成瀬さん見て頂けません?

--
Yusuke Endoh mame@tsg.ne.jp

Actions #20

Updated by naruse (Yui NARUSE) over 8 years ago

  • Tracker changed from Bug to Backport
  • Project changed from Ruby master to Backport200
  • Category deleted (build)
  • Target version deleted (2.0.0)
Actions #21

Updated by naruse (Yui NARUSE) over 8 years ago

  • Assignee changed from naruse (Yui NARUSE) to mame (Yusuke Endoh)

良いと思います。backport お願いします。

Actions #22

Updated by mame (Yusuke Endoh) over 8 years ago

  • Assignee changed from mame (Yusuke Endoh) to knu (Akinori MUSHA)

knu さん、バックポート作業してもらっていいでしょうか。
理解してない人がやるよりケアレスミス少ないと思うんで。。。

--
Yusuke Endoh mame@tsg.ne.jp

Actions #23

Updated by knu (Akinori MUSHA) over 8 years ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r39421.
Koichi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


merge revision(s) r39255:

* configure.in: Fix a bug introduced in r38342 that the cflagspat
  substitution is messed up by the way CFLAGS and optflags are
  modified, which affected FreeBSD and NetBSD/amd64 when
  configured to use libexecinfo.  This bug resulted in CFLAGS and
  CXXFLAGS in RbConfig::CONFIG having warnflags expanded in them,
  forcing third-party C/C++ extensions to follow what warnflags
  demands, like ANSI/ISO-C90 conformance.  ref [Bug #7101]
Actions

Also available in: Atom PDF