[WIP] Native: Deprecate -Xpurge-user-libs CLI argument
diff --git a/compiler/arguments/resources/kotlin-compiler-arguments.json b/compiler/arguments/resources/kotlin-compiler-arguments.json
index b1ddfda..cc385a1 100644
--- a/compiler/arguments/resources/kotlin-compiler-arguments.json
+++ b/compiler/arguments/resources/kotlin-compiler-arguments.json
@@ -16106,7 +16106,7 @@
                                         "shortName": null,
                                         "deprecatedName": "-purge_user_libs",
                                         "description": {
-                                            "current": "Don't link unused libraries even if explicitly specified.",
+                                            "current": "Don't link unused libraries even if explicitly specified.\nThis option is deprecated and will be removed in one of the future releases.",
                                             "valueInVersions": []
                                         },
                                         "delimiter": null,
@@ -16129,7 +16129,7 @@
                                         "releaseVersionsMetadata": {
                                             "introducedVersion": "1.5.20",
                                             "stabilizedVersion": null,
-                                            "deprecatedVersion": null,
+                                            "deprecatedVersion": "2.4.20",
                                             "removedVersion": null
                                         },
                                         "argumentType": {
diff --git a/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt b/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt
index d234c4a..2d51caf 100644
--- a/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt
+++ b/compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt
@@ -665,11 +665,16 @@
     compilerArgument {
         name = "Xpurge-user-libs"
         deprecatedName = "-purge_user_libs"
-        description = "Don't link unused libraries even if explicitly specified.".asReleaseDependent()
+        description = "Don't link unused libraries even if explicitly specified.\nThis option is deprecated and will be removed in one of the future releases.".asReleaseDependent()
         valueType = BooleanType.defaultFalse
 
+        additionalAnnotations(
+            Deprecated("This flag is deprecated")
+        )
+
         lifecycle(
             introducedVersion = KotlinReleaseVersion.v1_5_20,
+            deprecatedVersion = KotlinReleaseVersion.v2_4_20,
         )
     }
 
diff --git a/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt b/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt
index 58ba28d..adc7f200 100644
--- a/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt
+++ b/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArguments.kt
@@ -509,10 +509,12 @@
             field = value
         }
 
+    @Deprecated("This flag is deprecated")
     @Argument(
         value = "-Xpurge-user-libs",
         deprecatedName = "--purge_user_libs",
-        description = "Don't link unused libraries even if explicitly specified.",
+        description = """Don't link unused libraries even if explicitly specified.
+This option is deprecated and will be removed in one of the future releases.""",
     )
     var purgeUserLibs: Boolean = false
         set(value) {
diff --git a/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt b/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt
index 56e6227..6936e71 100644
--- a/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt
+++ b/compiler/cli/cli-base/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt
@@ -81,6 +81,7 @@
     to.printIr = from.printIr
     to.produce = from.produce
     to.propertyLazyInitialization = from.propertyLazyInitialization
+    @Suppress("DEPRECATION")
     to.purgeUserLibs = from.purgeUserLibs
     to.refinesPaths = from.refinesPaths.copyOf()
     to.runtimeFile = from.runtimeFile
diff --git a/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/FirNativeSerializer.kt b/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/FirNativeSerializer.kt
index 5d90048..c505f30 100644
--- a/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/FirNativeSerializer.kt
+++ b/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/FirNativeSerializer.kt
@@ -16,7 +16,6 @@
 import org.jetbrains.kotlin.fir.pipeline.AllModulesFrontendOutput
 import org.jetbrains.kotlin.fir.pipeline.Fir2KlibMetadataSerializer
 import org.jetbrains.kotlin.ir.KtDiagnosticReporterWithImplicitIrBasedContext
-import org.jetbrains.kotlin.konan.config.konanPurgeUserLibs
 import org.jetbrains.kotlin.konan.library.isExplicitlySpecifiedByUserInCLIArgument
 
 internal fun NativeFirstStagePhaseContext.firSerializerBase(
@@ -27,7 +26,7 @@
 ): SerializerOutput {
     val usedLibraries = fir2IrOutput?.let {
         config.loadedKlibs.all.filter { library ->
-            if (library.isExplicitlySpecifiedByUserInCLIArgument && !configuration.konanPurgeUserLibs) {
+            if (library.isExplicitlySpecifiedByUserInCLIArgument) {
                 // This is the dependency explicitly specified by the user in one of the compiler's CLI arguments: -library, -Xinclude.
                 //
                 // We assume such a library as "used" even if we cannot immediately prove there are declarations belonging to it
diff --git a/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/pipeline/NativeConfigurationPhase.kt b/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/pipeline/NativeConfigurationPhase.kt
index 228875eb..24920c7 100644
--- a/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/pipeline/NativeConfigurationPhase.kt
+++ b/compiler/cli/cli-native-klib/src/main/kotlin/org/jetbrains/kotlin/native/pipeline/NativeConfigurationPhase.kt
@@ -98,7 +98,6 @@
 
         configuration.konanNoStdlib = arguments.nostdlib
         configuration.konanNoDefaultLibs = arguments.nodefaultlibs
-        configuration.konanPurgeUserLibs = arguments.purgeUserLibs
 
         @Suppress("DEPRECATION")
         configuration.konanNoEndorsedLibs = arguments.noendorsedlibs
diff --git a/compiler/config/configuration-keys-generator/src/org/jetbrains/kotlin/config/keys/generator/NativeConfigurationKeysContainer.kt b/compiler/config/configuration-keys-generator/src/org/jetbrains/kotlin/config/keys/generator/NativeConfigurationKeysContainer.kt
index f5d5bda..9b9a678 100644
--- a/compiler/config/configuration-keys-generator/src/org/jetbrains/kotlin/config/keys/generator/NativeConfigurationKeysContainer.kt
+++ b/compiler/config/configuration-keys-generator/src/org/jetbrains/kotlin/config/keys/generator/NativeConfigurationKeysContainer.kt
@@ -58,7 +58,6 @@
     val KONAN_PRINT_IR by key<Boolean>()
     val KONAN_PRINT_FILES by key<Boolean>()
     val KONAN_PRODUCED_ARTIFACT_KIND by key<CompilerOutputKind>()
-    val KONAN_PURGE_USER_LIBS by key<Boolean>()
     val RUNTIME_FILE by key<String>()
     val KONAN_INCLUDED_LIBRARIES by key<List<String>>("Klibs processed in the same manner as source files.")
     val KONAN_SHORT_MODULE_NAME by key<String>("Short module name for IDE and export.")
diff --git a/kotlin-native/Interop/StubGenerator/src/org/jetbrains/kotlin/native/interop/gen/jvm/CommandLine.kt b/kotlin-native/Interop/StubGenerator/src/org/jetbrains/kotlin/native/interop/gen/jvm/CommandLine.kt
index 7ed4a60..3bc3c85 100644
--- a/kotlin-native/Interop/StubGenerator/src/org/jetbrains/kotlin/native/interop/gen/jvm/CommandLine.kt
+++ b/kotlin-native/Interop/StubGenerator/src/org/jetbrains/kotlin/native/interop/gen/jvm/CommandLine.kt
@@ -62,8 +62,12 @@
             deprecatedWarning = "Old form of flag. Please, use $NODEFAULTLIBS.").default(false)
     val noendorsedlibs by argParser.option(ArgType.Boolean, NOENDORSEDLIBS,
             description = "don't link the endorsed libraries from dist automatically").default(false)
-    val purgeUserLibs by argParser.option(ArgType.Boolean, PURGE_USER_LIBS,
-            description = "don't link unused libraries even explicitly specified").default(false)
+    val purgeUserLibs by argParser.option(
+            type = ArgType.Boolean,
+            fullName = PURGE_USER_LIBS,
+            description = "don't link unused libraries even explicitly specified",
+            deprecatedWarning = "'-$PURGE_USER_LIBS' option is deprecated and will be removed in one of the future releases",
+    ).default(false)
     val nopack by argParser.option(ArgType.Boolean, fullName = NOPACK,
             description = "Don't pack the produced library into a klib file").default(false)
     val tempDir by argParser.option(ArgType.String, TEMP_DIR,
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
index b6f5642..6827638 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
@@ -185,7 +185,7 @@
 
         init {
             val immediateBitcodeDependencies = topSortedLibraries
-                    .filter { (it.isExplicitlySpecifiedByUserInCLIArgument && !context.config.purgeUserLibs) || bitcodeIsUsed(it) }
+                    .filter { it.isExplicitlySpecifiedByUserInCLIArgument || bitcodeIsUsed(it) }
             for (library in immediateBitcodeDependencies) {
                 if (library == context.config.libraryToCache?.klib) continue
                 val cache = context.config.cachedLibraries.getLibraryCache(library)
@@ -317,7 +317,7 @@
             topSortedLibraries.mapNotNull { allBitcodeDependencies[it] }
         }
 
-        val nativeDependenciesToLink = topSortedLibraries.filter { (it.isExplicitlySpecifiedByUserInCLIArgument && !context.config.purgeUserLibs) || it in usedNativeDependencies }
+        val nativeDependenciesToLink = topSortedLibraries.filter { it.isExplicitlySpecifiedByUserInCLIArgument || it in usedNativeDependencies }
 
         val allNativeDependencies = (nativeDependenciesToLink +
                 allCachedBitcodeDependencies.map { it.library } // Native dependencies are per library
@@ -335,7 +335,7 @@
             }
 
             // Apply some DCE:
-            return (library.isExplicitlySpecifiedByUserInCLIArgument && !context.config.purgeUserLibs) || bitcodeIsUsed(library)
+            return library.isExplicitlySpecifiedByUserInCLIArgument || bitcodeIsUsed(library)
         }
     }
 
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeSecondStageCompilationConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeSecondStageCompilationConfig.kt
index ca74cd4..4ba6bd9 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeSecondStageCompilationConfig.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeSecondStageCompilationConfig.kt
@@ -34,7 +34,6 @@
 import org.jetbrains.kotlin.konan.config.konanHome
 import org.jetbrains.kotlin.konan.config.konanIncludedLibraries
 import org.jetbrains.kotlin.konan.config.konanManifestAddend
-import org.jetbrains.kotlin.konan.config.konanPurgeUserLibs
 import org.jetbrains.kotlin.konan.config.konanTarget
 import org.jetbrains.kotlin.konan.config.llvmLtoPasses
 import org.jetbrains.kotlin.konan.config.llvmModulePasses
@@ -436,7 +435,7 @@
             // Later upon the subsequent `getFullList()` call, some of the implicit dependencies will be added. But only if they
             // are mentioned in `depends=` manifest property in root libraries. Which means only a small really required subset
             // of them will be added.
-            it.library.isExplicitlySpecifiedByUserInCLIArgument && !purgeUserLibs
+            it.library.isExplicitlySpecifiedByUserInCLIArgument
         }.getFullList()
     }
 
@@ -704,9 +703,6 @@
     val languageVersionSettings: LanguageVersionSettings
         get() = configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS)!!
 
-    val purgeUserLibs: Boolean
-        get() = configuration.konanPurgeUserLibs
-
     val isInteropStubs: Boolean
         get() = manifestProperties?.getProperty("interop") == "true"
 }
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/SetupConfiguration.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/SetupConfiguration.kt
index 753cefe0..5f288f2 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/SetupConfiguration.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/SetupConfiguration.kt
@@ -45,7 +45,6 @@
 import org.jetbrains.kotlin.konan.config.konanPrintFiles
 import org.jetbrains.kotlin.konan.config.konanPrintIr
 import org.jetbrains.kotlin.konan.config.konanProducedArtifactKind
-import org.jetbrains.kotlin.konan.config.konanPurgeUserLibs
 import org.jetbrains.kotlin.konan.config.konanRefinesModules
 import org.jetbrains.kotlin.konan.config.konanShortModuleName
 import org.jetbrains.kotlin.konan.config.konanTarget
@@ -144,8 +143,6 @@
     konanPrintBitcode = arguments.printBitCode
     konanPrintFiles = arguments.printFiles
 
-    konanPurgeUserLibs = arguments.purgeUserLibs
-
     arguments.writeDependenciesOfProducedKlibTo?.let { konanWriteDependenciesOfProducedKlibTo = it }
 
     if (arguments.verifyCompiler != null)
diff --git a/kotlin-native/platformLibs/build.gradle.kts b/kotlin-native/platformLibs/build.gradle.kts
index 4c8fc72..6413c98 100644
--- a/kotlin-native/platformLibs/build.gradle.kts
+++ b/kotlin-native/platformLibs/build.gradle.kts
@@ -103,7 +103,6 @@
             }.toTypedArray()
 
             this.extraOpts.addAll(
-                    "-Xpurge-user-libs",
                     "-Xshort-module-name", df.name,
                     "-Xdisable-experimental-annotation",
                     "-no-default-libs",
diff --git a/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt b/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt
index 0c04afe..ad36804 100644
--- a/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt
+++ b/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt
@@ -268,7 +268,7 @@
                 "-target", target.visibleName,
                 "-def", defFile.absolutePath,
                 "-compiler-option", "-fmodules-cache-path=${tmpDirectory.child("clangModulesCache").absolutePath}",
-                "-no-default-libs", "-no-endorsed-libs", "-Xpurge-user-libs", "-nopack",
+                "-no-default-libs", "-no-endorsed-libs", "-nopack",
                 "-Xdisable-experimental-annotation",
                 *cinteropOptions.additionalArguments.toTypedArray(),
                 "-$SHORT_MODULE_NAME", def.shortLibraryName,
diff --git a/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt b/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt
index 493182b..c1ab30f 100644
--- a/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt
+++ b/kotlin-native/utilities/cli-runner/src/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt
@@ -29,7 +29,6 @@
     val outputFileName = arguments.output
     val noDefaultLibs = arguments.nodefaultlibs || arguments.nodefaultlibsDeprecated
     val noEndorsedLibs = arguments.noendorsedlibs
-    val purgeUserLibs = arguments.purgeUserLibs
     val nopack = arguments.nopack
     val temporaryFilesDir = arguments.tempDir
     val moduleName = arguments.moduleName
@@ -70,7 +69,6 @@
         libraries.flatMap { listOf("-library", it) } +
         (if (noDefaultLibs) arrayOf("-$NODEFAULTLIBS") else emptyArray()) +
         (if (noEndorsedLibs) arrayOf("-$NOENDORSEDLIBS") else emptyArray()) +
-        (if (purgeUserLibs) arrayOf("-$PURGE_USER_LIBS") else emptyArray()) +
         (if (nopack) arrayOf("-$NOPACK") else emptyArray()) +
         moduleName?.let { arrayOf("-module-name", it) }.orEmpty() +
         shortModuleName?.let { arrayOf("${K2NativeCompilerArguments::shortModuleName.cliArgument}=$it") }.orEmpty() +
diff --git a/native/native.config/gen/org/jetbrains/kotlin/konan/config/NativeConfigurationKeys.kt b/native/native.config/gen/org/jetbrains/kotlin/konan/config/NativeConfigurationKeys.kt
index 65b7ed7..0df8e75 100644
--- a/native/native.config/gen/org/jetbrains/kotlin/konan/config/NativeConfigurationKeys.kt
+++ b/native/native.config/gen/org/jetbrains/kotlin/konan/config/NativeConfigurationKeys.kt
@@ -171,9 +171,6 @@
     val KONAN_PRODUCED_ARTIFACT_KIND = CompilerConfigurationKey.create<CompilerOutputKind>("KONAN_PRODUCED_ARTIFACT_KIND")
 
     @JvmField
-    val KONAN_PURGE_USER_LIBS = CompilerConfigurationKey.create<Boolean>("KONAN_PURGE_USER_LIBS")
-
-    @JvmField
     val RUNTIME_FILE = CompilerConfigurationKey.create<String>("RUNTIME_FILE")
 
     // Klibs processed in the same manner as source files.
@@ -456,10 +453,6 @@
     get() = get(NativeConfigurationKeys.KONAN_PRODUCED_ARTIFACT_KIND)
     set(value) { put(NativeConfigurationKeys.KONAN_PRODUCED_ARTIFACT_KIND, requireNotNull(value) { "nullable values are not allowed" }) }
 
-var CompilerConfiguration.konanPurgeUserLibs: Boolean
-    get() = getBoolean(NativeConfigurationKeys.KONAN_PURGE_USER_LIBS)
-    set(value) { put(NativeConfigurationKeys.KONAN_PURGE_USER_LIBS, value) }
-
 var CompilerConfiguration.runtimeFile: String?
     get() = get(NativeConfigurationKeys.RUNTIME_FILE)
     set(value) { put(NativeConfigurationKeys.RUNTIME_FILE, requireNotNull(value) { "nullable values are not allowed" }) }
diff --git a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/UsedLibrariesComputationTest.kt b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/UsedLibrariesComputationTest.kt
index 22afaa8..0a7d280 100644
--- a/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/UsedLibrariesComputationTest.kt
+++ b/native/native.tests/klib-ir-inliner/tests/org/jetbrains/kotlin/konan/test/UsedLibrariesComputationTest.kt
@@ -68,6 +68,7 @@
         }.compileToKlibsViaCli(extraCliArgs = listOf("-l", additionalUnusedModulePath, "-Xpurge-user-libs")) { _, successKlib ->
             successKlib.assertDependencyNames(
                 /* implicit unavoidable dependency */ "stdlib",
+                /* because '-Xpurge-user-libs' has no effect anymore */ "additional",
             )
         }
 
@@ -155,4 +156,4 @@
             setProperty(KLIB_PROPERTY_UNIQUE_NAME, libName)
         }
     }
-}
\ No newline at end of file
+}