xmake 提供了很多的内置模块和接口,可以让用户在自定义脚本域中随意使用,方便用户处理编译过程中的各种定制化逻辑。其中,我们多少会需要涉及到一些系统调用、io 操作等。
因为这些是最基本也是最常用的操作接口,而 lua 语言自身就有提供 os 和 io 内置模块去处理这些,但是 lua 自带的这两个模块功能有限,使用也不是很方便,并且也无法满足用户对编译的一些特殊需求。因此 xmake 在此基础上,做了些扩展和改进,封装了更多好用的接口提供给大家使用。
在本实验中,我们重点介绍如何使用 os 系统模块里面的各种常用接口。
复制删除文件和目录
首先我们来讲解如何使用 os 模块去复制和删除指定的文件以及目录。
对于复制文件,xmake 提供了内置的 os.cp(src, dst)
接口,可以从源路径复制到目的路径,同时支持文件和目录的复制,并且支持 *
来模式匹配。
而对于删除文件,我们可以使用 os.rm()
接口,它也同时支持文件和目录的删除。在实验前,我们还是一样,先执行下面的命令,创建一个新的空工程。
cd ~/Code
xmake create ostest
接下来进入 ostest 目录,修改 xmake.lua 文件,加入对 os 模块接口的调用,具体修改如下。
target("ostest")
set_kind("binary")
add_files("src/*.cpp")
after_build(function (target)
os.cp(target:targetfile(), "$(buildir)/test")
os.rm(target:targetfile())
end)
上面的配置中,我们通过在 after_build
的自定义脚本中,额外调用 os.cp
接口将编译完成后生成的目标程序复制到 build/test
,然后调用 os.rm
删除了源文件,实现了移动目标程序路径的目的。
当然,这里只是出于演示目的,其实要做到这个需求,并不需要这么复杂,只需要调用 os.mv
或者直接使用 set_targetdir
去修改目标路径更加的方便省事。
而对于 os.cp
等带有路径参数的接口,它们也可以像描述域配置那样支持将内置变量 $(buildir)
直接嵌入字符串。
执行 xmake
命令,并通过 tree
命令看下实际生成的目标路径。
从图中,我们看到 release
目录已经变成了空目