Подход Яэгаши будет работать, но придать ему значения «на лету» будет непросто. Команда 'export' выполняется во время анализа Makefile и устанавливает переменную среды оболочки для рецепта. Затем переменная среды оценивается во время выполнения рецепта 'docs'.
Если в вашем сниппете должны быть заполнены какие-либо переменные, зависящие от цели, я бы порекомендовал такой подход:
Если вам просто нужно запустить пару однострочников, этот шаблон будет работают довольно хорошо.
run_script = python -c \
"import time ;\
print 'Hello world!' ;\
print '%d + %d = %d' %($1,$2,$1+$2) ;\
print 'Running target \'%s\' at time %s' %('$3', time.ctime())"
test:
$(call run_script,4,3,$@)
Если вы хотите использовать странные символы и функции, циклы for или другие многострочные конструкции, вот модный шаблон, который прекрасно подойдет.
#--------------------------- Python Script Runner ----------------------------#
define \n
endef
escape_shellstring = \
$(subst `,\`,\
$(subst ",\",\
$(subst $$,\$$,\
$(subst \,\\,\
$1))))
escape_printf = \
$(subst \,\\,\
$(subst %,%%,\
$1))
create_string = \
$(subst $(\n),\n,\
$(call escape_shellstring,\
$(call escape_printf,\
$1)))
python_script = printf "$(call create_string,$($(1)))" | python
#------------------------------- User Scripts --------------------------------#
define my_script
def good_times():
print "good times!"
import time
print 'Hello world!'
print '%d + %d = %d' %($2,$3,$2+$3)
print 'Runni`ng $$BEEF \ttarget \t\n\n"%s" at time %s' %('$4', time.ctime())
good_times()
endef
#--------------------------------- Recipes -----------------------------------#
test:
$(call python_script,my_script,1,2,$@)