gpt4 book ai didi

Makefile处理同扩展名的文件

转载 作者:行者123 更新时间:2023-12-04 02:11:26 25 4
gpt4 key购买 nike

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

我在 ../src/ 中有大量 .txt 文件需要处理,并转储到 ./ (这是一个名为 target/ 的目录)作为同名的 txt 文件。我想使用 make,这样只有 ../src/ 中已更改的文件才会在 ./ 中更新。我希望在放入实际代码之前让原型(prototype)正常工作。

我在./中的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/的内容是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) 目标,Make 将全部绑定(bind)在自己身上,试图找到目标以制作 ../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 与生成的目标文件一起保存在“target/”中,并使这些目标文件基于相对路径中的某些内容?

最佳答案

替换

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

与:

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

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

参见 §10.5.4 How Patterns Match了解更多详情。

避免相对路径也是一种很好的做法:

DIR = $(abspath ../src)

关于Makefile处理同扩展名的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com