Vine Linux バグトラッキングシステム - Vine Linux
課題の詳細を表示
0000479Vine Linux1 バグ公開2007-02-10 13:462007-03-09 17:00
anonymous 
 
不明 
完了不明 
 
 
x86
make-3.80-0vl4
0000479: コマンド「make」のファイル「Makefile」上で条件的にサフィックス・ルールが無視される。
もはや「Vine」に関係ないかもしれませんが…
コマンド「make」のファイル「Makefile」上で条件的に
サフィックス・ルールが無視されます。

Vine 4.0/3.2 でおきます。

  パッケージ : make-3.80-0vl4

(3.2 のパッケージは忘れました。)

 Makefile に 下記のように ビルド するファイルの依存ファイルの指定に
 ディレクトリ名を書き足すとサフィックス・ルールが無視されます。
 ※ この際、エラーもワーニングも発しません。

---- 以下 Makefileの(失敗)例

.SIFFIXES: .cc .o

TARGET=test

all: main.o
        g++ -o $(TARGET) main.o

clean:
        rm *~ *.o $(TARGET)

main.o: src/main.cc
# ↑ ここにディレクトリ名の指定を書き足すとビルドされない。
# g++ -c -o $*.o $<

.cc.o:
        g++ -c -o $*.o $<

---- 以上まで。

成功例と失敗例を添付(make-test-for-bug-report.tgz)しておきます。
設定されていません。
tgz make-test-for-bug-report.tgz (578) 2007-02-10 13:46
http://mantis.vinelinux.org/file_download.php?file_id=130&type=bug
課題の履歴
2007-02-10 13:46anonymous添付ファイル追加: make-test-for-bug-report.tgz
2007-02-10 13:46anonymous新規課題
2007-03-01 01:27anonymousコメント追加: 0002404
2007-03-04 14:50anonymousコメント追加: 0002405
2007-03-09 17:00kazutaka状態新規 => 完了
2007-03-09 17:00kazutakaコメント追加: 0002406

コメント
(0002404)
anonymous   
2007-03-01 01:27   
> .SIFFIXES: .cc .o

.SIFFIXES ではなく
.SUFFIXES です。
  ^

> ※ この際、エラーもワーニングも発しません。
$ make -d
とすると確認できると思います。
サフィックス・ルールを定義する時には -r オプションも使ったほうがわかりやすいです。

> ディレクトリ名を書き足すとサフィックス・ルールが無視されます。
src/main.o: src/main.cc のように、ターゲットをコンポーネントと同じディレクトリにするとサフィックス・ルールを利用できます。

「ディレクトリ名を書き足すと」というよりは、「ターゲットとコンポーネントのディレクトリが異なると」ということのようです。仕様なのではないでしょうか?

他のディレクトリも対象としたいのであれば、VPATH や vpath を使う必要があると思います。
Vine 4.0/3.2 では確認してませんが 4.1 x86 の make-3.80-0vl4 で、VPATH や vpath が使えました。
ただ、コマンド行を省略せずに書いたほうがトラブルにはなりにくいと思います。
(0002405)
anonymous   
2007-03-04 14:50   
>> .SIFFIXES: .cc .o
>
> .SIFFIXES ではなく
> .SUFFIXES です。
> ^
 
すみません。誤植でした。

>> ※ この際、エラーもワーニングも発しません。
> $ make -d
> とすると確認できると思います。
> サフィックス・ルールを定義する時には -r オプションも使ったほうがわかりや
> すいです。

>> ディレクトリ名を書き足すとサフィックス・ルールが無視されます。
> src/main.o: src/main.cc のように、ターゲットをコンポーネントと同じディレ
> クトリにするとサフィックス・ルールを利用できます。
>
> 「ディレクトリ名を書き足すと」というよりは、「ターゲットとコンポーネント
> のディレクトリが異なると」ということのようです。仕様なのではないでしょう
> か?

「サフィックス・ルール」で、検索してみたのですが「VPATH」まで、
たどり着けませんでした。

  main.o: src/main.cc
          g++ -c -o $*.o $<

「Makefile」で、↑のように、ファイル1つづつたと動作するので、
困惑してしまいました。
(ルールだと、依存のパスは見ないということですね。)

> 他のディレクトリも対象としたいのであれば、VPATH や vpath を使う必要がある
> と思います。
> Vine 4.0/3.2 では確認してませんが 4.1 x86 の make-3.80-0vl4 で、VPATH や
> vpath が使えました。
> ただ、コマンド行を省略せずに書いたほうがトラブルにはなりにくいと思います。

こちらでも「VPATH」を使い動作の確認がとれました。

ですので、この件は「解決」でおねがいします。
(0002406)
kazutaka   
2007-03-09 17:00   
> >> ディレクトリ名を書き足すとサフィックス・ルールが無視されます。
> > src/main.o: src/main.cc のように、ターゲットをコンポーネントと同じディレ
> > クトリにするとサフィックス・ルールを利用できます。
> >
> > 「ディレクトリ名を書き足すと」というよりは、「ターゲットとコンポーネント
> > のディレクトリが異なると」ということのようです。仕様なのではないでしょう
> > か?
>
> 「サフィックス・ルール」で、検索してみたのですが「VPATH」まで、
> たどり着けませんでした。
>
> main.o: src/main.cc
> g++ -c -o $*.o $<
>
> 「Makefile」で、↑のように、ファイル1つづつたと動作するので、
> 困惑してしまいました。
> (ルールだと、依存のパスは見ないということですね。)
>
> > 他のディレクトリも対象としたいのであれば、VPATH や vpath を使う必要がある
> > と思います。
> > Vine 4.0/3.2 では確認してませんが 4.1 x86 の make-3.80-0vl4 で、VPATH や
> > vpath が使えました。
> > ただ、コマンド行を省略せずに書いたほうがトラブルにはなりにくいと思います。
>
> こちらでも「VPATH」を使い動作の確認がとれました。
>
> ですので、この件は「解決」でおねがいします。

とのことですので、これで完了とします。

ハラダ