Можно ли установить переменные окружения в Makefile - будет использоваться после - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь установить переменную окружения в Makefile, чтобы ее можно было использовать в другой программе, работающей в оболочке sam, как make, но после запуска make.

Обновление: это невозможно в соответствии с принятым ответом с комментариями.

Шаги:

  1. Выполнить make test Настройка env: export TEST_ENV_ONE=OneString
  2. запустить другую программу, которая может читать TEST_ENV_ONE

Попробовал это:

Не работает:

test:
    export TEST_ENV_ONE=OneString
    $(shell export TEST_ENV_TWO=TwoString)

После этого пусто:

echo $TEST_ENV_ONE
echo $TEST_ENV_TWO

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Если вы хотите, чтобы переменные среды экспортировались в оболочку, из которой вы вызвали, это немного усложняет задачу, поскольку, как объясняется в ネ ロ ク, вы не можете напрямую экспортировать переменные среды из дочернего процесса (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
0 голосов
/ 31 августа 2018

Ваш export TEST_ENV_ONE=OneString выше работает в специальной оболочке. Последующие команды выполняются в других экземплярах оболочки. Следовательно, они не наследуют переменную среды TEST_ENV_ONE.


Вы можете использовать верхний уровень (то есть, не в рецепте цели) export директива в make-файле:

export env_var := MyEnvVariable

.PHONY: all
all:
    echo env_var: $$env_var

Таким образом, переменная env_var экспортируется в оболочки, которые будут выполнять рецепты.

Если вы запустите make с make-файлом выше:

$ make
echo env_var: $env_var
env_var: MyEnvVariable

Как видно из выходных данных, оболочка, которая запускает echo env_var: $env_var, имела переменную env_var в своей среде.

...