gpt4 book ai didi

makefile - 如果设置了变量,如何强制重建目标?

转载 作者:行者123 更新时间:2023-12-01 00:57:47 24 4
gpt4 key购买 nike

假设我有一个构建目标 foo:

foo:foo.c
$(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo

现在, ARGS是我在命令行上传递的东西:
$ make ARGS:=-DX=1 foo

所以,我需要绕过 make 的聪明才智,因为 foo target 不仅取决于哪些文件发生了变化,还取决于 ARGS 的值.

有什么东西可以做到这一点吗?我的黑客(见答案)似乎不是最优雅的,但它有效。有什么更好的吗?

最佳答案

这是针对您的特定问题的一般解决方案。

您希望能够依赖变量作为先决条件。也就是说,您可以将其作为 makefile 中任何目标的先决条件,并且当变量的值发生变化时,您重建这些目标。

这是一个执行此操作的函数,您使用此函数声明一个变量是可靠的,然后您可以将其用作先决条件。

请注意,如果在命令行中未使用该变量,则仍然意味着该变量仍有值,即空字符串。

define DEPENDABLE_VAR

.PHONY: phony
$1: phony
@if [[ `cat $1 2>&1` != '$($1)' ]]; then \
echo -n $($1) > $1 ; \
fi

endef

#declare ARGS to be dependable
$(eval $(call DEPENDABLE_VAR,ARGS))


foo:foo.c ARGS
$(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo

事实上,我们可以省略“声明”的需要,只需编写一个类似的函数,使所有变量在默认情况下都是可靠的。但我不喜欢那样。我更喜欢修改我编写的 makefile 的用户,明确声明他们的意图。这对他们有好处:)

关于makefile - 如果设置了变量,如何强制重建目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26145267/

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