使用一个规则为许多目标编写一个makefile?

时间:2013-04-05 08:47:34

标签: python windows qt makefile pyqt4

这似乎是一个非常简单的问题,但我找不到任何方法来解决它。

我的目的是通过调用pyuic4命令(来自PyQt)将每个“.ui”文件转换为“.py”文件。我尝试使用非常短的makefile来管理它:

%.py: %.ui
    pyuic4 $< --output $@

这就是我现在所需要的一切。

makefile名为“Makefile”,位于调用“make”的文件夹中,“.ui”文件也是如此。 “pyuic4(.bat)”位于系统的路径中(Windows 7),Unix Utilities也是“make”的一部分。

从Windows控制台运行“make”时,它说:

make: *** No targets.  Stop.

使用显式文件名从命令行调用pyuic4。

我知道我可以自己指定任何目标文件,但如果可能的话我想避免这种情况。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

根据kasterma的评论,你需要告诉make要构建哪个目标,但是你只提供了一个模式规则。这可以通过以下方式完成。

UIFILES := $(wildcard *.ui)
PYFILES := $(UIFILES:.ui=.py)

.PHONY: all
all: $(PYFILES)

%.py: %.ui
    pyuic4 $< --output $@

答案 1 :(得分:1)

由于您显然使用的是GNU Makefile语法,我建议您按照以下方式编写规则:

UIFILES = $(wildcard *.ui)

.PHONY: ui2py

ui2py: $(UIFILES)
        @for uifile in $(UIFILES); do \
                pyuic4 $$(uifile) --output $${uifile%.ui}.py; \
        done

答案 2 :(得分:1)

虽然问题可以通过perror或eriktous'解决方案来解决,但现在我只是通过简单地使用shell脚本调用pyuic4命令来进行eriktous提到的第三种方式。它的运行速度非常快,即使输出结果相同,也不会对源代码控制造成任何伤害。

我遇到了第二点,这可能会分散我的注意力。 pyuic4命令实际上名为pyuic4.bat,它是Windows中的“批处理文件”,类似于Linux / Unix环境中的shell脚本;相似,但不完全相同。如果从另一个批处理文件调用批处理文件,则应使用前导“call”语句调用该批处理文件,以防止在第一次调用后终止批处理。

如果我有三个文件(@符号是为了防止在执行期间列出命令)

D:\Projekte\test>type main.cmd
@sub1
@sub2

D:\Projekte\test>type sub1.cmd
@echo This is sub 1

D:\Projekte\test>type sub2.cmd
@echo This is sub 2

......结果只是

D:\Projekte\test>main
This is sub 1

所以我对这个非常小的东西的“解决方案”是一个名为“update.cmd”的简单批处理文件,可以通过此行的副本进行扩展:

call pyuic4 mainwindow.ui --output mainwindow.py

这不是我最初想要的,但它对我有用。

但无论如何,谢谢你的帮助: - )