布尔电路使用基本算术?

时间:2015-07-08 20:19:50

标签: shell math gnu-make

根据How do I perform arithmetic in a makefile?,我们可以通过GNUmakefile中的Posix shell执行基本算术运算(参见Dominic's answer)。

我非常兴奋,因为我过去缺乏逻辑运算符。所以我在OS X上编写了以下测试:

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])")
IS_DARWIN = $(shell uname -s | $(EGREP) -i -c "darwin")
CLANG_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang")

# Below, we are building a boolean circuit that says "Darwin && (GCC 4.2 or above || Clang)"
SUPPORTS_MULTIARCH = $$($(IS_DARWIN) * $$($(GCC42_OR_LATER) + $(CLANG_COMPILER)))

ifneq ($(SUPPORTS_MULTIARCH),0)
CXXFLAGS += -arch x86_64 -arch i386
else
CXXFLAGS += -march=native
endif

OS X上的运行显示-arch x86_64 -arch i386,这是预期的。

然后我在数学之前添加了一个IS_DARWIN=0,这应该会把一切都降低。但它没有,我再次获得-arch x86_64 -arch i386

我在上面的代码中做错了什么?

1 个答案:

答案 0 :(得分:2)

正如评论所说,要进行$$(())算术运算,你需要涉及shell 并且shell需要是bash。(编辑:显然它没有,任何POSIX shell可以工作,甚至可以像破折号一样最小化

<德尔> 首先,将它添加到`Makefile`的顶部:     SHELL = /斌/庆典

然后,你正在玩的那一行应该是:

# Below, we are building a boolean circuit that says "Darwin && (GCC 4.2 or above || Clang)"
SUPPORTS_MULTIARCH = $(shell echo $$(( $(IS_DARWIN) * ( $(GCC42_OR_LATER) + $(CLANG_COMPILER) ) )) )

我在该行中添加了额外的空格,以清楚地显示与内容匹配的内容。尽管它们没有任何伤害,请随意删除它们。

在double-paren-arithmetic组中,您不需要$$((来启动算术子组;只需使用普通的括号。