gpt4 book ai didi

makefile - GNU make : Generate rules for extracting tarballs

转载 作者:行者123 更新时间:2023-12-02 21:32:13 25 4
gpt4 key购买 nike

我有一个可以提取一系列 tarball 的 Makefile。现在规则写成这样:

dirname:
tar zxvf file.tar.gz

以及依赖于扩展 tarball 引用dirname 的其他目标。但是,为每个 tarball 定义这样的规则有点困惑。因此,我尝试使用 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))))

但是好像不行。我正在使用这个 tarball 进行测试(在同一目录中):

$ 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.

看起来它应该对我有用,但老实说,我什至不确定如何看到它扩展到什么。这里有什么明显的错误吗?

最佳答案

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

这就是 Makefile 的样子(并在当前目录中使用 2 个 tarball 进行测试):

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 等旧版本的 make 兼容
  • 添加了清洁规则

这是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 $@

.PHONY: default clean $(CLEAN_TARGETS)

关于makefile - GNU make : Generate rules for extracting tarballs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com