Больше чем сравнение строк в Makefile - PullRequest
11 голосов
/ 09 августа 2010

Как мне выразить следующую логику в Makefile?

if $(XORG_VERSION) > "7.7"
   <do some thing>
fi

Условные части файлов Makefile предоставляет только ifeq или ifneq.

Ответы [ 3 ]

13 голосов
/ 20 августа 2012

Я использую функцию sort для сравнения значений лексикографически. Идея состоит в том, чтобы отсортировать список из двух значений, $(XORG_VERSION) и 7.7, а затем принять первое значение - если оно 7.7, то версия такая же или больше.

ifeq "7.7" "$(word 1, $(sort 7.7 $(XORG_VERSION)))"
   <do some thing>
endif

Настройте 7.7 на 7.8, если вам нужно строгое условие больше чем.

Этот подход улучшает переносимость, избегая сценариев оболочки и сопутствующих предположений о возможностях доступной оболочки ОС. Тем не менее, он не работает, если лексикографический порядок не эквивалентен числовому порядку, например, при сравнении 7.7 и 7.11.

5 голосов
/ 09 августа 2010

Вы не ограничены использованием условных операторов make - каждая команда является командой оболочки, которая может быть настолько сложной, насколько вам нужно (включая условный оператор оболочки):

Рассмотрим следующее makefile:

dummy:
    if [ ${xyz} -gt 8 ] ; then \
        echo urk!! ${xyz} ;\
    fi

Когда вы используете xyz=7 make --silent, выход не выводится. Когда вы используете xyz=9 make --silent, он выдает urk!! 9, как и ожидалось.

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```

Я нашел способ, как разобраться с этой проблемой, и разместил ее в качестве решения этого другого вопроса . Я надеюсь, что кто-то найдет это полезным!

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