使用基本算术的布尔电路?
Boolean circuit using basic arithmetic?
根据 How do I perform arithmetic in a makefile?, we can perform basic arithmetic through the Posix shell in a GNUmakefile (see 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
我在上面的代码中做错了什么?
正如评论所说,要进行 $$(())
算术运算,您需要涉及 shell 并且 shell 需要 bash .(编辑:显然它没有,任何 POSIX shell 都可以工作,即使像破折号一样最小)
所以首先,将它添加到你的 `Makefile` 的顶部:
SHELL=/bin/bash
然后,您正在玩的那行应该是:
# 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) ) )) )
我在该行中添加了额外的空格以清楚地显示匹配项。随意删除它们,尽管它们没有害处。
在双括号算术群中,不需要$$((
开始算术子群;只需使用普通括号即可。
根据 How do I perform arithmetic in a makefile?, we can perform basic arithmetic through the Posix shell in a GNUmakefile (see 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
我在上面的代码中做错了什么?
正如评论所说,要进行 $$(())
算术运算,您需要涉及 shell 并且 shell 需要 bash .(编辑:显然它没有,任何 POSIX 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) ) )) )
我在该行中添加了额外的空格以清楚地显示匹配项。随意删除它们,尽管它们没有害处。
在双括号算术群中,不需要$$((
开始算术子群;只需使用普通括号即可。