2012-05-30 64 views
0

作爲構建過程的一部分,使創建多個.tgz文件:的Makefile:使用一個命令的輸出作爲參數傳遞給其他

blah_1.tgz blah_2.tgz .... blah_n.tgz 

如何調用上的每個文件的另一個命令(例如,rsync)?

在bash,我想:

for file in `ls *.tgz`' do rsync $file DESTINATION; done 

或者:

ls | grep tgz | xargs rsync {} DESTINATION 

但熟悉bash的語法似乎不符合製作。有任何想法嗎?

+0

'rsync'允許多個來源,所以你就應該能夠做到'rsync的* .tgz的DESTINATION' –

+0

+1感謝,但'rsync'僅僅是一個例子這裏,爲了清楚。實際的可執行文件只有一個文件作爲參數。 –

+0

好的 - 當你傳遞一個.tgz文件作爲輸入時,實際的可執行文件是否產生任何輸出文件? –

回答

1

嗯......像這樣的東西應該工作:

TGZ_FILES := blah_1.tgz blah_2.tgz .... blah_n.tgz 
RSYNC_TARGETS := $(TGZ_FILES:%=rsync-%) 

all : $(RSYNC_TARGETS) 

.PHONY : $(RSYNC_TARGETS) 
$(RSYNC_TARGETS) : rsync-% : % 
    rsync $* DESTINATION 

# Omit the following rule 
# if .tgz files are made somewhere else (outside Make), 
# and you assume they are always up-to-date 
$(TGZ_FILES) : %.tgz : ... 
    # rule to make each .tgz file 

此示例使用GNU的以下特點使得:

+0

執行Makefile之前'.tgz'文件不存在,所以它們不能列在文件的頂部。 –

+0

@Adam然後你可以將這段代碼抽取到一個單獨的makefile中,比如'rsync.mk',並在一個子make中調用它:'$(MAKE)-f rsync.mk TGZ_FILES ='...''。 –

相關問題