通过命令行附加到GNU makevariables

我正在使用一个GNU make Makefile来构build一个包含多个目标( allclean ,和一些项目特定目标)的C项目。 在debugging的过程中,我想将一些标志附加到单个版本,而不需要永久编辑Makefile(例如,添加debugging符号或设置预处理器标志)。

在过去,我已经做了如下(使用debugging符号的例子):

 make target CFLAGS+=-g 

不幸的是,这不是追加到CFLAGSvariables,而是清除它,并停止编译。 有没有一个干净的方式做这个没有定义某种虚拟variables附加到CFLAGSLDFLAGS的末尾?

检查覆盖指令 。 你可能需要修改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。