Build scripts: make distribution jars builder immutable

This commit is contained in:
Alexander Zolotov
2017-10-02 14:40:25 +03:00
parent a3500f4ef6
commit 57ebcbd814
2 changed files with 26 additions and 53 deletions
@@ -1,18 +1,4 @@
/*
* Copyright 2000-2017 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.
*/
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.io.FileUtil
@@ -270,20 +256,20 @@ idea.fatal.error.notification=disabled
void compileModulesFromProduct() {
checkProductProperties()
def patchedApplicationInfo = patchApplicationInfo()
def distributionJARsBuilder = new DistributionJARsBuilder(buildContext, patchedApplicationInfo)
compileModulesForDistribution(distributionJARsBuilder)
compileModulesForDistribution(patchedApplicationInfo)
}
private compileModulesForDistribution(DistributionJARsBuilder distributionJARsBuilder) {
private DistributionJARsBuilder compileModulesForDistribution(File patchedApplicationInfo) {
def productLayout = buildContext.productProperties.productLayout
def bundledPlugins = productLayout.bundledPluginModules as Set<String>
def moduleNames = productLayout.getIncludedPluginModules(bundledPlugins) +
distributionJARsBuilder.platformModules +
buildContext.productProperties.additionalModulesToCompile
productLayout.platformApiModules + productLayout.platformImplementationModules +
productLayout.additionalPlatformJars.values() +
DistributionJARsBuilder.toolModules + buildContext.productProperties.additionalModulesToCompile
compileModules(moduleNames + (buildContext.proprietaryBuildTools.scrambleTool?.additionalModulesToCompile ?: []) +
productLayout.mainModules, buildContext.productProperties.modulesToCompileTests)
def pluginsToPublish = distributionJARsBuilder.getPluginsByModules(buildContext.productProperties.productLayout.pluginModulesToPublish)
def pluginsToPublish = DistributionJARsBuilder.getPluginsByModules(buildContext, buildContext.productProperties.productLayout.pluginModulesToPublish)
if (buildContext.shouldBuildDistributions()) {
def providedModulesFilePath = "${buildContext.paths.artifacts}/${buildContext.productProperties.productCode}-builtinModules.json"
buildProvidedModulesList(providedModulesFilePath, moduleNames, productLayout.licenseFilesToBuildSearchableOptions)
@@ -296,13 +282,13 @@ idea.fatal.error.notification=disabled
}
}
}
compileModules(pluginsToPublish.collect { it.moduleJars.values() }.flatten() as List<String>)
distributionJARsBuilder.pluginsToPublish.addAll(pluginsToPublish)
def distributionJARsBuilder = new DistributionJARsBuilder(buildContext, patchedApplicationInfo, pluginsToPublish)
compileModules(distributionJARsBuilder.platformModules + (pluginsToPublish.collect { it.moduleJars.values() }.flatten() as List<String>))
//we need this to ensure that all libraries which may be used in the distribution are resolved, even if product modules don't depend on them (e.g. JUnit5)
CompilationTasks.create(buildContext).resolveProjectDependencies()
CompilationTasks.create(buildContext).buildProjectArtifacts(distributionJARsBuilder.includedProjectArtifacts)
return distributionJARsBuilder
}
@Override
@@ -311,8 +297,7 @@ idea.fatal.error.notification=disabled
copyDependenciesFile()
def patchedApplicationInfo = patchApplicationInfo()
def distributionJARsBuilder = new DistributionJARsBuilder(buildContext, patchedApplicationInfo)
compileModulesForDistribution(distributionJARsBuilder)
def distributionJARsBuilder = compileModulesForDistribution(patchedApplicationInfo)
buildContext.messages.block("Build platform and plugin JARs") {
if (buildContext.shouldBuildDistributions()) {
distributionJARsBuilder.buildJARs()
@@ -559,7 +544,7 @@ idea.fatal.error.notification=disabled
@Override
void buildUnpackedDistribution(String targetDirectory) {
buildContext.paths.distAll = targetDirectory
def jarsBuilder = new DistributionJARsBuilder(buildContext, patchApplicationInfo())
def jarsBuilder = new DistributionJARsBuilder(buildContext, patchApplicationInfo(), [])
CompilationTasks.create(buildContext).buildProjectArtifacts(jarsBuilder.includedProjectArtifacts)
jarsBuilder.buildJARs()
layoutShared()
@@ -1,18 +1,4 @@
/*
* Copyright 2000-2017 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.
*/
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.MultiValuesMap
@@ -46,11 +32,12 @@ class DistributionJARsBuilder {
private final Set<String> usedModules = new LinkedHashSet<>()
private final PlatformLayout platform
private final File patchedApplicationInfo
private final List<PluginLayout> pluginsToPublish = []
private final List<PluginLayout> pluginsToPublish
DistributionJARsBuilder(BuildContext buildContext, File patchedApplicationInfo) {
DistributionJARsBuilder(BuildContext buildContext, File patchedApplicationInfo, List<PluginLayout> pluginsToPublish) {
this.patchedApplicationInfo = patchedApplicationInfo
this.buildContext = buildContext
this.pluginsToPublish = pluginsToPublish
buildContext.ant.patternset(id: RESOURCES_INCLUDED) {
include(name: "**/*Bundle*.properties")
include(name: "**/*Messages.properties")
@@ -79,9 +66,8 @@ class DistributionJARsBuilder {
}
def productLayout = buildContext.productProperties.productLayout
def enabledPluginModules = getEnabledPluginModules()
List<JpsLibrary> projectLibrariesUsedByPlugins = getPluginsByModules(enabledPluginModules).collectMany { plugin ->
List<JpsLibrary> projectLibrariesUsedByPlugins = getPluginsByModules(buildContext, enabledPluginModules).collectMany { plugin ->
plugin.getActualModules(enabledPluginModules).values().collectMany {
def module = buildContext.findRequiredModule(it)
JpsJavaExtensionService.dependencies(module).includedIn(JpsJavaClasspathKind.PRODUCTION_RUNTIME).libraries.findAll {
@@ -143,7 +129,13 @@ class DistributionJARsBuilder {
}
List<String> getPlatformModules() {
(platform.moduleJars.values() as List<String>) +
(platform.moduleJars.values() as List<String>) + toolModules
}
/**
* @return module names which are required to run necessary tools from build scripts
*/
static List<String> getToolModules() {
["java-runtime", "platform-main", /*required to build searchable options index*/ "updater"]
}
@@ -247,14 +239,10 @@ class DistributionJARsBuilder {
usedModules.addAll(layoutBuilder.usedModules)
}
List<PluginLayout> getPluginsToPublish() {
return pluginsToPublish
}
private void buildBundledPlugins() {
def productLayout = buildContext.productProperties.productLayout
def layoutBuilder = createLayoutBuilder()
buildPlugins(layoutBuilder, getPluginsByModules(productLayout.bundledPluginModules), "$buildContext.paths.distAll/plugins")
buildPlugins(layoutBuilder, getPluginsByModules(buildContext, productLayout.bundledPluginModules), "$buildContext.paths.distAll/plugins")
usedModules.addAll(layoutBuilder.usedModules)
}
@@ -304,7 +292,7 @@ class DistributionJARsBuilder {
return plugin.versionEvaluator.apply(buildContext)
}
List<PluginLayout> getPluginsByModules(Collection<String> modules) {
static List<PluginLayout> getPluginsByModules(BuildContext buildContext, Collection<String> modules) {
def allNonTrivialPlugins = buildContext.productProperties.productLayout.allNonTrivialPlugins
def allOptionalModules = allNonTrivialPlugins.collectMany {it.optionalModules}
def nonTrivialPlugins = allNonTrivialPlugins.groupBy { it.mainModule }