
У меня есть следующий 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
, а не наоборот.