Makefile с исходной командой не работает

Makefile с исходной командой не работает

У меня есть следующий Makefile

env:
    source venv/bin/activate

Когда я make envактивирую виртуальную среду Python, я получаю следующую ошибку

источник venv/bin/activate make: источник: Такого файла или каталога нет make: *** [env] Ошибка 1

Но когда я копирую source venv/bin/activateи запускаю в оболочке, он работает нормально. Нужно ли мне устанавливать текущий каталог внутри Makefile?

решение1

sourceэтооболочка встроеннаякоманда, не исполняемый файл, который можно запустить откуда угодно, а оболочка. Что sourceделает, так это читает и выполняет содержимое файлав текущей оболочке,без запуска новой оболочки.

Целью этого является изменение состояния текущей оболочки (если вы просто sh venv/bin/activate, ваша оболочка также выполнит содержимое скрипта activate, но затем завершит работу и выйдет).

Но то, что вы хотите сделать, этоизменить состояние вашей makeпрограммы. Запуск activateскрипта в оболочке, которую вы порождаете, каким бы то ни было образом, из make, не изменит ничего в среде, которую makeвидит.
Это потому, что каждая программа (A), запущенная другой программой (B), получает свою собственную копию среды запускающей программы (B), которую она (A) может изменять по своему желанию, не влияя на среду запускающей программы (B).

Итак, то, что вы хотите сделать, не может сработать, даже теоретически.

Если вам нужно запустить какой-либо Makefile внутри venv, вам сначала придется получить исходный код activateскрипта, а затем запустить его из измененной таким образом оболочки make, а не наоборот.

Связанный контент