情况很简单。我有一组文件( .extA)和一个( .extB)。从所有* .extB我用shell脚本生成.extA。然后我想将所有* .extA文件复制到安装目录。生成的文件不会发生这种情况。
convert:
./convertFile.sh
DATA = $(wildcard ./data/*.extA)
TARGET := $(patsubst ./data/%.extA, ../install/data/%.extA, $(DATA))
install: $(TARGET)
../install/data/%.extA: ./data/%.extA
cp -f $< $@
因此,DATA不包含myfile.extA,并且cp不会复制它。作为解决问题的蛮力,我将DATA更改为:
DATA = $(wildcard ./data/*.extA) ./data/targetFile.extA
虽然这解决了这个问题,但我很难相信这不能以更优雅的方式完成。如果我有100个生成的文件怎么办?在这种情况下我错过了什么?在隐式规则完成之前,如何确保不评估DATA?我还尝试使用一个名为convert的规则,但我无法使变量依赖于规则...
我有什么选择?
谢谢!
更新: convertFile.sh脚本获取所有* .extB文件并从中创建extA文件。这实际上对文件中的某些条目执行了base64编码。所以这两个文件不可互换。 将转换规则更改回原始规则,因为这仅适用于最小样本:)。现在是这样的情景:
01.extA
02.extA
03.extA
...
10.extA
11.extB
12.extB
...
98.extB
99.extA
使用make convert将所有* .extB文件转换为extA。但是,由于DATA不包含任何这些文件,因此不会将它们复制到安装目标中。
在一个理想的世界中,我希望实现以下目标: 将extB文件转换为extA文件 - &gt;复制所有axtA文件进行安装(包括生成的文件)
清理规则会删除所有已转换的extA文件,因为它们永远不应该存储在存储库中,但这只是为了获取额外信息,所以我无法进行高级转换,并在当天剩余的时间内使用make。
答案 0 :(得分:0)
你正在做的事情可能是正确的。原因是在处理Makefile时会扩展$(wildcard )
,这是在您创建./data/myfile.extA
之前,因此它不会出现在扩展中。
很难知道其他哪些方法可能适用,因为Makefile中遗漏了很多(我猜测INSTALL
是以某种方式从DATA
推导出来的或者TARGET
,但是你没有向我们展示这一点,例如)。
答案 1 :(得分:0)
如果您不知道将创建*.extA
:
convert:
./convertFile.sh
install: convert
install -d data/*.extA ../install/data/
.PHONY: convert install
如果您可以确定*.extA
的名称(在运行./convertFile.sh
之前),则可以将install: convert
替换为install: names_of_extA
。