我在make中使用目标特定的变量值,它们是可以的,但它不应用于目标和先决条件,只是在食谱中。下面是Makefile:
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)
的一个变体。这使得它不确定。一般来说,目标特定的变量被认为是有害的。
手动:
请注意,给定的先决条件最多只能在每次调用make时构建一次。如果相同的文件是多个目标的先决条件,并且这些目标中的每个目标对于相同的特定于目标的变量具有不同的值,那么要构建的第一个目标将导致构建该先决条件,并且先决条件将从第一个目标继承特定于目标的值。它将忽略来自任何其他目标的特定于目标的值。
回答标题的问题,我知道的一种方法是通过宏的可读性。这里我们更改目标、依赖项和输出目录:
define build_rule
$1: $2
$(CC) $< -o $3/$@
endef
$(eval $(call build_rule z.o,z.c,objs.debug))
这样的宏几乎不受支持,并且会变成相当可怕的代码。
这个问题可以用模式规则更好地解决,但是你不能在那里设置任意的依赖关系。如果您提供需要实现的目标的示例,您可以获得示例解决方案。
您可能正在寻找二次扩展。