2

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']
4

2 に答える 2

2

Python に渡す文字列を引用符で囲む必要があります。

SDK_PATH ?= $(shell python -c '$(DETECT_SDK)')

そうしないと、シェルは Python スクリプトを解析しようとして混乱します。

編集:

私はあなたのPythonスクリプトを理解していません。インデントが間違っているためelse、 if (grrr...) に添付する必要があるか、breakステートメントが欠落している可能性があります... または、おそらくelse役に立たないだけです。書かれているように、存在するパスと「.」の改行で区切られたリストを生成します。あきらめたというだけでなく、本当にやろうとしていることを説明していただければ、私たちがお手伝いできます。

たとえば、そのリスト内の最初の既存のパスを出力したい場合、または「.」何も存在しない場合 (つまり、Python ループに のbreak後にa がないprint場合)、GNU make でこれを簡単に実行できます。

SDK_PATH_LIST = ../google/appengine /usr/local/google_appengine ../.locally/google_appengine
SDK_PATH ?= $(firstword $(wildcard $(SDK_PATH_LIST:%=%/.)) .)
于 2013-06-15T18:25:15.600 に答える
1

複数行の文字列を実行しようとしたいくつかの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)'
于 2013-06-17T15:35:34.683 に答える