我想在我的makefile中启用详细的编译,但是我不知道如何进行条件OR
。
让我解释一下:我希望能够通过设置 V=1
或 VERBOSE=1
来指定详细的编译。我想保持VERBOSE=1
可用,因为我们有一些使用它的脚本(并使用其他只知道VERBOSE
的makefile)
所以结果一定是这两个命令是相同的:
make all VERBOSE=1 # pain to write
make all V=1
现在,我的生成文件今天看起来像这样:
ifdef VERBOSE
[issue compilation commands with verbose mode]
endif
我想实现的是接近 C 中的预处理器:
if defined(VERBOSE) || defined(V)
[issue compilation commands with verbose mode]
endif
你知道怎么做吗?
我喜欢这样:
ifneq "$(or $(LINUX_TARGET),$(OSX_TARGET))" ""
endif
类似于 $( strip 方法,但使用更直观的 $(或关键字
VERBOSE := $(or $(VERBOSE),$(V))
。然后。。。
ifeq ($(VERBOSE),1)
#Conditional stuff
endif
我喜欢Neil Butterworth的方法,但如果你真的想按照你描述的风格去做,这会给你OR:
ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif
据我所知,GNU 中的条件内容不允许 OR 和 ANDS。你总是可以做这样的事情:
ifdef VERBOSE
DOVERBOSE = yes
endif
ifdef V
DOVERBOSE = yes
endif
ifeq( $DOVERBOSE, yes )
main verbose stuff here
endif
但我不明白为什么你需要首先引入 V 的(几乎不是自我记录的)定义。
好吧,参加聚会真的很晚,但我遇到了这个问题,并希望为正在寻找如何向 makefile 添加逻辑的其他人添加另一种解决方案:基本上,在 shell 中执行逻辑,并以这种方式获取输出。
ifneq ( $(shell ( [ $(VERBOSE) ] || [ $(V) ] ) && echo y ),)
它似乎更复杂,但是如果你有一个包含许多 AND 和 OR 的 if 语句,这提供了很大的灵活性,并且比嵌套的 $(和 .. $(或 ...)) 语句更容易阅读。