使用变量名称的Makefile规则

时间:2013-06-07 06:17:27

标签: makefile rules

我正在尝试使用相同的makefile编写release来构建我的程序的debugmakefile版本(版本选择将基于env变量)。

我的第一次尝试如下:

PROG  := myProgram

ifdef DEBUG
BUILD := debug
else
BUILD := release
endif

BIN := $(BUILD)/$(PROG)

SRC := main.c

OBJDIR := $(BUILD)/obj/
OBJ    := $(addprefix $(OBJDIR), $(SRC:%.c=%.o))


$(OBJDIR)/%.o: %.c
    $(GCC) $(CFLAGS) -o $@ $<

$(BIN): $(OBJ)
    $(GCC) $(OBJ) -o $@ $(LDFLAGS)

all: $(BIN)

当我尝试make我的项目时,我收到以下错误:

make: *** No rule to make target `release/obj/main.o', needed by `release/myProgram'.  Stop.

当我按$(OBJDIR)/%.o替换规则$(BUILD)/obj/%.o时,make能够匹配规则并构建我的对象文件。

我很困惑:为什么第一条规则不起作用? 我的理解是make会在执行前扩展规则中的变量,因此,最终两个规则看起来都一样吗?

在这种情况下,最佳做法是什么?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你加了一个斜线:

OBJDIR := $(BUILD)/obj/


$(OBJDIR)/%.o: %.c
    ...

规则(如编写)将与目标release/obj//main.o匹配,但没有与release/obj/main.o匹配的规则。

只需删除有问题的斜杠:

OBJDIR := $(BUILD)/obj