2010-01-24 100 views
48

我正在使用GNU make Makefile来构建一个包含多个目标(all,clean和几个项目特定目标)的C项目。在调试过程中,我想将一些标志添加到单个版本中,而无需永久编辑Makefile(例如,添加调试符号或设置预处理器标志)。通过命令行追加到GNU make变量

在过去,我已经做了如下(使用调试符号为例):

make target CFLAGS+=-g 

不幸的是,这是不附加到CFLAGS变量,而是将其清除,并从编译停止它。如果没有在CFLAGSLDFLAGS的末尾添加一些虚拟变量,是否有干净的方法呢?

回答

65

查看override directive。你可能需要修改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 
+0

感谢您的参考链接。这看起来像是解决问题的更好方案之一。 –

20

对于记录,@Carl Norum时的回答预规划变量,命令行透视。

我需要一种方法来实际追加,并想出了:

override CFLAGS := -Wall $(CFLAGS) 
6

刚一说明,我糊涂了 - 让这个做文件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. 

随着override指令从testmake文件中删除:

$ 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. 

所以,

  • 如果一个变量用override一次,它只能与override(正常分配将被忽略)另一个语句所附;
  • 根本没有override;试图从命令行追加(如+=)覆盖该变量的每个实例。
9

有两种方式传递变量进行:

  • 使用命令行参数:

    make VAR=value 
    
  • 使用环境:

    export VAR=var; make 
    

    或(更好,因为它只改变现在的指挥官的环境d)

    VAR=var make 
    

他们是略有不同。第一个更强。这意味着你知道你想要什么。第二个可能被认为是一个提示。它们之间的区别在于运营商=+=(不含override)。当在命令行中定义变量时忽略这些运算符,但在环境中定义变量时不会忽略这些运算符。因此,我建议你有一个Makefile:

CC ?= gcc 
    CFLAGS += -Wall 
    INTERNAL_VARS = value 

,并称之为:

CFLAGS=-g make 

注意,如果你想退出-Wall,你可以使用:

make CFLAGS= 

请不要使用override关键字,否则您将无法更改受override影响的变量。