1

作業ディレクトリの外部からファイルをコピーすることによって生成される複数のターゲットを持つmakefileがあります。

a.tex   : $(wildcard /foo/work1/a.tex)
    cp -p $< $@

b.tex   : $(wildcard /foo/work2/b.tex)
    cp -p $< $@

$(wildcard)にアクセスできないシステムでMakeを実行することがあるため、これを使用し/fooます。

cp -p $< $@すべてのルールに対してコマンドを繰り返さないようにするための最良の方法は何ですか?いくつかのオプション:

  • %.tex : %.texルールを設定します。これは機能しますが、具体的に示されていないターゲットにも適用されるため、次のような警告がたくさん表示されます。make: Circular a.tex <- a.tex dependency dropped.
  • を使用してコマンドのシーケンスを定義しますdefine。コマンドは1行しかないため、これは無意味に思えます。したがって、すべてのルールにコピーする代わりに、シーケンスをcp $< $@定義してすべてのルールにコピーします。cp-depcp-dep
  • コマンドを変数として定義して、次のことができるようにしますa.tex : $(wildcard /foo/work1/a.tex); $(CP-DEP)
  • 追加のルールとしてターゲット名を複製します。a.tex b.tex : ; cp -p $< $@。エラーを起こしやすい。
  • コピーして貼り付けるだけです。不格好ですが、効果的で理解しやすいです。
4

3 に答える 3

2

I haven't tested it, but can't you just use a pattern rule without prerequisites, and specify the prerequisite for each target on a separate line?

a.tex: $(wildcard /foo/work1/a.tex)
b.tex: $(wildcard /foo/work2/b.tex)

%.tex:
    cp -p $< $@

Btw. doesn't the wildcard function return the empty string when it doesn't find a match, so that $< is empty as well? Wouldn't that give a problem with cp?

于 2011-10-28T23:41:46.737 に答える
2

私はあなたcopyruleがやり過ぎだと思います(そして柔軟性がありません)。@eriktousのソリューションに対する反対意見が、依存関係を明示的に定義していないターゲットにルールを適用することである場合、静的パターンルールで簡単に修正できます。

a.tex: $(wildcard /foo/work1/a.tex)
b.tex: $(wildcard /foo/work2/b.tex)
blue.tex: $(wildcard /some/other/path/green.tex)

TEXES = a.tex b.tex

$(TEXES): %.tex:
    cp -p $< $@

(これで問題が解決した場合は、eriktousの答えを受け入れる必要があります。これは単なるバリエーションです。)

于 2011-10-30T02:36:38.997 に答える
1

私はこれをすることになった:

COPYFILES = /foo/work1/a.tex /foo/work2/b.tex

define copyrule
$(notdir $(1)): $$(wildcard $(1))
    cp -p $$< $$@
endef
$(foreach file,$(COPYFILES),$(eval $(call copyrule,$(file))))

この方法の利点は、最小限の定型文で新しいファイルを簡単に追加でき、このルール部分を新しいMakefileに簡単にコピーできることです。欠点は、宛先ファイル名を変更できなくなったことと、makefileの経験が少ない人にとっては実装がかなり不透明になることです。

于 2011-10-30T00:17:28.423 に答える