16

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

让我解释一下:我希望能够通过设置V=1 VERBOSE=1. 我想保持VERBOSE=1可用,因为我们有一些使用它的脚本(并使用其他只知道的 makefile VERBOSE

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

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

你知道怎么做吗?

4

5 回答 5

15

我喜欢这样:

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

endif

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

于 2012-11-16T04:54:16.580 回答
7
VERBOSE := $(or $(VERBOSE),$(V))

...然后...

ifeq ($(VERBOSE),1)
#Conditional stuff
endif
于 2014-05-28T09:11:25.167 回答
4

据我所知,GNU make 中的条件内容不允许 OR 和 ANDS。你总是可以做类似的事情:

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

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

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

于 2011-05-16T09:30:31.043 回答
4

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

ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif
于 2011-05-16T15:19:40.183 回答
0

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

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

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

于 2015-10-28T18:08:45.067 回答