2014-10-27 93 views
0

假設我有一組源文件:makefile中通配符擴展的目標

src/foo/file.abc 
src/foo/otherfile.abc 

,我希望做一些操作(爲簡單起見,我們只能說副本),導致在幾個不同的地方的目標文件夾:

dest/bar/file.xyz 
dest/bar/otherfile.xyz 
dest/baz/file.xyz 
dest/baz/otherfile.xyz 
dest/something/file.xyz 
dest/something/otherfile.xyz 

如何在Makefile中表達該依賴關係,以便更新先決條件文件會導致配方重新創建目標?

GNU Make manual「在目標和先決條件中自動執行make通配符擴展」。通過走出去,我希望

dest/*/%.xyz : src/foo/%.abc 
    install -d $< [email protected] 

工作,但它失敗:

$ make -f test.mk dest/bar/file.xyz 
make: *** No rule to make target `dest/bar/file.xyz'. Stop. 

我誤解的目標通配符擴展?有什麼更好的方式來實現我所追求的?

環境: GNU讓3.82.90
32位Cygwin的

回答

0

我發現它依賴於GNU擴展.SECONDEXPANSION,這是不理想,但總比沒有強的解決方案:

.SECONDEXPANSION: 
dest/%.xyz : src/foo/$$(@F) 
    install -D $< [email protected] 
0

這不是完全清楚你以後。這個怎麼樣:

dest/%.xyz: 
    cp src/foo/$(notdir $*).abc [email protected] 

現在make -f test.mk dest/bar/file.xyz將複製到src/foo/file.abcdest/bar/file.xyz。是你想要它做的所有事情,還是你希望它將文件複製到其他目的地,或者在同一操作中複製其他文件,或者什麼?

+0

這將工作,除了它是我真正關心的依賴檢查。如果更新了'src/foo/file.abc',則需要重新創建所有'dest/*/file.xyz'。 – etheranger 2014-10-27 05:45:28

0

按照shell執行是通配符擴展。如果您沒有任何目標文件,擴展將不會有任何效果。 Make不能神奇地找出你想要的目標文件。

所以,你需要聲明你想要的目標文件,並繼續像這樣:

DEST_FILES := \ 
    dest/bar/file.xyz \ 
    dest/bar/otherfile.xyz \ 
    dest/baz/file.xyz \ 
    dest/baz/otherfile.xyz \ 
    dest/something/file.xyz \ 
    dest/something/otherfile.xyz \ 

.PHONY: all 
all: $(DEST_FILES) 

.SECONDEXPANSION: 

$(DEST_FILES): %xyz: src/foo/$$(notdir $$*)abc Makefile 
    cp $< [email protected]