我正在使用make编译很多非常相似的目标文件,并希望做类似以下的事情:
BUILD_DIR := ./build/a
BUILD_DIRS += $(BUILD_DIR)
a:
$(CC) $(BUILD_DIR)/file.c
BUILD_DIR := ./build/b
BUILD_DIRS += $(BUILD_DIR)
b:
$(CC) $(BUILD_DIR)/file.c
问题是当我跑
时make a
BUILD_DIR的值是build / b。我预计它会是build / a,什么时候才能解析变量名?有什么容易阅读的方式来做我想要的吗?我尝试了define / endef但得到了相同的结果。
编辑:请注意,建议的答案Immediate variable expansion in recipe无法真正解决此问题。答案是使用特定于目标的变量。请注意,我还需要将变量与非特定于目标的变量一起使用:
BUILD_DIRS += $(BUILD_DIR)
如果该变量是针对特定目标的,我将无法像我想的那样在目标之外使用它。
答案 0 :(得分:2)
Etan关于目标特定变量将解决您的问题的答案,您只需要意识到在分配时解决了:=
(立即/简单)目标特定变量时间,就像其他:=
变量一样。
所以,这将有效:
# Force this to be a simple variable
BUILD_DIRS :=
BUILD_DIR := ./build/a
BUILD_DIRS += $(BUILD_DIR)
a: BUILD_DIR := $(BUILD_DIR)
a:
$(CC) $(BUILD_DIR)/file.c
BUILD_DIR := ./build/b
BUILD_DIRS += $(BUILD_DIR)
b: BUILD_DIR := $(BUILD_DIR)
b:
$(CC) $(BUILD_DIR)/file.c
我个人怀疑有更好的方法可以做到这一点但是没有更多关于你真正需要满足它的要求的信息对推测没用。