условный синтаксис" ifeq " в файле makefile

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

на самом деле у вас может быть противоположное представление, т. е. Make должен содержать дословно все аргументы в условном ifeq, потому что пользователь мог иметь эти пробелы как часть "теста", с намерение для этих пробелов играть решающий фактор, при оценке этого ifeq директива, as правда или false.

я не могу решить, какой из них больше правильно.

на самом деле, я не одинок!

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

в самом деле, иногда это будет полоса только ведущие пробелы.

не разочаровывает, иногда будет полоса только трейлинг пробелов.

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



файл makefile (Версия 1), есть:

ifeq ( a, a)
all::
    echo 'true'
else
all::
    echo 'false'
endif



выполнения, я получаю:

$ make -r
echo 'false'
false



файл makefile (версия 2), это:

ifeq (a ,a )
all::
    echo 'true'
else
all::
    echo 'false'
endif



выполнения, я получаю:

$ make -r
echo 'false'
false



файл makefile (Версия 3), является:

ifeq ( a , a )
all::
    echo 'true'
else
all::
    echo 'false'
endif



выполнения, я получаю:

$ make -r
echo 'false'
false



файл makefile (версия 4), это:

ifeq (a , a)
all::
    echo 'true'
else
all::
    echo 'false'
endif



выполнения, я получаю:

$ make -r
echo 'true'
true



файл makefile (версия 5), есть:

ifeq (a, a)
all::
    echo 'true'
else
all::
    echo 'false'
endif



выполнения, я получаю:

$ make -r
echo 'true'
true



Подводя итог, всего несколько случаев, у нас есть:

# Both, have only leading whitespace.
ifeq( a, a)    as: false.

# Both, have only trailing whitespace.
ifeq(a ,a )    as: false.

# Both, have trailing AND trailing whitespace.
ifeq( a , a )  as: false.

# Left-hand-size has only trailing, and right-hand-size has only leading whitepsace.
ifeq(a , a)    as: true.

# Left-hand-size has NO whitespace at-all, and right-hand-size has only leading whitepsace.
ifeq(a, a)     as: true.

Итак, эта методология, которая используется для оценки достоверность на ifeq условная директива, определенно превращает ее в:

  • меньше последовательный.
  • менее ремонтопригодны.
  • труднее отлаживать.
  • склонны к ошибкам.
  • наконец, много "веселья"!

согласны ли мы?

1 ответов


следует читать этой:

запятые и несопоставимые скобки или скобки не могут отображаться в тексте аргумента как написанные; начальные пробелы не могут отображаться в тексте первого аргумента как написанные. Эти символы могут быть помещены в значение аргумента путем подстановки переменных. Сначала определите переменные comma и space чьи значения являются изолированными запятыми и пробелами, а затем заменяют эти переменные, где такие символы требуются, вот так:

comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
# bar is now ‘a,b,c’.

вы должны использовать прокладки