无法使用以前定义的var

时间:2013-07-24 12:05:09

标签: windows makefile gnuwin32

我正在使用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时,它运行没有问题,结果是预期的。

怎么了?

1 个答案:

答案 0 :(得分:1)

GNU make不支持Windows风格的环境变量,例如%pyuic%。你的第一个例子是有效的,因为它正在调用Windows“shell”,而shell正在为你扩展这个值。在你的第二个例子中,GNU make试图直接调用命令。这可能被认为是GNU make中的一个错误:可能如果make在Windows上的规则中看到%,它应该总是使用Windows shell。

无论如何,你应该使用GNU make的变量语法; GNU make会在启动时导入所有环境变量,因此您可以将它们称为make变量。这样更便携,因为显然%pyuic%除了Windows之外什么都不会起作用:

UIC := $(pyuic)