我的linux c ++ gnu makefile变量扩展不符合我的预期

时间:2018-11-18 19:51:35

标签: c++ linux makefile

我创建了以下makefile小片段。 注意:我已将其作为问题的最小示例,因此它是毫无意义的makefile。

TARGET = none
OBJ_BASE_DIR = obj

# Linux x86 c++ compiler
.PHONY: build_cpp_x86Linux
build_cpp_x86Linux: TARGET = x86Linux
build_cpp_x86Linux: build

OBJ_DIR = $(addsuffix /$(TARGET),$(OBJ_BASE_DIR))

$(info TARGET IS: $(TARGET))
$(info OBJ_DIR IS: $(OBJ_DIR))

build: $(OBJ_DIR)/test.o
    @echo building, OBJ_DIR: $(OBJ_DIR)

# pattern rule
$(OBJ_DIR)/%.o:
    @echo "compiling $@"

这是调用make的输出:

TARGET IS: none
OBJ_DIR IS: obj/none
compiling obj/none/test.o
building, OBJ_DIR: obj/x86Linux

从输出中您可以看到它正在尝试编译obj/none/test.o,但是我要它执行的是尝试编译obj/x86Linux/test.o。我不太确定这是怎么回事。我想我知道makefile在第一次通过时会扩展变量(这将导致TARGET = none),但是我认为一旦我调用了目标build_cpp_x86Linux并将其设置为目标,它将再次重新扩展变量。 TARGET对x86Linux的价值...

我在这里做错了什么,应该怎么做?

1 个答案:

答案 0 :(得分:1)

您还可以使用:

TARGET?=none

然后在命令行TARGET = x86Linux上覆盖

您还可以使用ifdef或其他扫描if操作来基于这些参数或环境变量设置不同的变量。