mirror of
https://github.com/mappu/miqt.git
synced 2024-12-22 17:08:38 +00:00
genbindings/main: refactor extract generateClangCaches()
This commit is contained in:
parent
3382806f62
commit
b6aa72f62f
@ -76,8 +76,6 @@ func cleanGeneratedFilesInDir(dirpath string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
clang := flag.String("clang", "clang", "Custom path to clang")
|
clang := flag.String("clang", "clang", "Custom path to clang")
|
||||||
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")
|
||||||
@ -109,63 +107,7 @@ func main() {
|
|||||||
// PASS 0 (Fill clang cache)
|
// PASS 0 (Fill clang cache)
|
||||||
//
|
//
|
||||||
|
|
||||||
var clangChan = make(chan string, 0)
|
generateClangCaches(includeFiles, *clang, strings.Fields(*cflags))
|
||||||
var clangWg sync.WaitGroup
|
|
||||||
|
|
||||||
for i := 0; i < ClangSubprocessCount; i++ {
|
|
||||||
clangWg.Add(1)
|
|
||||||
go func() {
|
|
||||||
defer clangWg.Done()
|
|
||||||
log.Printf("Clang worker: starting")
|
|
||||||
|
|
||||||
for {
|
|
||||||
inputHeader, ok := <-clangChan
|
|
||||||
if !ok {
|
|
||||||
return // Done
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("Clang worker got message for file %q", inputHeader)
|
|
||||||
|
|
||||||
// Parse the file
|
|
||||||
// This seems to intermittently fail, so allow retrying
|
|
||||||
astInner := mustClangExec(ctx, *clang, inputHeader, strings.Fields(*cflags))
|
|
||||||
|
|
||||||
// Write to cache
|
|
||||||
jb, err := json.MarshalIndent(astInner, "", "\t")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = ioutil.WriteFile(cacheFilePath(inputHeader), jb, 0644)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
astInner = nil
|
|
||||||
jb = nil
|
|
||||||
runtime.GC()
|
|
||||||
|
|
||||||
}
|
|
||||||
log.Printf("Clang worker: exiting")
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, inputHeader := range includeFiles {
|
|
||||||
|
|
||||||
// Check if there is a matching cache hit
|
|
||||||
cacheFile := cacheFilePath(inputHeader)
|
|
||||||
|
|
||||||
if _, err := os.Stat(cacheFile); err != nil && os.IsNotExist(err) {
|
|
||||||
|
|
||||||
// Nonexistent cache file, regenerate from clang
|
|
||||||
log.Printf("No AST cache for file %q, running clang...", filepath.Base(inputHeader))
|
|
||||||
clangChan <- inputHeader
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Done with all clang workers
|
|
||||||
close(clangChan)
|
|
||||||
clangWg.Wait()
|
|
||||||
|
|
||||||
// The cache should now be fully populated.
|
// The cache should now be fully populated.
|
||||||
|
|
||||||
@ -288,3 +230,65 @@ func main() {
|
|||||||
|
|
||||||
log.Printf("Processing %d file(s) completed", len(includeFiles))
|
log.Printf("Processing %d file(s) completed", len(includeFiles))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func generateClangCaches(includeFiles []string, clangBin string, cflags []string) {
|
||||||
|
|
||||||
|
var clangChan = make(chan string, 0)
|
||||||
|
var clangWg sync.WaitGroup
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
for i := 0; i < ClangSubprocessCount; i++ {
|
||||||
|
clangWg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer clangWg.Done()
|
||||||
|
log.Printf("Clang worker: starting")
|
||||||
|
|
||||||
|
for {
|
||||||
|
inputHeader, ok := <-clangChan
|
||||||
|
if !ok {
|
||||||
|
return // Done
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Clang worker got message for file %q", inputHeader)
|
||||||
|
|
||||||
|
// Parse the file
|
||||||
|
// This seems to intermittently fail, so allow retrying
|
||||||
|
astInner := mustClangExec(ctx, clangBin, inputHeader, cflags)
|
||||||
|
|
||||||
|
// Write to cache
|
||||||
|
jb, err := json.MarshalIndent(astInner, "", "\t")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ioutil.WriteFile(cacheFilePath(inputHeader), jb, 0644)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
astInner = nil
|
||||||
|
jb = nil
|
||||||
|
runtime.GC()
|
||||||
|
|
||||||
|
}
|
||||||
|
log.Printf("Clang worker: exiting")
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, inputHeader := range includeFiles {
|
||||||
|
|
||||||
|
// Check if there is a matching cache hit
|
||||||
|
cacheFile := cacheFilePath(inputHeader)
|
||||||
|
|
||||||
|
if _, err := os.Stat(cacheFile); err != nil && os.IsNotExist(err) {
|
||||||
|
|
||||||
|
// Nonexistent cache file, regenerate from clang
|
||||||
|
log.Printf("No AST cache for file %q, running clang...", filepath.Base(inputHeader))
|
||||||
|
clangChan <- inputHeader
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done with all clang workers
|
||||||
|
close(clangChan)
|
||||||
|
clangWg.Wait()
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user