如何创建运行自定义生成事件的Makefile或.pro文件

时间:2015-11-11 13:35:49

标签: linux qt makefile

我目前使用一个小程序来处理Qt表单(.ui)文件,并自动生成具有公共基类的类,并使用虚函数来访问表单元素。 在Windows上,我将此工具作为ui表单文件上的自定义构建步骤运行。该工具的唯一参数是输入文件名。

为了澄清,在Windows上,Qt在.ui文件上运行uic,创建一个ui_filename.h文件。我需要在那个文件上运行我的工具。

我怎样才能/应该在linux上这样做?理想情况下,我将它构建到.pro文件中,但我也很乐意编辑Makefile。

我写Makefiles并不是很棒,所以这可能很简单。我很乐意为每个ui_或* .ui文件手动编写命令,但理想情况下,它会自动发生在所有.ui文件中。

1 个答案:

答案 0 :(得分:1)

不需要手动编写Makefile。调用自定义外部工具的Makefile可以由qmake从项目文件.pro生成。

需要使用QMAKE_EXTRA_TARGETS创建自定义目标。然后主要目标应设置为该自定义目标的denendent(自定义目标名称应添加到PRE_TARGETDEPS),例如How to modify the PATH variable in Qt Creator's project file (.pro)

该工具应在生成表单标头后运行,因此自定义目标应依赖于该文件customtarget1.depends = ui_mainwindow.h

customtarget1.target = form_scanner
customtarget1.commands = tool_win_bat_or_linux_shell.sh
customtarget1.depends = ui_mainwindow.h
QMAKE_EXTRA_TARGETS += customtarget1
PRE_TARGETDEPS += form_scanner

以上qmake命令会创建以下Makefile规则:

# the form header depends on mainwindow.ui
ui_mainwindow.h: ..\test\mainwindow.ui
<tab>#build command...

# form scanner depends on ui_mainwindow.h
form_scanner: ui_mainwindow.h
<tab>tool_win_bat_or_linux_shell.sh

# the final target depends on form scanner
$(DESTDIR_TARGET): form_scanner ui_mainwindowm.h $(OBJECTS) 

如果有多种表单,则可以创建许多自定义目标或创建一个依赖于所有表单文件的目标:

for (form, FORMS) {
    # autogenerated form headers are located in root of build directory
    FILE_NAME = $$basename(form)
    # prepend ui_ and replace ending .ui by .h
    FORM_HEADERS += ui_$$replace(FILE_NAME, .ui$, .h)
}

customtarget1.target = form_scanner
customtarget1.commands = tool_win_bat_or_linux_shell.sh  
customtarget1.depends = $$FORM_HEADERS

QMAKE_EXTRA_TARGETS += customtarget1
PRE_TARGETDEPS += form_scanner

因此,只有在生成所有表单标题时才会执行命令tool_win_bat_or_linux_shell.sh

也可以从项目目录$$PWD运行shell脚本,并将表单头文件名作为命令行参数传递:

customtarget1.commands = $$PWD/tool_win_bat_or_linux_shell.sh $$FORM_HEADERS

现在shell脚本可以为每个表单头tool_win_bat_or_linux_shell.sh运行一些命令:

# for each command line argument
for file in "$@"
do
    echo "$file"
    ls -l $file
done