Вы просто не можете этого сделать. Нет никакого способа… процесс make может изменить среду своего родителя (или его текущий каталог, о котором вы могли бы подумать дальше).
На самом деле, даже меньше, чем вы думаете.
- Не все
make
реализации отражают присваивание PATH
переменной make в среде; GNU make (встречается в Linux и других системах) делает, а BSD make - нет.
- Каждая командная строка под целью запускается в отдельной подоболочке. (За исключением некоторых более старых BSD, которые могут быть реализованы.) Таким образом,
export PATH
строка работает в оболочке, которая завершается сразу после этого. Не то, чтобы эта строка вообще что-то делала - если PATH
она определена на этом этапе, это потому, что она уже находится в среде оболочки.
Make предназначен для создания вещей автоматически. Если вы хотите установить переменные для своей интерактивной среды, это не тот инструмент, на который вам следует обратить внимание. Вместо этого напишите фрагмент оболочки и поместите его в текущую оболочку:
. ./define-my-variables.sh
В вашем make-файле поставьте скрипт в каждой подоболочке . Вы можете использовать обратную косую черту, чтобы сделать длинную команду; помни это
- Последовательность обратного слеша-новой строки удаляется командой make, поэтому оболочка не увидит там новую строку.
- Не забудьте префикс каждой строки на вкладке, тем не менее.
- Поведение ошибки make в случае сбоя команды прерывается. Оболочка не будет делать это по умолчанию, и сбой любой команды, кроме последней, по умолчанию останется незамеченным, поэтому вам нужно запустить
set -e
.
install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ Обязательного примечание: нет разумного способа. Даже удаленный вызов chdir
через ptrace
отладчик не будет работать, как в большинстве оболочек, потому что им не нравится, когда их текущий каталог изменяется под их ногами.
Жиль "ТАК - перестань быть злым"
источник
Ты не можешь Подпроцесс (например
make
) не может изменить среду своего родительского процесса.Вы могли бы сделать что-то вроде
Где
pathupdate
выглядит цель:источник
Ваш ответ можно найти здесь: https://stackoverflow.com/a/8942216/367461
По сути, вы должны сделать это:
Я проверил это на Fedora 23 с GNU Make 4.0, и он отлично работает для меня.
источник
.SHELL: name=sh path=/path/to/wrapper-script
а затем создать скрипт-обертку, напримерexport FOO=bar; exec bash "$@"
Я собираюсь задать тот же вопрос, потому что я не смог заставить работать другой пример ответа.
Однако мне удалось добиться рабочего решения для меня с помощью
eval
команды. Я не слишком уверен, почему это не было опубликовано ранее.источник
export PATH=…
наdo_something:
линию, вам не нужноeval
.Вы можете заставить Make рекурсивно вызывать себя в измененной среде, например:
Если вы хотите использовать фрагмент оболочки:
источник