Выполнение вычислений больше, чем меньше, в Makefile - PullRequest
10 голосов
/ 09 августа 2010

Я пытаюсь сделать это в Makefile:

value = 2.0

if ${greaterthan ${value}, 1.50}
-> execute a rule
elseif ${lessthan ${value}, 0.50}
-> execute a rule
endif

Кажется, это довольно распространенная вещь, которую я хочу сделать.Какой лучший способ сделать это?

Ответы [ 4 ]

16 голосов
/ 06 февраля 2015

Попробуйте это

В этом примере VER проверяется на более чем 4

ifeq ($(shell test $(VER) -gt 4; echo $$?),0)
  IFLAGS += -I$(TOPDIR)/include
  LIBS += -L$(TOPDIR)/libs -lpcap
endif
10 голосов
/ 09 августа 2010

Аналогично этот вопрос , но в основном вы можете использовать команды оболочки внутри Makefile. Таким образом, следующее абсолютно законно:

foo:
    if [ ${value} -gt 2 ] ; then \
         #Do stuff;\
    fi

Редактировать для небольшого отказа от ответственности: IIRC, bash не понимает арифметику с плавающей запятой. Он может интерпретировать их как строки , но это может сделать вещи немного странными. Обязательно примите это во внимание.

3 голосов
/ 09 мая 2017

Мой предпочтительный способ сделать это:

value = 2.0
ifeq ($(shell expr $(value) \>= 1.5), 1)
   # execute a rule
else ifeq ($(shell expr $(value) \<= 0.5), 1)
   # execute a rule
endif
0 голосов
/ 31 мая 2017

Использование команд оболочки, как упоминалось в других ответах, должно быть достаточным для большинства случаев использования:

if [ 1 -gt 0 ]; then \
    #do something \
fi

Однако, если вы, как и я, хотите использовать больше чем сравнение для , тогда установите переменную make с помощью make '$(eval), то вы обнаружите, что пытаетесь сделать это, используя модель другого ответа:

if [ 1 -gt 0 ]; then \
    $(eval FOO := value) \
fi

выдает ошибку:

if [ 1 -gt 0 ]; then  fi;
/bin/bash: -c: line 0: syntax error near unexpected token `fi'
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then  fi;'
make: *** [clean] Error 2```

Причина в том, что выражение make $(eval) возвращает пустую строку. В результате полученный код bash искажается. **

Я придумал следующее решение (попробовав много разных подходов!).

$(if $(shell [ $(FOO) -ge 1 ] && echo "OK"), \
    $(eval BAR := true), \
    $(eval BAR := false))

Необходимо вывести строку после выполнения арифметического сравнения (часть echo "OK"), поскольку оператор make $(if) основан на логике пустой строки:

$ (если условие, то-часть [, еще-часть])

Функция if обеспечивает поддержку условного расширения в функциональном контексте (в отличие от GNU делает условные выражения make-файла, такие как ifeq (см. Синтаксис условных выражений).

Первый аргумент, условие, сначала удаляет все предшествующие и конечные пробелы, а затем расширяется. Если он расширяется до любой непустой строки, то условие считается истинным. Если оно расширяется до пустой строки, условие считается ложным.

Источник: Руководство по GNU Make

Надеюсь, это поможет!

** Примечание : Первоначально я думал, что эту проблему можно легко исправить, добавив команду bash, которая ничего не делает с выражением, например true:

if [ $(VALUE) -ge 1 ]; then \
    true; $(eval BAR := GreaterOrEqualThan1) \
else \
    true; $(eval BAR := LowerThan1) \
fi

Это оказалось ужасной идеей. Я до сих пор не понял, почему, но ветка else всегда выполняется независимо от результата сравнения.

Думаю, мне следует открыть вопрос по этому делу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...