From 6679e91eb492f21518a8bdd5c2cea138f7726f67 Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Tue, 4 Feb 2025 18:45:29 +0100 Subject: [PATCH] [build scripts] skip unresolved optional content modules when building IDEA Community from intellij-community source code (IJPL-176806) We have cases when a variant of IDEA Community should be built from a subset of ultimate sources, and some content modules are missing in that subset. Also, this is needed to use the same plugin.xml for the frontend and the backend variant of a plugin (IJPL-165692) if the plugin is located in intellij-community (e.g., YAML), because the frontend variant uses API which is currently not available in intellij-community. Here a new property 'skipUnresolvedContentModules' is added to ProductModulesLayout to support such cases. GitOrigin-RevId: 235fa3e05078ff95150dc0180634adc2c383388d --- .../intellij/build/IdeaCommunityProperties.kt | 2 ++ .../jetbrains/intellij/build/ProductModulesLayout.kt | 10 ++++++++++ .../jetbrains/intellij/build/impl/BuildContextImpl.kt | 7 ++++++- .../intellij/build/impl/ContentModuleFilterImpl.kt | 11 +++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/build/src/org/jetbrains/intellij/build/IdeaCommunityProperties.kt b/build/src/org/jetbrains/intellij/build/IdeaCommunityProperties.kt index 167654ff3e08..5eea552199f4 100644 --- a/build/src/org/jetbrains/intellij/build/IdeaCommunityProperties.kt +++ b/build/src/org/jetbrains/intellij/build/IdeaCommunityProperties.kt @@ -65,6 +65,8 @@ open class IdeaCommunityProperties(private val communityHomeDir: Path) : BaseIde layout.withModule("intellij.platform.duplicates.analysis") layout.withModule("intellij.platform.structuralSearch") } + + productLayout.skipUnresolvedContentModules = true mavenArtifacts.forIdeModules = true mavenArtifacts.additionalModules = mavenArtifacts.additionalModules.addAll(MAVEN_ARTIFACTS_ADDITIONAL_MODULES) diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductModulesLayout.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductModulesLayout.kt index 7b0bb631ea0f..9420b32b9c4e 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductModulesLayout.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductModulesLayout.kt @@ -6,6 +6,7 @@ package org.jetbrains.intellij.build import it.unimi.dsi.fastutil.Hash import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenCustomHashSet import kotlinx.collections.immutable.* +import org.jetbrains.annotations.ApiStatus import org.jetbrains.intellij.build.impl.PlatformLayout import org.jetbrains.intellij.build.impl.PluginLayout @@ -117,6 +118,15 @@ class ProductModulesLayout { */ var compatiblePluginsToIgnore: PersistentList = persistentListOf() + /** + * If this property is set to `true`, modules registered as optional in `content` tag in `plugin.xml` files which doesn't exist in the JPS project configuration, will be excluded + * from the distribution (by default, in such cases build scripts fail with an error). + * This can be used to build a product from a subset of a source repository. E.g., a plugin from intellij-community may refer to some additional modules located in the ultimate + * part of the project, and they should be skipped while building from intellij-community sources. + */ + @ApiStatus.Internal + var skipUnresolvedContentModules: Boolean = false + /** * Module names which should be excluded from this product. * Allows filtering out default platform modules (both api and implementation) as well as product modules. diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt index 0ba96a40bb07..685936c7edc3 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt @@ -238,7 +238,12 @@ class BuildContextImpl internal constructor( @OptIn(DelicateCoroutinesApi::class) private fun computeContentModuleFilter(): Deferred { - if (productProperties.productMode == ProductMode.MONOLITH) return CompletableDeferred(IncludeAllContentModuleFilter) + if (productProperties.productMode == ProductMode.MONOLITH) { + if (productProperties.productLayout.skipUnresolvedContentModules) { + return CompletableDeferred(SkipUnresolvedOptionalContentModuleFilter(context = this)) + } + return CompletableDeferred(IncludeAllContentModuleFilter) + } return GlobalScope.async(Dispatchers.Unconfined + CoroutineName("Content Modules Filter"), start = CoroutineStart.LAZY) { val bundledPluginModules = getBundledPluginModules() diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/ContentModuleFilterImpl.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/ContentModuleFilterImpl.kt index a42263ce2b36..045cbd2d933f 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/ContentModuleFilterImpl.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/ContentModuleFilterImpl.kt @@ -5,6 +5,7 @@ import com.intellij.platform.runtime.product.ProductMode import com.intellij.platform.runtime.product.impl.ProductModeMatcher import com.intellij.platform.runtime.repository.RuntimeModuleId import com.intellij.platform.runtime.repository.RuntimeModuleRepository +import org.jetbrains.intellij.build.BuildContext import org.jetbrains.intellij.build.ContentModuleFilter /** @@ -34,4 +35,14 @@ internal class ContentModuleByProductModeFilter( internal object IncludeAllContentModuleFilter : ContentModuleFilter { override fun isOptionalModuleIncluded(moduleName: String, pluginMainModuleName: String?): Boolean = true + + override fun toString(): String = "IncludeAllContentModuleFilter" +} + +internal class SkipUnresolvedOptionalContentModuleFilter(private val context: BuildContext) : ContentModuleFilter { + override fun isOptionalModuleIncluded(moduleName: String, pluginMainModuleName: String?): Boolean { + return context.findModule(moduleName) != null; + } + + override fun toString(): String = "SkipUnresolvedOptionalContentModuleFilter" } \ No newline at end of file