在Makefile中嵌入Python来设置make变量



我有一个复杂的逻辑来检测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)'

最新更新