Если вы хотите, чтобы переменные среды экспортировались в оболочку, из которой вы вызвали, это немного усложняет задачу, поскольку, как объясняется в ネ ロ ク, вы не можете напрямую экспортировать переменные среды из дочернего процесса (make
) в его родительский процесс (оболочка, из которой вы вызываете make
). Но если вы примете вызов сделать так:
eval $(make)
тогда это действительно возможно: просто повторить export VARIABLE1=VALUE1; export VARIABLE2=VALUE2; ...
в вашем рецепте. Предупреждение: вам также нужно будет гарантировать, что ничто иное не будет отражено make на стандартном вводе. Но вместо этого вы можете использовать стандартную ошибку. Пример:
$ cat Makefile
export TEST_ENV_ONE := OneString
all:
@printf 'make variable TEST_ENV_ONE = %s\n' "$(TEST_ENV_ONE)" 1>&2
@printf 'in-recipe shell variable TEST_ENV_ONE = %s\n' "$$TEST_ENV_ONE" 1>&2
@printf 'export TEST_ENV_ONE="%s"\n' '$(TEST_ENV_ONE)'
$ unset TEST_ENV_ONE
$ printenv TEST_ENV_ONE
$ eval $(make)
make variable TEST_ENV_ONE = OneString
in-recipe shell variable TEST_ENV_ONE = OneString
$ printenv TEST_ENV_ONE
OneString
Обратите внимание, что make более или менее рассматривает переменные окружения как переменные make. Из GNU сделайте инструкцию:
Переменные в make могут исходить из среды, в которой запускается make.
Каждая переменная окружения, которая make видит, когда она запускается
преобразован в переменную make с тем же именем и значением.
Однако явное присваивание в make-файле или с помощью команды
аргумент, переопределяет окружающую среду. (Если указан флаг «-e»,
затем значения из среды переопределяют назначения в make-файле.
Смотрите Сводка опций. Но это не рекомендуемая практика.)
Таким образом, если значение вашей переменной не является результатом сложных вычислений самим make, гораздо более естественным способом получить тот же результат будет определение переменной окружения в родительской оболочке и использование ее как в Makefile:
$ cat Makefile
all:
@printf 'make variable TEST_ENV_ONE = %s\n' "$(TEST_ENV_ONE)"
@printf 'in-recipe shell variable TEST_ENV_ONE = %s\n' "$$TEST_ENV_ONE"
$ export TEST_ENV_ONE=OneString
$ make
make variable TEST_ENV_ONE = OneString
in-recipe shell variable TEST_ENV_ONE = OneString
$ printenv TEST_ENV_ONE
OneString