xmake的初衷就是为了让用户能够用最简单直接的方式去描述工程,提供跨平台项目构建,因此,简洁,灵活
是xmake.lua的核心设计思想。
通过之前的那篇文章:xmake入门,构建项目原来可以如此简单,我们对如何使用xmake去构建项目有了大概的了解,并且能够编写一些简单的xmake.lua去描述项目,例如:
target("test")
set_kind("binary")
add_files("src/*.c")
但是平常我们实际的项目维护,不可能这么简单,会有各种各样的配置需求,例如: 添加每个平台特有的flags,处理debug/release编译模式,多个target的依赖编译等等,在混杂了用户各种配置需求后,xmake.lua的维护很容易变得很臃肿,可读性变差。
因此本文会介绍一些常用的编写模式,去尽可能的利用xmake的设计特性,去简化对工程的描述,提高可读性和易维护性,避免用户因为不了解xmake而导致的一些错误写法。
xmake的配置关系是根据tree结构继承,子xmake.lua会集成父xmake.lua中的配置,同一个xmake.lua中,所有target的配置会集成根作用域的配置,因此一些通用配置,可以放置在根域,避免重复设置,例如:
在最新的xmake v2.2.1版本中,新增了对Qt SDK环境的支持,我们完全可以脱离Qt Creater进行Qt应用程序的开发,甚至配合vscode/idea等编辑器+xmake插件(xmake-vscode, xmake-idea …), 用户完全可以切换到自己最常用的编辑器环境中去开发和构建Qt程序,例如这样:
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
内容大概长这样:
target("qt_demo")
-- add rules
add_rules("qt.application")
-- add headers
add_headers("src/*.h")
-- add files
add_files("src/*.cpp")
add_files("src/qml.qrc")
-- add frameworks
add_frameworks("QtQuick")
在开发xmake之前,我一直在使用gnumake/makefile来维护个人C/C++项目,一开始还好,然而等项目越来越庞大后,维护起来就非常吃力了,后续也用过一阵子automake系列工具,并不是很好用。
由于C/C++程序的构建过程比较繁琐,如果不借助IDE工具,很难快速构建一个新的C/C++程序,想要跨平台构建就更加麻烦了。
虽然IDE很好用,也很强大,但是还是有很多不足的地方,例如:
当然如果你熟悉makefile的话,也可以手敲makefile,不过不同平台用的make也不相同,比如: gnumake, nmake等,导致makefile语法存在差异性,无法做到一致性编译,而且对开发者有一定的使用门槛。
在win上使用gnumake还得装cygwin,mingw-msys等环境,也非常麻烦,折腾完环境就得半天时间。
目前已经有了很多现代化的构建工具,方便开发者构建和维护C/C++项目,例如:cmake, scons, premake, bazel, gn, gyp等等。
其中很多只能生成对应的IDE工程,然后再通过对应IDE来维护和构建,这种只是解决了C/C++项目的一致性维护问题,但是构建方式不一致,因此还是没解决之前列举的大部分不足点,也无法直接快速构建。
而cmake, scons虽然很强大,但是cmake语法怪异不直观,本人实在是不习惯,scons使用还需要依赖python,py2/py3的问题折腾起来也比较蛋疼。
鉴于此,我采用了lua来描述工程,利用lua的轻量,简洁,灵活,跨平台等特性,来解决上述遇到的各种问题,使用xmake将会带来不一样的构建体验:
不会写makefile?没关系,直接在源码目录运行以下命令即可直接编译:
xmake
xmake会自动扫描在当前目录下的源码结构,生成一个xmake.lua
工程描述文件,然后尝试直接编译。
想要直接运行编译后的可执行程序,简单,直接敲:
$ xmake run
最近研究了下NVIDIA Cuda Toolkit的编译环境,并且在xmake 2.1.10开发版中,新增了对cuda编译环境的支持,可以直接编译*.cu
代码。
关于Cuda Toolkit相关说明以及安装文档,可参考官方文档:CUDA Toolkit Documentation。
下载安装好Cuda SDK后,在macosx上回默认安装到/Developer/NVIDIA/CUDA-x.x
目录下,Windows上可以通过CUDA_PATH
的环境变量找到对应的SDK目录,而
Linux下默认会安装到/usr/local/cuda
目录下。
xmake在执行$ xmake
命令编译*.cu
代码的时候,会尝试探测这些默认的安装目录,然后尝试调用nvcc编译器直接编译cuda程序,大部分情况下只需要执行:
$ xmake
我之前编译之前,我们可以通过xmake创建一个空的cuda工程,例如:
$ xmake create -l cuda test
$ cd test
$ xmake
通过-l
参数指定创建一个cuda代码工程,工程名为test,执行输出如下:
[00%]: ccache compiling.release src/main.cu
[100%]: linking.release test
我们也可以尝试直接运行这个cuda程序:
$ xmake run
此版本主要增加xmake f --menu
实现用户自定义图形菜单配置,界面风格类似linux的make menuconfig
:
更多使用说明,请阅读:文档手册。
del_files()
接口去从已添加的文件列表中移除一些文件rule()
, add_rules()
接口实现自定义构建规则,并且改进add_files("src/*.md", {rule = "markdown"})
os.filesize()
接口core.ui.xxx
等cui组件模块,实现终端可视化界面,用于实现跟用户进行短暂的交互xmake f --menu
实现可视化菜单交互配置,简化工程的编译配置set_values
接口到optionxmake f --cc=gcc@ccmips.exe
add_cxflags
等flags api的设置,添加force参数,来禁用自动检测和映射,强制设置选项:add_cxflags("-DTEST", {force = true})
add_files
的flags设置,添加force域,用于设置不带自动检测和映射的原始flags:add_files("src/*.c", {force = {cxflags = "-DTEST"}})
os.nuldev()
在mingw上传入gcc时出现问题xmake f --cross
无法配置问题os.cd
到windows根路径问题del_files
接口实现从源文件列表中删除指定文件通过此接口,可以从前面add_files接口添加的文件列表中,删除指定的文件,例如:
target("test")
add_files("src/*.c")
del_files("src/test.c")