我有一个复杂的逻辑来检测Makefile变量的路径。我放弃了在make语言中做这个,所以我用Python编码,并希望将代码嵌入到Makefile中以设置变量。但是,这不起作用:
define DETECT_SDK
import os
locations = [
"../google_appengine",
"/usr/local/google_appengine",
"../.locally/google_appengine",
]
for path in locations:
if os.path.exists(path):
print(path)
break
else:
print(".")
endef
SDK_PATH ?= $(shell python -c $(DETECT_SDK))
default:
python -c 'import sys; print(sys.argv)' $(SDK_PATH)
UPDATE:更新多行定义从是否可能在Makefile中创建一个多行字符串变量之前它在Makefile:2: *** missing separator. Stop.
上失败了。现在它失败了,出现了另一个错误:
/bin/sh: 1: Syntax error: "(" unexpected
python -c 'import sys; print(sys.argv)'
['-c']
你必须引用你传递给Python的字符串:
SDK_PATH ?= $(shell python -c '$(DETECT_SDK)')
否则,shell在解析Python脚本时会感到困惑。
编辑:我不懂你的Python脚本。要么你的缩进是错误的,所以else
应该附加到if (grrr…)或者你错过了break
语句…或者可能else
只是没用。在编写时,它将生成一个以换行符分隔的现有路径列表,加上"。"。如果你描述一下你真正想做的事情,而不是简单地说你已经放弃了,我们可以帮助你。
例如,如果你想做的是打印列表中第一个存在的路径,或者如果不存在(也就是说,你的Python循环在print
之后缺少break
),那么你可以很容易地在GNU make中做到这一点:
SDK_PATH_LIST = ../google/appengine /usr/local/google_appengine ../.locally/google_appengine
SDK_PATH ?= $(firstword $(wildcard $(SDK_PATH_LIST:%=%/.)) .)
由于make
的一些错误,它试图执行多行字符串,下面的工作为我:
define NEWLINE
endef
define DETECT_SDK
import os
locations = [
"../google_appengine",
"/usr/local/google_appengine",
"../.locally/google_appengine",
]
for path in locations:
if os.path.exists(path):
print(path)
break
endef
SDK_PATH ?= $(shell echo '$(subst $(NEWLINE),@NEWLINE@,${DETECT_SDK})' | sed 's/@NEWLINE@/n/g' | python -)
default:
@echo 'SDK Path Detected: $(SDK_PATH)'