通过命令行附加到GNU make变量

时间:2010-01-24 23:33:50

标签: c makefile gnu-make

我正在使用GNU-make Makefile来构建一个包含多个目标(allclean和一些项目特定目标的C项目。在调试过程中,我想在没有永久编辑Makefile的情况下将一些标志附加到单个构建中(例如添加调试符号或设置预处理器标志)。

过去,我已按如下方式(使用调试符号示例)执行此操作:

make target CFLAGS+=-g

不幸的是,这不会附加到CFLAGS变量,而是清除它并停止编译。有没有一种干净的方法来做到这一点,而没有在CFLAGSLDFLAGS的末尾附加某种虚拟变量?

4 个答案:

答案 0 :(得分:75)

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

答案 1 :(得分:24)

对于记录,从命令行的角度来看,@ Carl Norum的答案预先变量。

我需要一种方法来实际追加并提出:

override CFLAGS := -Wall $(CFLAGS)

答案 2 :(得分:15)

有两种方法可以传递变量:

  • 使用命令行参数:

    make VAR=value
    
  • 使用环境:

    export VAR=var; make
    

    或(更好,因为它只改变当前命令的环境)

    VAR=var make
    

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

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

并将其命名为:

CFLAGS=-g make

注意,如果您要撤消-Wall,可以使用:

make CFLAGS=

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

答案 3 :(得分: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的时候;尝试从命令行追加(如在+=中)会覆盖该变量的每个实例。