diff --git a/Makefile b/Makefile index 8e29922c1..cd40fe38e 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,8 @@ cmd/genbindings/genbindings: go.mod cmd/genbindings/*.go .PHONY: genbindings genbindings: cmd/miqt-docker/miqt-docker cmd/genbindings/genbindings - cd cmd/genbindings && ../miqt-docker/miqt-docker genbindings ./genbindings + cd cmd/genbindings && ../miqt-docker/miqt-docker genbindings ./genbindings -config qt5 + cd cmd/genbindings && ../miqt-docker/miqt-docker genbindings ./genbindings -config qt6 .PHONY: test-cmd test-cmd: cmd/miqt-docker/miqt-docker diff --git a/cmd/genbindings/config-qt5-libraries.go b/cmd/genbindings/config-qt5-libraries.go new file mode 100644 index 000000000..d4d77382b --- /dev/null +++ b/cmd/genbindings/config-qt5-libraries.go @@ -0,0 +1,343 @@ +package main + +import ( + "path/filepath" + "strings" +) + +func Qt5_ProcessLibraries(clangBin, outDir, extraLibsDir string) { + + flushKnownTypes() + InsertTypedefs(false) + generate( + "qt", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtCore", + "/usr/include/x86_64-linux-gnu/qt5/QtGui", + "/usr/include/x86_64-linux-gnu/qt5/QtWidgets", + }, + func(fullpath string) bool { + // Block cbor and generate it separately + fname := filepath.Base(fullpath) + if strings.HasPrefix(fname, "qcbor") { + return false + } + + return Widgets_AllowHeader(fullpath) + }, + clangBin, + pkgConfigCflags("Qt5Widgets"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + generate( + "qt/cbor", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtCore", + }, + func(fullpath string) bool { + // Only include the same json, xml, cbor files excluded above + fname := filepath.Base(fullpath) + return strings.HasPrefix(fname, "qcbor") + }, + clangBin, + pkgConfigCflags("Qt5Core"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + generate( + "qt/printsupport", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtPrintSupport", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5PrintSupport"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + generate( + "qt/svg", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtSvg", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5Svg"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 Network (1/3) + + generate( + "qt/network", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtNetwork", + }, + ExceptHeaders("qdtls.h", "qsctpserver.h", "qsctpsocket.h"), + clangBin, + pkgConfigCflags("Qt5Network"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 Network (2/3) + + generate( + "qt/network/sctp", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtNetwork", + }, + OnlyHeaders("qsctpserver.h", "qsctpsocket.h"), + clangBin, + pkgConfigCflags("Qt5Network"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 Network (3/3) - split out DTLS into subpackage because macOS Brew is + // compiled with it disabled + // There are still some extra functions to move out from qsslconfiguration.h + // @ref https://github.com/mappu/miqt/issues/151 + + generate( + "qt/network/dtls", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtNetwork", + }, + OnlyHeaders("qdtls.h"), + clangBin, + pkgConfigCflags("Qt5Network"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + generate( + "qt/multimedia", + []string{ + // Theoretically, QtMultimediaWidgets and QtMultimedia are different + // packages, but QtMultimedia qcamera.h has a dependency on qvideowidget. + // Bind them together since our base /qt/ package is Widgets anyway. + "/usr/include/x86_64-linux-gnu/qt5/QtMultimedia", + "/usr/include/x86_64-linux-gnu/qt5/QtMultimediaWidgets", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5MultimediaWidgets"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + generate( + "qt/script", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtScript", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5Script"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 QWebkit: depends on Qt5PrintSupport but only at runtime, not at + // codegen time + generate( + "qt/webkit", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtWebKit", + "/usr/include/x86_64-linux-gnu/qt5/QtWebKitWidgets", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5WebKitWidgets"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 QWebChannel + generate( + "qt/webchannel", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtWebChannel", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5WebChannel"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 QWebEngine + generate( + "qt/webengine", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtWebEngine", + "/usr/include/x86_64-linux-gnu/qt5/QtWebEngineCore", + "/usr/include/x86_64-linux-gnu/qt5/QtWebEngineWidgets", + }, + ExceptHeaders("qquickwebengineprofile.h", "qquickwebenginescript.h"), + clangBin, + pkgConfigCflags("Qt5WebEngineWidgets"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 QWebSockets + // Depends on QtCore + generate( + "qt/websockets", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtWebSockets", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5WebSockets"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 PDF + // Depends on QtCore/Gui/Widgets + generate( + "qt/pdf", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtPdf", + "/usr/include/x86_64-linux-gnu/qt5/QtPdfWidgets", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5PdfWidgets"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 Positioning + // Depends on QtCore + generate( + "qt/positioning", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtPositioning", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5Positioning"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 OpenGL + // Depends on QtCore/Gui/Widgets + generate( + "qt/opengl", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtOpenGL", + }, + OnlyHeaders("qgl.h"), + clangBin, + pkgConfigCflags("Qt5OpenGL"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 SQL + // Depends on QtCore + generate( + "qt/sql", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtSql", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5Sql"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 Designer + // Depends on QtCore/Gui/Widgets + generate( + "qt/designer", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtDesigner", + }, + ExceptHeaders("qdesigner_components.h"), + clangBin, + pkgConfigCflags("Qt5Designer"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 UI Plugin + // Depends on QtCore/Gui/Widgets + generate( + "qt/uiplugin", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtUiPlugin", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5UiPlugin"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 UI Tools + // Depends on QtCore/Gui/Widgets + generate( + "qt/uitools", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtUiTools", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5UiTools"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Qt 5 Qwt + // Depends on QtCore/Gui/Widgets/Designer/OpenGL + generate( + "qt-extras/qwt", + []string{ + "/usr/include/qwt", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5Qwt6"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Depends on QtCore/Gui/Widgets, QPrintSupport + generate( + "qt-restricted-extras/qscintilla", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/Qsci", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5PrintSupport"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + + // Depends on QtCore/Gui/Widgets + generate( + "qt-extras/scintillaedit", + []string{ + filepath.Join(extraLibsDir, "scintilla/qt/ScintillaEdit/ScintillaEdit.h"), + }, + AllowAllHeaders, + clangBin, + "--std=c++1z "+pkgConfigCflags("ScintillaEdit"), + outDir, + (&clangMatchUnderPath{filepath.Join(extraLibsDir, "scintilla")}).Match, + ) + +} diff --git a/cmd/genbindings/config-libraries.go b/cmd/genbindings/config-qt6-libraries.go similarity index 51% rename from cmd/genbindings/config-libraries.go rename to cmd/genbindings/config-qt6-libraries.go index e4b6300c9..7197f1e7e 100644 --- a/cmd/genbindings/config-libraries.go +++ b/cmd/genbindings/config-qt6-libraries.go @@ -5,355 +5,7 @@ import ( "strings" ) -func ProcessLibraries(clangBin, outDir, extraLibsDir string) { - - AllowAllHeaders := func(string) bool { return true } - OnlyHeaders := func(s ...string) func(fullpath string) bool { - return func(fullpath string) bool { - return slice_contains(s, filepath.Base(fullpath)) - } - } - ExceptHeaders := func(s ...string) func(fullpath string) bool { - return func(fullpath string) bool { - return !slice_contains(s, filepath.Base(fullpath)) - } - } - - flushKnownTypes() - InsertTypedefs(false) - - generate( - "qt", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtCore", - "/usr/include/x86_64-linux-gnu/qt5/QtGui", - "/usr/include/x86_64-linux-gnu/qt5/QtWidgets", - }, - func(fullpath string) bool { - // Block cbor and generate it separately - fname := filepath.Base(fullpath) - if strings.HasPrefix(fname, "qcbor") { - return false - } - - return Widgets_AllowHeader(fullpath) - }, - clangBin, - pkgConfigCflags("Qt5Widgets"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - generate( - "qt/cbor", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtCore", - }, - func(fullpath string) bool { - // Only include the same json, xml, cbor files excluded above - fname := filepath.Base(fullpath) - return strings.HasPrefix(fname, "qcbor") - }, - clangBin, - pkgConfigCflags("Qt5Core"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - generate( - "qt/printsupport", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtPrintSupport", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5PrintSupport"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - generate( - "qt/svg", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtSvg", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5Svg"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 Network (1/3) - - generate( - "qt/network", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtNetwork", - }, - ExceptHeaders("qdtls.h", "qsctpserver.h", "qsctpsocket.h"), - clangBin, - pkgConfigCflags("Qt5Network"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 Network (2/3) - - generate( - "qt/network/sctp", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtNetwork", - }, - OnlyHeaders("qsctpserver.h", "qsctpsocket.h"), - clangBin, - pkgConfigCflags("Qt5Network"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 Network (3/3) - split out DTLS into subpackage because macOS Brew is - // compiled with it disabled - // There are still some extra functions to move out from qsslconfiguration.h - // @ref https://github.com/mappu/miqt/issues/151 - - generate( - "qt/network/dtls", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtNetwork", - }, - OnlyHeaders("qdtls.h"), - clangBin, - pkgConfigCflags("Qt5Network"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - generate( - "qt/multimedia", - []string{ - // Theoretically, QtMultimediaWidgets and QtMultimedia are different - // packages, but QtMultimedia qcamera.h has a dependency on qvideowidget. - // Bind them together since our base /qt/ package is Widgets anyway. - "/usr/include/x86_64-linux-gnu/qt5/QtMultimedia", - "/usr/include/x86_64-linux-gnu/qt5/QtMultimediaWidgets", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5MultimediaWidgets"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - generate( - "qt/script", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtScript", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5Script"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 QWebkit: depends on Qt5PrintSupport but only at runtime, not at - // codegen time - generate( - "qt/webkit", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtWebKit", - "/usr/include/x86_64-linux-gnu/qt5/QtWebKitWidgets", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5WebKitWidgets"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 QWebChannel - generate( - "qt/webchannel", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtWebChannel", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5WebChannel"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 QWebEngine - generate( - "qt/webengine", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtWebEngine", - "/usr/include/x86_64-linux-gnu/qt5/QtWebEngineCore", - "/usr/include/x86_64-linux-gnu/qt5/QtWebEngineWidgets", - }, - ExceptHeaders("qquickwebengineprofile.h", "qquickwebenginescript.h"), - clangBin, - pkgConfigCflags("Qt5WebEngineWidgets"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 QWebSockets - // Depends on QtCore - generate( - "qt/websockets", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtWebSockets", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5WebSockets"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 PDF - // Depends on QtCore/Gui/Widgets - generate( - "qt/pdf", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtPdf", - "/usr/include/x86_64-linux-gnu/qt5/QtPdfWidgets", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5PdfWidgets"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 Positioning - // Depends on QtCore - generate( - "qt/positioning", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtPositioning", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5Positioning"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 OpenGL - // Depends on QtCore/Gui/Widgets - generate( - "qt/opengl", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtOpenGL", - }, - OnlyHeaders("qgl.h"), - clangBin, - pkgConfigCflags("Qt5OpenGL"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 SQL - // Depends on QtCore - generate( - "qt/sql", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtSql", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5Sql"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 Designer - // Depends on QtCore/Gui/Widgets - generate( - "qt/designer", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtDesigner", - }, - ExceptHeaders("qdesigner_components.h"), - clangBin, - pkgConfigCflags("Qt5Designer"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 UI Plugin - // Depends on QtCore/Gui/Widgets - generate( - "qt/uiplugin", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtUiPlugin", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5UiPlugin"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 UI Tools - // Depends on QtCore/Gui/Widgets - generate( - "qt/uitools", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/QtUiTools", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5UiTools"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Qt 5 Qwt - // Depends on QtCore/Gui/Widgets/Designer/OpenGL - generate( - "qt-extras/qwt", - []string{ - "/usr/include/qwt", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5Qwt6"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Depends on QtCore/Gui/Widgets, QPrintSupport - generate( - "qt-restricted-extras/qscintilla", - []string{ - "/usr/include/x86_64-linux-gnu/qt5/Qsci", - }, - AllowAllHeaders, - clangBin, - pkgConfigCflags("Qt5PrintSupport"), - outDir, - ClangMatchSameHeaderDefinitionOnly, - ) - - // Depends on QtCore/Gui/Widgets - generate( - "qt-extras/scintillaedit", - []string{ - filepath.Join(extraLibsDir, "scintilla/qt/ScintillaEdit/ScintillaEdit.h"), - }, - AllowAllHeaders, - clangBin, - "--std=c++1z "+pkgConfigCflags("ScintillaEdit"), - outDir, - (&clangMatchUnderPath{filepath.Join(extraLibsDir, "scintilla")}).Match, - ) - - // FLUSH all known typedefs / ... +func Qt6_ProcessLibraries(clangBin, outDir, extraLibsDir string) { flushKnownTypes() InsertTypedefs(true) diff --git a/cmd/genbindings/config-select.go b/cmd/genbindings/config-select.go new file mode 100644 index 000000000..f8cb89fca --- /dev/null +++ b/cmd/genbindings/config-select.go @@ -0,0 +1,36 @@ +package main + +import ( + "path/filepath" +) + +func AllowAllHeaders(string) bool { + return true +} + +func OnlyHeaders(s ...string) func(fullpath string) bool { + return func(fullpath string) bool { + return slice_contains(s, filepath.Base(fullpath)) + } +} + +func ExceptHeaders(s ...string) func(fullpath string) bool { + return func(fullpath string) bool { + return !slice_contains(s, filepath.Base(fullpath)) + } +} + +var ProcessLibraries func(clangBin, outDir, extraLibsDir string) = nil + +func SelectConfiguration(configName string) { + switch configName { + case "qt5": + ProcessLibraries = Qt5_ProcessLibraries + + case "qt6": + ProcessLibraries = Qt6_ProcessLibraries + + default: + panic(`Unknown configuration name "` + configName + `"`) + } +} diff --git a/cmd/genbindings/main.go b/cmd/genbindings/main.go index 3ad6ac04c..4a9053db6 100644 --- a/cmd/genbindings/main.go +++ b/cmd/genbindings/main.go @@ -273,9 +273,17 @@ func main() { log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime)) clang := flag.String("clang", "clang", "Custom path to clang") outDir := flag.String("outdir", "../../", "Output directory for generated gen_** files") + configName := flag.String("config", "qt5", "Configuration set (e.g. 'qt5' or 'qt6'") extraLibsDir := flag.String("extralibs", "/usr/local/src/", "Base directory to find extra library checkouts") flag.Parse() + // Load configuration + // This populates the ProcessLibraries function + + SelectConfiguration(*configName) + + // Run + ProcessLibraries(*clang, *outDir, *extraLibsDir) }