Вы просто не можете этого сделать. Нет никакого способа… процесс 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
отладчик не будет работать, как в большинстве оболочек, потому что им не нравится, когда их текущий каталог изменяется под их ногами.