2015-07-08 1 views
0

Согласно 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.

Что я делаю неправильно в приведенном выше коде?

+1

Поддержка '$ ((..))' является функцией оболочки, а не make. Обратите внимание, что ваш связанный ответ делает это в строке рецепта. Поэтому вам нужно включить оболочку в свой фрагмент, чтобы сделать эту работу. –

ответ

2

Как говорится в комментарии, для арифметической работы $$(()) необходимо задействовать оболочку , и эта оболочка должна быть bash. (EDIT: Видимо это не так, и любой POSIX оболочки будет работать, даже что-то минимально тире)

Так прежде всего, добавить это в верхней части `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))))) 

Я добавил дополнительные пробелы в этой строке, чтобы ясно показать, что соответствие с чем. Не стесняйтесь удалять их, хотя они не навредят.

Внутри группы с двойным парен-арифметикой вам не нужно $$((, чтобы начать арифметическую подгруппу; просто используйте обычные круглые скобки.

+1

Современные 'ksh' также поддерживают '$ ((math))' операции. Всем удачи! – shellter

+0

Большое вам спасибо. Я думаю, что волнение получило лучшее из меня, и я бросился к логике. – jww

+0

@ Даниэль - ты уверен в * «... и эта оболочка должна быть биткой ...» *. Я считаю, что комментарии говорят, что оболочка Posix - это минимальные требования. Ваш ответ отлично работает в моей настройке, включая тесты на OS X, Ubuntu, Fedora, OpenBSD и FreeBSD. Может быть, я должен сделать несколько тестов на всякий случай. – jww

Смежные вопросы