1

私はGnuWin32プロジェクトを使用しておりmakefile、いくつかのコードのコンパイルを管理するために を作成しました。コマンドラインで次を実行します。

set PYUIC=python "E:\PortableApps\Portable Python 2.7.3.1\App\Lib\site-packages\PyQt4\uic\pyuic.py"

私のmakeファイルには以下が含まれています:

UIC := %pyuic%
HELP_VIEW := less

vpath %.ui ./ui
vpath %.py ./py

.PHONY: help

help:
    ${HELP_VIEW} help

%.py: %.ui
    ${UIC} -o ./py/$@ $^

print_%:
    @echo $* = ${$*}

実行すると、次のようmake print_UICになります。

UIC = python "E:\PortableApps\Portable Python 2.7.3.1\App\Lib\site-packages\PyQt4\uic\pyuic.py"

しかし、「make main.py」を実行すると、次のようになります。

%pyuic% -o ./py/main.py ./ui/main.ui
process_begin: CreateProcess(NULL, %pyuic% -o ./py/main.py ./ui/main.ui, ...) fa
iled.
make (e=2): The system cannot find the file specified.
make: *** [main.py] Error 2

実行%pyuic% -o ./py/main.py ./ui/main.uiすると問題なく実行され、結果は期待どおりです。

どうしたの?

4

1 に答える 1

1

GNU make は、Windows スタイルの環境変数 ( %pyuic%. 最初の例は、Windows の「シェル」を呼び出しており、そのシェルがこの値を拡張しているため機能します。2 番目の例では、GNU make がコマンドを直接呼び出そうとしています。これは、GNU make のバグと見なすことができます。おそらく、make が%Windows のルールで a を検出した場合、常に Windows シェルを使用する必要があります。

とにかく、GNU make の変数構文を使用する必要があります。GNU make は起動時にすべての環境変数をインポートするので、それらを make 変数として参照できます。%pyuic%これは、明らかに Windows 以外ではまったく機能しないため、移植性がはるかに高くなります。

UIC := $(pyuic)
于 2013-07-24T12:14:37.643 に答える