Linux 当最终目标与Make一起存在时,如何不重新制作先决条件
在以下生成文件中,我希望在最终文件checksums.md5已经存在时,不重新生成所有md5文件:Linux 当最终目标与Make一起存在时,如何不重新制作先决条件,linux,bash,makefile,Linux,Bash,Makefile,在以下生成文件中,我希望在最终文件checksums.md5已经存在时,不重新生成所有md5文件: SOURCEDIR := . SOURCES := $(shell find $(SOURCEDIR) -name '*.gz') STAGES := .md5 CAT := checksums.md5 ALL := $(foreach I, $(STAGES), $(addsuffix $I, $(SOURCES))) all : ${CAT} %.md5: % md5sum $&l
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')
阶段:=.md5
类别:=校验和.md5
全部:=$(foreach I,$(STAGES),$(addsuffix$I,$(SOURCES)))
全部:${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
存在并且是最新的(比源代码更新),则不会执行任何操作。否则,所有md5和将重新计算并存储在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)
SOURCEDIR:=。
MD5DIR:=.md5sums
SOURCES:=$(shell find$(SOURCEDIR)-name'*.gz')
类别:=校验和.md5
全部:=$(addprefix$(MD5DIR)/,$(patsubst%,%.md5,$(SOURCES)))
全部:$(CAT)
$(MD5DIR)/%。md5:%
mkdir-p$(dir$@)和\
md5sum$<>$@
$(类别):$(全部)
cat$^>$@
清洁:
rm-rf$(MD5DIR)$(CAT)
注:
- 只是为了好玩,我使用了一种不同的方法来计算md5sum文件名(
),使用$(ALL)
和addprefix
patsubst
- 在将md5sum文件存储到目标目录之前,需要使用
$(MD5DIR)/%中的
方法创建目标目录mkdir-p
- 如果您的源也在子目录中,并且其中一些可以具有相同的基本名称,则需要使用
的这些目标子目录$(MD5DIR)
- 您可以使用条件句。例如:
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
存在并且是最新的(比源代码更新),则不会执行任何操作。否则,所有md5和将重新计算并存储在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)
SOURCEDIR:=。
MD5DIR:=.md5sums
SOURCES:=$(shell find$(SOURCEDIR)-name'*.gz')
类别:=校验和.md5
全部:=$(addprefix$(MD5DIR)/,$(patsubst%,%.md5,$(SOURCES)))
全部:$(CAT)
$(MD5DIR)/%。md5:%
mkdir-p$(dir$@)和\
md5sum$<>$@
$(类别):$(全部)
cat$^>$@
清洁:
rm-rf$(MD5DIR)$(CAT)
注:
- 只是为了好玩,我使用了一种不同的方法来计算md5sum文件名(
),使用$(ALL)
和addprefix
patsubst
- 在将md5sum文件存储到目标目录之前,需要使用
$(MD5DIR)/%中的
方法创建目标目录mkdir-p
- 如果您的源也在子目录中,并且其中一些可以具有相同的基本名称,则需要使用
的这些目标子目录$(MD5DIR)
*gz.md5
?*gz.md5
是${CAT}
的要求。在我将所有校验和收集到一个文件后进行清理。当您创建C
源代码并想要构建时,将有许多.o
文件,然后是可执行文件。我们不删除对象文件(.o
),因为如果不需要,为什么要重新生成?这也是你的情况。创建一些mid文件以创建最终文件。如果一个.gz
被更新,其.md5
将被更新,您不需要重新计算所有.md5
来创建最终的校验和.md5
。这就是为什么不应该删除*.gz.md5
文件的原因。为什么要删除*gz.md5
?*gz.md5
是${CAT}
的要求。在我将所有校验和收集到一个文件后进行清理。当您创建C
源代码并想要构建时,将有许多.o
文件,然后是可执行文件。我们不删除对象文件(.o
),因为如果不需要,为什么要重新生成?这也是你的情况。创建一些mid文件以创建最终文件。如果一个.gz
被更新,其.md5
将被更新,您不需要重新计算所有.md5
来创建最终的校验和.md5
。这就是为什么不应该删除*.gz.md5
文件的原因。我不像md5sum$^>S@那样做的原因是,像make-j 8那样运行它将没有效果。我之所以使用make,是因为它可以同时运行多个文件:)(当然,这在Python中也是可行的)在您的第二个代码块中,我还可以从CLI运行md5sum*gz>checksums.md5在您的第二个代码块中,我还可以从CLI运行md5sum*gz>checksums.md5:是的,绝对可以,如果您的所有源文件都在当前目录中,并且您不关心重新计算最新的校验和.md5
。我不喜欢md5sum$^>$@
的原因是,像make-j8那样运行它将没有任何效果:是的,但是您也将只生成一个shell,而不是每个源文件生成一个shell。根据源文件的数量和大小,3个解决方案各自的运行时间可能会令人惊讶…我很高兴提供一个解决方案并解释这不是最好的主意。我之所以不像md5sum$^>S@那样运行它,是因为像make-j 8那样运行它不会产生任何效果。我之所以使用make,是因为它可以同时运行多个文件:)(当然,这在Python中也是可行的)在您的第二个代码块中,我还可以从CLI运行md5sum*gz>checksums.md5在您的第二个代码块中,我还可以从CLI运行md5sum*gz>checksums.md5:是的,绝对可以,如果