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

Mic*_*val 60 c makefile gnu-make

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

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

make target CFLAGS+=-g
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有附加到CFLAGS变量,而是清除它并阻止它编译.是否有这样做没有确定某种形式的虚拟变量追加到年底的清洁方式CFLAGSLDFLAGS

Car*_*rum 82

查看override指令.你可能需要修改一次makefile,但它应该做你想要的.

示例makefile:

override CFLAGS += -Wall

app: main.c
    gcc $(CFLAGS) -o app main.c 
Run Code Online (Sandbox Code Playgroud)

示例命令行:

$ make
gcc -Wall -o app main.c 
$ make CFLAGS=-g
gcc -g -Wall -o app main.c 
Run Code Online (Sandbox Code Playgroud)


aib*_*aib 27

为了记录在案,@Carl Norum时的回答预先考虑的变量,在命令行的观点.

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

override CFLAGS := -Wall $(CFLAGS)
Run Code Online (Sandbox Code Playgroud)


Jér*_*ler 16

传递变量有两种方法:

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

CC ?= gcc
CFLAGS += -Wall
INTERNAL_VARS = value
Run Code Online (Sandbox Code Playgroud)

并称之为:

CFLAGS=-g make
Run Code Online (Sandbox Code Playgroud)

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

make CFLAGS=
Run Code Online (Sandbox Code Playgroud)

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


sda*_*aau 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)))
Run Code Online (Sandbox Code Playgroud)

然后:

$ 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.
Run Code Online (Sandbox Code Playgroud)

随着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.
Run Code Online (Sandbox Code Playgroud)

所以,

  • 如果一个变量使用override一次,它只能附加另一个语句override(正常的赋值将被忽略);
  • 什么时候根本没有override; 尝试+=从命令行追加(如),覆盖该变量的每个实例.