luarocks 是 lua 的一个包管理工具,提供了各类 lua 模块的安装集成,在用户安装 lua 模块的过程当中,它会使用内置的构建系统对 c/c++ 模块进行构建。c++
可是,它的构建系统只提供简单的配置,对于复杂的 c/c++ 模块的,就有点力不从心了,而且也没法灵活配置切换工具链。git
尽管它也提供了 make 和 cmake 的构建后端支持,可是经过 makefile 方式维护一样不够灵活,而 cmake 须要用户本身提早安装好 cmake 工具,不然安装 lua 模块的时候就会被打断。github
这里,我实现了一个基于 xmake 构建系统来构建 lua c/c++ 模块的 luarocks 插件 luarocks-build-xmake,来实现更加灵活方便的 lua 模块维护。后端
相比 luarocks 内建的构建系统,它提供了更增强大的构建配置,支持 c/c++ 依赖管理,相比 cmake 它不须要用户手动安装 xmake,此插件会自动安装 xmake 后,直接编译 lua 模块,对用户来说,不须要作额外的操做。markdown
若是模块工程中使用了 xmake.lua 来维护构建,那么咱们能够直接使用 xmake 去构建它,rockspec 文件中不须要额外的配置构建规则。工具
├── src
│ ├── test.c
│ └── test.h
└── xmake.lua
复制代码
咱们须要使用 add_rules("luarocks.module")
添加针对 luarocks 模块构建规则。oop
add_rules("mode.debug", "mode.release")
target("example1.hello")
add_rules("luarocks.module")
add_files("src/test.c")
复制代码
package = "example1"
version = "1.0-1"
source = {
url = "git://github.com/xmake-io/luarocks-build-xmake",
tag = "example1"
}
dependencies = {
"lua >= 5.1",
"luarocks-build-xmake"
}
build = {
type = "xmake",
copy_directories = {}
}
复制代码
若是模块工程中没有使用 xmake.lua 来维护,那么咱们也可使用 xmake 替代 luarocks 内置的构建来编译,只须要在 rockspec 文件中去描述构建规则。ui
├── src
├── test.c
└── test.h
复制代码
package = "example2"
version = "1.0-1"
source = {
url = "git://github.com/xmake-io/luarocks-build-xmake",
tag = "example2"
}
dependencies = {
"lua >= 5.1",
"luarocks-build-xmake"
}
build = {
type = "xmake",
modules = {
["example2.hello"] = {
sources = "src/test.c"
}
},
copy_directories = {}
}
复制代码
dependencies = {
"lua >= 5.1",
"luarocks-build-xmake"
}
build = {
type = "xmake",
variables = {
xmake = {
version = "2.5.1"
}
},
copy_directories = {}
}
复制代码
此插件提供了更多灵活的工具链配置,好比切换到 mingw 工具链,或者切换 vs 和 sdk 版本,修改 vs 运行时库,又或者切到 debug 编译模式等等。lua
dependencies = {
"lua >= 5.1",
"luarocks-build-xmake"
}
build = {
type = "xmake",
variables = {
xmake = {
plat = "mingw",
arch = "x86_64",
mode = "debug",
cflags = "-DTEST1",
cc = "gcc",
ld = "gcc",
ldflags = "...",
mingw = "mingw sdk path",
vs = "2019",
vs_runtime = "MT",
vs_toolset = "",
vs_sdkver = "",
}
},
copy_directories = {}
}
复制代码