package main import ( "fmt" "os" "os/exec" "path/filepath" "strings" "text/template" "github.com/bnema/puregotk/pkg/gir/pass" "github.com/bnema/puregotk/pkg/gir/util" ) //go:generate go run gen.go func main() { dir := "v4" os.RemoveAll(dir) var girs []string filepath.Walk("internal/gir/spec", func(path string, f os.FileInfo, err error) error { if !strings.HasSuffix(path, ".gir") { return nil } girs = append(girs, path) return nil }) p, err := pass.New(girs) if err != nil { panic(err) } // collect basic type info p.First() // Create the template gotemp, err := template.New("go").Funcs(template.FuncMap{ "conv": util.ConvertArgs, "convc": util.ConvertArgsComma, "convcb": util.ConvertCallbackArgs, "convcd": util.ConvertArgsCommaDeref, "convd": util.ConvertArgsDeref, "convcbne": util.ConvertCallbackArgsNoErr, "propsset": util.PropertyScalarSet, "propsget": util.PropertyScalarGet, "propvset": util.PropertyVectorSet, "propvget": util.PropertyVectorGet, }).ParseFiles("templates/go") if err != nil { panic(err) } // Write go files by making the second pass p.Second(dir, gotemp) // Finally copy some extra code that we want in the API data, err := os.ReadFile("templates/gobject") if err == nil { os.WriteFile("v4/gobject/more.go", data, 0o644) } data, err = os.ReadFile("templates/gtype") if err == nil { mkerr := os.MkdirAll("v4/gobject/types", 0o755) if mkerr != nil { panic(mkerr) } os.WriteFile("v4/gobject/types/types.go", data, 0o644) } data, err = os.ReadFile("templates/glib") if err == nil { os.WriteFile("v4/glib/more.go", data, 0o644) } data, err = os.ReadFile("templates/glib_sysv") if err == nil { os.WriteFile("v4/glib/more_sysv.go", data, 0o644) } data, err = os.ReadFile("templates/glib_windows") if err == nil { os.WriteFile("v4/glib/more_windows.go", data, 0o644) } data, err = os.ReadFile("templates/glib_other") if err == nil { os.WriteFile("v4/glib/more_other.go", data, 0o644) } // Fix imports: goimports adds missing imports and removes unused ones. // This is more robust than trying to statically predict all cross-package // references from template data. fmt.Println("Running goimports on generated files...") cmd := exec.Command("goimports", "-w", "-local", "github.com/bnema/puregotk", dir) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Fprintf(os.Stderr, "warning: goimports failed: %v\n", err) } }