From e069644ca0a9a42a7b677d31bc30db5c6eb7b84f Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 2 Jun 2016 19:21:19 +0300 Subject: [PATCH] build scripts redesign: support building exe installers --- build/conf/ideaCE/win/images/headerlogo.bmp | Bin 0 -> 25820 bytes build/conf/ideaCE/win/images/install.ico | Bin 0 -> 17542 bytes build/conf/ideaCE/win/images/logo.bmp | Bin 0 -> 154544 bytes build/conf/ideaCE/win/images/uninstall.ico | Bin 0 -> 17542 bytes build/conf/nsis/pathsCE.nsi | 5 - build/conf/nsis/stringsCE.nsi | 16 -- .../intellij/build/BuildOptions.groovy | 1 + .../intellij/build/ProductProperties.groovy | 15 ++ .../intellij/build/WinInstallerBuilder.groovy | 195 ------------------ .../build/impl/WinExeInstallerBuilder.groovy | 180 ++++++++++++++++ .../impl/WindowsDistributionBuilder.groovy | 5 + build/scripts/idea_properties.gant | 8 + 12 files changed, 209 insertions(+), 216 deletions(-) create mode 100644 build/conf/ideaCE/win/images/headerlogo.bmp create mode 100644 build/conf/ideaCE/win/images/install.ico create mode 100644 build/conf/ideaCE/win/images/logo.bmp create mode 100644 build/conf/ideaCE/win/images/uninstall.ico delete mode 100644 build/conf/nsis/pathsCE.nsi delete mode 100644 build/conf/nsis/stringsCE.nsi delete mode 100644 build/groovy/org/jetbrains/intellij/build/WinInstallerBuilder.groovy create mode 100644 build/groovy/org/jetbrains/intellij/build/impl/WinExeInstallerBuilder.groovy diff --git a/build/conf/ideaCE/win/images/headerlogo.bmp b/build/conf/ideaCE/win/images/headerlogo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1a89f68c58c381992ae525d321fd201118e27f80 GIT binary patch literal 25820 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 literal 0 HcmV?d00001 diff --git a/build/conf/ideaCE/win/images/logo.bmp b/build/conf/ideaCE/win/images/logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f7d12dfe40a56adfcc07c1b1f2b6623e1a01f15f GIT binary patch literal 154544 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 fileAssociations = [] } class MacProductProperties { diff --git a/build/groovy/org/jetbrains/intellij/build/WinInstallerBuilder.groovy b/build/groovy/org/jetbrains/intellij/build/WinInstallerBuilder.groovy deleted file mode 100644 index 62e453892ad7..000000000000 --- a/build/groovy/org/jetbrains/intellij/build/WinInstallerBuilder.groovy +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.intellij.build - -import com.intellij.openapi.util.SystemInfoRt -import org.codehaus.gant.GantBuilder -import org.jetbrains.jps.gant.JpsGantProjectBuilder -/** - * @author nik - */ -class WinInstallerBuilder { - GantBuilder ant - JpsGantProjectBuilder projectBuilder - ApplicationInfoProperties applicationInfo - /** - * Path to a directory where project sources are located. It will be used to replace 'BASE_DIR' in *.nsi files. - */ - String baseDirectory - /** - * Path to a directory where IntelliJ IDEA community sources are located - */ - String communityHome - /** - * Path to a directory where artifacts are stored - */ - String artifactsPath - /** - * Path to a directory where temporary files can be stored - */ - String sandboxPath - /** - * Prefix for the output file name. The value of buildNumber will be appended to this prefix. - */ - String outNamePrefix - /** - * Short build number without product code (e.g. 142.239) - */ - String buildNumber - /** - * Name which will be used for default config/system paths, should include the product name and version. E.g. for IntelliJ Ultimate 16 it is - * 'IntelliJIdea16', so the settings and system files will be stored in $USER_HOME/.IntelliJIdea16 by default. - */ - String systemSelector - /** - * Determines whether tools.jar should be included to the bundled JDK - */ - boolean includeToolsJar = true - boolean associateIpr = true - /** - * Path to a JDK 8 zip file which should be bundled with the application - */ - String winJDKZipPath - - /** - * Builds .exe installer. If build/lib/jet-sign.jar exists in baseDirectory it will be used to sign the created .exe file. - * - * @param pathsToInclude list of paths to directories which contents should be included to the product distribution - * @param stringsFile path to *.nsi file where installers variables are defined (use build/conf/nsis/stringsCE.nsi as a reference) - * @param pathsFile path to *.nsi file where installers path variables are defined (use build/conf/nsis/pathsCE.nsi as a reference) - * @return path to the created installer file - */ - def buildInstaller(List pathsToInclude, String stringsFile, String pathsFile) { - if (!SystemInfoRt.isWindows && !SystemInfoRt.isLinux) { - projectBuilder.warning("Windows installer can be built only under Windows or Linux") - return null - } - - projectBuilder.stage("Building Windows installer") - String outFileName = "${outNamePrefix}${buildNumber}" - ant.taskdef(name: "nsis", classname: "com.intellij.internalUtilities.ant.NsiFiles", classpath: "$communityHome/build/lib/NsiFiles.jar") - - def box = sandboxPath - ant.mkdir(dir: "$box/bin") - ant.mkdir(dir: "$box/nsiconf") - - if (winJDKZipPath != null) { - ant.mkdir(dir: "$box/jre") - ant.unzip(dest: "$box/jre", src: winJDKZipPath) - - ant.copy(todir: "$box/bin") { - fileset(dir: "$box/jre/jre/bin") { - include(name: "msvcr71.dll") - } - } - } - - ant.copy(todir: "$box/nsiconf") { - fileset(dir: "$communityHome/build/conf/nsis") { - include(name: "*") - exclude(name: "version*") - exclude(name: "strings*") - exclude(name: "paths*") - } - } - - if (applicationInfo.isEAP) { - ant.copy(file: "$communityHome/build/conf/nsis/version.eap.nsi", - tofile: "$box/nsiconf/version.nsi", overwrite: true) - } - else { - ant.copy(file: "$communityHome/build/conf/nsis/version.nsi", - tofile: "$box/nsiconf/version.nsi", overwrite: true) - } - ant.copy(file: pathsFile, toFile: "$box/nsiconf/paths.nsi", overwrite: true) - - ant.nsis(instfile: "$box/nsiconf/idea_win.nsh", uninstfile: "$box/nsiconf/unidea_win.nsh") { - pathsToInclude.each { - ant.fileset(dir: it, includes: "**/*") { - exclude(name: "**/idea.properties") - exclude(name: "**/*.vmoptions") - } - } - ant.fileset(dir: box, includes: "bin/msvcr71.dll") - if (winJDKZipPath != null) { - ant.fileset(dir: box, includes: "jre/**/*") - if (includeToolsJar) { - ant.fileset(dir: box) { - include(name: "jre/lib/tools.jar") - } - } - } - } - - ant.copy(file: stringsFile, toFile: "$box/nsiconf/strings.nsi", overwrite: true) - ant.replace(file: "$box/nsiconf/strings.nsi") { - replacefilter(token: "__VERSION_MAJOR__", value: applicationInfo.majorVersion) - replacefilter(token: "__VERSION_MINOR__", value: applicationInfo.minorVersion) - } - - ant.replace(file: "$box/nsiconf/version.nsi") { - replacefilter(token: "__BUILD_NUMBER__", value: buildNumber) - replacefilter(token: "__VERSION_MAJOR__", value: applicationInfo.majorVersion) - replacefilter(token: "__VERSION_MINOR__", value: applicationInfo.minorVersion) - replacefilter(token: "__PRODUCT_PATHS_SELECTOR__", value: systemSelector) - } - - ant.unzip(src: "$communityHome/build/tools/NSIS.zip", dest: box) - if (SystemInfoRt.isWindows) { - ant.exec(command: "\"${box}/NSIS/makensis.exe\"" + - " /DBASE_DIR=\"$baseDirectory\"" + - " /DCOMMUNITY_DIR=\"$communityHome\"" + - " /DIPR=\"${associateIpr}\"" + - " /DOUT_FILE=\"${outFileName}\"" + - " /DOUT_DIR=\"$artifactsPath\"" + - " \"${box}/nsiconf/idea.nsi\"") - } - else if (SystemInfoRt.isLinux) { - ant.exec(command: "makensis" + - " '-X!AddPluginDir \"${box}/NSIS/Plugins\"'" + - " '-X!AddIncludeDir \"${box}/NSIS/Include\"'" + - " -DBASE_DIR=\"$baseDirectory\"" + - " -DCOMMUNITY_DIR=\"$communityHome\"" + - " -DIPR=\"${associateIpr}\"" + - " -DOUT_FILE=\"${outFileName}\"" + - " -DOUT_DIR=\"$artifactsPath\"" + - " \"${box}/nsiconf/idea.nsi\"") - } - - def installerPath = "$artifactsPath/${outFileName}.exe" - if (!new File(installerPath).exists()) { - projectBuilder.error("Installer wasn't created.") - } - - def signJarPath = "$baseDirectory/build/lib/jet-sign.jar" - if (new File(signJarPath).exists()) { - projectBuilder.stage("Signing $installerPath") - ant.taskdef(name: "jet-sign", classname: "jetbrains.sign.JetSignTask") { - classpath(path: signJarPath) - } - ant."jet-sign"() { - ant.fileset(dir: artifactsPath) { - include(name: "${outFileName}.exe") - } - } - projectBuilder.stage("Signing done") - } - else { - projectBuilder.warning("$signJarPath not found, installer won't be signed") - } - return installerPath - } -} \ No newline at end of file diff --git a/build/groovy/org/jetbrains/intellij/build/impl/WinExeInstallerBuilder.groovy b/build/groovy/org/jetbrains/intellij/build/impl/WinExeInstallerBuilder.groovy new file mode 100644 index 000000000000..7ab3643e8c88 --- /dev/null +++ b/build/groovy/org/jetbrains/intellij/build/impl/WinExeInstallerBuilder.groovy @@ -0,0 +1,180 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.intellij.build.impl + +import com.intellij.openapi.util.SystemInfoRt +import org.codehaus.gant.GantBuilder +import org.jetbrains.intellij.build.BuildContext +/** + * @author nik + */ +class WinExeInstallerBuilder { + private final BuildContext buildContext + private final GantBuilder ant + + WinExeInstallerBuilder(BuildContext buildContext) { + this.buildContext = buildContext + ant = buildContext.ant + } + + void buildInstaller(String winDistPath) { + if (!SystemInfoRt.isWindows && !SystemInfoRt.isLinux) { + buildContext.messages.warning("Windows installer can be built only under Windows or Linux") + return + } + + String communityHome = buildContext.paths.communityHome + String outFileName = buildContext.productProperties.archiveName(buildContext.buildNumber) + buildContext.messages.progress("Building Windows installer $outFileName") + ant.taskdef(name: "nsis", classname: "com.intellij.internalUtilities.ant.NsiFiles", classpath: "$communityHome/build/lib/NsiFiles.jar") + + def box = "$buildContext.paths.temp/winInstaller" + ant.mkdir(dir: "$box/bin") + ant.mkdir(dir: "$box/nsiconf") + + def bundleJre = buildContext.productProperties.windows.bundleJre + if (bundleJre && !new File(buildContext.paths.winJre).exists()) { + buildContext.messages.info("JRE won't be bundled with Windows installer because JRE directory doesn't exist: ${buildContext.paths.winJre}") + bundleJre = false + } + + if (bundleJre) { + ant.copy(todir: "$box/bin") { + fileset(dir: "${buildContext.paths.winJre}/jre/bin") { + include(name: "msvcr71.dll") + } + } + } + + ant.copy(todir: "$box/nsiconf") { + fileset(dir: "$communityHome/build/conf/nsis") { + include(name: "*") + exclude(name: "strings*") + exclude(name: "paths*") + exclude(name: "version*") + } + } + + ant.nsis(instfile: "$box/nsiconf/idea_win.nsh", uninstfile: "$box/nsiconf/unidea_win.nsh") { + [buildContext.paths.distAll, winDistPath].each { + ant.fileset(dir: it, includes: "**/*") { + exclude(name: "**/idea.properties") + exclude(name: "**/*.vmoptions") + } + } + if (bundleJre) { + ant.fileset(dir: box, includes: "bin/msvcr71.dll") + ant.fileset(dir: buildContext.paths.winJre, includes: "jre/**/*") + //todo[nik] how tools.jar is excluded? + if (buildContext.productProperties.toolsJarRequired) { + ant.fileset(dir: buildContext.paths.winJre) { + include(name: "jre/lib/tools.jar") + } + } + } + } + + prepareConfigurationFiles(box, winDistPath) + + ant.unzip(src: "$communityHome/build/tools/NSIS.zip", dest: box) + if (SystemInfoRt.isWindows) { + ant.exec(command: "\"${box}/NSIS/makensis.exe\"" + + " /DCOMMUNITY_DIR=\"$communityHome\"" + + " /DIPR=\"${buildContext.productProperties.windows.associateIpr}\"" + + " /DOUT_FILE=\"${outFileName}\"" + + " /DOUT_DIR=\"${buildContext.paths.artifacts}\"" + + " \"${box}/nsiconf/idea.nsi\"") + } + else if (SystemInfoRt.isLinux) { + ant.exec(command: "makensis" + + " '-X!AddPluginDir \"${box}/NSIS/Plugins\"'" + + " '-X!AddIncludeDir \"${box}/NSIS/Include\"'" + + " -DCOMMUNITY_DIR=\"$communityHome\"" + + " -DIPR=\"${buildContext.productProperties.windows.associateIpr}\"" + + " -DOUT_FILE=\"${outFileName}\"" + + " -DOUT_DIR=\"${buildContext.paths.artifacts}\"" + + " \"${box}/nsiconf/idea.nsi\"") + } + + def installerPath = "${buildContext.paths.artifacts}/${outFileName}.exe" + if (!new File(installerPath).exists()) { + buildContext.messages.error("Windows installer wasn't created.") + } + + //todo[nik] improve, probably it would be better to automatically download jet-sign.jar or pass it via property + def signJarPath = "${buildContext.paths.projectHome}/build/lib/jet-sign.jar" + if (new File(signJarPath).exists()) { + buildContext.messages.progress("Signing $installerPath") + ant.taskdef(name: "jet-sign", classname: "jetbrains.sign.JetSignTask") { + classpath(path: signJarPath) + } + ant."jet-sign"() { + ant.fileset(dir: buildContext.paths.artifacts) { + include(name: "${outFileName}.exe") + } + } + buildContext.messages.info("Signing done") + } + else { + buildContext.messages.warning("$signJarPath not found, installer won't be signed") + } + buildContext.notifyArtifactBuilt(installerPath) + } + + private void prepareConfigurationFiles(String box, String winDistPath) { + new File(box, "nsiconf/paths.nsi").text = """ +!define IMAGES_LOCATION "${buildContext.productProperties.windows.installerImagesPath}" +!define PRODUCT_PROPERTIES_FILE "$winDistPath/bin/idea.properties" +!define PRODUCT_VM_OPTIONS_NAME ${buildContext.fileNamePrefix}*.exe.vmoptions +!define PRODUCT_VM_OPTIONS_FILE "$winDistPath/bin/\${PRODUCT_VM_OPTIONS_NAME}" +""" + + String fullProductName = buildContext.productProperties.fullNameIncludingEdition ?: buildContext.applicationInfo.productName + def extensionsList = buildContext.productProperties.windows.fileAssociations + def fileAssociations = extensionsList.isEmpty() ? "NoAssociation" : extensionsList.join(",") + new File(box, "nsiconf/strings.nsi").text = """ +!define MANUFACTURER "JetBrains" +!define MUI_PRODUCT "$fullProductName" +!define PRODUCT_FULL_NAME "$fullProductName" +!define PRODUCT_EXE_FILE "${buildContext.fileNamePrefix}.exe" +!define PRODUCT_EXE_FILE_64 "${buildContext.fileNamePrefix}64.exe" +!define PRODUCT_ICON_FILE "install.ico" +!define PRODUCT_UNINST_ICON_FILE "uninstall.ico" +!define PRODUCT_LOGO_FILE "logo.bmp" +!define PRODUCT_HEADER_FILE "headerlogo.bmp" +!define ASSOCIATION "$fileAssociations" +!define UNINSTALL_WEB_PAGE "${buildContext.productProperties.uninstallFeedbackPageUrl(buildContext.applicationInfo) ?: "feedback_web_page"}" + +; if SHOULD_SET_DEFAULT_INSTDIR != 0 then default installation directory will be directory where highest-numbered IDEA build has been installed +; set to 1 for release build +!define SHOULD_SET_DEFAULT_INSTDIR "0" + +""" + + def versionString = buildContext.applicationInfo.isEAP ? "\${VER_BUILD}" : "\${MUI_VERSION_MAJOR}.\${MUI_VERSION_MINOR}" + new File(box, "nsiconf/version.nsi").text = """ +!define MUI_VERSION_MAJOR "${buildContext.applicationInfo.majorVersion}" +!define MUI_VERSION_MINOR "${buildContext.applicationInfo.minorVersion}" + +!define VER_BUILD ${buildContext.buildNumber} + +!define PRODUCT_WITH_VER "\${MUI_PRODUCT} $versionString" +!define PRODUCT_FULL_NAME_WITH_VER "\${PRODUCT_FULL_NAME} $versionString" +!define PRODUCT_PATHS_SELECTOR "${buildContext.systemSelector}" +!define PRODUCT_SETTINGS_DIR ".\${PRODUCT_PATHS_SELECTOR}" +""" + } +} \ No newline at end of file diff --git a/build/groovy/org/jetbrains/intellij/build/impl/WindowsDistributionBuilder.groovy b/build/groovy/org/jetbrains/intellij/build/impl/WindowsDistributionBuilder.groovy index 0c4d4bcf556a..3ab47c73f459 100644 --- a/build/groovy/org/jetbrains/intellij/build/impl/WindowsDistributionBuilder.groovy +++ b/build/groovy/org/jetbrains/intellij/build/impl/WindowsDistributionBuilder.groovy @@ -16,6 +16,7 @@ package org.jetbrains.intellij.build.impl import org.jetbrains.intellij.build.BuildContext +import org.jetbrains.intellij.build.BuildOptions import org.jetbrains.jps.model.module.JpsModuleSourceRoot /** * @author nik @@ -46,6 +47,10 @@ class WindowsDistributionBuilder { buildWinLauncher(JvmArchitecture.x64) buildContext.productProperties.customWinLayout(winDistPath) buildWinZip() + + buildContext.executeStep("Build Windows Exe Installer", BuildOptions.WINDOWS_EXE_INSTALLER_STEP) { + new WinExeInstallerBuilder(buildContext).buildInstaller(winDistPath) + } } //todo[nik] rename diff --git a/build/scripts/idea_properties.gant b/build/scripts/idea_properties.gant index cda10bfd9de1..94c009b9194e 100644 --- a/build/scripts/idea_properties.gant +++ b/build/scripts/idea_properties.gant @@ -24,6 +24,7 @@ def getProperties(String home) { platformPrefix = "Idea" code = "IC" appInfoModule = "community-resources" + fullNameIncludingEdition = "IntelliJ IDEA Community Edition" additionalIDEPropertiesFilePath = "$home/build/conf/ideaCE.properties" exe_launcher_properties = "$home/build/conf/ideaCE-launcher.properties" exe64_launcher_properties = "$home/build/conf/ideaCE64-launcher.properties" @@ -36,6 +37,8 @@ def getProperties(String home) { ico = "$home/platform/icons/src/idea_CE.ico" windows.bundleJre = true + windows.installerImagesPath = "$home/build/conf/ideaCE/win/images" + windows.fileAssociations = [".java", ".groovy", ".kt"] mac.helpId = "IJ" mac.urlSchemes = ["idea"] @@ -44,6 +47,11 @@ def getProperties(String home) { mac.dmgImagePath = "$home/build/conf/mac/communitydmg.png" } + @Override + String uninstallFeedbackPageUrl(ApplicationInfoProperties applicationInfo) { + return "https://www.jetbrains.com/idea/uninstall/?edition=IC-${applicationInfo.majorVersion}.${applicationInfo.minorVersion}" + } + def String appInfoFile() { "${projectBuilder.moduleOutput(findModule("community-resources"))}/idea/IdeaApplicationInfo.xml" }