0

Makefile が使用している

.SUFFIXES: .ext1

.ext1:
      echo bla bla

構成ファイル path/to/abc.ext1 があるので、パス/to/abc を正常に動作させます。

make path/to/abc.ext1も機能するようにします。既存の .ext1 ターゲットを再利用できれば素晴らしいと思います。

4

3 に答える 3

0

のルールを追加するだけabc.ext1で、実行make abc.ext1が機能します。サフィックス ルールは、利用可能な明示的なルールがない場合にのみ検索されます。

それがあなたの状況でうまくいかない場合は、問題をより明確に説明してください。

于 2013-04-04T14:13:46.507 に答える
0

私が理解したことを要約してみましょう:

  1. ファイルpath/to/abc.ext1は既に存在します。
  2. ファイルを作成せずにすでにmake path/to/abcエコーしています。bla blapath/to/abc
  3. のようmake path/to/abc.ext1に振る舞いたいと思いmake path/to/abcます。現在のセットアップでは、path/to/abc.ext1既に存在するため機能しmakeないため、ルールをトリガーして「再構築」する理由はありません。

あなたの場合、ファイルabcまたはをビルドしていないため、これらが偽のターゲットであるabc.ext1ことを本当に伝える必要があります。(すでに存在していて より新しくても、あなたは働きmakeたいと思いますよね?)make abcabcabc.ext1

単一のファイルの場合、次のようなものがあります。

.PHONY: path/to/abc.ext1 path/to/abc
path/to/abc.ext1 path/to/abc:
        @echo bla bla

このように、make path/to/abc.ext1orはorの存在に関係なくmake path/to/abc常に実行されます(はそれらの存在をチェックしません)。echo bla blapath/to/abc.ext1path/to/abcmake

残念ながら、.PHONYターゲットの明示的なリストが必要です。GNU make を使用すると、ターゲットのリストを計算できます。$(wildcard...)または、サブディレクトリに再帰する必要がある場合は、$(shell find...). 例えば:

EXT1_FILES = $(shell find -type f -name '*.ext1' -print)
PHONY_TARGETS = $(EXT1_FILES) $(EXT1_FILES:.ext1=)

.PHONY: $(PHONY_TARGETS)
$(PHONY_TARGETS):
        @echo bla bla

のファイル名から$(EXT1_FILES:.ext1=)すべての.ext1拡張子を削除するだけ$(EXT1_FILES)です。

ツリーが非常に大きい場合、呼び出しに苦しむことになります:によってロードされる$(shell find...)たびに実行されます。遅すぎる場合は、ファイル名の明示的なリストに置き換えることができます (おそらく自動的に生成されます)。Makefilemake

あなたの質問はコンテキストを提供しないため、より有用な代替案を提案するのは困難です. まだ虐待しようとしているように感じますmakemake foo.ext1「存在する場合でもいくつかのコマンドを実行する必要があります」のようなことを述べるとfoo.ext1、それは怪しいです。echo bla bla引数を 1 つ取り、 everything$1またはexists を実行する単純なシェル スクリプトを作成できません$1.ext1か? makeのセマンティクスを回避しようとするよりも、おそらくはるかに簡単です。

于 2013-04-08T14:08:32.833 に答える