【问题标题】:Conditional OR in makefilemakefile 中的条件 OR
【发布时间】:2011-08-26 07:10:57
【问题描述】:

我想在我的 makefile 中启用详细编译,但我不知道如何制作条件 OR

让我解释一下:我希望能够通过设置V=1 VERBOSE=1 来指定详细编译。我想保持VERBOSE=1 可用,因为我们有一些使用它的脚本(并且使用其他只知道VERBOSE 的makefile)

所以结果一定是这两个命令是一样的:

make all VERBOSE=1 # pain to write
make all V=1

现在,我的 makefile 今天看起来像这样:

ifdef VERBOSE
[issue compilation commands with verbose mode]
endif

我想要实现的是接近 C 中的预处理器:

if defined(VERBOSE) || defined(V)
[issue compilation commands with verbose mode]
endif

你知道怎么做吗?

【问题讨论】:

标签: makefile logic conditional verbose


【解决方案1】:

据我所知,GNU make 中的条件内容不允许 OR 和 AND。你总是可以这样做:

ifdef VERBOSE
DOVERBOSE = yes
endif
ifdef V
DOVERBOSE = yes
endif

ifeq( $DOVERBOSE, yes )
    main verbose stuff here
endif

但我不明白你为什么需要首先介绍 V 的(几乎没有自我记录的)定义。

【讨论】:

  • ifdef V \ VERBOSE=v \ endif 怎么样,其余的保持原样?
  • @Beta 也不错!但我更喜欢你的回答。
【解决方案2】:

我喜欢 Neil Butterworth 的方法,但如果你真的想按照你描述的风格来做,这会给你 OR:

ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif

【讨论】:

    【解决方案3】:

    我喜欢这样:

    ifneq "$(or $(LINUX_TARGET),$(OSX_TARGET))" ""
    
    endif
    

    类似于 $(strip 方法,但使用更直观的 $(or 关键字

    【讨论】:

    • Niiii​​ice,这个方法更清晰。我不知道or
    • 我转而接受你的回答,因为它在语义上完全解决了我的问题。
    【解决方案4】:
    VERBOSE := $(or $(VERBOSE),$(V))
    

    ……然后……

    ifeq ($(VERBOSE),1)
    #Conditional stuff
    endif
    

    【讨论】:

      【解决方案5】:

      好的,聚会真的迟到了,但我遇到了这个问题,并想为其他正在寻找如何向 makefile 添加逻辑的人添加另一个解决方案:基本上,在 shell 中执行逻辑,并以这种方式获取输出.

      ifneq ( $(shell ( [ $(VERBOSE) ] || [ $(V) ] ) && echo y ),)
      

      它看起来更复杂,但是如果你有一个包含许多 ands 和 ors 的 if 语句,这提供了很大的灵活性,并且比嵌套的 $(and .. $(or ...)) 语句更容易阅读.

      【讨论】:

      • 它确实“提供了很大的灵活性”——除了它限制你使用你编码到的特定 shell(在你的情况下,BASH)
      猜你喜欢
      • 1970-01-01
      • 2023-02-04
      • 2012-10-08
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多