blob: 0bb18ff38758633e3f69ab55196bb179eb5778ce [file] [log] [blame]
import org.jetbrains.jps.LayoutInfo
import static org.jetbrains.jps.idea.IdeaProjectLoader.guessHome
setProperty("home", guessHome(this as Script))
includeTargets << new File("${guessHome(this as Script)}/build/scripts/utils.gant")
includeTargets << new File("${guessHome(this)}/build/scripts/libLicenses.gant")
requireProperty("buildNumber", requireProperty("build.number", snapshot))
setProperty("ch", home)
setProperty("pythonCommunityHome", "$home/python")
// load ApplicationInfo.xml properties
ant.xmlproperty(file: "$pythonCommunityHome/resources/idea/PyCharmCoreApplicationInfo.xml", collapseAttributes: "true")
setProperty("system_selector", "PyCharmCE${p("component.version.major")}0")
setProperty("dryRun", false)
setProperty("jdk16", guessJdk())
//modules to compile
setProperty("pluginFilter", new File("$pythonCommunityHome/build/plugin-list.txt").readLines())
private List<String> pycharmPlatformApiModules() {
return [platformApiModules, "dom-openapi"].flatten()
}
private List pycharmImplementationModules() { //modules to put into pycharm.jar
return [platformImplementationModules, "dom-impl", "python-community", "python-ide-community", "python-openapi", "python-psi-api",
"platform-main"].flatten()
}
private List modules() {
return [
"python-pydev", "colorSchemes", pycharmPlatformApiModules(), pycharmImplementationModules(), pluginFilter
].flatten()
}
private List approvedJars() {
def normalizedHome = ch.replace('\\', '/')
def normalizedPythonHome = pythonCommunityHome.replace('\\', '/')
return ["$normalizedHome/lib/", "$normalizedPythonHome/lib/", "$normalizedHome/xml/relaxng/lib/"]
}
class Paths {
final sandbox
final distAll
final distWin
final distMac
final distUnix
final artifacts
final ideaSystem
final ideaConfig
def Paths(String home) {
sandbox = "$home/out/pycharmCE"
distAll = "$sandbox/layout"
distWin = "$sandbox/win"
distMac = "$sandbox/mac"
distUnix = "$sandbox/unix"
artifacts = "$sandbox/artifacts"
ideaSystem = "$sandbox/system"
ideaConfig = "$sandbox/config"
}
}
setProperty("paths", new Paths(home))
setProperty("buildName", "PC-$buildNumber")
target('default': "Build artifacts") {
loadProject()
projectBuilder.stage("Cleaning up sandbox folder")
projectBuilder.targetFolder = "${paths.sandbox}/classes"
projectBuilder.dryRun = dryRun
if (!dryRun) {
forceDelete(paths.sandbox)
ant.mkdir(dir: paths.sandbox)
}
ant.tstamp() {
format(property: "todayYear", pattern: "yyyy")
}
ant.patternset(id: "resources.included") {
include(name: "**/*.properties")
include(name: "fileTemplates/**/*")
include(name: "inspectionDescriptions/**/*")
include(name: "intentionDescriptions/**/*")
include(name: "tips/**/*")
include(name: "search/**/*")
}
ant.patternset(id: "resources.excluded") {
exclude(name: "**/*.properties")
exclude(name: "fileTemplates/**/*")
exclude(name: "fileTemplates")
exclude(name: "inspectionDescriptions/**/*")
exclude(name: "inspectionDescriptions")
exclude(name: "intentionDescriptions/**/*")
exclude(name: "intentionDescriptions")
exclude(name: "tips/**/*")
exclude(name: "tips")
}
zipSources(home, paths.artifacts)
def usedJars = buildModulesAndCollectUsedJars(modules(), approvedJars(), ["/ant/"])
layoutCommunity("${paths.sandbox}/classes/production", usedJars)
/*
buildNSIS([paths.distAll, paths.distWin],
"$home/python/build/strings.nsi", "$home/python/build/paths.nsi",
"pycharm", false, true, system_selector)
*/
/*
signMacZip("pycharm")
buildDmg("pycharm", "${home}/python/build/DMG_background.png")
*/
}
public layoutCommunity(String classesPath, Set usedJars) {
setProperty("pluginFilter", new File("$pythonCommunityHome/build/plugin-list.txt").readLines())
if (usedJars == null) {
usedJars = collectUsedJars(modules(), approvedJars(), ["/ant/"], null)
}
def appInfo = appInfoFile(classesPath)
def paths = new Paths(home)
buildSearchableOptions("${projectBuilder.moduleOutput(findModule("platform-resources"))}/search", [], {
projectBuilder.moduleRuntimeClasspath(findModule("main_pycharm_ce"), false).each {
ant.pathelement(location: it)
}
}, "-Didea.platform.prefix=PyCharmCore -Didea.no.jre.check=true")
if (!dryRun) {
wireBuildDate("PC-${buildNumber}", appInfo)
}
Map args = [
buildNumber: "PC-${buildNumber}",
system_selector: system_selector,
ide_jvm_args: "-Didea.platform.prefix=PyCharmCore -Didea.no.jre.check=true"]
LayoutInfo layoutInfo = layoutFull(args, paths.distAll, usedJars)
generateLicensesTable("$paths.artifacts/third-party-libraries.txt", layoutInfo.usedModules);
layoutWin(args, paths.distWin)
layoutUnix(args, paths.distUnix)
layoutMac(args, paths.distMac)
ant.echo(message: "PC-${buildNumber}", file: "${paths.distAll}/build.txt")
def launcher = "${paths.distWin}/bin/pycharm.exe"
def launcher64 = "${paths.distWin}/bin/pycharm64.exe"
List resourcePaths = ["$ch/community-resources/src",
"$ch/platform/icons/src",
"$pythonCommunityHome/resources"]
buildWinLauncher("$ch", "$ch/bin/WinLauncher/WinLauncher.exe", launcher,
appInfo, "$pythonCommunityHome/build/pycharm_community_launcher.properties", system_selector, resourcePaths)
buildWinLauncher("$ch", "$ch/bin/WinLauncher/WinLauncher64.exe", launcher64,
appInfo, "$pythonCommunityHome/build/pycharm64_community_launcher.properties", system_selector, resourcePaths)
buildWinZip("${paths.artifacts}/pycharmPC-${buildNumber}.zip", [paths.distAll, paths.distWin])
String tarRoot = isEap() ? "pycharm-community-$buildNumber" : "pycharm-community-${p("component.version.major")}.${p("component.version.minor")}"
buildTarGz(tarRoot, "$paths.artifacts/pycharmPC-${buildNumber}.tar", [paths.distAll, paths.distUnix])
String macAppRoot = isEap() ? "PyCharm CE ${p("component.version.major")}.${p("component.version.minor")} EAP.app/Contents" : "PyCharm CE.app/Contents"
buildMacZip(macAppRoot, "${paths.artifacts}/pycharmPC-${buildNumber}.sit", [paths.distAll], paths.distMac)
}
private layoutPlugins(layouts) {
dir("plugins") {
layouts.layoutPlugin("rest")
layouts.layoutPlugin("python-rest")
}
layouts.layoutCommunityPlugins(ch)
}
private String appInfoFile(String classesPath) {
return "$classesPath/python-community/idea/PyCharmCoreApplicationInfo.xml"
}
private layoutFull(Map args, String target, Set usedJars) {
def openapiModules = pycharmPlatformApiModules()
def superLayouts = includeFile("$ch/build/scripts/layouts.gant")
reassignAltClickToMultipleCarets("$ch")
def result = layout(target) {
dir("lib") {
jar("util.jar") {
module("util")
module("util-rt")
}
jar("openapi.jar") {
openapiModules.each { module it }
}
jar("annotations.jar") { module("annotations") }
jar("extensions.jar") { module("extensions") }
jar("pycharm.jar") {
pycharmImplementationModules().each {
module(it) {
exclude(name: "**/tips/**")
}
}
}
jar("pycharm-pydev.jar") {
module("python-pydev")
}
jar("bootstrap.jar") { module("bootstrap") }
jar("resources.jar") {
module("platform-resources")
module("colorSchemes")
}
jar("forms_rt.jar") {
module("forms_rt")
}
//noinspection GroovyAssignabilityCheck
jar([name: "resources_en.jar", duplicate: "preserve"]) {
// custom resources should go first
fileset(dir: "$pythonCommunityHome/resources") {
include(name: "**/tips/**")
}
module("platform-resources-en") {
ant.patternset {
exclude(name: "tips/images/switcher.png")
exclude(name: "tips/images/navigateToFilePath.gif")
}
}
}
jar("icons.jar") { module("icons") }
jar("boot.jar") { module("boot") }
usedJars.each {
fileset(file: it)
}
dir("libpty") {
fileset(dir: "$ch/lib/libpty") {
exclude(name: "*.txt")
}
}
dir("ext") {
fileset(dir: "$ch/lib") {
include(name: "cglib*.jar")
}
}
dir("src") {
fileset(dir: "$ch/lib/src") {
include(name: "trove4j_changes.txt")
include(name: "trove4j_src.jar")
}
jar("pycharm-pydev-src.zip") {
fileset(dir: "$pythonCommunityHome/pydevSrc")
}
jar("pycharm-openapi-src.zip") {
fileset(dir: "$pythonCommunityHome/openapi/src")
fileset(dir: "$pythonCommunityHome/psi-api/src")
}
}
}
dir("help") {
fileset(dir: "$home/python/help") {
include(name: "*.pdf")
}
}
dir("helpers") {
fileset(dir: "$pythonCommunityHome/helpers")
}
dir("license") {
fileset(dir: "$ch/license")
fileset(dir: "$ch") {
include(name: "LICENSE.txt")
include(name: "NOTICE.txt")
}
}
layoutPlugins(superLayouts)
dir("bin") {
fileset(dir: "$ch/bin") {
exclude(name: "appletviewer.policy")
include(name: "*.*")
}
}
}
patchPropertiesFile(target, args + [appendices: ["$home/build/conf/ideaJNC.properties"]])
return result
}
private layoutWin(Map args, String target) {
layout(target) {
dir("bin") {
fileset(dir: "$ch/bin/win") {
exclude(name: "breakgen*")
}
}
dir("skeletons") {
fileset(dir: "$pythonCommunityHome/skeletons") {
include(name: "skeletons-win*.zip")
}
}
}
winScripts(target, ch, "pycharm.bat", args)
winVMOptions(target, null, "pycharm.exe", "pycharm64.exe")
ant.copy(file: "$home/python/help/pycharmhelp.jar", todir: "$target/help", failonerror: false)
}
private layoutUnix(Map args, String target) {
layout(target) {
dir("bin") {
fileset(dir: "$ch/bin/linux") {
exclude(name: "libbreakgen*")
}
}
}
ant.copy(file: "$pythonCommunityHome/resources/PyCharmCore128.png", tofile: "$target/bin/pycharm.png")
unixScripts(target, ch, "pycharm.sh", args)
unixVMOptions(target, "pycharm")
ant.copy(file: "$home/python/help/pycharmhelp.jar", todir: "$target/help", failonerror: false)
}
private layoutMac(Map _args, String target) {
layout(target) {
dir("bin") {
fileset(dir: "$home/bin") {
include(name: "*.jnilib")
}
}
dir("skeletons") {
fileset(dir: "$pythonCommunityHome/skeletons") {
include(name: "skeletons-mac*.zip")
}
}
}
Map args = new HashMap(_args)
args.icns = "$pythonCommunityHome/resources/PyCharmCore.icns"
args.bundleIdentifier = "com.jetbrains.pycharm"
args.platform_prefix = "PyCharmCore"
args.help_id = "PY"
args."idea.properties.path" = "${paths.distAll}/bin/idea.properties"
args."idea.properties" = ["idea.no.jre.check": true, "ide.mac.useNativeClipboard": "false"];
layoutMacApp(target, ch, args)
}