xmake的描述语法基于lua实现,因此描述语法继承了lua的灵活性和简洁性,并且通过28原则,将描述作用域(简单描述)、脚本作用域(复杂描述)进行分离,使得工程更加的简洁直观,可读性非常好。
因为80%的工程,并不需要很复杂的脚本控制逻辑,只需要简单的几行配置描述,就可满足构建需求,基于这个假设,xmake分离作用域,使得80%的xmake.lua
文件,只需要这样描述:
target("demo")
set_kind("binary")
add_files("src/*.c")
而仅有的20%的工程,才需要这样描述:
target("demo")
set_kind("shared")
set_objectdir("$(buildir)/.objs")
set_targetdir("libs/armeabi")
add_files("jni/*.c")
on_package(function (target)
os.run("ant debug")
end)
on_install(function (target)
os.run("adb install -r ./bin/Demo-debug.apk")
end)
on_run(function (target)
os.run("adb shell am start -n com.demo/com.demo.DemoTest")
os.run("adb logcat")
end)
上面的function () end
部分属于自定义脚本域,一般情况下是不需要设置的,只有在需要复杂的工程描述、高度定制化需求的情况下,才需要自定义他们,在这个作用域可以使用各种xmake提供的扩展模块,关于这个的更多介绍,见:xmake 描述语法和作用域详解。
而上面的代码,也是一个自定义混合构建jni和java代码的android工程,可以直接通过xmake run
命令,实现一键自动构建、安装、运行apk程序。
下面介绍一些比较常用的xmake描述实例:
此次更新,主要修复xmake的一些稳定性问题,并且对安装和卸载提供更加安全的权限处理,相关更新细节见:改进权限问题,提升操作安全性
并且此版本还对用户使用上的体验进行了一些优化,例如:
xmake.lua
时提供更加友好的提示,避免误操作详细更新信息,可参考下面的更新细节:
set_default
接口用于修改默认的构建所有targets行为xmake
命令进行构建,xmake会自动检测所在的工程根目录add_rpathdirs
api到target和option,支持动态库的自动加载运行xmake install
and xmake uninstall
任务,更友好的处理root安装问题rpm
, deb
和osxpkg
安装包xmake.lua
时,添加更友好的用户提示,避免用户无操作最近对xmake的操作权限进行了升级,提供更加安全的命令操作,例如:
xmake install
和xmake uninstall
命令,提供更加安全地安装和卸载支持之前的xmake install
和xmake uninstall
行为,是自动build
后进行安装,而大部分情况下安装目录是在/usr/local
目录下。
因此,需要root权限才能写入,那么之前的方式只能暴力地直接加上sudo xmake install
来执行。
可想而知,虽然安装确实成功了,但是由于默认的自动构建行为,导致生成的临时*.o
, *.a
等各种文件都具备了root权限,而且一个不小心就会覆盖系统的一些库文件。
因此,为了避免这个问题,xmake改进了安装逻辑,将build
和install
分离成两个独立的阶段,分别使用不同的权限,并且提供更加友好的提示信息,例如:
此版本主要增强了vs201x工程的生成,以及支持vs2017编译环境,并且针对archlinux提供更加方便的aur安装。
详细更新内容如下:
yaourt
包管理器进行安装。此版本重构了整个xmake,使得xmake更加方便地进行多语言扩展,并且在之前原有的构建语言支持上,新增了对golang
, dlang
和 rust
程序构建支持。
并且重写了所有文档,提供更加详细完整的接口手册和文档支持:新版文档
License也从之前的LGPLv2.1改为Apache License 2.0,更加详细的改进请看下面详细描述:
--links
, --linkdirs
and --includedirs
配置参数xmake.lua
工程描述增加dictionay语法风格xmake.lua
等工程描述文件的情况下,也能直接快速编译xmake.lua
工程描述添加set_xmakever
接口,更加友好的处理版本兼容性问题objc
和swift
程序添加add_frameworks
接口golang
, dlang
和rust
程序构建的支持target_end
, option_end
和task_end
等可选api,用于显示结束描述域,进入根域设置,提高可读性golang
, dlang
和rust
工程模板os.run
, os.exec
, os.cp
, os.mv
和 os.rm
等接口,支持通配符模式匹配和批量文件操作-q|--quiet
选项实现静默构建makefile
生成插件,抽取编译工具和编译选项到全局变量