附录B:从其他构建系统迁移
您可以使用qbs create-project命令从任意目录结构自动生成Qbs项目文件。这对于从qmake或CMake等其他构建工具迁移非常有用。
要使用此工具,请切换到项目目录并运行位于Qbs安装目录(或Qt Creator安装目录)的bin目录中的qbs create-project命令。
在生成初始.qbs文件后,如以下各节所述,请向其添加缺少的配置变量和函数。
从qmake迁移
以下各节描述了qmake变量值的Qbs等价物。
CONFIG
指定项目配置和编译器选项。
console
将Product.consoleApplication属性设置为true以用于Application、CppApplication或QtApplication项目。例如
Application {
name: "helloworld"
files: "main.cpp"
Depends { name: "cpp" }
consoleApplication: true
}ordered
此qmake变量没有在Qbs中直接等价的变量。相反,构建顺序由产品之间的隐式和显式依赖项确定。要添加显式依赖项,请向product添加一个Depends项目
CppApplication {
name: "myapp"
Depends { name: "mylib" }
}产品myapp依赖于并链接到产品mylib,因此它在其之后构建。
qt
在qmake中,Qt依赖性是隐式的,而在Qbs中则不是。如果CONFIG -= qt,添加一个Depends项目以指定该product依赖于cpp模块
Product {
Depends { name: "cpp" }
}DEFINES
设置cpp.defines属性product。
注意: 要引用cpp.defines,您必须指定对cpp模块的依赖。
Product {
Depends { name: "cpp" }
cpp.defines: ["SUPPORT_MY_FEATURES"]
}DESTDIR
我们建议您使用安装机制指定目标文件的位置
Application {
Group {
name: "Runtime resources"
files: "*.qml"
qbs.install: true
qbs.installDir: "share/myproject"
}
Group {
name: "The App itself"
fileTagsFilter: "application"
qbs.install: true
qbs.installDir: "bin"
}
}如果不可能,您可以使用destinationDirectory属性
DynamicLibrary {
name: "mydll"
destinationDirectory: "libDir"
}HEADERS, SOURCES, FORMS, RESOURCES, OTHER_FILES
将头文件、源文件、窗体、资源文件以及任何其他文件包括为Product.files或Group.files属性的值
QtApplication { name: "myapp" files: ["myapp.h", "myapp.cpp", "myapp.ui", "myapp.qrc", "readme.txt"] }
Qbs使用文件标记器来确定其正在处理的文件的类型。
ICON
在Qbs中找不到直接等效的项。如果您将一个依赖项添加到ib模块,并将.xcassets目录作为Product.files属性的值,Qbs会在为Apple平台构建时自动处理设置应用程序图标
Application {
name: "myapp"
files [".xcassets"]
Depends { name: "ib" }
}或者,您可以将图标名称设置为bundle.infoPlist参数的值,指定对ib模块的依赖项,并将应用程序的.icns文件作为files属性的值添加
Application {
name: "myapp"
files ["myapp.icns"]
Depends { name: "ib" }
bundle.infoPlist: ({"CFBundleIconFile": "myapp"})INCLUDEPATH
将包含文件路径作为cpp.includePaths属性的值添加
CppApplication {
cpp.includePaths: ["..", "some/other/dir"]
}LIBS
对于项目部分中的库,使用Depends项。
要引入外部库,使用Unix的cpp.libraryPaths属性作为-L(库路径)标志,以及cpp.dynamicLibraries和cpp.staticLibraries属性作为-l(库)标志。
例如,LIBS += -L/usr/local/lib -lm将变为
CppApplication {
cpp.libraryPaths: ["/usr/local/lib"]
cpp.dynamicLibraries: ["m"]
}OUT_PWD
使用Product.buildDirectory属性引用生成的工件的基本输出目录。
PWD
与文件作用域变量path相对应。
_PRO_FILE_
当在项目或产品中使用时,与文件作用域变量filePath相对应。
_PRO_FILE_PWD_
与Project.sourceDirectory或Product.sourceDirectory属性相对应。
QMAKE_ASSET_CATALOGS
将一个依赖项添加到ib模块,并将.xcassets目录作为files属性的值添加
Application {
name: "myapp"
files [".xcassets"]
Depends { name: "ib" }
}QMAKE_BUNDLE_DATA
目前,您可以使用安装机制手动将文件放置在正确的位置。更好的解决方案正在开发中。
QMAKE_BUNDLE_EXTENSION
设置bundle.extension属性。
注意:与qmake不同,Qbs会自动将点(.)预置于属性值之前。
QMAKE_{C,CXX,OBJECTIVE}_CFLAGS{_DEBUG,_RELEASE}
使用cpp.commonCompilerFlags属性或与每个编译器标志变量对应的属性。
| qmake变量 | cpp模块属性 |
|---|---|
QMAKE_CFLAGS_DEBUG
| cpp.cFlags |
QMAKE_CXXFLAGS_DEBUG
| cpp.cxxFlags |
QMAKE_OBJECTIVE_CFLAGS | cpp.objcFlags |
使用属性项或简单的条件作为qbs.buildVariant属性的值,以模拟qmake变量的_DEBUG和_RELEASE变体。
QMAKE_FRAMEWORK_BUNDLE_NAME
设置 bundle(bundleName) 属性(从 Product.targetName 继承)和 bundle.extension。
QMAKE_FRAMEWORK_VERSION
设置 bundle.frameworkVersion 属性。
QMAKE_INFO_PLIST
将 info.plist 文件作为 files 属性的值,并指定对 bundle 模块的依赖。
Application {
name: "myapp"
files ["info.plist"]
Depends { name: "bundle" }
}Qbs 将自动将任何必要的属性添加到您的 Info.plist 文件中。通常,它从项目的其他属性中确定适当的值,因此您不需要使用 Info.plist.in > Info.plist 配置机制。此外,您几乎不需要在源 Info.plist 文件中嵌入占位符。将 bundle.processInfoPlist 属性设置为 false 以禁用此行为。
\\ ... bundle.processInfoPlist: false
除了或代替使用实际的 Info.plist 文件外,您还可以使用 bundle.infoPlist 属性添加 Info.plist 属性。例如
\\ ... bundle.infoPlist: ({ "NSHumanReadableCopyright": "Copyright (c) 2017 Bob Inc", "Some other key", "Some other value, & XML special characters are no problem! >;) 非凡!" })
QMAKE_LFLAGS
为 product 设置 cpp.linkerFlags 属性。
QMAKE_{MACOSX,IOS,TVOS,WATCHOS}_DEPLOYMENT_TARGET
对于每个 qmake 部署目标变量,使用 cpp 模块的对应属性。
| qmake变量 | cpp模块属性 |
|---|---|
QMAKE_MACOSX_DEPLOYMENT_TARGET | cpp.minimumMacosVersion |
QMAKE_IOS_DEPLOYMENT_TARGET | cpp.minimumIosVersion |
QMAKE_TVOS_DEPLOYMENT_TARGET | cpp.minimumTvosVersion |
QMAKE_WATCHOS_DEPLOYMENT_TARGET | cpp.minimumWatchosVersion |
QMAKE_RPATHDIR
为 product 设置 cpp.rpaths 属性。
QMAKE_SONAME_PREFIX
为 product 使用 cpp.sonamePrefix 属性。
QML_IMPORT_PATH
仅用于 Qt Creator QML 语法高亮。在 Product、Application、CppApplication 或 QtApplication 中,创建一个 qmlImportPaths 属性
Product {
name: "myProduct"
property stringList qmlImportPaths: [sourceDirectory + "/path/to/qml/"]
}QT
向 product 添加一个 Depends 元素,指定对 Qt 模块的依赖。例如
QtApplication { Depends { name: "Qt.widgets" } }
您还可以使用以下等效于上一个的格式
QtApplication { Depends { name: "Qt"; submodules: "widgets" } }
QTPLUGIN
构建静态应用程序通常需要链接到静态 QPA 插件,例如 qminimal。您可以使用以下语法启用 Qbs 链接所需的插件
QtApplication { name: "myapp" Depends { name: "Qt"; submodules: ["core", "gui", "widgets"] } Depends { name: "Qt.qminimal"; condition: Qt.core.staticBuild } }
RC_FILE
将 Windows 资源文件添加到 Product.files 属性的值。
TARGET
使用 Product.targetName 属性指定目标实体的基本文件名。
TEMPLATE
app
CppApplication {
name: "helloworld"
files: "main.cpp"
}这与以下内容大致相同
Product {
name: "helloworld"
type: "application"
files: "main.cpp"
Depends { name: "cpp" }
}lib
根据.pro文件中CONFIG参数的值决定使用动态库或静态库作为产品,如果值为shared
DynamicLibrary {
name: "mydll"
files: ["mySourceFile.cpp"]
Depends { name: "cpp" }
}subdirs
Project {
references: [
"app/app.qbs",
"lib/lib.qbs"
]
}message(), warning(), error(), log()
您可以使用控制台API将信息、警告、错误和日志消息打印到控制台。
Product {
name: {
console.info("--> now evaluating the product name");
return "theName";
}
Depends { name: "cpp" }
cpp.includePath: { throw "An error occurred." }
}©2023 The Qt Company Ltd. 此处包含的文档贡献均为各自所有者的版权。提供的文档根据GNU自由文档许可证1.3版进行许可,该许可证由自由软件基金会发布。Qt及其相关标志在芬兰和/或其他国家和地区是The Qt Company Ltd的商标。所有其他商标均属于其各自所有者。