不复制Makefile生成的文件

时间:2017-08-07 13:37:53

标签: makefile

情况很简单。我有一组文件( .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。

2 个答案:

答案 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