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"),