【问题标题】:Specify empty variable on make command line在 make 命令行上指定空变量
【发布时间】:2013-05-31 19:27:50
【问题描述】:

我有一些基于某些变量存在的灵活的 Makefile,通过使用ifdef 来检查它们。我必须实际将变量设置为等于命令行上的某个值,这有点烦人。 make all DEBUG 不会触发 ifdefmake all DEBUG=1 会。也许我只是在使用它不属于的 C 预处理器方法。

Q1) 是否可以在命令行中指定一个变量为空?没有更多的字符? Q2) 将此类布尔参数用于制作的首选方法是什么?

【问题讨论】:

    标签: command-line makefile


    【解决方案1】:

    我猜你的意思是make all DEBUG=,对吧?如果没有=,make 会将DEBUG 视为构建目标,而不是变量赋值。

    手册指定具有非空值的变量会导致ifdef 返回true。不存在或存在但包含空字符串的变量会导致 ifdef 返回 false。注意ifdef 不会扩展变量,它只是测试变量是否有任何值。

    你可以使用$(origin ...)函数来测试一个变量是真的没有定义,还是定义了但为空,像这样:

    ifeq ($(origin DEBUG),undefined)
      $(info Variable DEBUG is not defined)
    else
      $(info Variable DEBUG is defined)
    endif
    

    【讨论】:

      【解决方案2】:

      正如@MadScientist 几分钟前解释的那样,

      make all DEBUG
      

      将目标DEBUG 添加到您的品牌中。幸运的是,有一个解决方法:

      ifneq (,$(filter DEBUG,$(MAKECMDGOALS)))
          DEBUG:=1 # or do whatever you want
          DEBUG: all; @echo -n
      endif
      

      必须为虚拟目标提供虚拟规则(例如,如上所示不回显)。或者把这个语句放在你的 makefile 的底部,或者像示例中那样明确指定先决条件目标。否则,make 可能会错误地选择 DEBUG 目标而不是 all

      请注意,这不是首选方法;约定就像使用V=1 来打开回声。

      另一个警告是make 按顺序处理命令行目标,例如make A B 将首先处理 A 目标,然后处理 B 目标,无论这些目标是独立的,还是相互依赖的。因此编写make DEBUG PERFECTmake PERFECT DEBUG 可能会产生不同的结果。但参数的顺序无关紧要,因此make PERFECT=1 DEBUG=1make DEBUG=1 PERFECT=1 是等价的。

      【讨论】:

      • 创意点...但正如您所说,这不是首选方法。 :] 谢谢。
      • 你问了两个问题,我都回答了​​。
      【解决方案3】:

      已经阐明了为什么不能只使用 DEBUG。不过我想补充一点。

      您可以在运行 ma​​ke 之前使用 shell 脚本来设置您需要的所有变量,因此,例如在 linux shell 中,它将如下所示:

      $source debug_setup.sh
      $make all
      Make is starting...
      Debug is enabled
      ...
      

      其中 debug_setup.sh 包含您需要设置的所有环境变量:

      export DEBUG=1
      export DEBUG_OPTION=some_option
      

      这很好,因为您可以在那里制作 cmets,如果您目前不需要某些东西并想保留以备将来使用,您可以注释掉,等等。

      然后,您可以拥有几个必须/可以用作标准例程的一部分的设置脚本。这一切都取决于您需要设置多少变量,您希望拥有多少组变量等。

      请注意,以某种方式通知用户选择了哪组变量是个好主意。

      【讨论】:

        猜你喜欢
        • 2017-06-14
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 2018-06-03
        • 2017-03-15
        • 1970-01-01
        相关资源
        最近更新 更多