パターンに一致するすべてのファイルにルールを適用するようにmakeに指示する方法はありますか?

パターンに一致するすべてのファイルにルールを適用するようにmakeに指示する方法はありますか?

私はディレクトリ構造が次のようなプロジェクトを進めています。

inputs/
   a.txt
   b.txt
   c.txt

outputs/
   a.out
   b.out
   c.out

makefile

フォルダ内のファイルはoutputsフォルダ内のファイルから生成され、inputs入力ファイルのいずれかが変更されるたびに自動的に更新したいと思います。

私はパターンルールを使用してmakefileを生成してこれを実行しようとしました。 (質問を簡単にするために入力ファイルを変換せずにコピーのみしました)

outputs/%.txt: inputs/%.out
    cp $< $@

しかし、このメイクファイルは私が望む効果を正しく得ることができません。実行すると、make outputs/a.txt私が作成したルールが適用され、出力ファイルが古い場合は出力ファイルが再生成されます。ただし、実行すると、次のようになりますmake

make: *** No targets.  Stop.

デフォルトでは、入力フォルダ内の各ファイルに対して出力ファイルを作成したいことをmakeに知らせる方法はありますか?

編集する:出力ファイルに入力ファイルとは異なるファイルサフィックスがあります。

ベストアンサー1

通常、次のmakefileを使用してこれを行います。

IN = $(wildcard inputs/*.txt)
OUT = $(subst inputs/,outputs/,$(IN))

outputs/%.txt: inputs/%.txt
        cp $< $@

default:  $(OUT)

これにより、デフォルトの宛先(ファイルの最初の宛先)は、ディレクトリ文字列がOUT入力から出力に変更される既存のファイルのグローバル拡張に依存します。IN


サフィックスを変更したい場合は、ターゲットで機能する他の組み込み関数がたくさんあります。たとえば、中間タスクを追加できます。

IN2 = $(addsuffix .out,$(basename $(IN)))

このbasename関数は末尾を削除し、.txt末尾addsuffixを追加します.out

おすすめ記事