func cleanup() { var ( qmlGo = filepath.Join(appPath, "qtQrc.go") qmlQrc = filepath.Join(appPath, "qtQrc.qrc") qmlCpp = filepath.Join(appPath, "qtQrc.cpp") ) utils.RemoveAll(qmlGo) utils.RemoveAll(qmlQrc) utils.RemoveAll(qmlCpp) }
func GenModule(name string) { var ( moduleT = name cppTmp string ) name = strings.ToLower(name) parser.GetModule(name) if ShouldBuild(moduleT) { utils.RemoveAll(utils.GetQtPkgPath(name)) utils.RemoveAll(utils.GetQtPkgPath("internal", "binding", "dump", moduleT)) var fcount = 0 for _, c := range parser.ClassMap { if moduleT == strings.TrimPrefix(c.Module, "Qt") { //Dry run to catch all unsupported for _, f := range map[string]func(*parser.Class) string{"cpp": CppTemplate, "h": HTemplate, "go": GoTemplate} { f(c) } for e, f := range map[string]func(*parser.Class) string{"cpp": CppTemplate, "h": HTemplate, "go": GoTemplate} { utils.MakeFolder(utils.GetQtPkgPath(name)) CopyCgo(moduleT) if moduleT == "AndroidExtras" { utils.Save(utils.GetQtPkgPath(name, fmt.Sprintf("%v_android.%v", strings.ToLower(c.Name), e)), f(c)) if e == "go" { c.Stub = true utils.Save(utils.GetQtPkgPath(name, fmt.Sprintf("%v.%v", strings.ToLower(c.Name), e)), f(c)) c.Stub = false } } else { if e == "cpp" { cppTmp += f(c) } else { utils.Save(utils.GetQtPkgPath(name, fmt.Sprintf("%v.%v", strings.ToLower(c.Name), e)), f(c)) } } } c.Dump() fcount += len(c.Functions) } } utils.Save(utils.GetQtPkgPath(name, fmt.Sprintf("%v.cpp", strings.ToLower(moduleT))), cppTmp) fmt.Printf("%v%v\tfunctions:%v", name, terminalSeperator(name), fcount) } }
func GenModule(name string) { if ShouldBuild(name) { var ( pkgName = strings.ToLower(name) suffix string ) if name == "AndroidExtras" { suffix = "_android" } //cleanup utils.RemoveAll(utils.GetQtPkgPath(pkgName)) utils.RemoveAll(utils.GetQtPkgPath("internal", "binding", "dump", name)) //prepare utils.MakeFolder(utils.GetQtPkgPath(pkgName)) CopyCgo(name) if name == "AndroidExtras" { utils.Save(utils.GetQtPkgPath(pkgName, "utils-androidextras_android.go"), utils.Load(utils.GetQtPkgPath("internal", "binding", "files", "utils-androidextras_android.go"))) } //dry run for _, c := range parser.ClassMap { if strings.TrimPrefix(c.Module, "Qt") == name { AddObjectNameFunctionIfNeeded(c) ManualWeakLink(c) } } CppTemplate("Qt" + name) HTemplate("Qt" + name) GoTemplate("Qt"+name, false) //generate utils.Save(utils.GetQtPkgPath(pkgName, pkgName+suffix+".cpp"), CppTemplate("Qt"+name)) utils.Save(utils.GetQtPkgPath(pkgName, pkgName+suffix+".h"), HTemplate("Qt"+name)) if name == "AndroidExtras" { utils.Save(utils.GetQtPkgPath(pkgName, pkgName+suffix+".go"), GoTemplate("Qt"+name, false)) } utils.Save(utils.GetQtPkgPath(pkgName, pkgName+".go"), GoTemplate("Qt"+name, name == "AndroidExtras")) } }
func deploy() { switch buildTarget { case "android": { var ( jdkLib string qtPrefix string androidPrefix string ending string ) switch runtime.GOOS { case "darwin", "linux": { if runtime.GOOS == "darwin" { var version = strings.Split(runCmd(exec.Command("java", "-version"), "deploy.jdk"), "\"")[1] jdkLib = fmt.Sprintf("/Library/Java/JavaVirtualMachines/jdk%v.jdk/Contents/Home", version) } else { jdkLib = "/opt/jdk" } qtPrefix = "/usr/local" androidPrefix = "/opt" } case "windows": { var version = strings.Split(runCmd(exec.Command("java", "-version"), "deploy.jdk"), "\"")[1] jdkLib = fmt.Sprintf("C:\\Program Files\\Java\\jdk%v", version) qtPrefix = "C:\\Qt" androidPrefix = "C:\\android" ending = ".exe" } } var deploy = exec.Command(filepath.Join(qtPrefix, "Qt5.5.1", "5.5", "android_armv7", "bin", "androiddeployqt"+ending)) deploy.Args = append(deploy.Args, "--input", filepath.Join(depPath, "android-libgo.so-deployment-settings.json"), "--output", filepath.Join(depPath, "build"), "--deployment", "bundled", "--android-platform", "android-22", "--jdk", jdkLib, "--ant", filepath.Join(androidPrefix, "apache-ant", "bin", "ant"), ) if ks := utils.Load(filepath.Join(appPath, "android", appName+".keystore")); ks != "" { deploy.Args = append(deploy.Args, "--sign", filepath.Join(appPath, "android", appName+".keystore"), strings.TrimSpace(utils.Load(filepath.Join(appPath, "android", "alias.txt"))), "--storepass", strings.TrimSpace(utils.Load(filepath.Join(appPath, "android", "password.txt"))), ) } deploy.Dir = filepath.Join(qtPrefix, "Qt5.5.1", "5.5", "android_armv7", "bin") deploy.Env = append(deploy.Env, "JAVA_HOME="+jdkLib) if runtime.GOOS == "windows" { utils.Save(filepath.Join(depPath, "build.bat"), fmt.Sprintf("set JAVA_HOME=%v\r\n%v", jdkLib, strings.Join(deploy.Args, " "))) runCmd(exec.Command(filepath.Join(depPath, "build.bat")), "deploy") utils.RemoveAll(filepath.Join(depPath, "build.bat")) } else { runCmd(deploy, "deploy") } } case "desktop": { switch runtime.GOOS { case "darwin": { var deploy = exec.Command("/usr/local/Qt5.5.1/5.5/clang_64/bin/macdeployqt") deploy.Args = append(deploy.Args, filepath.Join(depPath, fmt.Sprintf("%v.app/", appName)), fmt.Sprintf("-qmldir=%v", filepath.Join(appPath, "qml")), "-always-overwrite") deploy.Dir = "/usr/local/Qt5.5.1/5.5/clang_64/bin/" runCmd(deploy, "deploy") } case "linux": { var libraryPath string for _, dep := range strings.Split(runCmd(exec.Command("ldd", filepath.Join(depPath, appName)), "deploy.ldd"), "\n") { if strings.Contains(dep, "libQt5") || strings.Contains(dep, "libicu") { var libraryP, libName = filepath.Split(strings.Split(dep, " ")[2]) libraryPath = libraryP runCmd(exec.Command("cp", "-L", filepath.Join(libraryPath, libName), filepath.Join(depPath, libName)), fmt.Sprintf("deploy.%v", libName)) } } for _, libName := range []string{"DBus", "XcbQpa", "Quick", "Widgets"} { runCmd(exec.Command("cp", "-L", filepath.Join(libraryPath, fmt.Sprintf("libQt5%v.so.5", libName)), filepath.Join(depPath, fmt.Sprintf("libQt5%v.so.5", libName))), fmt.Sprintf("deploy.%v", libName)) } libraryPath = strings.TrimSuffix(libraryPath, "lib/") for _, libDir := range []string{"platforms", "platformthemes", "xcbglintegrations"} { utils.MakeFolder(filepath.Join(depPath, libDir)) } runCmd(exec.Command("cp", "-R", filepath.Join(libraryPath, "qml/"), depPath), "deploy.qml") runCmd(exec.Command("cp", "-L", filepath.Join(libraryPath, "plugins", "platforms", "libqxcb.so"), filepath.Join(depPath, "platforms", "libqxcb.so")), "deploy.qxcb") runCmd(exec.Command("cp", "-L", filepath.Join(libraryPath, "plugins", "platformthemes", "libqgtk2.so"), filepath.Join(depPath, "platformthemes", "libqgtk2.so")), "deploy.qgtk2") runCmd(exec.Command("cp", "-L", filepath.Join(libraryPath, "plugins", "xcbglintegrations", "libqxcb-glx-integration.so"), filepath.Join(depPath, "xcbglintegrations", "libqxcb-glx-integration.so")), "deploy.qxcb-glx-integration") } case "windows": { var deploy = exec.Command("C:\\Qt\\Qt5.5.1\\5.5\\mingw492_32\\bin\\windeployqt.exe") deploy.Args = append(deploy.Args, filepath.Join(depPath, appName+ending), fmt.Sprintf("-qmldir=%v", filepath.Join(appPath, "qml")), "-force") runCmd(deploy, "deploy") } } } } }
func args() { switch len(os.Args) { case 1: buildMode = "test" buildTarget = "desktop" appPath, _ = os.Getwd() case 2: buildMode = os.Args[1] buildTarget = "desktop" appPath, _ = os.Getwd() case 3: buildMode = os.Args[1] buildTarget = os.Args[2] appPath, _ = os.Getwd() case 4: buildMode = os.Args[1] buildTarget = os.Args[2] appPath = os.Args[3] } switch buildMode { case "build", "run", "test": { switch buildTarget { case "desktop", "android": default: { fmt.Println("usage:", "{ build | run | test }", "({ desktop | android })", "( dir )") os.Exit(1) } } } default: { fmt.Println("usage:", "{ build | run | test }", "({ desktop | android })", "( dir )") os.Exit(1) } } if !filepath.IsAbs(appPath) { appPath = utils.GetAbsPath(appPath) } appName = filepath.Base(appPath) switch buildTarget { case "android": { depPath = filepath.Join(appPath, "deploy", buildTarget) } case "desktop": { depPath = filepath.Join(appPath, "deploy", runtime.GOOS) } } switch buildMode { case "build", "test": { utils.RemoveAll(depPath) utils.MakeFolder(depPath) } } if runtime.GOOS == "windows" && buildTarget != "android" { ending = ".exe" } }
func predeploy() { var copyCmd string switch runtime.GOOS { case "windows": copyCmd = "xcopy" default: copyCmd = "cp" } switch buildTarget { case "android": { utils.MakeFolder(filepath.Join(appPath, "android")) for _, dir := range []string{"drawable-hdpi", "drawable-ldpi", "drawable-mdpi"} { utils.MakeFolder(filepath.Join(depPath, "build", "res", dir)) runCmdOptional(exec.Command(copyCmd, filepath.Join(appPath, "android", "icon.png"), filepath.Join(depPath, "build", "res", dir, "icon.png")), "predeploy.cpicon") } var libPath = filepath.Join(depPath, "build", "libs", "armeabi-v7a") utils.MakeFolder(libPath) runCmd(exec.Command(copyCmd, filepath.Join(depPath, "libgo.so"), libPath), "predeploy.cplib") var ( qtPrefix string androidPrefix string ndkhost string ) switch runtime.GOOS { case "darwin", "linux": { qtPrefix = "/usr/local" androidPrefix = "/opt" ndkhost = runtime.GOOS + "-x86_64" runCmd(exec.Command("cp", "/usr/local/Qt5.5.1/5.5/android_armv7/jar/QtAndroid-bundled.jar", filepath.Join(depPath, "build", "libs")), "predeploy.cpqtandroid") runCmd(exec.Command("zip", "-d", filepath.Join(depPath, "build", "libs", "QtAndroid-bundled.jar"), "org/qtproject/qt5/android/QtNative.class"), "predeploy.patchqtandroid_main") for i := 1; i < 19; i++ { runCmd(exec.Command("zip", "-d", filepath.Join(depPath, "build", "libs", "QtAndroid-bundled.jar"), fmt.Sprintf("org/qtproject/qt5/android/QtNative$%v.class", i)), fmt.Sprintf("predeploy.patchqtandroid_%v", i)) } } case "windows": { qtPrefix = "C:\\Qt" androidPrefix = "C:\\android" ndkhost = runtime.GOOS var ( jdkVersion = strings.Split(runCmd(exec.Command("java", "-version"), "predeploy.jdk"), "\"")[1] jarPath = fmt.Sprintf("C:\\Program Files\\Java\\jdk%v\\bin\\jar.exe", jdkVersion) ) runCmd(exec.Command("xcopy", "C:\\Qt\\Qt5.5.1\\5.5\\android_armv7\\jar\\QtAndroid-bundled.jar", filepath.Join(depPath, "build", "libs")), "predeploy.cpqtandroid") var jarUnzip = exec.Command(jarPath, "-xf", filepath.Join(depPath, "build", "libs", "QtAndroid-bundled.jar")) jarUnzip.Dir = filepath.Join(depPath, "build", "libs") runCmd(jarUnzip, "predeploy.unzipqtandroid") utils.RemoveAll(filepath.Join(depPath, "build", "libs", "QtAndroid-bundled.jar")) utils.RemoveAll(filepath.Join(depPath, "build", "libs", "org", "qtproject", "qt5", "android", "QtNative.class")) for i := 1; i < 19; i++ { utils.RemoveAll(filepath.Join(depPath, "build", "libs", "org", "qtproject", "qt5", "android", fmt.Sprintf("QtNative$%v.class", i))) } var zipQtAndroid = exec.Command(jarPath, "-cmf", filepath.Join(depPath, "build", "libs", "META-INF", "MANIFEST.MF"), filepath.Join(depPath, "build", "libs", "QtAndroid-bundled.jar"), "org") zipQtAndroid.Dir = filepath.Join(depPath, "build", "libs") runCmd(zipQtAndroid, "predeploy.zipqtandroid") utils.RemoveAll(filepath.Join(depPath, "build", "libs", "org")) utils.RemoveAll(filepath.Join(depPath, "build", "libs", "META-INF")) } } utils.MakeFolder(filepath.Join(depPath, "build", "src", "org", "qtproject", "qt5", "android")) runCmd(exec.Command(copyCmd, utils.GetQtPkgPath("internal", "android", "patch", "QtNative.java"), filepath.Join(depPath, "build", "src", "org", "qtproject", "qt5", "android")), "predeploy.cpqtandroidpatched") var out, err = json.Marshal(&struct { Qt string `json:"qt"` Sdk string `json:"sdk"` SdkBuildToolsRevision string `json:"sdkBuildToolsRevision"` Ndk string `json:"ndk"` Toolchainprefix string `json:"toolchain-prefix"` Toolprefix string `json:"tool-prefix"` Toolchainversion string `json:"toolchain-version"` Ndkhost string `json:"ndk-host"` Targetarchitecture string `json:"target-architecture"` AndroidPackageSourceDirectory string `json:"android-package-source-directory"` Qmlrootpath string `json:"qml-root-path"` Applicationbinary string `json:"application-binary"` }{ Qt: filepath.Join(qtPrefix, "Qt5.5.1", "5.5", "android_armv7"), Sdk: filepath.Join(androidPrefix, "android-sdk"), SdkBuildToolsRevision: "23.0.2", Ndk: filepath.Join(androidPrefix, "android-ndk"), Toolchainprefix: "arm-linux-androideabi", Toolprefix: "arm-linux-androideabi", Toolchainversion: "4.9", Ndkhost: ndkhost, Targetarchitecture: "armeabi-v7a", AndroidPackageSourceDirectory: filepath.Join(appPath, "android"), Qmlrootpath: filepath.Join(appPath, "qml"), Applicationbinary: filepath.Join(depPath, "libgo.so"), }) if err != nil { fmt.Println("predeploy.json", string(out), err) os.Exit(1) } utils.Save(filepath.Join(depPath, "android-libgo.so-deployment-settings.json"), string(out)) } case "desktop": { switch runtime.GOOS { case "darwin": { utils.Save(filepath.Join(depPath, fmt.Sprintf("%v.app/Contents/MacOS/%v_sh", appName, appName)), darwinSH()) utils.Save(filepath.Join(depPath, fmt.Sprintf("%v.app/Contents/MacOS/Info.plist", appName)), darwinPLIST()) //TODO: icon + plist } case "linux": { utils.Save(filepath.Join(depPath, fmt.Sprintf("%v.sh", appName)), linuxSH()) } case "windows": { //TODO: icon windres } } } } }