Makefile が使用している
.SUFFIXES: .ext1
.ext1:
echo bla bla
構成ファイル path/to/abc.ext1 があるので、パス/to/abc を正常に動作させます。
make path/to/abc.ext1も機能するようにします。既存の .ext1 ターゲットを再利用できれば素晴らしいと思います。
のルールを追加するだけabc.ext1で、実行make abc.ext1が機能します。サフィックス ルールは、利用可能な明示的なルールがない場合にのみ検索されます。
それがあなたの状況でうまくいかない場合は、問題をより明確に説明してください。
私が理解したことを要約してみましょう:
path/to/abc.ext1は既に存在します。make path/to/abcエコーしています。bla blapath/to/abcmake 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
あなたの質問はコンテキストを提供しないため、より有用な代替案を提案するのは困難です. まだ虐待しようとしているように感じますmake。make foo.ext1「存在する場合でもいくつかのコマンドを実行する必要があります」のようなことを述べるとfoo.ext1、それは怪しいです。echo bla bla引数を 1 つ取り、 everything$1またはexists を実行する単純なシェル スクリプトを作成できません$1.ext1か? makeのセマンティクスを回避しようとするよりも、おそらくはるかに簡単です。