A3d4e873e64a47c348084d158d43727a
xmake入门,构建项目原来可以如此简单

前言

在开发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项目文件生成也支持的哦
  • 更多隐藏特性等你来体验

xmake-compilation

xmake-compilation

快速上手

不会写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接口使用文档

使用演示

命令行下的使用过程,大家可以通过一个视频直观的体验下:

创建工程

更加省事的方式就是通过上节所说傻瓜式操作方式,自动生成一个xmake.lua,然后在这基础下修修改改就行了。

当然如果没有现成源码,想从新工程创建开始编译,那么可以使用xmake提供的工程模板进行创建:

$ xmake create test

默认创建一个名为test的c可执行项目,源码结构如下:

.
├── src
│   └── main.c
└── xmake.lua

当然你也可以选择语言和模板类型:

$ xmake create -l c++ -t shared test

上述命令创建了一个c++动态库项目,就这么简单。

运行和调试

编译完的可执行程序,直接敲xmake run就能运行,xmake会自动找到对应的target目标文件,你也可以传递参数给程序。

如果有多个target目标,你可以指定需要运行的target名,例如:

$ xmake run test

想要快速调试程序?加上-d参数即可

$ xmake run -d test

xmake默认会去找系统自带的调试器,然后加载运行,windows上使用vsjitdebugger,linux上gdb,macos上lldb,当然你也可以随意切换到其他调试器。

配合debug模式编译,就能做到使用xmake进行源码调试。

可视化配置和构建

xmake提倡使用命令行的方式来操作,用习惯后效率非常高,而且在windows上,即使没有cygwin,也可以直接在cmd下正常运行。

当然,并不是所有用户习惯命令行,因此xmake也提供了编辑器插件,与各大编辑器进行集成,例如:

xmake-vscode插件

xmake-idea插件

xmake-sublime插件

xmake-tui界面

除了编辑器插件,xmake甚至自己封装实现了一整套跨平台tui字符界面库,然后仿kconfig/menuconf的界面风格,实现了一个类似的可视化字符界面菜单配置。

这个不需要额外的插件,只需要在终端下执行:

$ xmake f --menu

就可以显示菜单配置界面进行编译配置,配置完即可根据当前配置进行编译,效果如下:

定制化编译

想要更加灵活的编译配置?那就得要修改xmake.lua啦,不过还是很简单的。

添加编译选项

target("test")
    set_kind("binary")
    add_files("src/*.c")
    if is_mode("debug") then
       add_cxflags("-DDEBUG")
    end

上面代码中,add_cxflags接口就是同时配置C/C++代码的编译选项,并且只在debug模式下生效,也就是执行下面命令的时候:

$ xmake f -m debug
$ xmake

使用内置选项

像添加宏定义,设置警告级别,优化级别,头文件搜索目录什么的,完全没必要使用原始的add_cxflags接口,xmake有提供更加方便的接口,更加智能化的处理来简化配置,也更加通用跨平台,例如:

add_defines("DEBUG")
set_optimize("fast")
set_warnings("all", "error")

target("test")
    set_kind("binary")
    add_files("src/*.c")

target("test2")
    set_kind("binary")
    add_files("src2/*.c")

跟刚才的配置不同的是,此处设置放在了target的上面,此处不属于target域,是root全局设置,会影响下面的所有target目标程序的编译设置,这样可以简化配置,避免冗余。

灵活的脚本控制

对于高端用户,构建需求复杂多变,xmake也提供了对应解决方案,各个构建阶段都可以灵活定制:

target("test")
    set_kind("binary")
    add_files("src/*.c")

    after_build(function (target)
        os.exec("file %s", target:targetfile())
    end)

上述代码在编译程序结束后,执行file命令查看目标程序相关信息,目前xmake可以在build, clean, run, install, uninstall等各个阶段的前后插入自定义的脚本,也可以直接内置action,例如: on_install会覆盖内置的安装逻辑,提供给用户足够的灵活性。

top Created with Sketch.