Что такое эквивалент существительного в Makefiles? - PullRequest
0 голосов
/ 02 декабря 2019

set -o nounset в Bash действительно полезен, но я не хочу запускать его для каждой строки в моем Makefile. Можно ли получить такой же эффект с помощью параметра global в Makefile?

1 Ответ

1 голос
/ 04 декабря 2019

Вы можете указать глобальные настройки оболочки в .SHELLFLAGS переменная , поскольку GNU составляет 3.82 . Вот так:

$ cat Makefile
.SHELLFLAGS := -o nounset -c

all:
        echo "Foo is $${FOO}"

unset:
        set -o nounset; echo "Foo is $${FOO}"

make-resolved:
        echo "Foo is ${FOO}"

Вывод:

$ make all
echo "Foo is ${FOO}"
/bin/sh: FOO: unbound variable
make: *** [Makefile:4: all] Error 127

$ make unset
set -o nounset; echo "Foo is ${FOO}"
/bin/sh: FOO: unbound variable
make: *** [Makefile:7: unset] Error 127

Без .SHELLFLAGS Первый вызов завершается успешно:

$ make all .SHELLFLAGS=-c
echo "Foo is ${FOO}"
Foo is

$ make unset .SHELLFLAGS=-c
set -o nounset; echo "Foo is ${FOO}"
/bin/sh: FOO: unbound variable
make: *** [Makefile:7: unset] Error 127

Обратите внимание, что вам нужно выйти $чтобы это было на самом деле разрешено оболочкой, а не make. Последняя цель показывает, что make разрешит ${FOO}, а оболочка не будет жаловаться:

$ make make-resolved
echo "Foo is "
Foo is

Вы также можете получить предупреждение (не ошибку) от make в этой ситуации , поскольку GNU make3,68 :

$ make --warn-undefined-variables make-resolved
Makefile:10: warning: undefined variable 'FOO'
echo "Foo is "
Foo is
...