diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-10-14 15:32:19 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-10-14 15:32:19 +0900 |
| commit | 72d7e6da4cba108f17749921755f4405eb1a5962 (patch) | |
| tree | c832cea6812393faff3f12adcdaaa59a68507386 /cmd/dist | |
| parent | ddc9246216e0bc6ba1282174acd787c1f5fadb3c (diff) | |
cmd/dist: allow forcing dynamic linking
This remains unsupported, but is useful during testing, or when
packaging for some particularly stubborn distros.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'cmd/dist')
| -rw-r--r-- | cmd/dist/main.go | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/cmd/dist/main.go b/cmd/dist/main.go index 1034f282..40a0583c 100644 --- a/cmd/dist/main.go +++ b/cmd/dist/main.go @@ -4,6 +4,7 @@ package main import ( "archive/tar" + "bytes" "compress/gzip" "context" "crypto/sha512" @@ -57,6 +58,7 @@ func main() { verbose := os.Getenv("VERBOSE") != "" runTests := os.Getenv("HAKUREI_DIST_MAKE") == "" race := os.Getenv("HAKUREI_RACE") != "" + dynamic := os.Getenv("HAKUREI_DYNAMIC") != "" version = getenv("HAKUREI_VERSION", strings.TrimSpace(version)) prefix := getenv("PREFIX", "/usr/local") destdir := getenv("DESTDIR", "dist") @@ -69,6 +71,12 @@ 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) + } + if err := os.MkdirAll(destdir, 0755); err != nil { log.Fatal(err) } @@ -94,15 +102,36 @@ func main() { ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) defer cancel() + const stubFlag = "-buildvcs=false" verboseFlag := "-v" if !verbose { - verboseFlag = "-buildvcs=false" + verboseFlag = stubFlag } raceFlag := "-race" if !race { - raceFlag = "-buildvcs=false" + raceFlag = stubFlag + } + + ldflagsStatic := " -extldflags=-static" + if dynamic { + cmd := exec.CommandContext(ctx, "llvm-config", "--host-target") + cmd.Stderr = os.Stderr + var p []byte + p, err = cmd.Output() + if err != nil { + log.Fatal(err) + } + p = bytes.TrimSpace(p) + _, abi, ok := strings.CutLast(string(p), "-") + if !ok { + log.Fatalf("invalid target %q", string(p)) + } + version += "-" + abi + + log.Println("WARNING: dynamic linking is not supported") + ldflagsStatic = "" } log.Printf("Building hakurei %s for %s/%s.", version, runtime.GOOS, runtime.GOARCH) @@ -112,7 +141,7 @@ func main() { "-trimpath", verboseFlag, raceFlag, "-o", s, "-ldflags=-s -w "+ - "-buildid= -linkmode external -extldflags=-static "+ + "-buildid= -linkmode external"+ldflagsStatic+" "+ "-X hakurei.app/internal/info.buildVersion="+version+" "+ "-X hakurei.app/internal/info.hakureiPath="+prefix+"/bin/hakurei "+ "-X hakurei.app/internal/info.hsuPath="+prefix+"/bin/hsu", @@ -136,7 +165,7 @@ func main() { log.Println("##### Testing Hakurei.") mustRun( ctx, nil, "go", "test", raceFlag, - "-ldflags=-buildid= -linkmode external -extldflags=-static", + "-ldflags=-buildid= -linkmode external"+ldflagsStatic, "./...", ) log.Println() |
