gpt4 book ai didi

makefile - 如何避免覆盖目标或抑制警告

转载 作者:行者123 更新时间:2023-12-04 17:33:48 24 4
gpt4 key购买 nike

我想创建一个包含在其他文件中的 makefile,有点像“库”,我们称它为 library.mak:

TARGET_FILES = a.txt b.txt c.txt d.txt
SRC_FOLDER = somewhere/else
.PHONY: all
all:
for target in ${TARGET_FILES} ; do \
echo -e "\nMaking $${target}:" ;\
${MAKE} ${MFLAGS} --no-print-directory $${target} ;\
done

.PHONY: ${TARGET_FILES}
${TARGET_FILES}:
cp ${SRC_FOLDER}/$@ $@

这两条规则分别用于制定所有目标和一个特定目标;使用默认规则(这是 library.mak 的目的)。

在名为 Makefile 的“用户 makefile”中,我想执行以下操作:

include library.mak

# special handling of c.txt
c.txt:
grep -v 'all except this' ${SRC_FOLDER}/$@ > $@

如您所见,用户希望能够覆盖某些特殊情况下的行为。虽然这有效,但它总是用可怕的 warning: overriding recipe for targetwarning: ignoring old commands for target 消息问候用户,即使行为是预期的。

所以问题来了:是否可以通过其他方式避免这些警告,或者是否有办法抑制它们?

最佳答案

警告说您覆盖了一个显式规则的配方。这真的是错误的。改为使用模式规则是有意义的,例如:%.txt: ${SRC_FOLDER}/%.txt。然后可以有一些明确的规则 (c.txt: ${SRC_FOLDER}/c.txt) 覆盖食谱。当然,这不是 100% 相同,但是,我认为这应该不是问题。无论如何,将明确的规则放入可重用文件中是一种犯罪行为。

接下来,你不断地使用“骗子”和没有先决条件的规则,即使你确实应该有它们。这是不好的。您正在尝试使“make”作为非分支 shell 脚本工作。这不仅效率低下,而且是一种滥用。基本上,make 可以被视为能够“以复杂的方式在文件时间戳上分支”的“shell 扩展”。如果不需要,请完全不要使用 make。

接下来,我认为完全没有理由进入递归 make。不管你要做什么,我相信,你可以没有它。即使您确实需要递归,也只需编写 $(MAKE)$(MFLAGS) 不应再使用(阅读 this )。

附言还有另一个(更灵活的)选项来定义参数化变量(宏)。例如:

define nl :=


endef
define myrule.text
$1: $2/$1
@cp $$< $$@
endef
myrule = $(eval $(foreach foo$0,$1,$(call myrule.text,$(foo$0),$2)$(nl)))
...
# user makefile
# for everything except c.txt call predefined macro
$(call myrule,$(filter-out c.txt,$(TARGET_FILES)),$(SRC_FOLDER))
# for c.txt only
c.txt: $(SRC_FOLDER)/c.txt
grep -v 'all except this' $< >$@

但是如您所见,它有点“神秘”,我不想向初学者推荐它。

关于makefile - 如何避免覆盖目标或抑制警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57518076/

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