大佬教程收集整理的这篇文章主要介绍了GNU 制造 |可以在执行时更改规则的目标和先决条件吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 make 中使用特定于目标的变量值,它们没问题,但它不适用于目标和先决条件,仅适用于配方。这是生成文件:
CXX := g++
TARGET := exec
BIN.PATH =
sourcES := $(wildcard *.cpp)
OBjeCTs.name := $(patsubst %.cpp,%.o,$(sourcES))
OBjeCTs.PATH = $(addprefix $(BIN.PATH)/,$(OBjeCTs.Name))
deBUG: BIN.PATH = deBUG
deBUG: $(TARGET)
$(TARGET): $(OBjeCTs.PATH)
@echo $(BIN.PATH) # deBUG
@echo $(OBjeCTs.PATH) # deBUG/main.o
@echo $^ # /main.o
# ...
$(BIN.PATH)/%.o: %.cpp
@echo $@ # /main.o
# ...
任何想法如何解决它?还是不可能?
不要通过向依赖项添加特定于目标的变量来重用目标。只会构建给定目标 $(TARGET)
的一种变体。这使得它具有不确定性。通常,特定于目标的变量是 considered harmful。
The manual:
请注意,每次调用 make 时,给定的先决条件最多只能构建一次。如果同一个文件是多个目标的先决条件,并且这些目标中的每一个对于相同的特定于目标的变量具有不同的值,则要构建的第一个目标将导致该先决条件被构建,并且先决条件将继承目标-来自第一个目标的特定值。它将忽略来自任何其他目标的特定于目标的值。
回答标题问题,我知道的一种方法是通过宏的可读性。这里我们更改目标、依赖项和输出目录:
define build_rule
$1: $2
$(CC) $< -o $3/$@
endef
$(eval $(call build_rule z.o,z.c,objs.debug))
这样的宏几乎无法支持,并且会变成非常可怕的代码。
使用模式规则可以更好地解决这个问题,但是您不能在那里设置任意依赖项。如果您提供需要实现的示例,您可以获得示例解决方案。
,您可能正在寻找secondary expansion。
以上是大佬教程为你收集整理的GNU 制造 |可以在执行时更改规则的目标和先决条件吗?全部内容,希望文章能够帮你解决GNU 制造 |可以在执行时更改规则的目标和先决条件吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。