[ruby-trunk - Bug #7287][Open] please rename atomic.h which conflicts with /usr/include/atomic.h in

Issue #7287 has been reported by ngoto (Naohisa G.).


Bug #7287: please rename atomic.h which conflicts with
/usr/include/atomic.h in Solaris10

Author: ngoto (Naohisa G.)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 2.0.0dev (2012-11-05) [sparc64-solaris2.10]

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 が含まれているようです。

Issue #7287 has been updated by ngoto (Naohisa G.).

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

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

Bug #7287: please rename atomic.h which conflicts with
/usr/include/atomic.h in Solaris10

Author: ngoto (Naohisa G.)
Status: Open
Priority: Low
Assignee:
Category:
Target version:
ruby -v: ruby 2.0.0dev (2012-11-05) [sparc64-solaris2.10]

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 が含まれているようです。

$B$-$7$b$H$G$9(B

#include “atomic.h” $B$H$O0c$C$F(B #include <atomic.h>
$B$N$h$&$K(B<>$B$G0O$s$G$$$k$N$G!"%7%9%F%$N%X%C%@%U%!%$%k$,M%@h$5$l$k$O$:!"$H;W$C$F$$$?$i!"<B$O$=$&$G$O$J$/!"(Bconfigure$B$,%3%s%Q%$%k;~$N%*%W%7%g%s$H$7$F(B "-I." $B$rDI2C$7$F$$$k$?$a!"(BRuby$B%=!<%9B&$N(B atomic.h $B$7$+FI$_9~$$3$H$,$G$-$:!"$I$&4hD%$C$F$b%7%9%F%`$N(B /usr/include/atomic.h
$B$OFI$_9~$^$l$J$$$3$H$,H=L@$7$^$7$?!#(B

ruby$B$G$O!"$O$^$C$?$3$H$O$J$$$N$G$9$,!“5U$N%Q%?!<%s$G!”(B
base64.h (heimdal) $B$H$+!"(Bgc.h (Boehm GC) $B$H$+$G!"%"%W%jB&$N(B
$B%X%C%@%U%!%$%k$r%$%s%/%k!<%I$7$F$[$7$$$N$K!"(B/usr/local/include
$B$K(B
$B$"$k!"%7%9%F%`!J%i%$%V%i%j$N%Q%C%1!<%8!K$NB&$N%X%C%@%U%!%$%k$,(B
$B%$%s%/%k!<%I$5$l$F$7$^$$!"%H%i%V$k!"$H$$$&%Q%?!<%s$KITDj4|$K(B
$B8+Iq$o$l$F$$$^$9!#(B

-I/usr/local/include $B$OB>$N%i%$%V%i%j$N$?$a$KMW$k$N$G!"(B

“” $B$G0O$s$G$b$"$^$j0UL#$,$J$/(B

$B!VF1L>$N%X%C%@%U%!%$%k!WLdBj$N%Y%9%H%W%i%/%F%#%9!"$C$FL5$$$b$N$G(B
$B$7$g$&$+$M$’!)(B

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

-I/usr/local/include $B$OB>$N%i%$%V%i%j$N$?$a$KMW$k$N$G!"(B

“” $B$G0O$s$G$b$"$^$j0UL#$,$J$/(B

$B!VF1L>$N%X%C%@%U%!%$%k!WLdBj$N%Y%9%H%W%i%/%F%#%9!"$C$FL5$$$b$N$G(B
$B$7$g$&$+$M$’!)(B

$B!!$h$/CN$i$l$?%X%C%@%U%!%$%k$HF1$8L>A0$N$b$N$O:n$i$:!“I,MW$J$i3,AX2=$9(B
$B$Y$7!”$H$$$&$H$3$m$G$9$+$M$(!#(B

$B!!(Bgcc $B$K$O(B #include “…” $B$K$@$1:nMQ$9$k(B -iquote dir
$B$H$$$&%*%W%7%g%s$,(B
$B$"$j!"$3$l$,@5$K$:$P$j$J$N$G$9$,!"(B $BDI?o$7$F$$$k$N$O(B clang
$B$/$i$$$+$b$7(B
$B$l$^$;$s!#(B

$B$"$j!"$3$l$,@5$K$:$P$j$J$N$G$9$,!"(B $BDI?o$7$F$$$k$N$O(B clang
$B$/$i$$$+$b$7(B
$B$l$^$;$s!#(B

$B$=$b$=$b(B atomic.h
$B$O8x3+$7$?$/$J$$$+$i(Binclude/ruby$B$G$O$J$$>l=j$K$*$$$F$"$k$N$K(B
$B$J$<(B /usr/local/include $B$KF~$C$F$7$^$C$?$N$G$7$g$&(B
Makefile$B$,%P%0$C$F$k!)$X$s$J%G%#%9%H%j$D$+$C$F$k!)(B

Issue #7287 has been updated by mame (Yusuke E.).

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 E. [email protected]

Bug #7287: please rename atomic.h which conflicts with
/usr/include/atomic.h in Solaris10

Author: ngoto (Naohisa G.)
Status: Assigned
Priority: Low
Assignee: kosaki (Motohiro KOSAKI)
Category:
Target version:
ruby -v: ruby 2.0.0dev (2012-11-05) [sparc64-solaris2.10]

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 が含まれているようです。

Issue #7287 has been updated by kosaki (Motohiro KOSAKI).

Assignee changed from kosaki (Motohiro KOSAKI) to ngoto (Naohisa G.)

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

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

Bug #7287: please rename atomic.h which conflicts with
/usr/include/atomic.h in Solaris10

Author: ngoto (Naohisa G.)
Status: Assigned
Priority: Low
Assignee: ngoto (Naohisa G.)
Category:
Target version:
ruby -v: ruby 2.0.0dev (2012-11-05) [sparc64-solaris2.10]

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 が含まれているようです。

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

$B$"$j!"$3$l$,@5$K$:$P$j$J$N$G$9$,!"(B $BDI?o$7$F$$$k$N$O(B clang
$B$/$i$$$+$b$7(B

$B$l$^$;$s!#(B

$B$=$b$=$b(B atomic.h
$B$O8x3+$7$?$/$J$$$+$i(Binclude/ruby$B$G$O$J$$>l=j$K$*$$$F$"$k$N$K(B
$B$J$<(B /usr/local/include $B$KF~$C$F$7$^$C$?$N$G$7$g$&(B
Makefile$B$,%P%0$C$F$k!)$X$s$J%G%#%9%H%j$D$+$C$F$k!)(B

#include “atomic.h” $B$GFI$^$l$k$=$N(B $(srcdir)/atomic.h $B$,(B Solaris
$B$G$O(B
/usr/include/atomic.h $B$rI,MW$H$9$k$N$GCf$G(B #include <atomic.h>
$B$H$7$F$$(B
$B$?$N$@$1$I!"(B <> $B$G3g$C$F$b(B -I$(srcdir)
$B$,;XDj$5$l$F$$$k$H%7%9%F%%G%#%l(B $B%/%H%j$G$J$/$=$A$i$rM%@h$7$F$7$^$&$N$G!"<B<AE*$K(B "" $B$b(B <> $B$b0c$$$,$J$/!"(B $B%7%9%F%$K$"$kF1L>%X%C%@$O1#$5$l$F%$%s%/%k!<%I$G$-$J$$$H$$$&OC$@$H;W$$(B
$B$^$9!#(B

$B$H=q$$$?$H$3$m$G<!$N%a!<%k$K5$$,IU$-$^$7$?$,5-O?$N$?$a$KEj$2$F$*$-$^$9!#(B

$B$-$7$b$H$G$9(B

$B!!(Bgcc $B$K$O(B #include “…” $B$K$@$1:nMQ$9$k(B -iquote dir
$B$H$$$&%*%W%7%g%s$,(B

$B$"$j!"$3$l$,@5$K$:$P$j$J$N$G$9$,!"(B $BDI?o$7$F$$$k$N$O(B clang
$B$/$i$$$+$b$7(B

$B$l$^$;$s!#(B

$B$=$&$$$C$?@)8f$N$?$a$K;H$($k(B -I- $B$,(B deprecated
$B$K$J$C$F$7$^$C$F!"(B
$BBeBX$,$J$$$N$+$J$!!"$H;W$C$F$$$?$N$G$9$,!"$A$c$s$H$"$C$?$N$G$9$M!#(B

Issue #7287 has been updated by ngoto (Naohisa G.).

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

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

Bug #7287: please rename atomic.h which conflicts with
/usr/include/atomic.h in Solaris10

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

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 が含まれているようです。