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 bla
path/to/abc
make path/to/abc.ext1
に振る舞いたいと思いmake path/to/abc
ます。現在のセットアップでは、path/to/abc.ext1
既に存在するため機能しmake
ないため、ルールをトリガーして「再構築」する理由はありません。あなたの場合、ファイルabc
またはをビルドしていないため、これらが偽のターゲットであるabc.ext1
ことを本当に伝える必要があります。(すでに存在していて より新しくても、あなたは働きmake
たいと思いますよね?)make abc
abc
abc.ext1
単一のファイルの場合、次のようなものがあります。
.PHONY: path/to/abc.ext1 path/to/abc
path/to/abc.ext1 path/to/abc:
@echo bla bla
このように、make path/to/abc.ext1
orはorの存在に関係なくmake path/to/abc
常に実行されます(はそれらの存在をチェックしません)。echo bla bla
path/to/abc.ext1
path/to/abc
make
残念ながら、.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...)
たびに実行されます。遅すぎる場合は、ファイル名の明示的なリストに置き換えることができます (おそらく自動的に生成されます)。Makefile
make
あなたの質問はコンテキストを提供しないため、より有用な代替案を提案するのは困難です. まだ虐待しようとしているように感じますmake
。make foo.ext1
「存在する場合でもいくつかのコマンドを実行する必要があります」のようなことを述べるとfoo.ext1
、それは怪しいです。echo bla bla
引数を 1 つ取り、 everything$1
またはexists を実行する単純なシェル スクリプトを作成できません$1.ext1
か? make
のセマンティクスを回避しようとするよりも、おそらくはるかに簡単です。