正如标题所说,我写了一个简单的lua库名为luabc,意思是lua build c,就是用lua来构建c项目,其实就和Makefile的工作类似,不过我这个更加简陋

有人问,直接用Makefile不就行了,还要用lua干嘛,这么“小众”的语言,问得好?我的回答是I wanna do what the fucking I want to do,翻译过来就是闲得蛋疼

实际上是因为受到了国外一名主播tsoding的项目nob.h的启发,这个项目nob.h就是no build的意思,它使用c语言编写,构建c项目只需要c编译器以及一个头文件nob.h就可以了,并且跨平台,它的目的就是用一种简单的方式来管理c项目,不需要安装其他环境,你所需要的只是好的编译器

我想的是,用c的话太麻烦了,而且我也不好意思“抄袭”,正好可以用来练练lua,并且我写makefile都是直接问gpt的,然后改一改目录之类的,总之就是懒得学,所以才有了luabc

好了,说了它的来源,接下来就介绍下luabc吧,希望大家能够有所启发(能够折腾的事还是挺多的)

!!!注意:luabc并不跨平台,仅适用于使用bash shell的环境,比如linux

ok啊,以下就是项目的目录结构

  • luabc.lua包含了luabc的api
  • build.lua是用来构建项目的脚本
  • zero.lua 和 zero.c 其实就是有点类似于rust中的cargo,不过同样非常简陋,就是用来初始化一个项目的环境,比如某些必备的文件等等,zero.lua包含了初始化的设置,zero.c其实就是调用了zero.lua,只不过将其包装成一个可执行程序,这样就不用每次都lua zero.lua了,直接设置下环境变量,然后用生成的可执行文件zero就可以了
    1

目前zero只提供两个选项(通过zero.lua设置)

  • zero init project_name 这会创建一个项目,然后里面包含了一些必备的文件等等
  • zero update 这个就是单纯的更新当前目录下luabc.lua,简单来说就是拷贝文件,毕竟构建的时候可能会给luabc添加新的功能,主要是为了方便

让我们看一看效果吧
2

好了,介绍完了zero,接下来说说luabc.lua的使用吧,就着上面创建的项目newnew,我们构建看看,很简单,直接执行build.lua文件即可

3

使用起来是不是很简单

接下来我们看看build.lua的内容吧,看看该怎么调用提供的api

local luabc = require("luabc")
local cmd   = luabc.cmd
local tool  = luabc.tool
local debug = luabc.debug

local CC     = "gcc"
local CFLAGS = { "-Wall", "-Wextra" }
local CSTD   = "-std=c11"
local TARGET = "main"
local SRC    = tool.match_file_extension(".c", "src")
local OBJ    = tool.replace_files_extension(SRC, ".o")
local LD_LIB = ""
local CLEAR  = { TARGET, table.unpack(OBJ) }

local function build()
    local all = cmd:new()
    all:append(CC, CFLAGS, CSTD, "-o", TARGET, SRC)
    all:run()
end
build()

怎么样,看起来是不是很像makefile,不同的点在于,我们是在执行函数,函数的结果就是构建我们的项目

local luabc = require("luabc")
local cmd   = luabc.cmd
local tool  = luabc.tool
local debug = luabc.debug

这三个就是目前luabc所提供的主要功能了,cmd是用来操作命令的(添加,删除等等),tool是一些工具函数,debug是一些用于调试的函数,比如打印命令等等

local CC     = "gcc"
local CFLAGS = { "-Wall", "-Wextra" }
local CSTD   = "-std=c11"
local TARGET = "main"
local SRC    = tool.match_file_extension(".c", "src")
local OBJ    = tool.replace_files_extension(SRC, ".o")
local LD_LIB = ""
local CLEAR  = { TARGET, table.unpack(OBJ) }

这个没什么好说的,就和makefile一样,定义了一些变量,可以看到我们使用了两个工具函数,一个用来在./src目录下匹配.c文件,一个用来将SRC中的所有文件替换为.o后缀

local function build()
    local all = cmd:new()
    all:append(CC, CFLAGS, CSTD, "-o", TARGET, SRC)
    all:run()
end
build()

这里就是构建的具体细节了,其实就和你直接用命令行一样的

local all = cmd:new()
首先我们创建了一个cmd对象

all:append(CC, CFLAGS, CSTD, "-o", TARGET, SRC)
然后给这个命令添加参数,就是我们定义的变量了

all:run()
最后就是执行命令了

怎么样,是不是非常的简单,这种调用函数的思路我感觉挺不错的,而且灵活度也更高(自我感觉良好中)

其实还有其他的功能,会稍微复杂一点,比如提供了label(就是让你根据指定的label执行对应的命令)等等

以下是我的项目仓库的地址,欢迎大家提意见,另外源码的注释挺详细的,而且也不难,同时鼓励大家可以尝试用自己喜欢的语言扩展它,比如pybc(笑),让它跨平台,让它...
https://github.com/Dylaris/luabc/

如果缺少luabc使用例子的话,下面这个项目稍微大一点,也使用了luabc构建,用了更多的功能,感觉应该能够帮助大家”精通“了
https://github.com/Dylaris/dysh

 posted on 2025-05-03 00:40  Dylaris  阅读(22)  评论(0)    收藏  举报