这似乎与如何在目标文件和源文件具有相同扩展名的地方编写Makefile有关。。在该问题中,扩展名相同,但是输入和输出文件似乎在同一目录中,并且文件名有条件地重命名。
我有大量.txt
文件../src/
需要处理,然后作为同名txt文件转储到./
(称为目录target/
)中。我要使用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" "$<" > $@
目前,../src/
aretest1.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)
目标,Make将束缚自己,试图找到要建立的目标,../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/
。这种方法似乎可行,但并不理想。最终将有这些Makefile链,每个Makefile从一个目录拉到另一个目录。
有没有一种方法可以将Makefile
'target /'与生成的目标文件保持在一起,并以相对路径中的某些目标文件为基础?
代替
%.txt: $(DIR)/%.txt
和:
${CURDIR}/%.txt: $(DIR)/%.txt
这种方式%.txt
与.txt
任何目录中的任何文件都不匹配。换句话说,您将此规则的范围限制为${CURDIR}/
仅包含文件,这样可以防止无限递归。
有关更多详细信息,请参见§10.5.4模式如何匹配。
避免相对路径也是一种好的做法:
DIR = $(abspath ../src)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句