From 5c36e0d95acb75d49929b89a41c70a91ec392771 Mon Sep 17 00:00:00 2001 From: zarazaex69 Date: Wed, 22 Apr 2026 21:28:02 +0300 Subject: [PATCH] build: add support for building with 'b' codec in magefile --- magefile.go | 110 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 14 deletions(-) diff --git a/magefile.go b/magefile.go index 8fbbab7..b3db124 100644 --- a/magefile.go +++ b/magefile.go @@ -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)