Project

General

Profile

Actions

Bug #7287

closed

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

Added by ngoto (Naohisa Goto) about 12 years ago. Updated about 12 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.0.0dev (2012-11-05) [sparc64-solaris2.10]
Backport:
[ruby-dev:46414]

Description

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

#elif defined(__sun)
#include <atomic.h>

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

"gc.c", line 1421: warning: implicit function declaration: atomic_swap_uint
"gc.c", line 1902: warning: implicit function declaration: atomic_or_uint
"gc.c", line 1952: warning: implicit function declaration: atomic_swap_ulong

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

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

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


Files

noname (205 Bytes) noname Anonymous, 11/06/2012 08:53 PM
noname (205 Bytes) noname Anonymous, 11/07/2012 10:23 AM
Actions #1

Updated by ngoto (Naohisa Goto) about 12 years 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 <sys/atomic.h> for the workaround of
    header file name conflict of atomic.h with /usr/include/atomic.h
    on Solaris 10. [ruby-dev:46414] [Bug #7287]

Updated by ngoto (Naohisa Goto) about 12 years ago

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

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

Updated by metanest (Makoto Kishimoto) about 12 years ago

きしもとです

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

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

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

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

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

Updated by Anonymous about 12 years ago

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

きしもとです

#include "atomic.h" とは違って #include <atomic.h> のように<>で囲んでいるので、システムのヘッダファイルが優先されるはず、と思っていたら、実はそうではなく、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/

Updated by mame (Yusuke Endoh) about 12 years ago

  • Status changed from Open to Assigned
  • Assignee set to kosaki (Motohiro KOSAKI)

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

$ ls *.h
addr2line.h encdb.h iseq.h regint.h timev.h vm_core.h
atomic.h eval_intern.h method.h regparse.h transcode_data.h vm_exec.h
constant.h gc.h node.h revision.h transdb.h vm_insnhelper.h
debug.h id.h parse.h thread_pthread.h verconf.h vm_opts.h
dln.h internal.h regenc.h thread_win32.h version.h

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

--
Yusuke Endoh

Updated by kosaki (Motohiro KOSAKI) about 12 years ago

  • Assignee changed from kosaki (Motohiro KOSAKI) to ngoto (Naohisa Goto)

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

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

Updated by kosaki (Motohiro KOSAKI) about 12 years ago

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

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

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

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

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

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

Updated by Anonymous about 12 years 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 <atomic.h> としてい
たのだけど、 <> で括っても -I$(srcdir) が指定されているとシステムディレ
クトリでなくそちらを優先してしまうので、実質的に "" も <> も違いがなく、
システムにある同名ヘッダは隠されてインクルードできないという話だと思い
ます。

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

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

Updated by metanest (Makoto Kishimoto) about 12 years ago

きしもとです

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

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

Actions #10

Updated by ngoto (Naohisa Goto) about 12 years 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. [ruby-dev:46414] [Bug #7287]
  • gc.c, signal.c, vm_core.h, common.mk: reflect the rename from atomic.h
    to ruby_atomic.h.

Updated by ngoto (Naohisa Goto) about 12 years ago

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

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0