Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch Windows distrib building on jpackage #284

Open
olegs opened this issue Nov 22, 2024 · 0 comments
Open

Switch Windows distrib building on jpackage #284

olegs opened this issue Nov 22, 2024 · 0 comments

Comments

@olegs
Copy link
Contributor

olegs commented Nov 22, 2024

def createUnpackZipTask(File downloadFile, String jdkName) {
    def unpackDir = "${downloadFile.parent}\\${jdkName - ".zip"}\\"
    def downloadTaskName = "download${jdkName.capitalize()}"
    def unpackTasksName = "unpack${jdkName.capitalize()}"
    assert os() == "windows"
    task(unpackTasksName, type: Copy, dependsOn: downloadTaskName, group: "amazon-corretto") {
        inputs.file(downloadFile)
        // outputs is destination folder
        doFirst {
            Files.createDirectories(Paths.get(unpackDir))
            delete "$unpackDir\\jdk"
        }
        from zipTree(downloadFile)
        into { unpackDir }
        includeEmptyDirs = false
        doLast {
            // Unpacked Jdk folder
            def jdkFolder = ""
            new File(unpackDir).eachDir { jdkFolder = it.name }
            file("$unpackDir\\$jdkFolder").renameTo(file("$unpackDir\\jdk"))
        }
    }
    cleanSetupAmazonCorretteChainToJLink.dependsOn("cleanUnpack${jdkName.capitalize()}")
    file("$unpackDir\\jdk")
}

// ---------------------------------------------------------------------------------------------------------------------
// ---------- Windows Distribution -------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
// Tasks pipeline when doSignApp() is
// false
//      createWinExe -> createWinDistrib
// true
//      createWinExe -> signWinExe -> createWinDistrib
//
def createWinExeTask(File fullJdkPath, String jdkName, String os, String arch) {
    if (os != "windows") {
        return
    }
    def unpackTaskName = "unpack${jdkName.capitalize()}"

    String jpackage = getJPackagePath(os, fullJdkPath)
    def appDir = "${project.buildDir}\\${project.distsDirName}\\winexe"
    def exePath = "${appDir}\\${project.appName}.exe"

    def newTask = task("createWinExe", type: Exec, group: "distribution", dependsOn: [shadowJar, unpackTaskName]) {
        description "Create exe using standard Java jpackage commands."

        def jarPath = project.tasks.shadowJar.outputs.files.asPath

        inputs.dir(fullJdkPath)
        inputs.file(jarPath)
        outputs.file(exePath)

        doFirst {
            delete exePath
        }
        commandLine jpackage,
                "--type", "exe",
                "--name", project.appName,
                "--input", "${project.buildDir}\\libs\\",
                "--main-jar", project.tasks.shadowJar.archiveName,
                "--dest", "${exePath}",
                "--icon", "${projectDir}\\src\\main\\resources\\icons\\JBR.icns",
                "--jlink-options", "--strip-native-commands --no-header-files --no-man-pages --strip-debug",
                "--add-modules", project.JBR_JLINK_MODULES,
                "--app-version", project.version,
                "--description", "JBR Genome Browser ${fullVersion()}",
                "--vendor", "JetBrains Research",
                "--copyright", "Copyright JetBrains s.r.o., 2024",
                "--java-options",
                "-Xmx${project.project.appMaxHeapSize}M -ea -XX:+UseCompressedOops " +
                        "-XX:+HeapDumpOnOutOfMemoryError " +
                        "-XX:ErrorFile=\$USER_HOME\\jbr_java_error%p.log " +
                        "-XX:HeapDumpPath=\$USER_HOME\\jbr_java_error.hprof " +
                        "-splash:\$APPDIR\\icons\\[email protected]",
                "--file-associations", "${projectDir}\\src\\main\\resources\\FAsession.properties"
        doLast {
            println "=================================================================================================="
            println "JPackage exe: ${exePath}"
            println "=================================================================================================="
        }
    }
    newTask
}

if (os() == "windows") {
    def os = os()
    def arch = arch()
    def (url, md5) = getAmazonCorrettoUrlMd5(os, arch)
    def jdkName = url.substring(url.lastIndexOf("/") + 1)
    def unpackTask = project.tasks.findByName("unpack${jdkName.capitalize()}")
    def fullJdkPath = ""
    if (unpackTask) {
        fullJdkPath = unpackTask.outputs.files.singleFile
        // Copy zip declares output dir as output
        if (!fullJdkPath.toString().endsWith("\\jdk")) {
            fullJdkPath = file("${fullJdkPath}\\jdk")
        }
    } else {
        throw new GradleException("Unpacked JDK not found")
    }

    createWinExeTask(fullJdkPath, jdkName, os, arch)

    task signWinExe(group: "jetsign", dependsOn: [createWinExe, lazyDownloadJetSign]) {
        description "Sign windows exe file"

        def exeFile = project.tasks.createWinExe.outputs.files.singleFile
        inputs.dir(exeFile)
        outputs.dir(exeFile)
        doLast {
            signWinApplication(exeFile)
        }
    }

    task createWinDistrib(type: Copy, group: "distribution") {
        description "Creates *.exe and copies it to distributions folder."

        def exePath = null
        if (doSignApp()) {
            dependsOn signWinExe
            exePath = project.tasks.signWinExe.outputs.files.singleFile
        } else {
            dependsOn createWinExe
            exePath = project.tasks.createWinExe.outputs.files.singleFile
        }
        def outDir = "${project.buildDir}\\${project.distsDirName}\\win"

        from exePath.parent
        include exePath.name
        destinationDir file(outDir)
    }

    clean.dependsOn(cleanSetupAmazonCorretteChainToJLink)

    task winDistrib(dependsOn: [clean, createWinDistrib], group: "distribution") {
        description = "Creates Windows distributive. Files are singed if signing is enabled."
    }
}

However jpackage requires Wix to be able to create exe file (https://wixtoolset.org/docs/intro/).
So stick with launch4j gradle plugin for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant