Есть еще несколько слоев, и вы, вероятно, окажетесь со своим следующим шагом, но по одному за раз. Рецепты выполняются в оболочке, более конкретно, по умолчанию, я считаю, что и в нашем случае, /bin/sh
, который не понимает source
, поэтому ... измените ваш Makefile
на:
env:
. ../env/bin/activate
Или определите переменную make SHELL
, чтобы сказать /bin/bash
, и она будет работать:
SHELL := /bin/bash
env:
source ../env/bin/activate
Но, следующая вещь ... строка рецепта делает fork()
свою собственную оболочку (среду) Таким образом, изменения, внесенные в один экземпляр оболочки (путем создания сценария), не влияют на следующий. Вы можете обойти это и создать только одну оболочку, объединив несколько команд рецептов в одну строку (экранируя новые строки и разделяя команды с помощью ;
вместо:
env:
. ../env/bin/activate ; \
SOME_COMMAND
Но это по-прежнему эффективно только для команд которые являются частью этой единой командной строки.
Вы можете рассмотреть возможность сделать то же самое в нескольких рецептах, но на самом деле, если вам нужно, чтобы среда была активной для всего, что происходит в make, вы можете просто захотеть ее активировать сначала перед вызовом make.