代码之家  ›  专栏  ›  技术社区  ›  leoger zOlive

使用makefile目标设置生成选项

  •  6
  • leoger zOlive  · 技术社区  · 14 年前

    这要么是微不足道的,要么违背了make应该如何使用的原则,但我希望有一个命令行,它的内容是“make debug”,而不是“makedebug=1”。我尝试创建一个名为debug的虚假目标,它除了设置调试变量之外什么都不做,但是“make debug build”和“make build debug”之间存在差异,即在一种情况下,变量是在生成之后设置的。

    有没有一种方法可以给予某些目标优先权?

    谢谢你的帮助。

    6 回复  |  直到 14 年前
        1
  •  3
  •   jake    14 年前

    您还可以通过查看makeCmdGoals变量来完成此操作。

    ifneq "$(findstring debug, $(MAKECMDGOALS))" ""
    DEBUG = 1
    endif
    
    build:
        @echo build and DEBUG is [$(DEBUG)]
    
    debug:
    

    当你称之为:

    $ make build
    build and DEBUG is []
    $ make build debug
    build and DEBUG is [1]
    make: Nothing to be done for `debug'.
    $ make debug build
    make: Nothing to be done for `debug'.
    build and DEBUG is [1]
    
        2
  •  5
  •   bmargulies    14 年前

    参见中的“目标特定变量值” this page .

        3
  •  1
  •   Roland Illig    14 年前

    您可以编写以下内容:

    .PHONY: debug
    debug:
            $(MAKE) -$(MAKEFLAGS) build DEBUG=1
    
    build:
            echo makeflags='$(MAKEFLAGS)' debug=${DEBUG}
    

    这至少可以与GNU制造、BSD制造和Interix制造一起使用。我没有尝试所有其他实现。

        4
  •  1
  •   Chris Dodd    14 年前

    使用gnumake可以做的一件事是使用扩展到规则的宏 foreach 内置。比如:

    TARGETS := build all foo bar baz
    
    define DEBUG_TARGET_RULE
    $(1).debug:
            $$(MAKE) DEBUG=1 $(1)
    debug.$(1):
            $$(MAKE) DEBUG=1 $(1)
    endef
    
    $(foreach target,$(TARGETS),$(eval $(call DEBUG_TARGET_RULE,$(target))))
    

    这将允许您键入 make debug.foo make foo.debug 它会自动变成 make DEBUG=1 foo 它适用于任何你放进去的目标 $(TARGETS)

        5
  •  0
  •   jonathanasdf    14 年前

    如果调试只与生成目标一起使用,那么您也可以进行调试调用build,以便只需键入 make debug make build ,在哪里 生成 将是非调试的。

    但至于你的实际问题,我对makefiles还不太熟悉。

        6
  •  0
  •   GreenMatt    14 年前

    一种方法是在生成和调试目标中设置依赖项和生成规则,但将调试选项添加到调试目标中。一个简单的例子:

    生成文件

    program:        program.c
                    gcc -o program program.c
    debug:          program.c
                    gcc -D DEBUG -o program program.c
    

    程序.c

    #include <stdio.h>
    int main(void) {
    #ifdef DEBUG
      printf("DEBUG on!\n");
    #endif
      printf("in the program\n");
      return 0;
    }