Makefile:在prereq中使用目标文件路径

Makefile:在prereq中使用目标文件路径,makefile,gnu-make,Makefile,Gnu Make,我有以下项目结构: +-Makefile +-src/ +-a/ | +-foo.py +-b/ | +-foo.py +-c/ | +-foo.py 每个foo.py文件都是一个名称完全相同的不同文件(即它们有不同的inode,但字面上都称为'foo.py'——当然实际上名称不是foo.py,这只是一个示例) 我希望创建一个GNU Makefile规则,该规则在运行时创建以下结构: +-Makefile +-src/ +-a/ | +-foo.py | +

我有以下项目结构:

+-Makefile
+-src/
  +-a/
  | +-foo.py
  +-b/
  | +-foo.py
  +-c/
  | +-foo.py
每个
foo.py
文件都是一个名称完全相同的不同文件(即它们有不同的inode,但字面上都称为'foo.py'——当然实际上名称不是foo.py,这只是一个示例)

我希望创建一个GNU Makefile规则,该规则在运行时创建以下结构:

+-Makefile
+-src/
  +-a/
  | +-foo.py
  | +-a.zip
  +-b/
  | +-foo.py
  | +-b.zip
  +-c/
  | +-foo.py
  | +-c.zip
这是我所能想到的最接近的一个,尽管它当然失败了,因为在prereqs中使用了一个目标变量,这似乎是不允许的:

SRCDIR = src/
PRJ_DIRS = a b c
SRC_FILE = foo.py

# This next rather nasty line turns PRJ_DIRS in to, e.g., src/a/a.zip etc.
ZIP_FILES = $(addprefix $(SRCDIR),$(join $(PRJ_DIRS),$(PRJ_DIRS:%=/%.zip)))'

build: $(ZIP_FILES)

# Next line crashes because we can't use $@ in the prereq
$(ZIP_FILES): $(addprefix $(dir $@), $(SRC_FILE))
        touch $@
因此,提出问题的一种方式是: 如何编写规则?使用每个相应的
foo.py
文件作为预请求来构建相应的.zip文件?

或者,一个更直接的问题,实际上可能是从错误的角度来看这个问题:
<强> >我如何引用在预置中正在构建的特定目标?< /强>

< P>好的,因为你考虑二次扩展一个KLUGY,它是代码> $(前缀…)> />代码>和代码> $(EVAL)<代码>再次进行救援(一个非常强大的组合)。 用下面的规则替换你的规则,你应该得到你想要的

define rule $(SRCDIR)$(1)/$(1).zip: $(SRCDIR)$(1)/$(SRC_FILE) touch $$@ endef $(foreach dir, $(PRJ_DIRS), $(eval $(call rule,$(dir)))) 定义规则 $(SRCDIR)$(1)/$(1).zip:$(SRCDIR)$(1)/$(SRC_文件) 触碰$$@ 恩德夫 $(foreach dir,$(PRJ_DIRS),$(eval$(调用规则,$(dir)))
看看二次扩展。IIRC,它允许您引用先决条件中的目标变量。@eriktous:是的,我也读过一些关于这方面的内容,但这似乎是一个模糊的问题-我想有一个更好的(可能是显而易见的)方法来做这件事。但我会再看一眼。谢谢