这似乎与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.txt
和test2.txt
。 由于Makefile立即生效,运行make test2.txt
会按预期生成文件。
target/ $ make test2.txt
sed -e "s/test/cat/g" "../src/test2.txt" > test2.txt
运行make check
显示INPUTS
和OUTPUTS
正确。
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 /'中,并且将这些目标文件基于相对路径中的某些内容?
完美。我不得不将OUTPUTS = ...行改为OUTPUTS = $(patsubst $(DIR)/%.txt,$ {CURDIR} /%.txt,$(INPUTS))' 。谢谢! –
@MattD。好,'make'对路径有点过于敏感,它只会对字符串进行文件名比较,例如“../src/x”不等于“../src/../src/x”。 –
@MattD。这就是将所有路径转换为绝对值有助于避免此问题的原因。 –