1package main
2
3import (
4 "fmt"
5 "os"
6 "os/exec"
7 "path/filepath"
8 "strings"
9 "text/template"
10
11 "github.com/bnema/puregotk/pkg/gir/pass"
12 "github.com/bnema/puregotk/pkg/gir/util"
13)
14
15//go:generate go run gen.go
16
17func main() {
18 dir := "v4"
19 os.RemoveAll(dir)
20 var girs []string
21 filepath.Walk("internal/gir/spec", func(path string, f os.FileInfo, err error) error {
22 if !strings.HasSuffix(path, ".gir") {
23 return nil
24 }
25 girs = append(girs, path)
26 return nil
27 })
28 p, err := pass.New(girs)
29 if err != nil {
30 panic(err)
31 }
32 // collect basic type info
33 p.First()
34
35 // Create the template
36 gotemp, err := template.New("go").Funcs(template.FuncMap{
37 "conv": util.ConvertArgs,
38 "convc": util.ConvertArgsComma,
39 "convcb": util.ConvertCallbackArgs,
40 "convcd": util.ConvertArgsCommaDeref,
41 "convd": util.ConvertArgsDeref,
42 "convcbne": util.ConvertCallbackArgsNoErr,
43 "propsset": util.PropertyScalarSet,
44 "propsget": util.PropertyScalarGet,
45 "propvset": util.PropertyVectorSet,
46 "propvget": util.PropertyVectorGet,
47 }).ParseFiles("templates/go")
48 if err != nil {
49 panic(err)
50 }
51
52 // Write go files by making the second pass
53 p.Second(dir, gotemp)
54
55 // Finally copy some extra code that we want in the API
56 data, err := os.ReadFile("templates/gobject")
57 if err == nil {
58 os.WriteFile("v4/gobject/more.go", data, 0o644)
59 }
60 data, err = os.ReadFile("templates/gtype")
61 if err == nil {
62 mkerr := os.MkdirAll("v4/gobject/types", 0o755)
63 if mkerr != nil {
64 panic(mkerr)
65 }
66 os.WriteFile("v4/gobject/types/types.go", data, 0o644)
67 }
68 data, err = os.ReadFile("templates/glib")
69 if err == nil {
70 os.WriteFile("v4/glib/more.go", data, 0o644)
71 }
72 data, err = os.ReadFile("templates/glib_sysv")
73 if err == nil {
74 os.WriteFile("v4/glib/more_sysv.go", data, 0o644)
75 }
76 data, err = os.ReadFile("templates/glib_windows")
77 if err == nil {
78 os.WriteFile("v4/glib/more_windows.go", data, 0o644)
79 }
80 data, err = os.ReadFile("templates/glib_other")
81 if err == nil {
82 os.WriteFile("v4/glib/more_other.go", data, 0o644)
83 }
84
85 // Fix imports: goimports adds missing imports and removes unused ones.
86 // This is more robust than trying to statically predict all cross-package
87 // references from template data.
88 fmt.Println("Running goimports on generated files...")
89 cmd := exec.Command("goimports", "-w", "-local", "github.com/bnema/puregotk", dir)
90 cmd.Stdout = os.Stdout
91 cmd.Stderr = os.Stderr
92 if err := cmd.Run(); err != nil {
93 fmt.Fprintf(os.Stderr, "warning: goimports failed: %v\n", err)
94 }
95}