Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当最终目标与Make一起存在时,如何不重新制作先决条件_Linux_Bash_Makefile - Fatal编程技术网

Linux 当最终目标与Make一起存在时,如何不重新制作先决条件

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

在以下生成文件中,我希望在最终文件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 $< > $@

${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:是的,绝对可以,如果