1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
package main
// auto run protoc with the correct args
import (
"errors"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/go-cmd/cmd"
"go.wit.com/lib/gui/shell"
"go.wit.com/log"
)
// THIS GENERATES THIS cmd and then runs it:
// autogenpb needs the commands:
// protoc
// gen-proto-go
// these are in the GO tools
// Thsese lines were taken from a working Makefile:
// test.pb.go: test.proto
// cd ~/go/src && protoc --go_out=. --proto_path=go.wit.com/apps/autogenpb/testautogen \
// --go_opt=Mtest.proto=go.wit.com/apps/autogenpb/testautogen \
// test.proto
// forgeConfig.pb.go: forgeConfig.proto
// cd ~/go/src && protoc --go_out=. --proto_path=go.wit.com/apps/autogenpb/testautogen \
// --go_opt=MforgeConfig.proto=go.wit.com/apps/autogenpb/testautogen \
// forgeConfig.proto
func (pb *Files) protocBuild(f *File) error {
// read in the .proto file
data, err := os.ReadFile(f.Filename)
if err != nil {
// log.Info("open config file :", err)
return err
}
if shell.Exists(f.Pbfilename) {
log.Info("protoc file already created", f.Pbfilename)
return nil
}
log.Info("Attempt to generate the protoc file:", f.Pbfilename)
// log.Info("go src", forge.GetGoSrc())
pwd, _ := os.Getwd()
log.Info("go.Getwd()", pwd)
if !strings.HasPrefix(pwd, argv.GoSrc) {
log.Info("are you building using a go.work file? If so,")
log.Info("your paths will not match because the default")
log.Info("is to use ~/go/src so you have to specify")
log.Info("where your path is with --go-src")
log.Info("todo: use forgepb to figure this out")
return errors.New("paths don't match")
}
gopath := strings.TrimPrefix(pwd, argv.GoSrc)
gopath = strings.Trim(gopath, "/")
log.Info("gopath", gopath)
cmd := []string{"protoc", "--go_out=."}
cmd = append(cmd, "--proto_path="+gopath)
cmd = append(cmd, "--go_opt=M"+f.Filename+"="+gopath)
// look for included proto files
lines := strings.Split(string(data), "\n")
for _, line := range lines {
// log.Info("line:", line)
if strings.HasPrefix(line, "import ") {
parts := strings.Split(line, "\"")
protofile := parts[1]
if shell.Exists(protofile) {
log.Info("adding import", protofile)
cmd = append(cmd, "--go_opt=M"+protofile+"="+gopath)
} else {
basepath, pname := filepath.Split(protofile)
if basepath == "" {
log.Warn("import line:", line, "missing proto file:", pname)
log.Warn("protoc will probably fail here")
} else {
log.Warn("need to check basepath here", basepath, pname)
}
}
}
/*
start := "type " + names["Bases"] + " struct {"
if strings.HasSuffix(line, start) {
found = true
log.Info("FOUND line:", line)
fmt.Fprintln(w, line)
fmt.Fprintln(w, "\tsync.RWMutex // auto-added by go.wit.com/apps/autogenpb")
fmt.Fprintln(w, "")
} else {
fmt.Fprintln(w, line)
}
*/
}
cmd = append(cmd, f.Filename)
log.Info("\tpwd", argv.GoSrc)
for i, s := range cmd {
log.Info("\t", i, s)
}
return runprotoc(argv.GoSrc, cmd)
}
func runprotoc(pwd string, mycmd []string) error {
result := shell.PathRun(argv.GoSrc, mycmd)
if result.Error != nil {
return userNotes(result)
}
if result.Exit != 0 {
return userNotes(result)
}
return nil
}
func userNotes(result cmd.Status) error {
log.Info("protoc failed", result.Cmd, "with", result.Exit)
for _, line := range result.Stdout {
log.Info("STDOUT:", line)
}
for _, line := range result.Stderr {
log.Info("STDERR:", line)
}
log.Info("This is likely because you don't have protoc and protoc-gen-go installed")
log.Info("")
log.Info("On debian, you can:")
log.Info(" apt install protobuf-compiler # for protoc")
log.Info(" apt install protoc-gen-go # for protoc-gen-go")
log.Info("")
return fmt.Errorf("protoc failed with %d %v", result.Exit, result.Error)
}
|