mirror of
https://github.com/Hilbis/Hilbish
synced 2025-07-01 16:52:03 +00:00
build: remove taskfile and use go-written program to build and install hilbish
This commit is contained in:
parent
1bb433dc64
commit
1ddb10cc36
@ -43,8 +43,7 @@ on the website for distributed binaries from GitHub or other package repositorie
|
|||||||
Otherwise, continue reading for steps on compiling.
|
Otherwise, continue reading for steps on compiling.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
- [Go 1.22+](https://go.dev)
|
- [Go 1.23+](https://go.dev)
|
||||||
- [Task](https://taskfile.dev/installation/) (**Go on the hyperlink here to see Task's install method for your OS.**)
|
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
First, clone Hilbish. The recursive is required, as some Lua libraries
|
First, clone Hilbish. The recursive is required, as some Lua libraries
|
||||||
@ -57,16 +56,16 @@ go get -d ./...
|
|||||||
|
|
||||||
To build, run:
|
To build, run:
|
||||||
```
|
```
|
||||||
task
|
go run cmd/build/build.go
|
||||||
```
|
```
|
||||||
|
|
||||||
Or, if you want a stable branch, run these commands:
|
Or, if you want a stable branch, run these commands:
|
||||||
```
|
```
|
||||||
git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
|
git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
|
||||||
task build
|
go run cmd/build/build.go stable
|
||||||
```
|
```
|
||||||
|
|
||||||
After you did all that, run `sudo task install` to install Hilbish globally.
|
After you did all that, run `sudo go run cmd/build/build.go install` to install Hilbish globally.
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
Any kind of contributions are welcome! Hilbish is very easy to contribute to.
|
Any kind of contributions are welcome! Hilbish is very easy to contribute to.
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
# https://taskfile.dev
|
|
||||||
|
|
||||||
version: '3'
|
|
||||||
|
|
||||||
vars:
|
|
||||||
PREFIX: '{{default "/usr/local" .PREFIX}}'
|
|
||||||
bindir__: '{{.PREFIX}}/bin'
|
|
||||||
BINDIR: '{{default .bindir__ .BINDIR}}'
|
|
||||||
libdir__: ''
|
|
||||||
LIBDIR: '{{default .libdir__ .LIBDIR}}'
|
|
||||||
goflags__: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}}"'
|
|
||||||
GOFLAGS: '{{default .goflags__ .GOFLAGS}}'
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
default:
|
|
||||||
cmds:
|
|
||||||
- go build {{.GOFLAGS}}
|
|
||||||
vars:
|
|
||||||
GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}} -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"'
|
|
||||||
|
|
||||||
default-nocgo:
|
|
||||||
cmds:
|
|
||||||
- CGO_ENABLED=0 go build {{.GOFLAGS}}
|
|
||||||
vars:
|
|
||||||
GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}} -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"'
|
|
||||||
|
|
||||||
build:
|
|
||||||
cmds:
|
|
||||||
- go build {{.GOFLAGS}}
|
|
||||||
|
|
||||||
build-nocgo:
|
|
||||||
cmds:
|
|
||||||
- CGO_ENABLED=0 go build {{.GOFLAGS}}
|
|
||||||
|
|
||||||
install:
|
|
||||||
cmds:
|
|
||||||
- install -v -d "{{.DESTDIR}}{{.BINDIR}}/" && install -m 0755 -v hilbish "{{.DESTDIR}}{{.BINDIR}}/hilbish"
|
|
||||||
- mkdir -p "{{.DESTDIR}}{{.LIBDIR}}"
|
|
||||||
- cp -r libs docs emmyLuaDocs nature .hilbishrc.lua {{.DESTDIR}}{{.LIBDIR}}
|
|
||||||
- grep -qxF "{{.DESTDIR}}{{.BINDIR}}/hilbish" /etc/shells || echo "{{.DESTDIR}}{{.BINDIR}}/hilbish" >> /etc/shells
|
|
||||||
|
|
||||||
uninstall:
|
|
||||||
cmds:
|
|
||||||
- rm -vrf
|
|
||||||
"{{.DESTDIR}}{{.BINDIR}}/hilbish"
|
|
||||||
"{{.DESTDIR}}{{.LIBDIR}}"
|
|
||||||
- grep -v 'hilbish' /etc/shells > /tmp/shells.hilbish_uninstall && mv /tmp/shells.hilbish_uninstall /etc/shells
|
|
210
cmd/build/build.go
Normal file
210
cmd/build/build.go
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
var PREFIX string
|
||||||
|
var BINDIR string
|
||||||
|
var LIBDIR string
|
||||||
|
|
||||||
|
func initEnvs(local bool) {
|
||||||
|
if pfx := os.Getenv("PREFIX"); pfx != "" {
|
||||||
|
PREFIX = pfx
|
||||||
|
} else {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
// do nothing, idk
|
||||||
|
default:
|
||||||
|
PREFIX = "/usr/local"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ldr := os.Getenv("LIBDIR"); ldr != "" {
|
||||||
|
LIBDIR = ldr
|
||||||
|
} else {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
// is this right?
|
||||||
|
LIBDIR = filepath.Join(os.Getenv("APPDATA"), "hilbish")
|
||||||
|
default:
|
||||||
|
LIBDIR = filepath.Join(PREFIX, "share", "hilbish")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if bdr := os.Getenv("BINDIR"); bdr != "" {
|
||||||
|
BINDIR = bdr
|
||||||
|
} else {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
// make it the same as libdir, because yes
|
||||||
|
BINDIR = LIBDIR
|
||||||
|
default:
|
||||||
|
BINDIR = filepath.Join(PREFIX, "bin")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
local := false
|
||||||
|
if len(os.Args) >= 3 {
|
||||||
|
if os.Args[2] == "local" {
|
||||||
|
local = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
initEnvs(local)
|
||||||
|
|
||||||
|
if len(os.Args) == 1 {
|
||||||
|
buildGit()
|
||||||
|
} else if os.Args[1] == "stable" {
|
||||||
|
buildStable()
|
||||||
|
} else if os.Args[1] == "install" {
|
||||||
|
install()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildGit() {
|
||||||
|
var libdir string
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "linux":
|
||||||
|
if ldr := os.Getenv("LIBDIR"); ldr != "" {
|
||||||
|
libdir = ldr
|
||||||
|
} else {
|
||||||
|
libdir = LIBDIR
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
libdir = LIBDIR
|
||||||
|
}
|
||||||
|
|
||||||
|
sh, _ := exec.LookPath("sh")
|
||||||
|
cmd := exec.Command(sh, "-c", fmt.Sprintf(`go build -ldflags "-s -w -X main.dataDir=%s -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"`, libdir))
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
cmd.Stdin = os.Stdin
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildStable() {
|
||||||
|
gopath, _ := exec.LookPath("go")
|
||||||
|
cmd := exec.Command(gopath, "build")
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
cmd.Stdin = os.Stdin
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func install() {
|
||||||
|
fmt.Println("bindir", BINDIR)
|
||||||
|
os.MkdirAll(BINDIR, 0755)
|
||||||
|
|
||||||
|
hilbishPath := filepath.Join(BINDIR, "hilbish")
|
||||||
|
err := copyFile("hilbish", hilbishPath)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("libdir", LIBDIR)
|
||||||
|
err = os.MkdirAll(LIBDIR, 0755)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
dirs := []string{"libs", "docs", "emmyLuaDocs", "nature"}
|
||||||
|
for _, dir := range dirs {
|
||||||
|
err := copyFS(filepath.Join(LIBDIR, dir), os.DirFS(dir))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = copyFile(".hilbishrc.lua", filepath.Join(LIBDIR, ".hilbishrc.lua"))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// i guess checking if not windows makes more sense..
|
||||||
|
if runtime.GOOS != "windows" {
|
||||||
|
shells, err := os.ReadFile("/etc/shells")
|
||||||
|
if err != nil {
|
||||||
|
// pass, i guess
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !bytes.Contains(shells, []byte(hilbishPath)) {
|
||||||
|
f, err := os.OpenFile("/etc/shells", os.O_APPEND|os.O_WRONLY, 0644)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.Write([]byte(hilbishPath))
|
||||||
|
f.Write([]byte("\n"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://pkg.go.dev/os#CopyFS that doesnt error if a file already exists
|
||||||
|
func copyFS(dir string, fsys fs.FS) error {
|
||||||
|
return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fpath, err := filepath.Localize(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
newPath := filepath.Join(dir, fpath)
|
||||||
|
if d.IsDir() {
|
||||||
|
return os.MkdirAll(newPath, 0777)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(panjf2000): handle symlinks with the help of fs.ReadLinkFS
|
||||||
|
// once https://go.dev/issue/49580 is done.
|
||||||
|
// we also need filepathlite.IsLocal from https://go.dev/cl/564295.
|
||||||
|
if !d.Type().IsRegular() {
|
||||||
|
return &os.PathError{Op: "CopyFS", Path: path, Err: os.ErrInvalid}
|
||||||
|
}
|
||||||
|
|
||||||
|
r, err := fsys.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer r.Close()
|
||||||
|
info, err := r.Stat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
w, err := os.OpenFile(newPath, os.O_CREATE|os.O_WRONLY, 0666|info.Mode()&0777)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := io.Copy(w, r); err != nil {
|
||||||
|
w.Close()
|
||||||
|
return &os.PathError{Op: "Copy", Path: newPath, Err: err}
|
||||||
|
}
|
||||||
|
return w.Close()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyFile(from, to string) error {
|
||||||
|
exe, err := os.ReadFile(from)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.WriteFile(to, exe, 0755)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user