hack のためのネタ帳, etc,,,

ruby-*/ext/-test-/printf/printf.c 内に utoa という static 関数が 2013-09-19 に tag:v2_1_0_preview1 にて導入された。 この commit は ruby-2.0.0-p481 以降 ruby-2.0.0-p576 がリリースされる間のどこかで ruby-2.0.0 にも backport されている。

また cygwin 32/64 双方において cygwin-1.7.33-1 以降 cygwin-1.7.34-6 までのどこかで cygwin-devel に含まれる /usr/include/stdlib.h 内にも utoa が追加されており、しかも、この2つの utoa に互換性はない。
このため、少なくとも cygwin-1.7.34-6 以降で ruby-2.0.0-p576 以降、及び ruby-2.1.0-preview1 以降をビルドすると、utoa がコンフリクトするためコンパイルに失敗する。

例えば、ruby-2.1.5 だと以下の様に失敗する。

log

...
make[2]: Entering directory '/tmp/ruby-build.20150216164934.2208/ruby-2.1.5/ext/-test-/printf'
compiling printf.c
linking shared-object -test-/postponed_job.so
printf.c:31:1: エラー: ‘utoa’ と型が競合しています
 utoa(char *p, char *e, unsigned int x)
 ^
In file included from /usr/include/stdio.h:29:0,
                 from ../../.././include/ruby/defines.h:26,
                 from ../../.././include/ruby/ruby.h:29,
                 from ../../.././include/ruby.h:33,
                 from printf.c:1:
/usr/include/stdlib.h:184:8: 備考: 前の ‘utoa’ の宣言はここです
 char * _EXFUN(utoa,(unsigned, char *, int));
        ^
Makefile:228: recipe for target 'printf.o' failed
make[2]: *** [printf.o] Error 1
make[2]: Leaving directory '/tmp/ruby-build.20150216164934.2208/ruby-2.1.5/ext/-test-/printf'
exts.mk:110: recipe for target 'ext/-test-/printf/all' failed
make[1]: *** [ext/-test-/printf/all] Error 2
make[1]: *** 未完了のジョブを待っています....
make[2]: Leaving directory '/tmp/ruby-build.20150216164934.2208/ruby-2.1.5/ext/-test-/postponed_job'
make[1]: Leaving directory '/tmp/ruby-build.20150216164934.2208/ruby-2.1.5'
uncommon.mk:180: recipe for target 'build-ext' failed
make: *** [build-ext] Error 2

2015-02-16 現在、この影響を受けるリリースは以下の通りである。
  • ruby-2.0.0-p576 以降、最新の ruby-2.0.0-p598 まで
  • ruby-2.1.0-preview1 以降、最新の ruby-2.1.5 まで
  • ruby-2.2.0 系列では、最新の ruby-2.2.0 まで
  • ruby-2.3.0 系列では、最新の ruby-2.3.0-dev まで

対応策としては ruby-*/ext/-test-/printf/printf.c 内に出て来る utoa を my_utoa とか適当な名前に置換しておけば良い。

なお、現時点において Debian stable, Debian unstable, Ubuntu 14.04.1 LTS では上記の不具合は確認出来なかった。

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます