2013-03-11 80 views
3

我有一个提取一系列tarball的Makefile。现在的规则是这样写的:GNU make:生成提取tarball的规则

dirname: 
     tar zxvf file.tar.gz 

,并依赖于扩大压缩包参考dirname其他目标。但是,为每个压缩包定义一个这样的规则是一种混乱。所以,我试图使用eval函数自动生成这些规则。我的尝试是这样的:

TARFILES = $(wildcard *.tar.gz *.tgz) 
define extract_tmpl = 
$(shell tar tf $(1) | head -1): 
     tar zxvf $(1) 
endef 
$(foreach file, $(TARFILES), $(eval $(call extract_tmpl, $(file)))) 

但它似乎没有工作。我与这个压缩包检测(在同一目录):

$ ls Python-2.6.6.tgz 
Python-2.6.6.tgz 
$ tar tf Python-2.6.6.tgz | head -1 
Python-2.6.6/ 
$ make Python-2.6.6/ 
make-3.79.1-p7: *** No rule to make target `Python-2.6.6/'. Stop. 

好像它应该工作给我,但老实说,我甚至不知道我怎么可以看到它扩展到。这里有什么明显的错误?

回答

5
  • 您不需要在define之后=
  • 应该有以前硬标签的tar zxvf $(1)
  • 可选,定义一个名为default在Makefile中的第一条规则,这取决于将要创建的所有目录,规则,这样,如果你只是运行make,它会提取所有的tarball。
  • 可选,但最好的做法是将default定义为PHONY规则,因为它不会创建任何名为default的文件。

这是怎么Makefile看起来像(和使用在当前目录2个压缩包测试):

TARFILES = $(wildcard *.tar.gz *.tgz) 

define extract_tmpl 
$(shell tar tf $(1) | head -1): 
    tar zxvf $(1) 
#^
# HARD-TAB 
# 
endef 

TAR_DIRS := $(foreach file, $(TARFILES), $(shell tar tf $(file) | head -1)) 

default: $(TAR_DIRS) 

$(foreach file, $(TARFILES), $(eval $(call extract_tmpl, $(file)))) 

.PHONY: default 

一种替代的解决方案,而无需使用eval和刚刚static pattern rules

  • 二手.extract_file.tar.gz.extract_file.tgz作为空文件,如果已经提取,则不重新提取归档文件
  • 号EVAL,但只是静态模式规则,应使其与旧版本作出这样v3.79
  • 清洁

添加的规则的兼容这是Makefile

TARFILES = $(wildcard *.tar.gz *.tgz) 

EXTRACT_TARGETS := $(addprefix .extract_,$(TARFILES)) 
CLEAN_TARGETS := $(addprefix .clean_,$(TARFILES)) 

default: $(EXTRACT_TARGETS) 

clean: $(CLEAN_TARGETS) 

$(CLEAN_TARGETS): .clean_%: .extract_% 
    rm -rf "$(shell tar tf $(patsubst .extract_%,%,$<) | head -1)" 
    rm -f $< 

$(EXTRACT_TARGETS): .extract_%: % 
    tar zxf $< 
    touch [email protected] 

.PHONY: default clean $(CLEAN_TARGETS) 
+0

谢谢,这工作。此外,似乎3.79没有'eval'这是我的问题的一部分。 – FatalError 2013-03-11 22:13:11

+0

@FatalError - 如果您需要使用旧版本的'make',那么只是使用'static pattern rules'并且不使用'eval'就添加了一个替代解决方案。 :) – Tuxdude 2013-03-11 22:20:31