【问题标题】:using makefile targets to set build options使用 makefile 目标设置构建选项
【发布时间】:2023-03-12 10:00:01
【问题描述】:

这要么是微不足道的,要么与应该如何使用 make 的理念背道而驰,但我希望有一个命令行读取为“make debug”而不是“make DEBUG=1”。我尝试创建一个名为 debug 的虚假目标,除了设置 DEBUG 变量之外什么都不做,但是“make debug build”和“make build debug”之间存在差异——即在一种情况下,变量在构建之后设置发生了。

有没有办法让某些目标优先?

感谢您的帮助。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    请参阅this page 中的“目标特定变量值”。

    【讨论】:

    • 没有害处,您只需为目标执行target: DEBUG=1 而不是将他指向文档...对吗?
    • 这不是解决了“make build debug”不等于“make debug build”的问题吗?这个特殊功能正是我尝试过的。
    • 回想起来,我可以看到这与您的问题相匹配,但您并没有说清楚。使目标总是有序,所以我认为你正在执行一项不可能完成的任务。
    • 在那种情况下,这正是我需要知道的。谢谢!
    【解决方案2】:

    您也可以通过查看 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]
    

    【讨论】:

      【解决方案3】:

      你可以这样写:

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

      这至少适用于 GNU Make、BSD Make 和 Interix Make。我没有尝试所有其他实现。

      【讨论】:

      • 以对 make 文件进行递归评估为代价的可移植性。
      【解决方案4】:

      您可以使用 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.foomake foo.debug,它会自动变成make DEBUG=1 foo,它适用于您输入$(TARGETS) 的任何目标

      【讨论】:

      • 不完全是我想要的,但是很酷的解决方法,它也展示了 make 的一个有用功能。
      【解决方案5】:

      如果您的调试仅用于构建目标,您不妨进行调试调用构建,这样您只需键入 make debugmake build,其中 make build 将是非调试的。

      但至于您的实际问题,我对 makefile 不够熟悉,无法回答。

      【讨论】:

        【解决方案6】:

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

        生成文件

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-25
          相关资源
          最近更新 更多