mirror of
https://github.com/CompeyDev/lei.git
synced 2025-05-04 10:43:49 +01:00
Compare commits
7 commits
efaccf57ad
...
749c2ae39d
Author | SHA1 | Date | |
---|---|---|---|
749c2ae39d | |||
fb8d0c1514 | |||
d82a23b44c | |||
725efd14f8 | |||
08e1de819f | |||
342c56b4da | |||
516d7a4f76 |
16 changed files with 85 additions and 121 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -17,5 +17,8 @@
|
||||||
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
|
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
|
||||||
.glide/
|
.glide/
|
||||||
|
|
||||||
|
# Build script compiled data
|
||||||
|
.lei/
|
||||||
|
|
||||||
# Dependency directories (remove the comment below to include it)
|
# Dependency directories (remove the comment below to include it)
|
||||||
# vendor/
|
# vendor/
|
||||||
|
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +1,6 @@
|
||||||
[submodule "internal/luau"]
|
[submodule "internal/luau"]
|
||||||
path = internal/luau
|
path = internal/luau
|
||||||
url = https://github.com/luau-lang/luau
|
url = https://github.com/luau-lang/luau
|
||||||
|
[submodule "ffi/luau"]
|
||||||
|
path = ffi/luau
|
||||||
|
url = https://github.com/luau-lang/luau.git
|
||||||
|
|
|
@ -19,27 +19,31 @@ func bail(err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildVm(artifactPath string, cmakeFlags ...string) {
|
func cloneSrc() string {
|
||||||
color.Blue.Println("> Cloning luau-lang/luau")
|
color.Blue.Println("> Cloning luau-lang/luau")
|
||||||
|
|
||||||
dir, homeDirErr := os.MkdirTemp("", "lei-build")
|
dir, tempDirErr := os.MkdirTemp("", "lei-build")
|
||||||
bail(homeDirErr)
|
bail(tempDirErr)
|
||||||
|
|
||||||
defer os.RemoveAll(dir)
|
|
||||||
|
|
||||||
// Clone down the Luau repo and checkout the required tag
|
// Clone down the Luau repo and checkout the required tag
|
||||||
Exec("git", "", "clone", "https://github.com/luau-lang/luau.git", dir)
|
Exec("git", "", "clone", "https://github.com/luau-lang/luau.git", dir)
|
||||||
Exec("git", dir, "checkout", LUAU_VERSION)
|
Exec("git", dir, "checkout", LUAU_VERSION)
|
||||||
|
|
||||||
color.Green.Printf("> Cloned repo to%s\n\n", dir)
|
color.Green.Printf("> Cloned repo to%s\n\n", dir)
|
||||||
|
return dir
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildVm(srcPath string, artifactPath string, includesDir string, cmakeFlags ...string) {
|
||||||
color.Blue.Println("> Compile libLuau.VM.a")
|
color.Blue.Println("> Compile libLuau.VM.a")
|
||||||
|
|
||||||
// Build the Luau VM using CMake
|
// Build the Luau VM using CMake
|
||||||
buildDir := path.Join(dir, "cmake")
|
buildDir := path.Join(srcPath, "cmake")
|
||||||
bail(os.Mkdir(buildDir, os.ModePerm))
|
buildDirErr := os.Mkdir(buildDir, os.ModePerm)
|
||||||
|
if !os.IsExist(buildDirErr) {
|
||||||
|
bail(buildDirErr)
|
||||||
|
}
|
||||||
|
|
||||||
defaultCmakeFlags := []string{"..", "-DCMAKE_BUILD_TYPE=RelWithDebInfo", "-DLUAU_EXTERN_C=ON"}
|
defaultCmakeFlags := []string{"..", "-DCMAKE_BUILD_TYPE=RelWithDebInfo", "-DLUAU_EXTERN_C=ON", "-DCMAKE_POLICY_VERSION_MINIMUM=3.5"}
|
||||||
Exec("cmake", buildDir, append(defaultCmakeFlags, cmakeFlags...)...)
|
Exec("cmake", buildDir, append(defaultCmakeFlags, cmakeFlags...)...)
|
||||||
Exec("cmake", buildDir, "--build", ".", "--target Luau.VM", "--config", "RelWithDebInfo")
|
Exec("cmake", buildDir, "--build", ".", "--target Luau.VM", "--config", "RelWithDebInfo")
|
||||||
|
|
||||||
|
@ -49,17 +53,37 @@ func buildVm(artifactPath string, cmakeFlags ...string) {
|
||||||
artifactFile, artifactErr := os.ReadFile(path.Join(buildDir, ARTIFACT_NAME))
|
artifactFile, artifactErr := os.ReadFile(path.Join(buildDir, ARTIFACT_NAME))
|
||||||
bail(artifactErr)
|
bail(artifactErr)
|
||||||
bail(os.WriteFile(artifactPath, artifactFile, os.ModePerm))
|
bail(os.WriteFile(artifactPath, artifactFile, os.ModePerm))
|
||||||
|
|
||||||
|
// Copy the header files into the includes directory
|
||||||
|
headerDir := path.Join(srcPath, "VM", "include")
|
||||||
|
headerFiles, headerErr := os.ReadDir(headerDir)
|
||||||
|
bail(headerErr)
|
||||||
|
for _, file := range headerFiles {
|
||||||
|
src := path.Join(headerDir, file.Name())
|
||||||
|
dest := path.Join(includesDir, file.Name())
|
||||||
|
|
||||||
|
headerContents, headerReadErr := os.ReadFile(src)
|
||||||
|
bail(headerReadErr)
|
||||||
|
|
||||||
|
os.WriteFile(dest, headerContents, os.ModePerm)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
homeDir, homeDirErr := os.UserHomeDir()
|
workDir, workDirErr := os.Getwd()
|
||||||
bail(homeDirErr)
|
bail(workDirErr)
|
||||||
|
|
||||||
artifactDir := path.Join(homeDir, ".lei")
|
artifactDir := path.Join(workDir, ".lei")
|
||||||
artifactPath := path.Join(artifactDir, ARTIFACT_NAME)
|
artifactPath := path.Join(artifactDir, ARTIFACT_NAME)
|
||||||
lockfilePath := path.Join(artifactDir, ".lock")
|
lockfilePath := path.Join(artifactDir, ".lock")
|
||||||
|
includesDir := path.Join(artifactDir, "includes")
|
||||||
|
|
||||||
bail(os.MkdirAll(artifactDir, os.ModePerm))
|
bail(os.MkdirAll(includesDir, os.ModePerm)) // includesDir is the deepest dir, creates all
|
||||||
|
|
||||||
|
gitignore, gitignoreErr := os.ReadFile(".gitignore")
|
||||||
|
if gitignoreErr == nil && !strings.Contains(string(gitignore), ".lei") {
|
||||||
|
color.Yellow.Println("> WARN: The gitignore in the CWD does not include `.lei`, consider adding it")
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Args for clean build
|
// TODO: Args for clean build
|
||||||
args := os.Args[1:]
|
args := os.Args[1:]
|
||||||
|
@ -68,25 +92,35 @@ func main() {
|
||||||
cmakeFlags := []string{}
|
cmakeFlags := []string{}
|
||||||
features := []string{}
|
features := []string{}
|
||||||
|
|
||||||
|
// TODO: maybe use env vars for this config instead
|
||||||
for _, arg := range args {
|
for _, arg := range args {
|
||||||
if arg == "--enable-vector4" {
|
if arg == "--enable-vector4" {
|
||||||
features = append(features, "LUAU_VECTOR4")
|
features = append(features, "LUAU_VECTOR4")
|
||||||
// FIXME: This flag apparently isn't recognized by cmake for some reason
|
// FIXME: This flag apparently isn't recognized by cmake for some reason
|
||||||
cmakeFlags = append(cmakeFlags, "-DLUAU_VECTOR_SIZE=4")
|
cmakeFlags = append(cmakeFlags, "-DLUAU_VECTOR_SIZE=4")
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
goArgs = append(goArgs, arg)
|
goArgs = append(goArgs, arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lockfileContents, err := os.ReadFile(lockfilePath)
|
lockfileContents, err := os.ReadFile(lockfilePath)
|
||||||
|
if !os.IsNotExist(err) {
|
||||||
bail(err)
|
bail(err)
|
||||||
|
}
|
||||||
|
|
||||||
serFeatures := fmt.Sprintf("%v", features)
|
serFeatures := fmt.Sprintf("%v", features)
|
||||||
toCleanBuild := string(lockfileContents) != serFeatures
|
toCleanBuild := (string(lockfileContents) != serFeatures) || os.Getenv("LEI_CLEAN_BUILD") == "true"
|
||||||
if _, err := os.Stat(artifactPath); err == nil && !toCleanBuild {
|
if _, err := os.Stat(artifactPath); err == nil && !toCleanBuild {
|
||||||
fmt.Printf("[build] Using existing artifact at %s\n", artifactPath)
|
fmt.Printf("[build] Using existing artifact at %s\n", artifactPath)
|
||||||
} else {
|
} else {
|
||||||
buildVm(artifactPath, cmakeFlags...)
|
srcPath, notUnset := os.LookupEnv("LEI_LUAU_SRC")
|
||||||
|
if !notUnset {
|
||||||
|
srcPath = cloneSrc()
|
||||||
|
defer os.RemoveAll(srcPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
buildVm(srcPath, artifactPath, includesDir, cmakeFlags...)
|
||||||
bail(os.WriteFile(lockfilePath, []byte(serFeatures), os.ModePerm))
|
bail(os.WriteFile(lockfilePath, []byte(serFeatures), os.ModePerm))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +142,7 @@ func main() {
|
||||||
"CGO_LDFLAGS",
|
"CGO_LDFLAGS",
|
||||||
fmt.Sprintf("-L %s -lLuau.VM -lm -lstdc++", artifactDir),
|
fmt.Sprintf("-L %s -lLuau.VM -lm -lstdc++", artifactDir),
|
||||||
).
|
).
|
||||||
|
WithVar("CGO_CFLAGS", fmt.Sprintf("-I%s", includesDir)).
|
||||||
WithVar("CGO_ENABLED", "1").
|
WithVar("CGO_ENABLED", "1").
|
||||||
PipeAll(Forward).
|
PipeAll(Forward).
|
||||||
ToCommand()
|
ToCommand()
|
||||||
|
|
|
@ -13,11 +13,6 @@ lua_State* clua_newstate(void* f, void* ud)
|
||||||
return lua_newstate((lua_Alloc)f, ud);
|
return lua_newstate((lua_Alloc)f, ud);
|
||||||
}
|
}
|
||||||
|
|
||||||
l_noret cluaL_errorL(lua_State* L, char* msg)
|
|
||||||
{
|
|
||||||
luaL_errorL(L, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clua_pushcclosurek(lua_State* L, void* f, char* debugname, int nup, void* cont) {
|
void clua_pushcclosurek(lua_State* L, void* f, char* debugname, int nup, void* cont) {
|
||||||
return lua_pushcclosurek(L, (lua_CFunction)f, debugname, nup, (lua_Continuation)cont);
|
return lua_pushcclosurek(L, (lua_CFunction)f, debugname, nup, (lua_Continuation)cont);
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package internal
|
package ffi
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#cgo CFLAGS: -Iluau/VM/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/14.1.1/include
|
#cgo CFLAGS: -Iluau/VM/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/14.1.1/include
|
||||||
|
@ -171,8 +171,10 @@ func LErrorL(L *LuaState, msg string) {
|
||||||
cmsg := C.CString(msg)
|
cmsg := C.CString(msg)
|
||||||
defer C.free(unsafe.Pointer(cmsg))
|
defer C.free(unsafe.Pointer(cmsg))
|
||||||
|
|
||||||
C.cluaL_errorL(L, cmsg)
|
PushString(L, msg)
|
||||||
panic(msg)
|
Error(L)
|
||||||
|
|
||||||
|
// TODO: do we panic on the go side?
|
||||||
}
|
}
|
||||||
|
|
||||||
func LCheckOption(L *LuaState, narg int32, def string, lst []string) int32 {
|
func LCheckOption(L *LuaState, narg int32, def string, lst []string) int32 {
|
|
@ -1,4 +1,4 @@
|
||||||
package internal
|
package ffi
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#cgo CFLAGS: -Iluau/VM/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/14.1.1/include
|
#cgo CFLAGS: -Iluau/VM/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/14.1.1/include
|
||||||
|
@ -697,7 +697,7 @@ func GetUserdataDtor(L *LuaState, tag int32) LuaDestructor {
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetUserdataMetatable(L *LuaState, tag int32, idx int32) {
|
func SetUserdataMetatable(L *LuaState, tag int32, idx int32) {
|
||||||
C.lua_setuserdatametatable(L, C.int(tag), C.int(idx))
|
C.lua_setuserdatametatable(L, C.int(idx))
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUserdataMetatable(L *LuaState, tag int32) {
|
func GetUserdataMetatable(L *LuaState, tag int32) {
|
1
ffi/luau
Submodule
1
ffi/luau
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit c51743268bcbe5c5af1bd78bcacaefe7f6fe3391
|
|
@ -1,4 +1,4 @@
|
||||||
package internal
|
package ffi
|
||||||
|
|
||||||
//#include <stdlib.h>
|
//#include <stdlib.h>
|
||||||
import "C"
|
import "C"
|
|
@ -1,6 +1,6 @@
|
||||||
//go:build !LUAU_VECTOR4
|
//go:build !LUAU_VECTOR4
|
||||||
|
|
||||||
package internal
|
package ffi
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#cgo CFLAGS: -Iluau/VM/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/14.1.1/include
|
#cgo CFLAGS: -Iluau/VM/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/14.1.1/include
|
11
go.mod
11
go.mod
|
@ -1,3 +1,12 @@
|
||||||
module github.com/CompeyDev/lei
|
module github.com/CompeyDev/lei
|
||||||
|
|
||||||
go 1.19
|
go 1.23.0
|
||||||
|
|
||||||
|
toolchain go1.24.2
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gookit/color v1.5.4 // indirect
|
||||||
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
|
||||||
|
golang.org/x/sys v0.32.0 // indirect
|
||||||
|
golang.org/x/term v0.31.0 // indirect
|
||||||
|
)
|
||||||
|
|
8
go.sum
Normal file
8
go.sum
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
|
||||||
|
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
|
||||||
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
|
||||||
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
|
||||||
|
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
|
||||||
|
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
|
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
|
||||||
|
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
|
|
@ -1,91 +0,0 @@
|
||||||
/* Code generated by cmd/cgo; DO NOT EDIT. */
|
|
||||||
|
|
||||||
/* package internal */
|
|
||||||
|
|
||||||
|
|
||||||
#line 1 "cgo-builtin-export-prolog"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#ifndef GO_CGO_EXPORT_PROLOGUE_H
|
|
||||||
#define GO_CGO_EXPORT_PROLOGUE_H
|
|
||||||
|
|
||||||
#ifndef GO_CGO_GOSTRING_TYPEDEF
|
|
||||||
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Start of preamble from import "C" comments. */
|
|
||||||
|
|
||||||
|
|
||||||
#line 3 "lua.go"
|
|
||||||
|
|
||||||
|
|
||||||
// #cgo LDFLAGS: -L${SRCDIR}/luau/cmake -lLuau.VM -lm -lstdc++
|
|
||||||
#include "/home/compey/dev/gluau/internal/luau/VM/include/lua.h"
|
|
||||||
#include "/home/compey/dev/gluau/internal/luau/VM/include/lualib.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "/home/compey/dev/gluau/internal/clua.h"
|
|
||||||
|
|
||||||
#line 1 "cgo-generated-wrapper"
|
|
||||||
|
|
||||||
|
|
||||||
/* End of preamble from import "C" comments. */
|
|
||||||
|
|
||||||
|
|
||||||
/* Start of boilerplate cgo prologue. */
|
|
||||||
#line 1 "cgo-gcc-export-header-prolog"
|
|
||||||
|
|
||||||
#ifndef GO_CGO_PROLOGUE_H
|
|
||||||
#define GO_CGO_PROLOGUE_H
|
|
||||||
|
|
||||||
typedef signed char GoInt8;
|
|
||||||
typedef unsigned char GoUint8;
|
|
||||||
typedef short GoInt16;
|
|
||||||
typedef unsigned short GoUint16;
|
|
||||||
typedef int GoInt32;
|
|
||||||
typedef unsigned int GoUint32;
|
|
||||||
typedef long long GoInt64;
|
|
||||||
typedef unsigned long long GoUint64;
|
|
||||||
typedef GoInt64 GoInt;
|
|
||||||
typedef GoUint64 GoUint;
|
|
||||||
typedef size_t GoUintptr;
|
|
||||||
typedef float GoFloat32;
|
|
||||||
typedef double GoFloat64;
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#include <complex.h>
|
|
||||||
typedef _Fcomplex GoComplex64;
|
|
||||||
typedef _Dcomplex GoComplex128;
|
|
||||||
#else
|
|
||||||
typedef float _Complex GoComplex64;
|
|
||||||
typedef double _Complex GoComplex128;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
static assertion to make sure the file is being used on architecture
|
|
||||||
at least with matching size of GoInt.
|
|
||||||
*/
|
|
||||||
typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
|
|
||||||
|
|
||||||
#ifndef GO_CGO_GOSTRING_TYPEDEF
|
|
||||||
typedef _GoString_ GoString;
|
|
||||||
#endif
|
|
||||||
typedef void *GoMap;
|
|
||||||
typedef void *GoChan;
|
|
||||||
typedef struct { void *t; void *v; } GoInterface;
|
|
||||||
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* End of boilerplate cgo prologue. */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern GoUintptr go_allocf(GoUintptr fp, GoUintptr ptr, GoUint64 osize, GoUint64 nsize);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 4f917420d74aae84912acbaeb42e86691ddea309
|
|
2
main.go
2
main.go
|
@ -1,6 +1,6 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import lualib "github.com/CompeyDev/lei/internal"
|
import lualib "github.com/CompeyDev/lei/ffi"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
lua := lualib.LNewState()
|
lua := lualib.LNewState()
|
||||||
|
|
Loading…
Add table
Reference in a new issue