gpt4 book ai didi

linux - 当 Make 存在最终目标时如何不重新制作先决条件

转载 作者:太空宇宙 更新时间:2023-11-04 09:17:31 25 4
gpt4 key购买 nike

在下面的 Makefile 中,当最终文件:checksums.md5 已经存在时,我希望 make 不要重新制作所有 md5 文件:

SOURCEDIR := .
SOURCES := $(shell find $(SOURCEDIR) -name '*.gz')
STAGES := .md5
CAT := checksums.md5
ALL := $(foreach I, $(STAGES), $(addsuffix $I, $(SOURCES)))

all : ${CAT}

%.md5: %
md5sum $< > $@

${CAT} : ${ALL}
cat $^ >> $@
rm *gz.md5

最佳答案

您可以使用条件。示例:

SOURCEDIR := .
SOURCES := $(shell find $(SOURCEDIR) -name '*.gz')
STAGES := .md5
CAT := checksums.md5
ALL := $(foreach I,$(STAGES),$(addsuffix $(I),$(SOURCES)))

ifeq ($(wildcard $(CAT)),)

all: $(CAT)

%.md5: %
md5sum $< > $@

$(CAT): $(ALL)
cat $^ >> $@
rm $(ALL)

else

all:
@echo "Nothing to be done"

endif

说明:如果 checksums.md5 存在,$(wildcard $(CAT)) 将扩展为 checksums.md5(不是空的string) 和 ifeq 条件将实例化 elseendif 之间的内容。如果 checksums.md5 不存在,$(wildcard $(CAT)) 将扩展为空字符串,ifeq 条件将实例化什么介于 ifeqelse 之间。这有点像您针对两种情况使用了两个不同的 Makefile。

注意事项:

  • 我在您的 foreach 调用中抑制了无用的空格(使用 make 避免无用的空格,它们可能会影响它的行为)。
  • 不要压缩ifeq($(wildcard...之间的空格,这是需要的。
  • 我用括号替换了花括号(过时的)。
  • 我在对非自动变量 ($I => $(I)) 的引用中添加了括号,因为强烈建议这样做。
  • 我将 rm *gz.md5 替换为 rm $(ALL) 如果您在子目录中有一些源代码,这似乎更好。

一般性评论:您所做的不符合 make 理念。 make 根据文件的最后修改时间和一组目标先决条件依赖规范来决定应该做什么和不应该做什么。如果你不使用 make 的这个特性,你可能根本不应该使用它。任何脚本语言(bash、python、perl...)可能会更好。

如果你不想要这些部分的md5文件,为什么不直接把和放在checksums.md5中呢?示例:

SOURCEDIR := .
SOURCES := $(shell find $(SOURCEDIR) -name '*.gz')
CAT := checksums.md5

all: $(CAT)

$(CAT): $(SOURCES)
md5sum $^ > $@

clean:
rm -f $(CAT)

如果 checksums.md5 存在并且是最新的(比源代码更新),则什么都不做。否则,将重新计算所有 md5sums 并将其存储在 checksums.md5 中。

如果您的问题是避免重新计算未更改文件的 md5sum,则需要跟踪上次计算它们的时间,没有比保留这些中间 md5sum 文件更好的方法了。但如果您愿意,您可以将它们全部放在一个单独的目录中:

SOURCEDIR := .
MD5DIR := .md5sums
SOURCES := $(shell find $(SOURCEDIR) -name '*.gz')
CAT := checksums.md5
ALL := $(addprefix $(MD5DIR)/,$(patsubst %,%.md5,$(SOURCES)))

all: $(CAT)

$(MD5DIR)/%.md5: %
mkdir -p $(dir $@) && \
md5sum $< > $@

$(CAT): $(ALL)
cat $^ > $@

clean:
rm -rf $(MD5DIR) $(CAT)

注意事项:

  • 为了好玩,我使用了一种不同的方法来计算 md5sum 文件名 ($(ALL)),使用 addprefixpatsubst
  • $(MD5DIR)/%.md5: % 配方中的 mkdir -p 需要在将 md5sum 文件存储到其中之前创建目标目录。
  • 如果您的源也在子目录中并且其中一些可以具有相同的基本名称,则需要这些 $(MD5DIR) 的目标子目录。

关于linux - 当 Make 存在最终目标时如何不重新制作先决条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45502410/

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