1

Makefileルールの理由を説明していただけますか:

clean:
    rm -f foo.{bar1,bar2,bar3}

ファイルを削除することにはなりません: foo.bar1 foo.bar2 および foo.bar3? さまざまな Makefile でそのようなパターンを何度も見たと思いますが、現在独自の Makefile を作成していて、そのルールを正しく機能させることができません (ファイルは削除されません)。

私は使用しています:

  • ヌーメイク3.81
  • gnu バッシュ 4.1.5

私が推測するように、Bashはそのパターンを評価します:

$ echo test.{a,b,c}
test.a test.b test.c

ありがとう!

アップデート

David のヒントのおかげで、上記の問題の解決策が見つかりました。gnu make はデフォルトで /bin/sh を使用するため、a.{1,2,3} は a.1 a.2 a.3 に評価されません。

「make」で sh の代わりに bash を使用するには、次の行を Makefile に追加します。

SHELL=/bin/bash

これから a.{1,2,3} は a.1 a.2 a.3 と見なされます

4

2 に答える 2

1

ディレクトリに名前の付いたファイルはありますcleanか? その場合、make はそのターゲットが最新であると見なし、対応するコマンドを実行しません。これを修正するには、次の行を makefile に追加します。

.PHONY: clean

実行make cleanすると出力が得られる場合

make: `clean' is up to date.

それはおそらくあなたの問題です。

于 2010-06-15T20:22:01.987 に答える
-1

これは、ここでシェルが呼び出されていないためであり、むしろ rm が直接呼び出されているためです。シェルは {} 置換を行うため、rm が「認識する」のは生の foo.{bar1,bar2,bar3} 文字列です。そのようなファイルがないため、何も起こりません。

GNUmake の文字列マクロの 1 つを使用して、展開を実行する必要があります。

于 2010-06-15T20:22:26.943 に答える