Bug #7287

please rename atomic.h which conflicts with /usr/include/atomic.h in Solaris10

Added by Naohisa Goto over 1 year ago. Updated over 1 year ago.

[ruby-dev:46414]
Status:Closed
Priority:Low
Assignee:Naohisa Goto
Category:-
Target version:-
ruby -v:ruby 2.0.0dev (2012-11-05) [sparc64-solaris2.10] Backport:

Description

Solaris10にて、ccやfccなどgcc以外を使用してコンパイルする際は、Rubyソース内の atomic.h にて、以下のようにシステムの atomic.h (/usr/include/atomic.h)を#includeしています。

#elif defined(__sun)
#include

#include "atomic.h" とは違って #include のように<>で囲んでいるので、システムのヘッダファイルが優先されるはず、と思っていたら、実はそうではなく、configureがコンパイル時のオプションとして "-I." を追加しているため、Rubyソース側の atomic.h しか読み込むことができず、どう頑張ってもシステムの /usr/include/atomic.h は読み込まれないことが判明しました。
このため、以下のように"implicit function declaration"の警告が出ます。(行番号はr36984の場合)

"gc.c", line 1421: warning: implicit function declaration: atomicswapuint
"gc.c", line 1902: warning: implicit function declaration: atomicoruint
"gc.c", line 1952: warning: implicit function declaration: atomicswapulong

幸い、Solaris10およびIllumos(旧OpenSolaris)の現時点の /usr/include/atomic.h は、実質的に 内部で #include しているだけでしたので、#include をRubyの atomic.h に追加することで問題を回避できました。ただし、Solaris10のmanページ(man atomic_ops)では atomic.h を使うように指示がされており、sys/atomic.h はカーネル内ドライバ専用らしいので、OSの将来のバージョン・リビジョンでは最悪コンパイルできなくなる可能性は残っています。根本的解決策としては、Ruby側のatomic.hのファイル名を違う名前に変更するしかないと思います。

ファイル名変更するときは、他のOSやライブラリとも被らないことが望ましいので若干調べたところ、
AIX 6.1 では、#include だそうです。
http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.kerneltechref%2Fdoc%2Fktechrf1%2Ffetch_and_add.htm

BoehmGC が要求する libatomicops には atomicops.h が含まれているようです。
https://github.com/ivmai/libatomic_ops/

noname (205 Bytes) Anonymous, 11/06/2012 08:53 PM

noname (205 Bytes) Anonymous, 11/07/2012 10:23 AM

Associated revisions

Revision 37491
Added by Naohisa Goto over 1 year ago

  • atomic.h: add #include for the workaround of header file name conflict of atomic.h with /usr/include/atomic.h on Solaris 10. [Bug #7287]

Revision 37604
Added by Naohisa Goto over 1 year ago

  • ruby_atomic.h: renamed from atomic.h to avoid header file name conflict on Solaris 10. [Bug #7287]
  • gc.c, signal.c, vmcore.h, common.mk: reflect the rename from atomic.h to rubyatomic.h.

History

#1 Updated by Naohisa Goto over 1 year ago

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

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


  • atomic.h: add #include for the workaround of header file name conflict of atomic.h with /usr/include/atomic.h on Solaris 10. [Bug #7287]

#2 Updated by Naohisa Goto over 1 year ago

  • Status changed from Closed to Open
  • Priority changed from Normal to Low

回避策はコミットしましたが、根本的解決ではないので再openします。

#3 Updated by Makoto Kishimoto over 1 year ago

きしもとです

#include "atomic.h" とは違って #include のように<>で囲んでいるので、システムのヘッダファイルが優先されるはず、と思っていたら、実はそうではなく、configureがコンパイル時のオプションとして "-I." を追加しているため、Rubyソース側の atomic.h しか読み込むことができず、どう頑張ってもシステムの /usr/include/atomic.h は読み込まれないことが判明しました。

rubyでは、はまったことはないのですが、逆のパターンで、
base64.h (heimdal) とか、gc.h (Boehm GC) とかで、アプリ側の
ヘッダファイルをインクルードしてほしいのに、/usr/local/include に
ある、システム(ライブラリのパッケージ)の側のヘッダファイルが
インクルードされてしまい、トラブる、というパターンに不定期に
見舞われています。

# -I/usr/local/include は他のライブラリのために要るので、
# "" で囲んでもあまり意味がなく

「同名のヘッダファイル」問題のベストプラクティス、って無いもので
しょうかねぇ?

#4 Updated by Anonymous over 1 year ago

At Tue, 6 Nov 2012 17:28:27 +0900,
KISHIMOTO, Makoto wrote:

きしもとです

#include "atomic.h" とは違って #include のように<>で囲んでいるので、システムのヘッダファイルが優先されるはず、と思っていたら、実はそうではなく、configureがコンパイル時のオプションとして "-I." を追加しているため、Rubyソース側の atomic.h しか読み込むことができず、どう頑張ってもシステムの /usr/include/atomic.h は読み込まれないことが判明しました。

rubyでは、はまったことはないのですが、逆のパターンで、
base64.h (heimdal) とか、gc.h (Boehm GC) とかで、アプリ側の
ヘッダファイルをインクルードしてほしいのに、/usr/local/include に
ある、システム(ライブラリのパッケージ)の側のヘッダファイルが
インクルードされてしまい、トラブる、というパターンに不定期に
見舞われています。

-I/usr/local/include は他のライブラリのために要るので、

"" で囲んでもあまり意味がなく

「同名のヘッダファイル」問題のベストプラクティス、って無いもので
しょうかねぇ?

 よく知られたヘッダファイルと同じ名前のものは作らず、必要なら階層化す
べし、というところですかねえ。

 gcc には #include "..." にだけ作用する -iquote dir というオプションが
あり、これが正にずばりなのですが、 追随しているのは clang くらいかもし
れません。

--
Akinori MUSHA / http://akinori.org/

#5 Updated by Yusuke Endoh over 1 year ago

  • Status changed from Open to Assigned
  • Assignee set to Motohiro KOSAKI

atomic.h を入れた kosaki さんに振ってしまいます。rb_atomic.h とかにするんですかね。
他は大丈夫ですかねえ。

$ ls *.h
addr2line.h encdb.h iseq.h regint.h timev.h vmcore.h
atomic.h eval
intern.h method.h regparse.h transcodedata.h vmexec.h
constant.h gc.h node.h revision.h transdb.h vminsnhelper.h
debug.h id.h parse.h thread
pthread.h verconf.h vmopts.h
dln.h internal.h regenc.h thread
win32.h version.h

Boehm GC とか #include できなさそうですね。しないけど。

Yusuke Endoh mame@tsg.ne.jp

#6 Updated by Motohiro KOSAKI over 1 year ago

  • Assignee changed from Motohiro KOSAKI to Naohisa Goto

ああ、やっと問題が理解できました。(すいません、別メールでへんなコメントをつけてしまいました)

回避策のrevertと名前変更は一緒にやったほうがいいと思うのでngotoさんがコミットしてもらったほうがいいかと思います。
名前は rb_atomic.h で異論ありません。(ほかのでもOK、そこにこだわりはない)

#7 Updated by Motohiro KOSAKI over 1 year ago

-I/usr/local/include は他のライブラリのために要るので、

"" で囲んでもあまり意味がなく

「同名のヘッダファイル」問題のベストプラクティス、って無いもので
しょうかねぇ?

 よく知られたヘッダファイルと同じ名前のものは作らず、必要なら階層化す
べし、というところですかねえ。

 gcc には #include "..." にだけ作用する -iquote dir というオプションが
あり、これが正にずばりなのですが、 追随しているのは clang くらいかもし
れません。

そもそも atomic.h は公開したくないからinclude/rubyではない場所においてあるのに
なぜ /usr/local/include に入ってしまったのでしょう
Makefileがバグってる?へんなディストリつかってる?

#8 Updated by Anonymous over 1 year ago

At Wed, 7 Nov 2012 02:15:08 +0900,
KOSAKI Motohiro wrote:

-I/usr/local/include は他のライブラリのために要るので、

"" で囲んでもあまり意味がなく

「同名のヘッダファイル」問題のベストプラクティス、って無いもので
しょうかねぇ?

 よく知られたヘッダファイルと同じ名前のものは作らず、必要なら階層化す
べし、というところですかねえ。

 gcc には #include "..." にだけ作用する -iquote dir というオプションが
あり、これが正にずばりなのですが、 追随しているのは clang くらいかもし
れません。

そもそも atomic.h は公開したくないからinclude/rubyではない場所においてあるのに
なぜ /usr/local/include に入ってしまったのでしょう
Makefileがバグってる?へんなディストリつかってる?

#include "atomic.h" で読まれるその $(srcdir)/atomic.h が Solaris では
/usr/include/atomic.h を必要とするので中で #include としてい
たのだけど、 <> で括っても -I$(srcdir) が指定されているとシステムディレ
クトリでなくそちらを優先してしまうので、実質的に "" も <> も違いがなく、
システムにある同名ヘッダは隠されてインクルードできないという話だと思い
ます。

と書いたところで次のメールに気が付きましたが記録のために投げておきます。

--
Akinori MUSHA / http://akinori.org/

#9 Updated by Makoto Kishimoto over 1 year ago

きしもとです

 gcc には #include "..." にだけ作用する -iquote dir というオプションが
あり、これが正にずばりなのですが、 追随しているのは clang くらいかもし
れません。

そういった制御のために使える -I- が deprecated になってしまって、
代替がないのかなぁ、と思っていたのですが、ちゃんとあったのですね。

#10 Updated by Naohisa Goto over 1 year ago

  • Status changed from Assigned to Closed

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


  • ruby_atomic.h: renamed from atomic.h to avoid header file name conflict on Solaris 10. [Bug #7287]
  • gc.c, signal.c, vmcore.h, common.mk: reflect the rename from atomic.h to rubyatomic.h.

#11 Updated by Naohisa Goto over 1 year ago

回避策のrevertと名前変更は一緒にやったほうがいいと思うのでngotoさんがコミットしてもらったほうがいいかと思います。名前は rb_atomic.h で異論ありません。(ほかのでもOK、そこにこだわりはない)

r37603 にていったん r37491 をリバートした後、r37604 にてコミットしました。
ファイル名は、旧atomic.h内でマクロ RUBYATOMICH を使っているのを見て、何となく、rbatomic.h ではなく rubyatomic.h にしました。

Also available in: Atom PDF