2017-08-07 43 views
0

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

回答

0

如果你不知道什么*.extA将被创建:

convert: 
    ./convertFile.sh 

install: convert 
    install -d data/*.extA ../install/data/ 

.PHONY: convert install 

如果你能确定(运行./convertFile.sh之前)*.extA名字可以更换install: convertinstall: names_of_extA

+0

两个问题:为什么使用'mkdir -p'而不是'install -D -d'?为什么用'@'隐藏这些命令? –

+0

我不能直接包含任何extB,因为它们的格式不正确。我会更新我的帖子。 –

+0

@TobySpeight问题1:我使用FreeBSD,在其Makefile中定义了几个宏而不创建目录('COPYTREE_SHARE','COPYTREE_BIN'等),并且应该用'mkdir'创建目录。 Q2:它是可选的。 – uzsolt

0

你在做什么可能是正确的。原因是在处理Makefile时扩展$(wildcard),这是在创建./data/myfile.extA之前扩展的,所以它不会出现在扩展中。

很难知道其他的方法可能适用什么,因为有这么多在Makefile中失踪(我猜INSTALLDATATARGET某种程度上得到,但你没有告诉我们该位,例如)。

+0

你是对的,我完全错误的那一点。这是TARGET,而不是INSTALL,只是盖住并键入规则名称。除此之外,我的Makefile中没有其他信息。只有名称已更改。 –

+0

你建议你可能有100个生成的文件,但不清楚它们是否会使用模式规则生成;我也无法分辨'TARGET'中是否有文件使用这个Makefile没有生成。 –