Skip to content

Commit a152cc2

Browse files
committed
added addtags command
workaround for golang/go#47179
1 parent 74f313a commit a152cc2

File tree

3 files changed

+78
-2
lines changed

3 files changed

+78
-2
lines changed

cmd/addtags/main.go

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"flag"
6+
"fmt"
7+
"go/build/constraint"
8+
"go/format"
9+
"os"
10+
"os/exec"
11+
)
12+
13+
var (
14+
tags = flag.String("tags", "", "comma-separated list of build tags to apply")
15+
file = flag.String("file", "", "file to modify")
16+
)
17+
18+
func usage() {
19+
fmt.Fprintf(os.Stderr, `
20+
usage: addtags -tags <build tags to apply> -file FILE <subcommand args...>
21+
`[1:])
22+
23+
flag.PrintDefaults()
24+
fmt.Fprintf(os.Stderr, `
25+
It is intended for use with 'go generate', so it also runs a subcommand,
26+
which presumably creates the file.
27+
Sample usage:
28+
addtags -tags=darwin,arm64 -file linuxrosettaavailability_string.go stringer -type=LinuxRosettaAvailability
29+
`[1:])
30+
os.Exit(2)
31+
}
32+
33+
func main() {
34+
flag.Usage = usage
35+
flag.Parse()
36+
args := flag.Args()
37+
if len(args) == 0 {
38+
flag.Usage()
39+
}
40+
plusConstraint := fmt.Sprintf("// +build %s", *tags)
41+
expr, err := constraint.Parse(plusConstraint)
42+
check(err)
43+
goBuildConstraint := fmt.Sprintf("//go:build %s", expr.String())
44+
45+
cmd := exec.Command(args[0], args[1:]...)
46+
cmd.Stdout = os.Stdout
47+
cmd.Stderr = os.Stderr
48+
err = cmd.Run()
49+
check(err)
50+
b, err := os.ReadFile(*file)
51+
check(err)
52+
53+
var buf bytes.Buffer
54+
_, err = fmt.Fprintf(&buf, "%s\n%s\n", goBuildConstraint, plusConstraint)
55+
check(err)
56+
57+
_, err = buf.Write(b)
58+
check(err)
59+
60+
src, err := format.Source(buf.Bytes())
61+
check(err)
62+
63+
f, err := os.OpenFile(*file, os.O_TRUNC|os.O_WRONLY, 0644)
64+
check(err)
65+
defer f.Close()
66+
67+
_, err = f.Write(src)
68+
check(err)
69+
}
70+
71+
func check(err error) {
72+
if err != nil {
73+
fmt.Fprintln(os.Stderr, err)
74+
os.Exit(1)
75+
}
76+
}

linuxrosettaavailability_string.go renamed to linuxrosettaavailability_string_arm64.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

shared_directory_arm64.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717

1818
// LinuxRosettaAvailability represents an availability of Rosetta support for Linux binaries.
1919
//
20-
//go:generate stringer -type=LinuxRosettaAvailability
20+
//go:generate go run ./cmd/addtags -tags=darwin,arm64 -file linuxrosettaavailability_string_arm64.go stringer -type=LinuxRosettaAvailability -output=linuxrosettaavailability_string_arm64.go
2121
type LinuxRosettaAvailability int
2222

2323
const (

0 commit comments

Comments
 (0)