2016-06-10 136 views
0

这似乎与How to write Makefile where target and source files have the same extension?略有关系。在这个问题中,扩展名是相同的,但输入和输出文件似乎在同一个目录中,并且文件名被有条件地重命名。具有相同扩展名的Makefile处理文件

我在../src/大集合.txt文件需要处理,并倒入./(被称为target/目录)作为同名的txt文件。我想使用make,以便只有../src/中已更改的文件才能在./中更新。我想获得原型工作之前,我把真正的代码中

Makefile./如下:。

DIR = ../src 
INPUTS = $(wildcard $(DIR)/*.txt) 
OUTPUTS = $(patsubst $(DIR)/%.txt,%.txt,$(INPUTS)) 

all: $(OUTPUTS) 

.PHONY: $(INPUTS) 

check: 
    @echo "DIR = $(DIR)" 
    @echo "INPUTS = $(INPUTS)" 
    @echo "OUTPUTS = $(OUTPUTS)" 

%.txt: $(DIR)/%.txt 
    sed -e "s/test/cat/g" "$<" > [email protected] 

就目前而言,../src/内容是test1.txttest2.txt。 由于Makefile立即生效,运行make test2.txt会按预期生成文件。

target/ $ make test2.txt 
sed -e "s/test/cat/g" "../src/test2.txt" > test2.txt 

运行make check显示INPUTSOUTPUTS正确。

target/ $ make check 
DIR = ../src 
INPUTS = ../src/test1.txt ../src/test2.txt 
OUTPUTS = test1.txt test2.txt 

如果我运行make all,它会每次生成每个文件。预计这里有.PHONY $(INPUTS)行。

如果我删除了.PHONY $(INPUTS)目标,使得到所有在自己有义务设法发现目标,使../src/test1.txt并不断在它前面的前缀$(DIR),直至它太长的文件名和放弃。

make: stat: ../src/../src/../src/ [repeat for a few pages] ../src/../src/test1.txt: File name too long 
make: stat: ../src/../src/../src/ [repeat for a few pages] ../src/../src/../src/test1.txt: File name too long 
make: *** No rule to make target `../src/../src/../src/[repeat]../src/../src/test1.txt', needed by `../src/[repeat]../src/../src/test1.txt'. Stop. 

它从来没有去处理test2.txt


正如我草拟这一点,我有想法,请从DIR, 的../和重新定位的Makefile所以这是父母双方src/target/。这种方法似乎有效,但并不理想。最终会有这些Makefiles的链条,每个链接都从一个目录拖到另一个目录。

有没有办法将Makefile与生成的目标文件一起保存在'target /'中,并且将这些目标文件基于相对路径中的某些内容?

回答

0

更换

%.txt: $(DIR)/%.txt 

有:

${CURDIR}/%.txt: $(DIR)/%.txt 

这样%.txt没有任何目录匹配任何.txt文件。换句话说,您仅将此规则的范围限制为仅在${CURDIR}/中的文件,这可以防止无限递归。

有关更多详细信息,请参阅§10.5.4 How Patterns Match

这也是很好的做法,以避免相对路径:

DIR = $(abspath ../src) 
+0

完美。我不得不将OUTPUTS = ...行改为OUTPUTS = $(patsubst $(DIR)/%.txt,$ {CURDIR} /%.txt,$(INPUTS))' 。谢谢! –

+0

@MattD。好,'make'对路径有点过于敏感,它只会对字符串进行文件名比较,例如“../src/x”不等于“../src/../src/x”。 –

+0

@MattD。这就是将所有路径转换为绝对值有助于避免此问题的原因。 –

相关问题