2012-05-30 30 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 ='...''。 –

相关问题