首页 文章

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

提问于
浏览
54

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

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

make target CFLAGS+=-g

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

4 回答

  • 24

    看看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
    
  • 73

    为了记录,从命令行的角度来看,@ Carl Norum的答案会预先考虑变量 .

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

    override CFLAGS := -Wall $(CFLAGS)
    
  • 6

    传递变量有两种方法:

    • 使用命令行参数:
    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 影响的变量 .

  • 14

    只是一个注释,因为我感到困惑 - 让这个文件 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.
    

    所以,

    • 如果一个变量使用 override 一次,它只能附加另一个带 override 的语句(正常的赋值将被忽略);

    • 什么时候根本没有 override ;尝试从命令行追加(如在 += 中)将覆盖该变量的每个实例 .

相关问题