From 9273adbf575c8de2cbc012a47c7f13dd2bb36d5c Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Mon, 18 Aug 2025 11:54:36 +0200 Subject: [PATCH] [build scripts] refactoring: pass platform prefix for the base IDE of JetBrains Client explicitly (IJPL-185957) Currently, standalone frontend distributions for all IDEs have platformPrefix 'JetBrainsClient'. To distinguish different distributions of JetBrainsClient inside the dev build, the platform prefix of the base IDE was implicitly prepended to the 'platformPrefix' property. This may cause problems with code which uses 'platformPrefix' and expects the proper value, so now an explicit 'baseIdePlatformPrefixForFrontend' property is added. GitOrigin-RevId: 9f8f429bc02f25d7a0858c74ddff3c0956cce908 --- .../dev-server/src/DevMainImpl.kt | 1 + .../intellij/build/ProductProperties.kt | 9 +++++++- .../intellij/build/dev/BuildServer.kt | 9 ++++---- .../intellij/build/dev/IdeBuilder.kt | 23 ++++++++++++++----- .../productRunner/DevModeProductRunner.kt | 1 + 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/platform/build-scripts/dev-server/src/DevMainImpl.kt b/platform/build-scripts/dev-server/src/DevMainImpl.kt index 470b64aab0bf..ae64049b1019 100644 --- a/platform/build-scripts/dev-server/src/DevMainImpl.kt +++ b/platform/build-scripts/dev-server/src/DevMainImpl.kt @@ -54,6 +54,7 @@ fun buildDevImpl(): BuildDevInfo { buildProductInProcess( BuildRequest( platformPrefix = System.getProperty("idea.platform.prefix", "idea"), + baseIdePlatformPrefixForFrontend = System.getProperty("dev.build.base.ide.platform.prefix.for.frontend"), additionalModules = getAdditionalPluginMainModules(), projectDir = ideaProjectRoot, keepHttpClient = false, diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt index cc1743088873..f6efb2bda465 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt @@ -19,7 +19,7 @@ import org.jetbrains.intellij.build.impl.qodana.QodanaProductProperties import org.jetbrains.jps.model.JpsProject import org.jetbrains.jps.model.module.JpsModule import java.nio.file.Path -import java.util.* +import java.util.Locale import java.util.function.BiPredicate /** @@ -405,6 +405,13 @@ abstract class ProductProperties { @Suppress("DEPRECATION") open fun applicationInfoOverride(project: JpsProject): ApplicationInfoOverrides? = null + /** + * For a standalone frontend distribution, specifies the platform prefix of its base IDE. In other cases returns `null`. + */ + @get:ApiStatus.Internal + open val baseIdePlatformPrefixForFrontend: String? + get() = null + @Deprecated("Do not use it. Needed only for JetBrains Client per-ide customisation + it's temporary") data class ApplicationInfoOverrides( val fullProductName: String, diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/dev/BuildServer.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/dev/BuildServer.kt index ca3bec5ac2b3..20615b3e30a3 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/dev/BuildServer.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/dev/BuildServer.kt @@ -103,7 +103,7 @@ suspend fun buildProductInProcess(request: BuildRequest): Path { request = request, createProductProperties = { compilationContext -> val configuration = createConfiguration(homePath = request.projectDir, productionClassOutput = request.productionClassOutput) - val productConfiguration = getProductConfiguration(configuration, request.platformPrefix) + val productConfiguration = getProductConfiguration(configuration, request.platformPrefix, request.baseIdePlatformPrefixForFrontend) createProductProperties(productConfiguration = productConfiguration, compilationContext = compilationContext, request = request) }, ) @@ -135,9 +135,10 @@ internal fun getProductPropertiesPath(homePath: Path): Path { ?: homePath.resolve(PRODUCTS_PROPERTIES_PATH) } -private fun getProductConfiguration(configuration: Configuration, platformPrefix: String): ProductConfiguration { - return configuration.products[platformPrefix] - ?: throw ConfigurationException("No production configuration for platform prefix `${platformPrefix}`; please add to `${PRODUCTS_PROPERTIES_PATH}` if needed") +private fun getProductConfiguration(configuration: Configuration, platformPrefix: String, baseIdePlatformPrefixForFrontend: String?): ProductConfiguration { + val key = if (baseIdePlatformPrefixForFrontend != null) "$baseIdePlatformPrefixForFrontend$platformPrefix" else platformPrefix + return configuration.products[key] + ?: throw ConfigurationException("No production configuration for `$key`; please add to `${PRODUCTS_PROPERTIES_PATH}` if needed") } internal class ConfigurationException(message: String) : RuntimeException(message) diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt index fdd66b9d54ce..5614c63a202a 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt @@ -92,6 +92,8 @@ data class BuildRequest( @JvmField val platformPrefix: String, @JvmField val additionalModules: List, @JvmField val projectDir: Path, + /** For a standalone frontend distribution where `platformPrefix` is "JetBrainsClient", specifies the platform prefix of its base IDE. */ + @JvmField val baseIdePlatformPrefixForFrontend: String? = null, @JvmField val devRootDir: Path = System.getProperty("idea.dev.root.dir")?.let { Path.of(it).normalize().toAbsolutePath() } ?: projectDir.resolve("out/dev-run"), @JvmField val jarCacheDir: Path = devRootDir.resolve("jar-cache"), @JvmField val productionClassOutput: Path = System.getenv("CLASSES_DIR")?.let { Path.of(it).normalize().toAbsolutePath() } ?: projectDir.resolve("out/classes/production"), @@ -116,11 +118,16 @@ data class BuildRequest( @JvmField val os: OsFamily = OsFamily.currentOs ) { override fun toString(): String = - "BuildRequest(platformPrefix='$platformPrefix', " + - "additionalModules=$additionalModules, " + - "productionClassOutput=$productionClassOutput, " + - "keepHttpClient=$keepHttpClient, " + - "generateRuntimeModuleRepository=$generateRuntimeModuleRepository" + buildString { + append("BuildRequest(platformPrefix='$platformPrefix', ") + if (baseIdePlatformPrefixForFrontend != null) { + append("baseIdePlatformPrefixForFrontend='$baseIdePlatformPrefixForFrontend', ") + } + append("additionalModules=$additionalModules, ") + append("productionClassOutput=$productionClassOutput, ") + append("keepHttpClient=$keepHttpClient, ") + append("generateRuntimeModuleRepository=$generateRuntimeModuleRepository") + } } @OptIn(ExperimentalCoroutinesApi::class) @@ -138,7 +145,11 @@ internal suspend fun buildProduct(request: BuildRequest, createProductProperties } val classifier = computeAdditionalModulesFingerprint(request.additionalModules) - val productDirNameWithoutClassifier = if (request.platformPrefix == "Idea") "idea-community" else request.platformPrefix + val productDirNameWithoutClassifier = when (request.platformPrefix) { + "Idea" -> "idea-community" + "JetBrainsClient" -> "${request.baseIdePlatformPrefixForFrontend ?: ""}${request.platformPrefix}" + else -> request.platformPrefix + } val productDirName = (productDirNameWithoutClassifier + (if (System.getProperty("intellij.build.minimal").toBoolean()) "-ij-void" else "") + classifier).takeLast(255) val buildDir = withContext(Dispatchers.IO.limitedParallelism(4)) { diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/productRunner/DevModeProductRunner.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/productRunner/DevModeProductRunner.kt index 46d955174c0d..43e4dc35576d 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/productRunner/DevModeProductRunner.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/productRunner/DevModeProductRunner.kt @@ -30,6 +30,7 @@ internal suspend fun createDevModeProductRunner(context: BuildContext, additiona isUnpackedDist = false, writeCoreClasspath = false, platformPrefix = context.productProperties.platformPrefix ?: "idea", + baseIdePlatformPrefixForFrontend = context.productProperties.baseIdePlatformPrefixForFrontend, additionalModules = additionalPluginModules, projectDir = homeDir, devRootDir = context.paths.tempDir.resolve("dev-run"),