前言
在开发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将会带来不一样的构建体验:
- 轻量,跨平台,无依赖,无需额外安装python等第三方环境,直接内置lua运行时,一个安装包(或者命令)直接搞定
- 工程描述直观简洁,更符合用户正常的思维习惯
- 支持直接构建,强大的命令行工具,终端用户的福音,装逼用户必备
- vscode, idea, clion, sublime, vim等编辑器插件支持
- 智能检测支持,简化用户编译配置过程
- 插件支持,灵活的用户可扩展性
- vcproj等IDE项目文件生成也支持的哦
- 更多隐藏特性等你来体验
快速上手
不会写makefile?没关系,直接在源码目录运行以下命令即可直接编译:
xmake
xmake会自动扫描在当前目录下的源码结构,生成一个xmake.lua
工程描述文件,然后尝试直接编译。
想要直接运行编译后的可执行程序,简单,直接敲:
$ xmake run
更多相关信息,请参考文章: xmake新增智能代码扫描编译模式,无需手写任何make文件
快速入门
如果想要更进一步描述工程,调整源码结构,添加一些编译选项什么的,还是需要维护一个名叫xmake.lua的工程描述文件,类似makefile, cmakelist.txt,但是其语法和api经过不断地改进简化,已经相当易用。
最简单的描述例子只需要三行:
target("test")
set_kind("binary")
add_files("src/*.c")
就可以构建一个可执行程序,编译所有在src目录下的c源文件。
然后直接执行xmake即可编译。
add_files()
支持通配符文件模式匹配,并且支持.c, .cpp, .go, .d, .m, .mm, .S, .swift, .rc, .rs
等各种native语言的代码文件,大部分都能支持混编。
我们甚至可以添加.a和.o, .obj文件到add_files()
,例如:
target("test")
set_kind("static")
add_files("src/*.c")
add_files("lib/libxxx.a", "obj/bbb.o")
上述描述会编译生成一个libtest.a库,在编译归档的时候,会自动将libxxx.a库反解出来,合并到libtest.a中去,并且同时将bbb.o也加进去。
xmake提供的add_files
是非常强大的,我们还可以再添加一批文件的同时,指定排除某些文件,例如:
add_files("src/**.cpp|test.cpp|arm/*.cpp")
上述描述,在递归添加源文件的同时,排除掉了test.cpp以及arm目录下的源文件。
更多add_files
用法,请参考文档:add_files接口使用文档