通过命令行附加到GNU makevariables
我正在使用一个GNU make Makefile来构build一个包含多个目标( all
, clean
,和一些项目特定目标)的C项目。 在debugging的过程中,我想将一些标志附加到单个版本,而不需要永久编辑Makefile(例如,添加debugging符号或设置预处理器标志)。
在过去,我已经做了如下(使用debugging符号的例子):
make target CFLAGS+=-g
不幸的是,这不是追加到CFLAGS
variables,而是清除它,并停止编译。 有没有一个干净的方式做这个没有定义某种虚拟variables附加到CFLAGS
和LDFLAGS
的末尾?
检查覆盖指令 。 你可能需要修改makefile一次,但它应该做你想做的。
示例makefile:
override CFLAGS += -Wall app: main.c gcc $(CFLAGS) -o app main.c
示例命令行:
$ make gcc -Wall -o app main.c $ make CFLAGS=-g gcc -g -Wall -o app main.c
对于logging来说,@Carl Norum的答案在命令行视angular前加上variables。
我需要一种方法来实际追加和提出:
override CFLAGS := -Wall $(CFLAGS)
只是一个笔记,因为我感到困惑 – 让这个文件testmake
:
$(eval $(info A: CFLAGS here is $(CFLAGS))) override CFLAGS += -B $(eval $(info B: CFLAGS here is $(CFLAGS))) CFLAGS += -C $(eval $(info C: CFLAGS here is $(CFLAGS))) override CFLAGS += -D $(eval $(info D: CFLAGS here is $(CFLAGS))) CFLAGS += -E $(eval $(info E: CFLAGS here is $(CFLAGS)))
然后:
$ make -f testmake A: CFLAGS here is B: CFLAGS here is -B C: CFLAGS here is -B D: CFLAGS here is -B -D E: CFLAGS here is -B -D make: *** No targets. Stop. $ make -f testmake CFLAGS+=-g A: CFLAGS here is -g B: CFLAGS here is -g -B C: CFLAGS here is -g -B D: CFLAGS here is -g -B -D E: CFLAGS here is -g -B -D make: *** No targets. Stop.
使用从testmake
文件中删除的override
指令:
$ make -f testmake A: CFLAGS here is B: CFLAGS here is -B C: CFLAGS here is -B -C D: CFLAGS here is -B -C -D E: CFLAGS here is -B -C -D -E make: *** No targets. Stop. $ make -f testmake CFLAGS+=-g A: CFLAGS here is -g B: CFLAGS here is -g C: CFLAGS here is -g D: CFLAGS here is -g E: CFLAGS here is -g make: *** No targets. Stop.
所以,
- 如果一个variables被
override
一次,它只能被override
另一个override
语句(正常的赋值将被忽略)。 - 什么时候一点都没有
override
; 试图从命令行追加(如+=
)覆盖该variables的每个实例。
有两种方法可以传递variables:
-
使用命令行参数:
make VAR=value
-
使用环境:
export VAR=var; make
或者(更好,因为它只改变当前命令的环境)
VAR=var make
他们有些不同。 第一个更强。 这意味着你知道你想要什么。 第二个可能被认为是一个提示。 尤其是,运算符=
和+=
行为(没有override
)是不同的。 在命令行中定义variables时忽略这些运算符,但在环境中定义variables时不会忽略这些运算符。 因此,我build议你有一个Makefile:
CC ?= gcc CFLAGS += -Wall INTERNAL_VARS = value
并用以下方式调用它:
CFLAGS=-g make
注意,如果你想撤销 – -Wall
,你可以使用:
make CFLAGS=
请不要使用override
关键字,否则您将无法更改受override
影响的variables。