Вопрос

Возможно ли обновить среду из 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top