如何创建一个qmake函数来创建一个自定义的make目标
How to create a qmake function that creates a custom make target?
我知道我们有QMAKE_EXTRA_TARGETS
来创建新的makefile目标,如下所示(如http://blog.qt.io/blog/2008/04/16/the-power-of-qmake/):
conv.target=convert
conv.input=file.in
conv.output=file.out
conv.commands=convert.sh file.in file.out
QMAKE_EXTRA_TARGETS+=conv
在我的例子中,convert.sh
用于多个文件和目标。我想创建一个带有参数(target_name、input_file、output_file)的方法,为我创建任务,这样我就不必重复上面的行了。
qmake的文档非常缺乏,或者我还没有找到正确的来源,但据我所知,qmake中有两种类型的函数:替换和测试(http://doc.qt.io/qt-5/qmake-language.html#replace-函数),并且我们可以使用CCD_ 3和CCD_。
我试过:
defineTest(createConvertTask) {
custom.target = $$1
custom.input = $$2
custom.output = $$3
custom.commands = convert.sh $$2 > $$3
QMAKE_EXTRA_TARGETS += custom
}
但这并不能真正起作用,因为在多次调用createConvertTask
之后,QMAKE_EXTRA_TARGETS
将只包含字符串custom
的多个副本。
然而,这个
defineTest(createConvertTask) {
$$1.target = $$1
$$1.input = $$2
$$1.output = $$3
$$1.commands = convert.sh $$2 > $$3
QMAKE_EXTRA_TARGETS += $$1
}
失败,出现错误example.pro:2: error: Left hand side of assignment must expand to exactly one word.
关于如何处理这个问题,有什么想法吗?
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_FILE_IN}
包含当前输入文件,与${QMAKE_FILE_BASE}
相同,但没有扩展名。这里,输出文件名是从输入文件中生成的。CONFIG
选项告诉qmake不要将输出文件添加到对象列表中,而是将它们作为主目标的先决条件添加。此外,将生成make
目标compiler_convert_make_all
。
只需添加文件:
LIST_OF_IN_FILES += file1 file2
并制作
make compiler_convert_make_all
此选项还将所有输出文件添加到clean
目标(将在make clean
上删除。
2.选项:使用eval()
和export()
要将变量用作左手表达式,可以使用eval()
函数,该函数"使用qmake语法规则评估字符串的内容"。
eval($${1}.target = $$1)
由于这是在函数内部完成的,因此需要将所有变量export()
添加到全局范围中。
eval(export($${1}.target))
然后添加目标并导出QMAKE_EXTRA_TARGETS
:
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
)。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何创建一个空的全局类并在启动时实例化它
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 在c++中为double类型的数组创建一个unique_ptr
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何从这些语句中的每一个创建不同的函数?
- 给定一个创建的带有货物的链表,我需要使用函数检查实际序列或"train"是否有效
- 一个创建彩票游戏的程序,该彩票游戏可以有效地创建 10 套而没有任何重复?
- 如何实现一个创建新对象并返回对它的引用的C++方法
- 如何成功创建一个创建对象并返回指向该对象的指针的函数