build: add support for building with 'b' codec in magefile

This commit is contained in:
zarazaex69
2026-04-22 21:28:02 +03:00
parent a2d1b95ffa
commit 5c36e0d95a

View File

@@ -19,6 +19,7 @@ const (
buildDir = "build"
ldflags = "-s -w"
goVersion = "1.25"
bRepo = "github.com/zarazaex69/b"
)
var (
@@ -36,7 +37,14 @@ func Build() error {
// BuildCLI builds the olcrtc server/client binary.
func BuildCLI() error {
mg.Deps(Deps)
return buildBinary("olcrtc", "./cmd/olcrtc", goos, goarch)
return buildBinary("olcrtc", "./cmd/olcrtc", goos, goarch, false)
}
// BuildB builds olcrtc with b codec support (requires libb.so).
func BuildB() error {
mg.Deps(Deps)
mg.Deps(B.Build)
return buildBinary("olcrtc", "./cmd/olcrtc", goos, goarch, true)
}
// BuildUI builds the Fyne desktop UI binary.
@@ -61,7 +69,7 @@ func Cross() error {
}
for _, t := range targets {
if err := buildBinary("olcrtc", "./cmd/olcrtc", t.os, t.arch); err != nil {
if err := buildBinary("olcrtc", "./cmd/olcrtc", t.os, t.arch, false); err != nil {
return err
}
}
@@ -124,7 +132,7 @@ func Mobile() error {
)
}
func buildBinary(name, pkg, os_, arch string) error {
func buildBinary(name, pkg, os_, arch string, withB bool) error {
if err := ensureBuildDir(); err != nil {
return err
}
@@ -133,14 +141,25 @@ func buildBinary(name, pkg, os_, arch string) error {
if os_ == "windows" {
ext = ".exe"
}
outName := fmt.Sprintf("%s-%s-%s%s", name, os_, arch, ext)
suffix := ""
if withB {
suffix = "-b"
}
outName := fmt.Sprintf("%s%s-%s-%s%s", name, suffix, os_, arch, ext)
out := filepath.Join(buildDir, outName)
fmt.Printf("building %s (%s/%s) -> %s\n", name, os_, arch, out)
fmt.Printf("building %s (%s/%s, b=%v) -> %s\n", name, os_, arch, withB, out)
env := map[string]string{
"GOOS": os_,
"GOARCH": arch,
"CGO_ENABLED": "0",
"GOOS": os_,
"GOARCH": arch,
}
if withB {
env["CGO_ENABLED"] = "1"
bLibDir := bLibPath()
env["CGO_LDFLAGS"] = fmt.Sprintf("-L%s -Wl,-rpath,%s", bLibDir, bLibDir)
} else {
env["CGO_ENABLED"] = "0"
}
flags := ldflags
@@ -148,12 +167,13 @@ func buildBinary(name, pkg, os_, arch string) error {
flags += " -checklinkname=0"
}
return sh.RunWithV(env, goexe, "build",
"-trimpath",
"-ldflags", flags,
"-o", out,
pkg,
)
args := []string{"build", "-trimpath", "-ldflags", flags}
if withB {
args = append(args, "-tags", "b")
}
args = append(args, "-o", out, pkg)
return sh.RunWithV(env, goexe, args...)
}
func buildUIBinary(os_, arch string) error {
@@ -190,6 +210,68 @@ func buildUIBinary(os_, arch string) error {
return cmd.Run()
}
type B mg.Namespace
func bLibPath() string {
return filepath.Join(buildDir, "lib")
}
func bSrcPath() string {
return filepath.Join(buildDir, "b-src")
}
func (B) Build() error {
if err := ensureBuildDir(); err != nil {
return err
}
libDir := bLibPath()
libPath := filepath.Join(libDir, "libb.so")
if _, err := os.Stat(libPath); err == nil {
fmt.Println("libb.so already exists, skipping build")
return nil
}
srcDir := bSrcPath()
if _, err := os.Stat(srcDir); os.IsNotExist(err) {
fmt.Println("cloning b repository...")
if err := sh.RunV("git", "clone", "--depth=1", "https://"+bRepo, srcDir); err != nil {
return fmt.Errorf("failed to clone b: %w", err)
}
}
fmt.Println("building libb.so with cargo...")
if err := sh.RunV("cargo", "build", "--release", "--manifest-path", filepath.Join(srcDir, "Cargo.toml")); err != nil {
return fmt.Errorf("cargo build failed: %w", err)
}
if err := os.MkdirAll(libDir, 0o755); err != nil {
return err
}
srcLib := filepath.Join(srcDir, "target", "release", "libb.so")
if err := sh.Copy(libPath, srcLib); err != nil {
return fmt.Errorf("failed to copy libb.so: %w", err)
}
fmt.Printf("libb.so installed to %s\n", libPath)
return nil
}
func (B) Clean() error {
srcDir := bSrcPath()
if _, err := os.Stat(srcDir); err == nil {
if err := os.RemoveAll(srcDir); err != nil {
return err
}
}
libPath := filepath.Join(bLibPath(), "libb.so")
if _, err := os.Stat(libPath); err == nil {
return os.Remove(libPath)
}
return nil
}
func ensureBuildDir() error {
return os.MkdirAll(buildDir, 0o755)