多个冒号和makefile中的等号(需要说明)

时间:2012-07-11 05:19:29

标签: makefile

这只是一个makefile的一部分。我不太明白发生了什么。

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)

我理解的是这些行将.cpp文件编译成.o,在'print-opts'之后用'cc-command'编译。但我不懂语义。

如果我展开'OBJS'的宏,这一行应该是:

$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)

对我来说,它看起来像'$(SRCS:$(SRC)/%。cpp = $(OBJ)/%。o)',它声称$(SRC)中的所有.cpp都会来.o在$(OBJ)中,但这取决于$(OBJ)/%。o,这取决于$(SRC)/%。cpp。这没有意义......

我不明白这里等号的含义是什么,以及多个冒号的意思。

1 个答案:

答案 0 :(得分:16)

假设您已经定义了这三个变量(如果没有,那么规则将无法正常工作):

SRC = source_dir
OBJ = object_dir
SRCS = source_dir/foo.cpp source_dir/bar.cpp

现在考虑作业

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)

这是substitution reference;它表示“对于$(SRCS)中具有$(SRC)/%.cpp形式的任何内容,请将其更改为$(OBJ)/%.o”。因此OBJS将评估为object_dir/foo.o object_dir/bar.o

现在规则:

$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)

Thuis是static pattern rule。它指定目标列表($(OBJS)),目标模式($(OBJ)/%.o)和先决条件模式($(SRC)/%.cpp)。使匹配成为目标模式的目标,并使用它来构造先决条件名称。因此,如果Make使用此规则来构建object_dir/foo.o,则词干将为foo,先决条件为source_dir/foo.cpp

(你没有询问| print-opts,所以我认为它已经很清楚了。)