Makefile 如何使用GNU make更新包含特定文件的所有子目录中的文件?

Makefile 如何使用GNU make更新包含特定文件的所有子目录中的文件?,makefile,gnu-make,Makefile,Gnu Make,在我的项目中,我有一组包含package.yaml文件的子目录,例如: A/package.yaml B/package.yaml C/package.yaml 如果我运行hpacka/package.yaml,则会(重新)生成文件A/A.cabal。这些目录的列表会随着时间的推移而改变,因此我想使用GNU make查找包含package.yaml文件的所有直接子目录,并使用hpack生成相应的.cabal文件 我尝试了这个基于,但没有成功: HPACK_FILES := $(wildcard

在我的项目中,我有一组包含
package.yaml
文件的子目录,例如:

A/package.yaml
B/package.yaml
C/package.yaml
如果我运行
hpacka/package.yaml
,则会(重新)生成文件
A/A.cabal
。这些目录的列表会随着时间的推移而改变,因此我想使用GNU make查找包含
package.yaml
文件的所有直接子目录,并使用hpack生成相应的
.cabal
文件

我尝试了这个基于,但没有成功:

HPACK_FILES := $(wildcard */package.yaml)
PKG_DIRS := $(subst /,,$(dir $(HPACK_FILES)))
CABAL_FILES := $(addsuffix .cabal,$(join $(dir $(HPACK_FILES)),$(PKG_DIRS)))

test:
    @echo $(CABAL_FILES)

update-cabal: $(CABAL_FILES)

%.cabal: package.yaml
    hpack $<
HPACK_文件:=$(通配符*/package.yaml)
PKG_DIRS:=$(subst/,$(dir$(HPACK_文件)))
CABAL_文件:=$(addsuffix.CABAL,$(join$(dir$(HPACK_文件)),$(PKG_DIRS)))
测试:
@echo$(阴谋集团文件)
更新阴谋集团:$(阴谋集团文件)
%.cabal:package.yaml
hpack$<
然而,
make update cabal
说没有什么可以做的<代码>进行测试但是输出的是正确的阴谋集团文件。我怎样才能解决这个问题

干杯

问题在于:

%.cabal: package.yaml
没有文件
package.yaml
。这些文件的名称类似于
A/package.yaml
。这不是一回事

由于先决条件不存在,make决定此模式规则无法匹配,因此它将寻找另一个可能能够构建目标的规则。它找不到任何可以构建目标的规则,所以make说没有什么可以做的,因为所有的输出文件都已经存在

不幸的是,使用make要做的事情一点也不容易,因为make最适合使用由扩展名或类似文件名绑定在一起的输入和输出文件。特别是,对于变量部分重复多次的关系(如,
a/a.cabal
中重复的
a
),它确实很难处理。要做到这一点,没有简单的方法

为此,您必须使用高级功能,如
eval
。比如:

# How to build a cabal file
%.cabal:
        hpack $<

# Declare the prerequisites
$(foreach D,$(dir $(HPACK_FILES)),$(eval $D/$D.cabal: $D/package.yml))
#如何构建阴谋集团文件
%.阴谋集团:
hpack$<
#声明先决条件
$(foreach D,$(dir$(HPACK_文件)),$(eval$D/$D.cabal:$D/package.yml))