From b04cb706de8d0829cc8d94071f13e740cb5fc3f2 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Fri, 23 Oct 2026 05:43:48 +0900 Subject: cmd/dist: cross-compile via clang The cross-compiled sysroot can now be provided by internal/rosa. Unfortunately pkg-config still had to be configured externally to avoid making any assumptions about the prefix. Signed-off-by: Ophestra --- cmd/dist/main.go | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) (limited to 'cmd/dist') diff --git a/cmd/dist/main.go b/cmd/dist/main.go index 40a0583c..df586bbf 100644 --- a/cmd/dist/main.go +++ b/cmd/dist/main.go @@ -47,6 +47,22 @@ func mustRun(ctx context.Context, env []string, name string, arg ...string) { } } +// mustLinuxArch returns the architecture name used by linux corresponding to arch. +func mustLinuxArch(arch string) string { + switch arch { + case "amd64": + return "x86_64" + case "arm64": + return "aarch64" + case "riscv64": + return "riscv64" + + default: + log.Fatalf("unsupported target %s", arch) + return "\x00" + } +} + //go:embed comp/_hakurei var comp []byte @@ -56,6 +72,8 @@ func main() { log.SetOutput(os.Stdout) verbose := os.Getenv("VERBOSE") != "" + arch := getenv("HAKUREI_ARCH", runtime.GOARCH) + sysroot := getenv("HAKUREI_SYSROOT", "/") runTests := os.Getenv("HAKUREI_DIST_MAKE") == "" race := os.Getenv("HAKUREI_RACE") != "" dynamic := os.Getenv("HAKUREI_DYNAMIC") != "" @@ -63,6 +81,9 @@ func main() { prefix := getenv("PREFIX", "/usr/local") destdir := getenv("DESTDIR", "dist") + linuxArch := mustLinuxArch(arch) + target := linuxArch + "-rosa-linux-musl" + if verbose { log.Println() } @@ -71,10 +92,13 @@ func main() { version += "-race" } - if err := os.Setenv("CC", "clang"); err != nil { - log.Fatal(err) - } else if err = os.Setenv("CXX", "clang++"); err != nil { - log.Fatal(err) + for _, env := range [][2]string{ + {"CC", "clang --target=" + target + " --sysroot=" + sysroot}, + {"CXX", "clang++ --target=" + target + " --sysroot=" + sysroot}, + } { + if err := os.Setenv(env[0], env[1]); err != nil { + log.Fatal(err) + } } if err := os.MkdirAll(destdir, 0755); err != nil { @@ -134,10 +158,12 @@ func main() { ldflagsStatic = "" } - log.Printf("Building hakurei %s for %s/%s.", version, runtime.GOOS, runtime.GOARCH) + log.Printf("Building hakurei %s for %s/%s.", version, runtime.GOOS, arch) mustRun(ctx, nil, "go", "generate", "./...") mustRun( - ctx, nil, "go", "build", + ctx, []string{ + "GOARCH=" + arch, + }, "go", "build", "-trimpath", verboseFlag, raceFlag, "-o", s, "-ldflags=-s -w "+ @@ -149,9 +175,12 @@ func main() { "./cmd/sharefs", ) - log.Printf("Building cmd/hsu for %s/%s.", runtime.GOOS, runtime.GOARCH) + log.Printf("Building cmd/hsu for %s/%s.", runtime.GOOS, arch) mustRun( - ctx, []string{"CGO_ENABLED=0"}, "go", "build", + ctx, []string{ + "CGO_ENABLED=0", + "GOARCH=" + arch, + }, "go", "build", "-trimpath", verboseFlag, "-o", s, "-ldflags=-s -w "+ @@ -173,7 +202,7 @@ func main() { log.Println("##### Creating distribution.") const suffix = ".tar.gz" - distName := "hakurei-" + version + "-" + runtime.GOARCH + distName := "hakurei-" + version + "-" + arch var f *os.File if f, err = os.OpenFile( filepath.Join(s, distName+suffix), -- cgit v1.3.1