diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/BuildContext.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/BuildContext.kt index cc514bad1304..ff21d88efc00 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/BuildContext.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/BuildContext.kt @@ -7,15 +7,22 @@ import kotlinx.collections.immutable.PersistentList import org.jetbrains.jps.model.module.JpsModule import java.nio.file.Path -interface BuildContext: CompilationContext { +interface BuildContext : CompilationContext { val productProperties: ProductProperties val windowsDistributionCustomizer: WindowsDistributionCustomizer? val linuxDistributionCustomizer: LinuxDistributionCustomizer? - val macDistributionCustomizer: MacDistributionCustomizer? val proprietaryBuildTools: ProprietaryBuildTools val applicationInfo: ApplicationInfoProperties + /** + * Relative paths to files in distribution which should take 'executable' permissions. + * No need to add *.sh. + */ + fun addExtraExecutablePattern(os: OsFamily, pattern: String) + + fun getExtraExecutablePattern(os: OsFamily): List + /** * Build number without product code (e.g. '162.500.10') */ diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/MacDistributionCustomizer.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/MacDistributionCustomizer.kt index b13926655b57..4e6b37ef05c0 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/MacDistributionCustomizer.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/MacDistributionCustomizer.kt @@ -5,10 +5,11 @@ import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.persistentListOf import org.jetbrains.intellij.build.impl.support.RepairUtilityBuilder import java.nio.file.Path -import java.util.concurrent.atomic.AtomicReference import java.util.function.Predicate -abstract class MacDistributionCustomizer { +abstract class MacDistributionCustomizer( + val extraExecutables: List = emptyList(), +) { /** * Path to icns file containing product icon bundle for macOS distribution * For full description of icns files see Apple Icon Image Format @@ -79,24 +80,6 @@ abstract class MacDistributionCustomizer { */ var associateIpr = false - - /** - * Relative paths to files in macOS distribution which should take 'executable' permissions - */ - private var extraExecutablesRef = AtomicReference>(persistentListOf()) - - // use setter only if you configure build context first time - var extraExecutables: PersistentList - get() = extraExecutablesRef.get() - set(value) { - extraExecutablesRef.set(value) - } - - // thread-safe - fun addExtraExecutable(path: String) { - extraExecutablesRef.updateAndGet { it.add(path) } - } - /** * Filter for files that is going to be put to `/bin` directory. */ 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 9307d518c037..3dd234be24cb 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 @@ -1,5 +1,5 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -@file:Suppress("ReplaceJavaStaticMethodWithKotlinAnalog") +@file:Suppress("ReplaceJavaStaticMethodWithKotlinAnalog", "ReplaceGetOrSet") package org.jetbrains.intellij.build.impl @@ -8,8 +8,7 @@ import com.intellij.openapi.util.text.Strings import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.api.common.Attributes import io.opentelemetry.api.trace.Span -import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import org.jetbrains.intellij.build.* @@ -27,15 +26,19 @@ import java.nio.file.Files import java.nio.file.Path import java.util.* import java.util.concurrent.ConcurrentLinkedQueue +import java.util.concurrent.atomic.AtomicReference -class BuildContextImpl private constructor(private val compilationContext: CompilationContextImpl, - override val productProperties: ProductProperties, - override val windowsDistributionCustomizer: WindowsDistributionCustomizer?, - override val linuxDistributionCustomizer: LinuxDistributionCustomizer?, - override val macDistributionCustomizer: MacDistributionCustomizer?, - override val proprietaryBuildTools: ProprietaryBuildTools = ProprietaryBuildTools.DUMMY, - private val distFiles: ConcurrentLinkedQueue>) : BuildContext { +class BuildContextImpl private constructor( + private val compilationContext: CompilationContextImpl, + override val productProperties: ProductProperties, + override val windowsDistributionCustomizer: WindowsDistributionCustomizer?, + override val linuxDistributionCustomizer: LinuxDistributionCustomizer?, + internal val macDistributionCustomizer: MacDistributionCustomizer?, + override val proprietaryBuildTools: ProprietaryBuildTools = ProprietaryBuildTools.DUMMY +) : BuildContext { + private val distFiles = ConcurrentLinkedQueue>() + private val extraExecutablePatterns = AtomicReference>>(persistentHashMapOf()) override val fullBuildNumber: String get() = "${applicationInfo.productCode}-$buildNumber" @@ -117,8 +120,7 @@ class BuildContextImpl private constructor(private val compilationContext: Compi windowsDistributionCustomizer = windowsDistributionCustomizer, linuxDistributionCustomizer = linuxDistributionCustomizer, macDistributionCustomizer = macDistributionCustomizer, - proprietaryBuildTools = proprietaryBuildTools, - distFiles = ConcurrentLinkedQueue()) + proprietaryBuildTools = proprietaryBuildTools) } } @@ -150,6 +152,7 @@ class BuildContextImpl private constructor(private val compilationContext: Compi override val options: BuildOptions get() = compilationContext.options + @Suppress("SSBasedInspection") override val messages: BuildMessages get() = compilationContext.messages @@ -260,7 +263,6 @@ class BuildContextImpl private constructor(private val compilationContext: Compi linuxDistributionCustomizer = productProperties.createLinuxCustomizer(projectHomeForCustomizersAsString), macDistributionCustomizer = productProperties.createMacCustomizer(projectHomeForCustomizersAsString), proprietaryBuildTools = proprietaryBuildTools, - distFiles = ConcurrentLinkedQueue() ) @Suppress("DEPRECATION") val productCode = productProperties.productCode copy.paths.artifactDir = paths.artifactDir.resolve(productCode!!) @@ -298,6 +300,14 @@ class BuildContextImpl private constructor(private val compilationContext: Compi jvmArgs.addAll(getCommandLineArgumentsForOpenPackages(this, os)) return jvmArgs } + + override fun addExtraExecutablePattern(os: OsFamily, pattern: String) { + extraExecutablePatterns.updateAndGet { prev -> + prev.put(os, (prev.get(os) ?: persistentListOf()).add(pattern)) + } + } + + override fun getExtraExecutablePattern(os: OsFamily): List = extraExecutablePatterns.get().get(os) ?: emptyList() } private fun createBuildOutputRootEvaluator(projectHome: Path, diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt index 0d30253f0d07..b150a40ba6a7 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt @@ -56,7 +56,9 @@ import java.util.function.BiConsumer import java.util.function.Predicate import java.util.stream.Collectors -class BuildTasksImpl(private val context: BuildContext) : BuildTasks { +class BuildTasksImpl(context: BuildContext) : BuildTasks { + private val context = context as BuildContextImpl + override suspend fun zipSourcesOfModules(modules: List, targetFile: Path, includeLibraries: Boolean) { zipSourcesOfModules(modules = modules, targetFile = targetFile, includeLibraries = includeLibraries, context = context) } @@ -614,14 +616,16 @@ private suspend fun compileModulesForDistribution(pluginsToPublish: Set LinuxDistributionBuilder(context = context, customizer = context.linuxDistributionCustomizer ?: return null, ideaProperties = ideaProperties) - OsFamily.MACOS -> MacDistributionBuilder(context, context.macDistributionCustomizer ?: return null, ideaProperties) + OsFamily.MACOS -> MacDistributionBuilder(context = context, + customizer = (context as BuildContextImpl).macDistributionCustomizer ?: return null, + ideaProperties = ideaProperties) } } diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BundledRuntimeImpl.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BundledRuntimeImpl.kt index 1523b271d7df..5af81c7c9e21 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BundledRuntimeImpl.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BundledRuntimeImpl.kt @@ -4,6 +4,7 @@ package org.jetbrains.intellij.build.impl import com.intellij.diagnostic.telemetry.use import com.intellij.openapi.util.SystemInfoRt import com.intellij.openapi.util.io.NioFiles +import kotlinx.collections.immutable.persistentListOf import org.apache.commons.compress.archivers.tar.TarArchiveInputStream import org.jetbrains.intellij.build.* import org.jetbrains.intellij.build.dependencies.BuildDependenciesDownloader @@ -24,7 +25,6 @@ class BundledRuntimeImpl( private val error: (String) -> Unit, private val info: (String) -> Unit) : BundledRuntime { companion object { - @JvmStatic fun getProductPrefix(context: BuildContext): String { return context.options.bundledRuntimePrefix ?: context.productProperties.runtimeDistribution.artifactPrefix } @@ -124,14 +124,14 @@ class BundledRuntimeImpl( override fun executableFilesPatterns(os: OsFamily): List { val pathPrefix = if (os == OsFamily.MACOS) "jbr/Contents/Home/" else "jbr/" @Suppress("SpellCheckingInspection") - val executableFilesPatterns = mutableListOf( + var executableFilesPatterns = persistentListOf( pathPrefix + "bin/*", pathPrefix + "lib/jexec", pathPrefix + "lib/jspawnhelper", pathPrefix + "lib/chrome-sandbox" ) if (os == OsFamily.LINUX) { - executableFilesPatterns += "jbr/lib/jcef_helper" + executableFilesPatterns = executableFilesPatterns.add("jbr/lib/jcef_helper") } return executableFilesPatterns } diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.kt index 4546b40f9a42..e55a42059f49 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/LinuxDistributionBuilder.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.util.io.NioFiles import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.api.common.Attributes import io.opentelemetry.api.trace.Span +import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.jetbrains.intellij.build.* @@ -129,13 +130,12 @@ class LinuxDistributionBuilder(override val context: BuildContext, } override fun generateExecutableFilesPatterns(includeRuntime: Boolean): List { - val patterns = ArrayList() - patterns.addAll(listOf("bin/*.sh", "bin/*.py", "bin/fsnotifier*", "bin/remote-dev-server.sh")) - patterns.addAll(customizer.extraExecutables) + var patterns = persistentListOf("bin/*.sh", "plugins/**/*.sh", "bin/*.py", "bin/fsnotifier*") + .addAll(customizer.extraExecutables) if (includeRuntime) { - patterns.addAll(context.bundledRuntime.executableFilesPatterns(OsFamily.LINUX)) + patterns = patterns.addAll(context.bundledRuntime.executableFilesPatterns(OsFamily.LINUX)) } - return patterns + return patterns.addAll(context.getExtraExecutablePattern(OsFamily.LINUX)) } override fun getArtifactNames(context: BuildContext): List { @@ -325,18 +325,6 @@ private fun makeFileExecutable(file: Path) { Files.setPosixFilePermissions(file, PosixFilePermissions.fromString("rwxr-xr-x")) } -fun copyFileSymlinkAware(source: Path, target: Path) { - target.parent?.let { Files.createDirectories(it) } - if (Files.isSymbolicLink(source)) { - // append 'NOFOLLOW_LINKS' copy option to be able to copy symbolic links - Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING, LinkOption.NOFOLLOW_LINKS) - } - else { - Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING, LinkOption.NOFOLLOW_LINKS) - } -} - - internal const val REMOTE_DEV_SCRIPT_FILE_NAME = "remote-dev-server.sh" internal fun generateUnixScripts(context: BuildContext, diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/MacDistributionBuilder.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/MacDistributionBuilder.kt index 6d769dd989ac..53c8e5689a48 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/MacDistributionBuilder.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/MacDistributionBuilder.kt @@ -343,6 +343,7 @@ class MacDistributionBuilder(override val context: BuildContext, override fun generateExecutableFilesPatterns(includeRuntime: Boolean): List { var executableFilePatterns = persistentListOf( "bin/*.sh", + "plugins/**/*.sh", "bin/*.py", "bin/fsnotifier", "bin/printenv", @@ -353,7 +354,9 @@ class MacDistributionBuilder(override val context: BuildContext, if (includeRuntime) { executableFilePatterns = executableFilePatterns.addAll(context.bundledRuntime.executableFilesPatterns(OsFamily.MACOS)) } - return executableFilePatterns.addAll(customizer.extraExecutables) + return executableFilePatterns + .addAll(customizer.extraExecutables) + .addAll(context.getExtraExecutablePattern(OsFamily.MACOS)) } private suspend fun buildForArch(builtinModule: BuiltinModulesFileData?, diff --git a/python/build/src/org/jetbrains/intellij/build/pycharm/PyCharmMacDistributionCustomizer.kt b/python/build/src/org/jetbrains/intellij/build/pycharm/PyCharmMacDistributionCustomizer.kt index c6a70bf86b93..17051e80297e 100644 --- a/python/build/src/org/jetbrains/intellij/build/pycharm/PyCharmMacDistributionCustomizer.kt +++ b/python/build/src/org/jetbrains/intellij/build/pycharm/PyCharmMacDistributionCustomizer.kt @@ -5,7 +5,7 @@ import org.jetbrains.intellij.build.ApplicationInfoProperties import org.jetbrains.intellij.build.BuildContext import org.jetbrains.intellij.build.MacDistributionCustomizer -open class PyCharmMacDistributionCustomizer : MacDistributionCustomizer() { +open class PyCharmMacDistributionCustomizer(extraExecutables: List = emptyList()) : MacDistributionCustomizer(extraExecutables = extraExecutables) { override fun copyAdditionalFiles(context: BuildContext, targetDirectory: String) { super.copyAdditionalFiles(context, targetDirectory) PyCharmBuildUtils.copySkeletons(context, targetDirectory, "skeletons-mac*.zip")