Согласно How do I perform arithmetic in a makefile?, мы можем выполнить базовую арифметику через оболочку Posix в файле GNUmakefile (см. 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
.
Что я делаю неправильно в приведенном выше коде?
Поддержка '$ ((..))' является функцией оболочки, а не make. Обратите внимание, что ваш связанный ответ делает это в строке рецепта. Поэтому вам нужно включить оболочку в свой фрагмент, чтобы сделать эту работу. –