C++ 如何创建创建自定义make目标的qmake函数?

C++ 如何创建创建自定义make目标的qmake函数?,c++,qt,makefile,qmake,C++,Qt,Makefile,Qmake,我知道我们有QMAKE_EXTRA_TARGETS来创建新的makefile目标,如下所示(如中所示): 在我的例子中,convert.sh用于多个文件和目标。我想创建一个带有参数(target_name、input_file、output_file)的方法,它为我创建任务,这样我就不必重复上面的几行 关于qmake的文档非常缺乏,或者我没有找到正确的源代码,但据我所知,qmake中有两种类型的函数:replace和test(),我们可以使用definerereplace和defineTest创

我知道我们有
QMAKE_EXTRA_TARGETS
来创建新的makefile目标,如下所示(如中所示):

在我的例子中,
convert.sh
用于多个文件和目标。我想创建一个带有参数(target_name、input_file、output_file)的方法,它为我创建任务,这样我就不必重复上面的几行

关于qmake的文档非常缺乏,或者我没有找到正确的源代码,但据我所知,qmake中有两种类型的函数:replace和test(),我们可以使用
definerereplace
defineTest
创建自定义函数

我试过:

defineTest(createConvertTask) {
    custom.target = $$1
    custom.input = $$2
    custom.output = $$3
    custom.commands = convert.sh $$2 > $$3
    QMAKE_EXTRA_TARGETS += custom
}
但这并没有真正起作用,因为在多次调用
createConvertTask
之后,
QMAKE\u EXTRA\u目标
将只包含字符串
custom
的多个副本

但是,

defineTest(createConvertTask) {
    $$1.target = $$1
    $$1.input = $$2
    $$1.output = $$3
    $$1.commands = convert.sh $$2 > $$3
    QMAKE_EXTRA_TARGETS += $$1
}
失败,出现错误
示例。pro:2:错误:作业的左侧必须扩展到一个单词。

关于如何实现这一点有什么想法吗?

1.选项:自定义编译器 使用这样的方法:

convert.input = LIST_OF_IN_FILES  # note: no $$
convert.output = $${SOME_DIR}/${QMAKE_FILE_BASE}.ext
convert.commands = convert.sh ${QMAKE_FILE_IN} > $${SOME_DIR}/${QMAKE_FILE_BASE}.ext

convert.CONFIG += no_link target_predeps
QMAKE_EXTRA_COMPILERS += convert
变量
${QMAKE\u FILE\u IN}
包含当前输入文件,与
${QMAKE\u FILE\u BASE}
相同,但没有扩展名。这里,输出文件名由输入文件生成。
CONFIG
选项告诉qmake不要将输出文件添加到对象列表中,而是将其作为主目标的先决条件添加。此外,将生成一个
make
target
compiler\u convert\u make\u all

只需添加文件:

LIST_OF_IN_FILES += file1 file2
使

make compiler_convert_make_all
此选项还将所有输出文件添加到
clean
目标(将在
makeclean
上删除)

2.选项:使用
eval()
export()
要将变量用作左手表达式,可以使用“使用qmake语法规则计算字符串内容”的

eval($${1}.target = $$1)
因为这是在一个函数中完成的,所以需要将所有变量分配到全局范围

eval(export($${1}.target))
然后添加目标并导出
QMAKE_EXTRA_目标

QMAKE_EXTRA_TARGETS += $${1}
export(QMAKE_EXTRA_TARGETS)
完成后,返回值将添加到自定义
convert
目标的依赖项中:

convert.target = convert

defineReplace(createConvertTask) {
    eval($${2}_custom.target = $$2)
    eval($${2}_custom.depends = $$1)
    eval($${2}_custom.commands = convert.sh $$1 > $$2)
    eval(export($${2}_custom.target))
    eval(export($${2}_custom.depends))
    eval(export($${2}_custom.commands))

    QMAKE_EXTRA_TARGETS += $${2}_custom
    export(QMAKE_EXTRA_TARGETS)
    return($${2}_custom)
 }

 convert.depends += $$createConvertTask(in_file_1, out_file_1)
 convert.depends += $$createConvertTask(in_file_2, out_file_2)

 QMAKE_EXTRA_TARGETS += convert
生成的
Makefile
中的结果:

out_file_1: in_file_1
       convert.sh in_file_1 > out_file_1

out_file_2: in_file_2
       convert.sh in_file_2 > out_file_2

convert: out_file_1 out_file_2
这种方法更灵活,可以扩展以支持可变目标参数(此处为常量
convert

out_file_1: in_file_1
       convert.sh in_file_1 > out_file_1

out_file_2: in_file_2
       convert.sh in_file_2 > out_file_2

convert: out_file_1 out_file_2