diff --git a/platform/build-scripts/dev-server/src/PluginBuilder.kt b/platform/build-scripts/dev-server/src/PluginBuilder.kt index 6b47af999dbd..01e0c08c79d3 100644 --- a/platform/build-scripts/dev-server/src/PluginBuilder.kt +++ b/platform/build-scripts/dev-server/src/PluginBuilder.kt @@ -7,10 +7,10 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import org.jetbrains.intellij.build.BuildContext import org.jetbrains.intellij.build.TraceManager -import org.jetbrains.intellij.build.impl.DistributionJARsBuilder import org.jetbrains.intellij.build.impl.ModuleOutputPatcher import org.jetbrains.intellij.build.impl.PluginLayout import org.jetbrains.intellij.build.impl.checkOutputOfPluginModules +import org.jetbrains.intellij.build.impl.layoutDistribution import java.nio.file.Files import java.nio.file.NoSuchFileException import java.nio.file.Path @@ -106,12 +106,12 @@ private suspend fun buildPlugin(plugin: BuildItem, buildContext: BuildContext, p checkOutputOfPluginModules(mainModule, plugin.layout.moduleJars, plugin.layout.moduleExcludes, buildContext) } - DistributionJARsBuilder.layout(plugin.layout, - plugin.dir, - true, - moduleOutputPatcher, - plugin.layout.moduleJars, - buildContext) + layoutDistribution(layout = plugin.layout, + targetDirectory = plugin.dir, + copyFiles = true, + moduleOutputPatcher = moduleOutputPatcher, + moduleJars = plugin.layout.moduleJars, + context = buildContext) plugin.markAsBuilt(projectOutDir) } } \ No newline at end of file diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt index db7c518bca13..5f6a28c70484 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt @@ -21,8 +21,6 @@ import org.jetbrains.intellij.build.* import org.jetbrains.intellij.build.TraceManager.spanBuilder import org.jetbrains.intellij.build.dependencies.BuildDependenciesCommunityRoot import org.jetbrains.intellij.build.fus.createStatisticsRecorderBundledMetadataProviderTask -import org.jetbrains.intellij.build.impl.DistributionJARsBuilder.Companion.layout -import org.jetbrains.intellij.build.impl.JarPackager.Companion.getSearchableOptionsDir import org.jetbrains.intellij.build.impl.JarPackager.Companion.pack import org.jetbrains.intellij.build.impl.SVGPreBuilder.createPrebuildSvgIconsTask import org.jetbrains.intellij.build.impl.projectStructureMapping.* @@ -69,64 +67,6 @@ class DistributionJARsBuilder { this.state = state } - companion object { - suspend fun layout(layout: BaseLayout, - targetDirectory: Path, - copyFiles: Boolean, - moduleOutputPatcher: ModuleOutputPatcher, - moduleJars: MultiMap, - context: BuildContext): List { - if (copyFiles) { - checkModuleExcludes(layout.moduleExcludes, context) - } - - // patchers must be executed _before_ pack because patcher patches module output - if (copyFiles && layout is PluginLayout && !layout.patchers.isEmpty()) { - val patchers = layout.patchers - spanBuilder("execute custom patchers").setAttribute("count", patchers.size.toLong()).useWithScope { - for (patcher in patchers) { - patcher.accept(moduleOutputPatcher, context) - } - } - } - - return coroutineScope { - val tasks = ArrayList>>(3) - tasks.add(async { - spanBuilder("pack").useWithScope2 { - val actualModuleJars = TreeMap>() - for (entry in moduleJars.entrySet()) { - val modules = entry.value - val jarPath = getActualModuleJarPath(entry.key, modules, layout.explicitlySetJarPaths, context) - actualModuleJars.computeIfAbsent(jarPath) { mutableListOf() }.addAll(modules) - } - withContext(Dispatchers.IO) { - pack(actualModuleJars, targetDirectory.resolve("lib"), layout, moduleOutputPatcher, !copyFiles, context) - } - } - }) - - if (copyFiles && (!layout.resourcePaths.isEmpty() || (layout is PluginLayout && !layout.resourceGenerators.isEmpty()))) { - tasks.add(async(Dispatchers.IO) { - spanBuilder("pack additional resources").useWithScope2 { - layoutAdditionalResources(layout, context, targetDirectory) - emptyList() - } - }) - } - - if (!layout.includedArtifacts.isEmpty()) { - tasks.add(async(Dispatchers.IO) { - spanBuilder("pack artifacts").useWithScope2 { layoutArtifacts(layout, context, copyFiles, targetDirectory) } - }) - } - tasks - }.flatMap { it.getCompleted() } - } - - - } - suspend fun buildJARs(context: BuildContext, isUpdateFromSources: Boolean = false): ProjectStructureMapping { validateModuleStructure(context) val svgPrebuildTask = createPrebuildSvgIconsTask(context)?.fork() @@ -243,7 +183,7 @@ class DistributionJARsBuilder { } val messages = context.messages - val targetDirectory = getSearchableOptionsDir(context) + val targetDirectory = context.searchableOptionDir val modules = withContext(Dispatchers.IO) { val ideClasspath = createIdeClassPath(context) NioFiles.deleteRecursively(targetDirectory) @@ -318,7 +258,7 @@ class DistributionJARsBuilder { val entries = ArrayList() for (plugin in allPlugins) { if (satisfiesBundlingRequirements(plugin = plugin, osFamily = null, arch = null, context = context)) { - entries.addAll(layout(layout = plugin, + entries.addAll(layoutDistribution(layout = plugin, targetDirectory = pluginLayoutRoot, copyFiles = false, moduleOutputPatcher = moduleOutputPatcher, @@ -541,7 +481,7 @@ private suspend fun buildPlugins(moduleOutputPatcher: ModuleOutputPatcher, val pluginDir = targetDirectory.resolve(directoryName) async { spanBuilder("plugin").setAttribute("path", context.paths.buildOutputDir.relativize(pluginDir).toString()).useWithScope2 { - val result = layout(layout = plugin, + val result = layoutDistribution(layout = plugin, targetDirectory = pluginDir, copyFiles = true, moduleOutputPatcher = moduleOutputPatcher, @@ -714,12 +654,12 @@ suspend fun processLibDirectoryLayout(moduleOutputPatcher: ModuleOutputPatcher, return spanBuilder("layout") .setAttribute("path", context.paths.buildOutputDir.relativize(context.paths.distAllDir).toString()) .useWithScope2 { - layout(layout = platform, - targetDirectory = context.paths.distAllDir, - copyFiles = copyFiles, - moduleOutputPatcher = moduleOutputPatcher, - moduleJars = platform.moduleJars, - context = context) + layoutDistribution(layout = platform, + targetDirectory = context.paths.distAllDir, + copyFiles = copyFiles, + moduleOutputPatcher = moduleOutputPatcher, + moduleJars = platform.moduleJars, + context = context) } } @@ -943,6 +883,60 @@ private fun buildKeymapPlugins(targetDir: Path, context: BuildContext): ForkJoin return buildKeymapPlugins(context.buildNumber, targetDir, keymapDir) } +suspend fun layoutDistribution(layout: BaseLayout, + targetDirectory: Path, + copyFiles: Boolean, + moduleOutputPatcher: ModuleOutputPatcher, + moduleJars: MultiMap, + context: BuildContext): List { + if (copyFiles) { + checkModuleExcludes(layout.moduleExcludes, context) + } + + // patchers must be executed _before_ pack because patcher patches module output + if (copyFiles && layout is PluginLayout && !layout.patchers.isEmpty()) { + val patchers = layout.patchers + spanBuilder("execute custom patchers").setAttribute("count", patchers.size.toLong()).useWithScope { + for (patcher in patchers) { + patcher.accept(moduleOutputPatcher, context) + } + } + } + + return coroutineScope { + val tasks = ArrayList>>(3) + tasks.add(async { + spanBuilder("pack").useWithScope2 { + val actualModuleJars = TreeMap>() + for (entry in moduleJars.entrySet()) { + val modules = entry.value + val jarPath = getActualModuleJarPath(entry.key, modules, layout.explicitlySetJarPaths, context) + actualModuleJars.computeIfAbsent(jarPath) { mutableListOf() }.addAll(modules) + } + withContext(Dispatchers.IO) { + pack(actualModuleJars, targetDirectory.resolve("lib"), layout, moduleOutputPatcher, !copyFiles, context) + } + } + }) + + if (copyFiles && (!layout.resourcePaths.isEmpty() || (layout is PluginLayout && !layout.resourceGenerators.isEmpty()))) { + tasks.add(async(Dispatchers.IO) { + spanBuilder("pack additional resources").useWithScope2 { + layoutAdditionalResources(layout, context, targetDirectory) + emptyList() + } + }) + } + + if (!layout.includedArtifacts.isEmpty()) { + tasks.add(async(Dispatchers.IO) { + spanBuilder("pack artifacts").useWithScope2 { layoutArtifacts(layout, context, copyFiles, targetDirectory) } + }) + } + tasks + }.flatMap { it.getCompleted() } +} + private fun layoutAdditionalResources(layout: BaseLayout, context: BuildContext, targetDirectory: Path) { for (resourceData in layout.resourcePaths) { val source = basePath(context, resourceData.moduleName).resolve(resourceData.resourcePath).normalize() diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/JarPackager.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/JarPackager.kt index 044451b79d13..8365b116a5a7 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/JarPackager.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/JarPackager.kt @@ -35,6 +35,9 @@ import java.util.function.IntConsumer private val JAR_NAME_WITH_VERSION_PATTERN = "(.*)-\\d+(?:\\.\\d+)*\\.jar*".toPattern() +internal val BuildContext.searchableOptionDir: Path + get() = paths.tempDir.resolve("searchableOptionsResult") + @Suppress("ReplaceJavaStaticMethodWithKotlinAnalog") private val libsThatUsedInJps = java.util.Set.of( "ASM", @@ -211,8 +214,6 @@ class JarPackager private constructor(private val context: BuildContext) { } return packager.projectStructureMapping } - - fun getSearchableOptionsDir(buildContext: BuildContext): Path = buildContext.paths.tempDir.resolve("searchableOptionsResult") } private fun mergeLibsByPredicate(jarName: String, @@ -248,7 +249,7 @@ class JarPackager private constructor(private val context: BuildContext) { layout: BaseLayout, moduleNameToSize: MutableMap, sourceList: MutableList) { - val searchableOptionsDir = getSearchableOptionsDir(context) + val searchableOptionsDir = context.searchableOptionDir Span.current().addEvent("include module outputs", Attributes.of(AttributeKey.stringArrayKey("modules"), java.util.List.copyOf(modules))) for (moduleName in modules) { addModuleSources(moduleName = moduleName,