GNU make:define,eval和多文件目标

时间:2018-01-30 14:23:26

标签: makefile gnu-make

我正在尝试以下Makefile,现在我遇到了这个错误,我需要一些帮助(也许还有一些建议)。

这就是我想要实现的目标:我有一个程序可以从生活在同一目录中的一堆其他文件开始生成大量输出文件。然后我必须为其中几个目录运行该程序。每个目标都是这样的:

output_1 output_2 ... output_n : input_1 input_2 ... input_m
    program args 

这是完整的Makefile:

SRCDIR  = <...>
DESTDIR = <...>
JOBT4Z  = <...>

# function to change the position of the directory tree
changetree = $(shell echo $(2)/$(shell echo $(1) | rev | cut -d'/' -f-4 | rev))

# get all directories with input files to be processed
DIRS = $(wildcard ../../*/*/*/edep ../../*/*/*/coin)

# extract infos from path to later build output file names
volume  = $(shell echo $(1) | cut -d "/" -f3)
part    = $(shell echo $(1) | cut -d "/" -f4)
isotope = $(shell echo $(1) | cut -d "/" -f5)
deptype = $(shell echo $(1) | cut -d "/" -f6)

# array with runIDs
RUNS = $(shell seq 53 65) 67 $(shell seq 69 89)

# function to build the output file name
# ARG1: directory with raw files
# ARG2: runID
t4zfile = t4z-$(call volume,$(1))-$(call part,$(1))-$(call isotope,$(1))-$(call deptype,$(1))-run$(2).root

# function to get the list of output files that will be created for one job
# ARG1: directory with input files
out4zfiles = $(foreach id,$(RUNS),$(call changetree,$(1)/$(call t4zfile,$(1),$(id)),$(DESTDIR)))

# variable holding *all* the output files
ALLT4Z = $(foreach dir,$(DIRS),$(call out4zfiles,$(dir)))

all : $(ALLT4Z)

# the dependencies are set to be the input files, so if they change the
# corresponding output files are re-processed
define t4z-recipe-template
  $(call out4zfiles,$(1)) : $(wildcard $(call changetree,$(1),$(SRCDIR))/raw-*.root)
  $(JOBT4Z) $(call changetree,$(1),$(SRCDIR)) $(DESTDIR) > /dev/null
endef

# run!
$(foreach dir,$(DIR),$(eval $(call t4z-recipe-template,$(dir))))

clean :
    -rm -rf $(T4ZFILES)

.PHONY : clean all

核心线是:

define t4z-recipe-template
  $(call out4zfiles,$(1)) : $(wildcard $(call changetree,$(1),$(SRCDIR))/raw-*.root)
  $(JOBT4Z) $(call changetree,$(1),$(SRCDIR)) $(DESTDIR) > /dev/null
endef

# run!
$(foreach dir,$(DIR),$(eval $(call t4z-recipe-template,$(dir))))

所有其余的基本上都是用字符串播放,我已经调试了它,它应该按预期工作。

首先,如果我尝试运行它,我会从$(foreach dir,$(DIR),$(eval $(call t4z-recipe-template,$(dir))))行收到“缺少分隔符”错误,我不知道为什么。其次,我确信这不起作用,因为$(call out4zfiles,$(1))不会在同一个目标中展开

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:0)

“缺少的分隔符”错误来自tab部分中缺少的define,尽管idkw报告的示例here在没有它的情况下工作...还要添加分号{{1显然,在先决条件列表工作之后有一个换行符;

进一步了解文档我意识到多项目目标实际上等同于每个项目的规则,因此实际上不需要它。