私はディレクトリ構造が次のようなプロジェクトを進めています。
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
。