附录B:从其他构建系统迁移

您可以使用qbs create-project命令从任意目录结构自动生成Qbs项目文件。这对于从qmake或CMake等其他构建工具迁移非常有用。

要使用此工具,请切换到项目目录并运行位于Qbs安装目录(或Qt Creator安装目录)的bin目录中的qbs create-project命令。

在生成初始.qbs文件后,如以下各节所述,请向其添加缺少的配置变量和函数。

从qmake迁移

以下各节描述了qmake变量值的Qbs等价物。

CONFIG

指定项目配置和编译器选项。

console

Product.consoleApplication属性设置为true以用于ApplicationCppApplicationQtApplication项目。例如

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.filesGroup.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.dynamicLibrariescpp.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.sourceDirectoryProduct.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

QMAKE_CFLAGS_RELEASE

cpp.cFlags
QMAKE_CXXFLAGS_DEBUG

QMAKE_CXXFLAGS_RELEASE

cpp.cxxFlags
QMAKE_OBJECTIVE_CFLAGScpp.objcFlags

cpp.objcxxFlags

使用属性项或简单的条件作为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_TARGETcpp.minimumMacosVersion
QMAKE_IOS_DEPLOYMENT_TARGETcpp.minimumIosVersion
QMAKE_TVOS_DEPLOYMENT_TARGETcpp.minimumTvosVersion
QMAKE_WATCHOS_DEPLOYMENT_TARGETcpp.minimumWatchosVersion

QMAKE_RPATHDIR

product 设置 cpp.rpaths 属性。

QMAKE_SONAME_PREFIX

product 使用 cpp.sonamePrefix 属性。

QML_IMPORT_PATH

仅用于 Qt Creator QML 语法高亮。在 ProductApplicationCppApplicationQtApplication 中,创建一个 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

请使用应用程序C++应用程序作为产品

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的商标。所有其他商标均属于其各自所有者。