Make 대상에서 Python 코드 조각을 실행하려고 하는데 이 항목이 Make에서 어떻게 작동하는지 파악하는 데 문제가 있습니다.
지금까지 시도한 내용은 다음과 같습니다.
define BROWSER_PYSCRIPT
import os, webbrowser, sys
try:
from urllib import pathname2url
except:
from urllib.request import pathname2url
webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1])))
endef
BROWSER := $(shell python -c '$(BROWSER_PYSCRIPT)')
다음과 같은 대상에서 $(BROWSER)를 사용하고 싶습니다.
docs:
#.. compile docs
$(BROWSER) docs/index.html
이게 정말 나쁜 생각인가요?
답변1
관련된:https://stackoverflow.com/q/649246/4937930
단일 레시피에서처럼 여러 줄 변수를 호출할 수는 없지만, 이렇게 하면 여러 레시피로 확장되어 구문 오류가 발생합니다.
가능한 해결책은 다음과 같습니다.
export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"
docs:
#.. compile docs
$(BROWSER) docs/index.html
답변2
Yaegashi의 접근 방식은 효과가 있지만 이에 대한 동적 가치를 제공하는 것은 쉽지 않습니다. Makefile이 구문 분석되면 "export" 명령이 평가되고 셸 환경 변수가 레시피로 설정됩니다. 그런 다음 "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,$@)