こんにちは。

mkmf.rbで作成するMakefileには COUTFLAG や OUTFLAG といったmakeの変数が
定義されます。その内容が意図した結果となっていないのではないかと思いま
した。殆どの環境で実害は出ていないと思います。


きっかけは4月の終わりに、Solaris 9上のpkgsrcでruby193-baseのコンパイル
がエラーとなるという報告がありました。報告された方に答えつつ確認を求め
た事項が少々的外れだったのですが、症状としてはmakeから、以下を実行して
エラーになるという内容です。

	cc ...(いっぱいオプション) -fPIC -obug.o -c bug.c

ここで、ポイントは -o オプションと出力先のファイル名の間にスペースがな
いことです。Solaris 9のas(1)は、ここにスペースがないとエラーとなるよう
です。(Solaris 10では問題とはならないことは確認しています。)

上記のコマンドが来た元を追うと、

1. 生成されたMakefile(例えば、ext/-test-/bug-3571/Makefile)では、

.c.o:
	$(ECHO) compiling $(<)
	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<

   といったルールがあって、$(COUTFLAG)と$@の間にスペースはありません。
   (スペースがあってはならない環境もあるのでしょうか?)

2. 同じMakefileで COUTFLAGS は、

COUTFLAG = -o 

   と設定されています。

3. これらのMakefileを生成する元のlib/mkmf.rbで1.については、

COMPILE_C = config_string('COMPILE_C') || '$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<'

   というのが元となっていて、まぁ、これはそのまんまです。

4. lib/mkmf.rbで2.については、

COUTFLAG = #{COUTFLAG}

   という文字列中で展開している行が存在していて、Rubyの定数COUTFLAGが
   元で、さらにこの定数はlib/mkmf.rbの先の方で、

COUTFLAG = CONFIG['COUTFLAG']

   として定義しています。

5. CONFIG['COUTFLAG']はrbconfig.rbが元ですが、これはconfigure時に由来
   していて、config.logで確認すると、

COUTFLAG='-o '

   となっています。


と、いうわけで改めて2.の部分を見ると、COUTFLAG に代入している行で -o
の後ろにスペースが1つあるのですが、Makefileの世界ではこのスペースは捨
てられてしまいます。

話が長くなりましたが、1.や3.のルールでは$(COUTFLAG)と$@の間にはスペー
スが入ると期待していたのか、全然気にしていないのか、どうなんだろうと思っ
た次第です。

A. 元々、$(COUTFLAG)と$@の間にスペースを入れてはいけない理由はない。
B. $(COUTFLAGS)の後ろにスペースがあると思っていた。

pkgsrcが対象とするプラットフォームでは、A.に基づいても良さそうに思えま
すが、少し気になったのでメールにまとめてみました。

-- 
神戸 隆博 (かんべ たかひろ)		at 仕事場