diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-10-23 05:43:48 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-10-23 05:43:48 +0900 |
| commit | b04cb706de8d0829cc8d94071f13e740cb5fc3f2 (patch) | |
| tree | f524863044c7a22468fede5eaadafad107d9bffd /cmd | |
| parent | e10c90b58c2a7d92c42b27054ecc783b64585bc5 (diff) | |
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 <cat@gensokyo.uk>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/dist/main.go | 47 |
1 files changed, 38 insertions, 9 deletions
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), |
