Может ли makefile обновить вызывающую среду?
Вопрос
Возможно ли обновить среду из makefile?Я хочу иметь возможность создать цель, чтобы установить для них переменные клиентской среды.Что- то вроде этого:
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
и пусть это работает без необходимости им самим устанавливать путь к классу для выполнения java.
Или я хочу сделать это неправильным способом, и есть способ получше?
Решение
Нет, вы не можете обновить среду в вызывающем процессе таким образом.Как правило, подпроцесс не может изменять среду родительского процесса.Одним из заметных исключений являются пакетные файлы в Windows при запуске из командной оболочки.Основываясь на примере, который вы показываете, я предполагаю, что вы все же не работаете в 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" параметром скрипта, а не жестко кодировать его.
Другие советы
Исходя из вашего вопроса, я предполагаю, что вы используете оболочку bash.
Вы можете поместить определения переменных в сценарий оболочки, например:
AXIS2_HOME=/usr/local/axis2-1.4.1
export AXIS2_HOME
#etc
И тогда source
скрипт в текущую среду, с
source <filename>
или просто
. <filename>
Который выполняет скрипт в текущей оболочке (т.е.дочернего процесса нет), поэтому любые изменения среды, внесенные скриптом, будут сохраняться.
Быстрый ответ - да, однако в вашем коде вам нужно будет определить переменные в setenv:директива.Выполнение этого в начале Makefile делает его локальной переменной для Makefile.Я бы использовал LOCAL_...в верхней части файла, затем установите его в setenv:директива с VAR=LOCAL_VAR и т.д...Также помните, что вам нужно будет вызвать makefile только с помощью make setenv.Я бы действительно подумал о том, чтобы сделать это в bash-скрипте, поскольку переменная должна быть создана вне Makefile.Как только переменная будет сгенерирована в среде, вы сможете назначить ее и экспортировать из Makefile.