[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
This commit is contained in:
Nikolay Chashnikov
2025-08-19 15:09:22 +00:00
committed by intellij-monorepo-bot
parent d500d31ec2
commit 9273adbf57
5 changed files with 32 additions and 11 deletions
@@ -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,
@@ -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,
@@ -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)
@@ -92,6 +92,8 @@ data class BuildRequest(
@JvmField val platformPrefix: String,
@JvmField val additionalModules: List<String>,
@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)) {
@@ -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"),