情况很简单。我有一组文件(.extA)和一个( .extB)。从所有的* .extB我用shell脚本生成.extA。然后我想将所有* .extA文件复制到安装目录。这不会发生在生成的文件中。Makefile生成的文件不被复制
convert:
./convertFile.sh
DATA = $(wildcard ./data/*.extA)
TARGET := $(patsubst ./data/%.extA, ../install/data/%.extA, $(DATA))
install: $(TARGET)
../install/data/%.extA: ./data/%.extA
cp -f $< [email protected]
因此,DATA不包含myfile.extA,并且cp不会复制它。作为蛮力来解决这个问题我改变的数据到:
DATA = $(wildcard ./data/*.extA) ./data/targetFile.extA
虽然这解决了这个问题,我也很难相信,这不能以更优雅的方式来完成。如果我有100个生成的文件怎么办?在这种情况下我错过了什么?我如何确保在隐式规则完成之前不对数据进行评估?我也尝试使用一个叫做convert的规则,但是我不能让这个变量取决于规则...
我的选择是什么?
谢谢!
更新: convertFile.sh脚本选取所有* .extB文件并从它们创建extA文件。这实际上是在文件中的某些条目上进行base64编码。所以这两个文件是不可互换的。 将转换规则更改回原始,因为这只是一个最小样本:)。现在这里是场景:
01.extA
02.extA
03.extA
...
10.extA
11.extB
12.extB
...
98.extB
99.extA
所有这些* .extB文件都转换为extA使用转换。但是,由于DATA不包含任何这些文件,因此它们不会被复制到安装目标中。
在一个理想的世界,我要实现以下目标: 转换的EXTB文件EXTA文件 - >复制所有axtA文件来安装(包括产生的)
干净规则删除所有转换EXTA文件,因为它们应该永远不会在存储库中结束,但这仅仅是为了获得额外的信息,所以我不能在一天中的其他时间进行前期转换并使用make。
两个问题:为什么使用'mkdir -p'而不是'install -D -d'?为什么用'@'隐藏这些命令? –
我不能直接包含任何extB,因为它们的格式不正确。我会更新我的帖子。 –
@TobySpeight问题1:我使用FreeBSD,在其Makefile中定义了几个宏而不创建目录('COPYTREE_SHARE','COPYTREE_BIN'等),并且应该用'mkdir'创建目录。 Q2:它是可选的。 – uzsolt