Может ли make-файл обновить среду вызова? - PullRequest
5 голосов
/ 24 марта 2009

Возможно ли обновить окружение из make-файла? Я хочу быть в состоянии создать цель, чтобы установить переменные среды клиента для них. Примерно так:

AXIS2_HOME ?= /usr/local/axis2-1.4.1
JAVA_HOME  ?= /usr/java/latest
CLASSPATH  := foo foo

setenv:
    export AXIS2_HOME
    export JAVA_HOME
    export CLASSPATH

Чтобы клиент мог просто сделать:

make setenv all
java MainClass

и заставить его работать без необходимости самим устанавливать classpath для выполнения java.

Или я пытаюсь сделать это неправильно, и есть лучший способ?

Ответы [ 3 ]

5 голосов
/ 24 марта 2009

Нет, вы не можете обновить среду в процессе вызова таким образом. Как правило, подпроцесс не может изменить среду родительского процесса. Одно заметное исключение - командные файлы в Windows при запуске из оболочки cmd. Исходя из приведенного вами примера, я полагаю, что вы не работаете в Windows.

Обычно то, что вы пытаетесь выполнить, выполняется с помощью сценария оболочки, который устанавливает среду и затем запускает намеченный вами процесс. Например, вы можете написать скрипт go.sh, например:

!#/bin/sh
AXIS2_HOME=/usr/local/axix2-1.4.1
JAVA_HOME=/usr/java/latest
CLASSPATH=foo foo
export AXIS2_HOME
export JAVA_HOME
export CLASSPATH
java MainClass

Сделайте go.sh исполняемым, и теперь вы можете запускать приложение как ./go.sh. Вы также можете сделать свой сценарий более сложным, если хотите - например, вы можете сделать «MainClass» параметром сценария, а не жестко его кодировать.

4 голосов
/ 24 марта 2009

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

Вы можете поместить определения переменных в сценарий оболочки, например:

AXIS2_HOME=/usr/local/axis2-1.4.1
export AXIS2_HOME
#etc

А затем source скрипт в текущую среду, с

source <filename>

или просто

. <filename>

, который выполняет сценарий в текущей оболочке (т. Е. Дочерний процесс отсутствует), поэтому любые изменения среды, внесенные сценарием, сохранятся.

0 голосов
/ 24 марта 2009

Быстрый ответ - да, однако в вашем коде вам необходимо определить переменные в директиве setenv :. Выполнение этого в начале Makefile делает его локальной переменной для Makefile. Я бы использовал LOCAL _... вверху файла, затем установил его в директиве setenv: с VAR = LOCAL_VAR и т. Д. Также помните, что вам нужно будет вызывать make-файл только с make setenv. Я действительно хотел бы сделать это в скрипте bash, так как переменная должна быть создана вне Makefile. Как только переменная будет сгенерирована в среде, вы сможете назначать и экспортировать из Makefile.

...