xmake 使用方式

1. 简介

参考链接1:xmake的使用_云守护的专栏-CSDN博客_xmake

XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目。

xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得一次编写,随处构建

它跟cmake、automake、premake有点类似,但是机制不同,它默认不会去生成IDE相关的工程文件,采用直接编译,并且更加的方便易用

采用lua的工程描述语法更简洁直观,支持在大部分常用平台上进行构建,以及交叉编译

并且xmake提供了创建、配置、编译、打包、安装、卸载、运行等一些actions,使得开发和构建更加的方便和流程化。

2. 支持特性

支持windows、mac、linux、ios、android等平台,自动检测不同平台上的编译工具链(也可手动配置);

编译windows项目采用原生vs的工具链,不需要使用cygwin、mingw(当然这些也支持)

支持自定义平台编译配置,可以很方便地扩展第三方平台支持

采用lua脚本语法描述项目,描述规则简单高效,逻辑规则可灵活修改,并且不会生成相关平台的工程文件,是工程更加简单明了

支持创建模板工程、配置项目、编译项目、运行、打包、安装和卸载等常用功能(后续还会增加:自动生成文档、调试等模块)

支持编译c/c++/objc/swift成静态库、动态库、命令行可执行程序

提供丰富的工程描述api,使用简单灵活,例如添加编译文件只需(还支持过滤排除):

add_files("src/*.c", "src/asm/**.S", "src/*.m")


支持头文件、接口、链接库依赖、类型的自动检测,并可自动生成配置头文件config.h

支持自定义编译配置开关,例如如果在工程描述文件中增加了enable_xxx的开关,那么配置编译的时候就可以手动进行配置来启用它:

xmake config --enable_xxx=y

提供一键打包功能,不管在哪个平台上进行打包,都只需要执行一条相同的命令,非常的方便

支持全局配置,一些常用的项目配置,例如工具链、规则描述等等,都可以进行全局配置,这样就不需要每次编译不同工程,都去配置一遍

除了可以自动检测依赖模块,也支持手动强制配置模块,还有各种编译flags。

支持插件扩展、平台扩展、模板扩展、选项自定义等高级功能

提供一些内置的常用插件(例如:自动生成doxygen文档插件,宏脚本记录和运行插件)

宏记录插件里面提供了一些内置的宏脚本(例如:批量打包一个平台的所有archs等),也可以在命令行中手动记录宏并回放执行

提供强大的task任务机制不依赖makefile和make,实现直接编译,内置自动多任务加速编译, xmake是一个真正的构架工具,而不仅仅是一个工程文件生成器

自动检测ccache,进行自动缓存提升构建速度

自动检测头文件依赖,并且快速自动构建修改的文件

3. 架构和流程

参考链接2:xmake: 轻量级跨平台C/C++构建工具,采用lua语法接口API描述项目,提供依赖检测、编译、打包、安装、运行、调试一条龙服务 (gitee.com)

4. 支持平台

Windows (x86, x64)

macOS (i386, x86_64, arm64)

Linux (i386, x86_64, cross-toolchains ..)

BSD (i386, x86_64)

Android (x86, x86_64, armeabi, armeabi-v7a, arm64-v8a)

iOS (armv7, armv7s, arm64, i386, x86_64)

WatchOS (armv7k, i386)

AppleTVOS (armv7, arm64, i386, x86_64)

MSYS (i386, x86_64)

MinGW (i386, x86_64, arm, arm64)

Cygwin (i386, x86_64)

Wasm (wasm32)

Cross (cross-toolchains ..)

5. 支持工具链


6. 支持语言

Objc/Objc++

Swift

Assembly

Golang

Rust

Dlang

Fortran

Cuda

Zig

7. 工程类型

静态库程序

动态库类型

控制台程序

Cuda程序

Qt应用程序

WDK驱动程序

WinSDK应用程序

MFC应用程序

iOS/MacOS应用程序

Framework和Bundle程序(iOS/MacOS)

8. xmake新增对Qt编译环境支持

8.1. 参考链接

参考链接3:xmake新增对Qt编译环境支持_TBOOX开源工程-CSDN博客

参考链接4:xmake 描述语法和作用域详解_TBOOX开源工程-CSDN博客

8.2. 简述

在最新的xmake v2.2.1版本中,新增了对Qt SDK环境的支持,我们完全可以脱离Qt Creater进行Qt应用程序的开发,甚至配合vscode/idea等编辑器+xmake插件(xmake-vscode, xmake-idea …),用户完全可以切换到自己最常用的编辑器环境中去开发和构建Qt程序。

8.3. 模板创建空工程

xmake内置了一些工程模板可以用来快速创建一个基于Qt的空工程,例如:

$ xmake create -l c++ -t console_qt test //控制台程序

$ xmake create -l c++ -t static_qt test //静态库

$ xmake create -l c++ -t shared_qt test //动态库

$ xmake create -l c++ -t quickapp_qt test //ui应用程序

以quickapp工程为例,最后生成的空工程xmake.lua内容大概长这样:

8.4. Qt SDK环境配置

默认情况下xmake会自动探测Qt环境,当然如果找不到Qt SDK环境,用户也可以手动指定Qt SDK环境目录:

$ xmake f --qt=~/Qt/Qt5.9.1

8.5. 静态库程序

xmake通过内置的构建规则qt.static,将其应用到对应的target,即可让相关target支持Qt静态库的构建,非常的方便简洁。

xmake官方网站:xmake

支持其他构建环境,也只需要方便地自定义一个自己的扩展规则,应用到对应的target即可实现,言归正传,我们看下Qt静态库的xmake.lua描述:

taget("test")

add_rules("qt.static")

add_files("src/*.cpp")

add_frameworks("QtNetwork", "QtGui")

非常简单,一般只需要这几行就ok了,如果需要用到Qt的一些框架库,可以通过add_frameworks来添加, 接着就是正常的编译过程:

$ xmake

8.6. 动态库程序

动态库程序跟上节介绍的静态库描述规则类似,唯一的区别就是吧构建规则改成add_rules("qt.shared")。

target("test")

add_rules("qt.shared")

add_files("src/*.cpp")

add_frameworks("QtNetwork", "QtGui")


add_rules("qt.shared")和之前的set_kind("shared")有什么区别呢,区别就是:set_kind("shared"): 是xmake最为基础的动态库构建模式,非常原始,不附加任何框架层的依赖库和配置add_rules("qt.shared"):仅用于Qt动态库的构建,属于内置的扩展规则,会附加Qt SDK的构建环境。

8.7. 控制台程序

控制台也是类似,直接替换构建规则就可以了:qt.console

target("test")

add_rules("qt.console")

add_files("src/*.cpp")

8.8. Quick应用程序

从Qt目前最新的SDK,主要提供了两种ui app的构建框架,Quick App 和 Widgets App,xmake也都进行了支持,并且统一规范成:qt.application Qt应用程序规则来简化设置。

target("qt_quickapp")

add_rules("qt.application")

add_files("src/*.cpp")

add_files("src/qml.qrc")

add_frameworks("QtQuick")

上述描述,仅仅只需要把对应的qml.qrc作为源文件添加进去,然后附加需要的QtQuick依赖库就行了。

注:虽然xmake的add_links也是用来添加依赖库进行链接的,但是这里建议对于Qt SDK提供的库还是用add_frameworks来添加,因为所有Qt的构建规则都对add_frameworks进行了扩展,

对Qt自带的框架库进行了更好的支持,也能根据构建模式自动切换debug/release版本的Qt库。

8.9. Widgets应用程序

Widgets App的描述规则还是用的qt.application,只需要把.ui文件添加进去就行了,唯一需要注意的是,带Q_OBJECTmeta的头文件,例如:mainwindow.h这种,因为有个moc预处理过程,所以也需要把它添加到源文件中,这样Qt的构建规则就会检测到,将其自动进行moc预处理。

target("qt_widgetapp")

add_rules("qt.application")

add_files("src/*.cpp")

add_files("src/mainwindow.ui")

add_files("src/mainwindow.h") -- 添加带有 Q_OBJECT 的meta头文件

add_frameworks("QtWidgets")

参考链接5:xmake新增对Qt编译环境支持 (tboox.org)

原文链接:,转发请注明来源!