mirror of
https://github.com/mappu/miqt.git
synced 2025-03-14 19:30:23 +00:00
genbindings: generate multiple files in one run, cache clang ast files
This commit is contained in:
parent
7f552ee6a4
commit
944e04bf5d
0
cmd/genbindings/cachedir/.create_dir
Normal file
0
cmd/genbindings/cachedir/.create_dir
Normal file
@ -14,30 +14,55 @@ func main() {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
clang := flag.String("clang", "clang", "Custom path to clang")
|
clang := flag.String("clang", "clang", "Custom path to clang")
|
||||||
inputHeader := flag.String("inputHeader", `/usr/include/x86_64-linux-gnu/qt5/QtWidgets/qpushbutton.h`, "Input file")
|
|
||||||
cflags := flag.String("cflags", `-DQT_WIDGETS_LIB -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtCore -DQT_GUI_LIB -I/usr/include/x86_64-linux-gnu/qt5/QtGui -DQT_CORE_LIB`, "Cflags to pass to clang (e.g. `pkg-config --cflags Qt5Widgets`)")
|
cflags := flag.String("cflags", `-DQT_WIDGETS_LIB -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtCore -DQT_GUI_LIB -I/usr/include/x86_64-linux-gnu/qt5/QtGui -DQT_CORE_LIB`, "Cflags to pass to clang (e.g. `pkg-config --cflags Qt5Widgets`)")
|
||||||
outDir := flag.String("outdir", "../../qt", "Output directory for generated gen_** files")
|
outDir := flag.String("outdir", "../../qt", "Output directory for generated gen_** files")
|
||||||
dumpClang := flag.String("dumpclang", "", "(Optional) File to dump output clang JSON")
|
|
||||||
dumpIL := flag.String("dumpil", "", "(Optional) File to dump intermediate IL JSON")
|
dumpIL := flag.String("dumpil", "", "(Optional) File to dump intermediate IL JSON")
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
includeFiles := []string{
|
||||||
|
"/usr/include/x86_64-linux-gnu/qt5/QtWidgets/qwidget.h",
|
||||||
|
"/usr/include/x86_64-linux-gnu/qt5/QtWidgets/qabstractbutton.h",
|
||||||
|
"/usr/include/x86_64-linux-gnu/qt5/QtWidgets/qpushbutton.h",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, inputHeader := range includeFiles {
|
||||||
|
|
||||||
|
// If we have a cached clang AST, use that instead
|
||||||
|
cacheFile := filepath.Join("cachedir", strings.Replace(inputHeader, `/`, `__`, -1)+".json")
|
||||||
|
astJson, err := ioutil.ReadFile(cacheFile)
|
||||||
|
var astInner []interface{} = nil
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
// Nonexistent cache file, regenerate from clang
|
||||||
|
log.Printf("No AST cache for file %q, running clang...", filepath.Base(inputHeader))
|
||||||
|
|
||||||
// Parse the file
|
// Parse the file
|
||||||
astInner, err := clangExec(ctx, *clang, *inputHeader, strings.Fields(*cflags))
|
astInner, err = clangExec(ctx, *clang, inputHeader, strings.Fields(*cflags))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if *dumpClang != "" {
|
// Write to cache
|
||||||
jb, err := json.MarshalIndent(astInner, "", "\t")
|
jb, err := json.MarshalIndent(astInner, "", "\t")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ioutil.WriteFile(*dumpClang, jb, 0644)
|
err = ioutil.WriteFile(cacheFile, jb, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
log.Printf("Reused cache AST for file %q", filepath.Base(inputHeader))
|
||||||
|
|
||||||
|
// Json decode
|
||||||
|
err = json.Unmarshal(astJson, &astInner)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert it to our intermediate format
|
// Convert it to our intermediate format
|
||||||
@ -63,9 +88,9 @@ func main() {
|
|||||||
astTransformOverloads(parsed)
|
astTransformOverloads(parsed)
|
||||||
|
|
||||||
// Emit 3 code files from the intermediate format
|
// Emit 3 code files from the intermediate format
|
||||||
outputName := filepath.Join(*outDir, "gen_"+strings.TrimSuffix(filepath.Base(*inputHeader), `.h`))
|
outputName := filepath.Join(*outDir, "gen_"+strings.TrimSuffix(filepath.Base(inputHeader), `.h`))
|
||||||
|
|
||||||
goSrc, err := emitGo(parsed, filepath.Base(*inputHeader))
|
goSrc, err := emitGo(parsed, filepath.Base(inputHeader))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -75,7 +100,7 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
bindingCppSrc, err := emitBindingCpp(parsed, filepath.Base(*inputHeader))
|
bindingCppSrc, err := emitBindingCpp(parsed, filepath.Base(inputHeader))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -85,7 +110,7 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
bindingHSrc, err := emitBindingHeader(parsed, filepath.Base(*inputHeader))
|
bindingHSrc, err := emitBindingHeader(parsed, filepath.Base(inputHeader))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -97,5 +122,9 @@ func main() {
|
|||||||
|
|
||||||
// Done
|
// Done
|
||||||
|
|
||||||
log.Printf("Processing %q completed", *inputHeader)
|
log.Printf("Processing %q completed", inputHeader)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Processing %d file(s) completed", len(includeFiles))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user