我创建了以下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的价值...
我在这里做错了什么,应该怎么做?
答案 0 :(得分:1)
您还可以使用:
TARGET?=none
然后在命令行TARGET = x86Linux上覆盖
您还可以使用ifdef
或其他扫描if
操作来基于这些参数或环境变量设置不同的变量。