2017-05-16 8 views
0

複数のファイルをコピーする必要があります。メイクをしている:GNU makeでファイルをコピーする

FILES=foo.txt d1/bar.dat d2/baz.txt 
TARGETDIR=/app 

targets=$(addprefix $(TARGETDIR)/,$(FILES)) 

all: $(targets) 

$(targets): $(FILES) 
     cp $(subst $(TARGETDIR)/,,[email protected]) [email protected] 

ファイルが正しくコピーされたが、私はtouch foo.txtをすれば、3つのすべてのファイルがコピーされます。

私は「正しい方法は、」のような3つのルールを定義することであることを知っている:

$(TARGETDIR)/foo.txt: foo.txt 
    cp $^ [email protected] 
$(TARGETDIR)/d1/bar.dat: d1/bar.dat 
    cp $^ [email protected] 
$(TARGETDIR)/d2/baz.txt: d2/baz.txt 
    cp $^ [email protected] 

をしかし、この場合には、私は一度これらのルールのため、一度allルールのため、二回のファイルの名前を記述する必要があります。

前提条件の各名前のルールを「乗算する」方法はありますか?あなたがsecondary expansionを使用する場合は、テキスト操作関数を使用してターゲット名を操作することができます

$(TARGETDIR)/%: $(FILES) 
    cp $< [email protected] 

答えて

0

よう 何か:

.SECONDEXPANSION: 
$(targets): $$(patsubst $(TARGETDIR)/%, %, [email protected]) 
    echo cp $< [email protected] 

これが唯一の方法ではありませんが、それはおそらく最も簡単なのです。

関連する問題