目录
添加新的配置功能
安装文件
添加自定义目标
添加编译器
库依赖
添加新的配置功能
通过qmake,您可以通过将其名称添加到CONFIG变量指定的值列表中来创建可包含在项目文件中的功能。功能是.prf文件中的自定义函数和定义的集合,这些文件可以驻留在许多标准目录之一中。这些目录的位置定义在许多地方,当qmake查找.prf文件时,它们按以下顺序检查每个目录:
- 在QMAKEFEATURES环境变量中列出的目录中,该目录包含由平台的路径列表分隔符(Unix的冒号,Windows的分号)分隔的目录列表。
- 在QMAKEFEATURES属性变量中列出的目录中,该目录包含由平台的路径列表分隔符分隔的目录列表。
- 在mkspecs目录中的features目录中。 mkspecs目录可以位于QMAKEPATH环境变量中列出的任何目录下,该目录包含由平台的路径列表分隔符分隔的目录列表。例如:$QMAKEPATH/mkspecs/<feature>。
- 在功能目录中,该目录位于QMAKESPEC环境变量提供的目录下。例如:$QMAKESPEC/<features>。
- 在位于data_install/mkspecs目录中的功能目录中。例如:data_install/mkspecs/<features>。
- 在功能目录中,该目录作为QMAKESPEC环境变量指定的目录的同级存在。例如:$ QMAKESPEC/../<features>。
在以下功能目录中搜索功能文件:
- features/unix,features/win32,或features/macx,取决于使用的平台
- features/
例如,考虑项目文件中的以下设置:
CONFIG += myfeatures
加上CONFIG变量后,qmake在完成对项目文件的解析后,将在上面列出的位置搜索myfeatures.prf文件。在Unix系统上,它将查找以下文件:
- $QMAKEFEATURES/myfeatures.prf(针对QMAKEFEATURES环境变量中列出的每个目录)
- $$QMAKEFEATURES/myfeatures.prf(针对QMAKEFEATURES属性变量中列出的每个目录)
- myfeatures.prf(在项目的根目录中)。项目根目录由顶级.pro文件确定。但是,如果将.qmake.cache文件放置在子目录或子项目的目录中,则项目根目录将成为子目录本身。
- $QMAKEPATH/mkspecs/features/unix/myfeatures.prf和$QMAKEPATH/mkspecs/features/myfeatures.prf(针对QMAKEPATH环境变量中列出的每个目录)
- $QMAKESPEC/features/unix/myfeatures.prf和$QMAKESPEC/features/myfeatures.prf
- data_install/mkspecs/features/unix/myfeatures.prf和data_install/mkspecs/features/myfeatures.prf
- $ QMAKESPEC /../ features / unix / myfeatures.prf和$ QMAKESPEC /../ features / myfeatures.prf
注意:.prf文件的名称必须小写。
安装文件
在Unix上,通常也使用构建工具来安装应用程序和库。例如,通过调用make install。因此,qmake具有安装集的概念,它是一个对象,其中包含有关项目部分安装方式的说明。例如,可以通过以下方式描述文档文件的集合:
documentation.path = /usr/local/program/doc
documentation.files = docs/*
路径成员通知qmake应该将文件安装在/usr/local/program/doc(路径成员)中,并且文件成员指定应复制到安装目录的文件。 在这种情况下,docs目录中的所有内容都将复制到/usr/local/program/doc。
完整描述了安装集后,您可以使用如下一行将其追加到安装列表中:
INSTALLS += documentation
qmake将确保将指定的文件复制到安装目录。 如果需要对该过程进行更多控制,则还可以为对象的额外成员提供定义。 例如,以下行告诉qmake为此安装集执行一系列命令:
unix:documentation.extra = create_docs; mv master.doc toc.doc
Unix范围可确保仅在Unix平台上执行这些特定命令。 可以使用其他域规则来定义用于其他平台的适当命令。
在执行对象的其他成员中的指令之前,将执行额外成员中指定的命令。
如果您将内置安装集附加到INSTALLS变量,并且不指定文件或额外成员,则qmake将决定需要为您复制哪些内容。 当前,支持target和dlltarget安装集。 例如:
target.path = /usr/local/myprogram
INSTALLS += target
在以上几行中,qmake知道需要复制什么,并将自动处理安装过程。
添加自定义目标
qmake试图做一个跨平台构建工具所期望的一切。 当您确实需要运行特殊的平台相关命令时,可以通过针对不同qmake后端的特定指令来实现。
Makefile输出的自定义是通过对象风格的API执行的,如在qmake中的其他位置所发现的那样。 通过指定对象的成员来自动定义对象。 例如:
mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2
mytarget2.commands = @echo Building $$mytarget.target
上面的定义定义了一个名为mytarget的qmake目标,其中包含一个名为.buildfile的Makefile目标,该目标又通过touch命令生成。 最后,.depends成员指定mytarget依赖于mytarget2,后者是随后定义的另一个目标。 mytarget2是一个虚拟目标。 它仅定义为向控制台回显一些文本。
最后一步是使用QMAKE_EXTRA_TARGETS变量来指示qmake该对象是要构建的目标:
QMAKE_EXTRA_TARGETS += mytarget mytarget2
这是实际构建自定义目标所需要做的一切。 当然,您可能希望将这些目标之一与qmake构建目标联系起来。 为此,您只需要在PRE_TARGETDEPS列表中包括Makefile目标即可。
自定义目标规范支持以下成员:
成员 | 描述 | commands | 用于生成自定义目标的命令。 | CONFIG | 自定义目标的特定配置选项。 可以设置为递归,以指示应在Makefile中创建规则以调用子目标特定的Makefile中的相关目标。 该成员默认为每个子目标创建一个条目。 | depends | 自定义目标所依赖的现有构建目标。 | recurse | 指定在Makefile中创建规则以调用特定于子目标的Makefile时应使用的子目标。 仅当在CONFIG中设置了递归时才使用此成员。 典型值为“Debug”和“Release”。 | recurse_target | 指定应该通过子目标Makefile为Makefile中的规则构建的目标。 该成员添加了类似$(MAKE) -f Makefile。[subtarget] [recurse_target]。 仅当在CONFIG中设置了递归时才使用此成员。 | target | 自定义目标的名称。 |
添加编译器
可以自定义qmake以支持新的编译器和预处理器:
new_moc.output = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc
根据上述定义,您可以使用moc的直接替代品(如果有)。 该命令在赋予NEW_HEADERS变量的所有参数上执行(来自输入成员),并将结果写入输出成员定义的文件中。 该文件被添加到项目中的其他源文件中。 另外,qmake将执行depend_command来生成依赖项信息,并将该信息也放置在项目中。
自定义编译器规范支持以下成员:
成员 | 描述 | commands | 用于从输入生成输出的命令。 | CONFIG | 自定义编译器的特定配置选项。 有关详细信息,请参见CONFIG表。 | depend_command | 指定用于生成输出依赖性列表的命令。 | dependency_type | 指定输出的文件类型。 如果它是已知类型(例如TYPE_C,TYPE_UI,TYPE_QRC),则将其视为这些文件类型之一。 | depends | 指定输出文件的依赖性。 | input | 该变量指定应使用自定义编译器处理的文件。 | name | 自定义编译器正在执行的操作的描述。 仅在某些后端中使用。 | output | 由自定义编译器创建的文件名。 | output_function | 指定一个自定义qmake函数,该函数用于指定要创建的文件名。 | variables | 指示在pro文件中称为$(VARNAME)时,此处指定的变量已用$(QMAKE_COMP_VARNAME)替换。 | variable_out | 由输出创建的文件应添加到此变量。 |
CONFIG成员支持以下选项:
选项 | 描述 | combine | 表示所有输入文件都组合到一个输出文件中。 | target_predeps | 指示应将输出添加到PRE_TARGETDEPS列表中。 | explicit_dependencies | 输出的依赖项仅从depends成员生成,而从其他任何地方都不生成。 | dep_existing_only | 检查.depend_command结果产生的每个依赖项是否存在。 不存在的依赖项将被忽略。 这个值是在Qt 5.13.2中引入的。 | dep_lines | .depend_command的输出解释为每行一个文件。 默认值是在空白处分割,仅出于向后兼容的原因而保留。 | no_link | 指示不应将输出添加到要链接的对象列表中。 |
库依赖
通常,在链接到库时,qmake依赖基础平台来了解该库链接到的其他库,并允许平台将它们引入。但是,在许多情况下,这还不够。 例如,当静态链接一个库时,没有其他库被链接,因此不创建对这些库的依赖关系。 但是,以后与此库链接的应用程序将需要知道在哪里可以找到静态库所需的符号。 如果显式启用跟踪,则qmake尝试在适当的情况下跟踪库的依赖项。
第一步是在库本身中启用依赖项跟踪。 为此,您必须告诉qmake保存有关库的信息:
CONFIG += create_prl
这仅与lib模板有关,所有其他模板都将被忽略。 启用此选项后,qmake将创建一个以.prl结尾的文件,该文件将保存有关该库的一些元信息。 此元文件就像普通的项目文件一样,但是仅包含内部变量声明。 安装此库时,通过在INSTALLS声明中将其指定为目标库,qmake将自动将.prl文件复制到安装路径。
此过程的第二步是在使用静态库的应用程序中启用此元信息的读取:
CONFIG += link_prl
启用此功能后,qmake将处理该应用程序链接到的所有库,并找到它们的元信息。 qmake将使用它来确定相关的链接信息,特别是将值添加到应用程序项目文件的DEFINES以及LIBS列表中。 一旦qmake处理了该文件,它将在LIBS变量中浏览新引入的库,并找到它们的相关.prl文件,直到所有库都被解析为止。 此时,将像往常一样创建Makefile,并且将库与应用程序明确链接。 .prl文件应仅由qmake创建,并且不应在操作系统之间传输,因为它们可能包含平台相关的信息。 |