Make kotlin-native shared be included subproject
diff --git a/kotlin-native/build-tools/build.gradle.kts b/kotlin-native/build-tools/build.gradle.kts
index 54f5204..471e4f8 100644
--- a/kotlin-native/build-tools/build.gradle.kts
+++ b/kotlin-native/build-tools/build.gradle.kts
@@ -60,6 +60,8 @@
 
     implementation("org.jetbrains.kotlin:kotlin-util-klib:${project.bootstrapKotlinVersion}")
     implementation("org.jetbrains.kotlin:kotlin-native-utils:${project.bootstrapKotlinVersion}")
+
+    api(project(":kotlin-native-shared"))
 }
 
 java {
@@ -92,8 +94,6 @@
     sourceSets {
         main {
             kotlin.srcDir("src/main/kotlin")
-            kotlin.srcDir("../../kotlin-native/shared/src/library/kotlin")
-            kotlin.srcDir("../../kotlin-native/shared/src/main/kotlin")
             kotlin.srcDir("../../kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin")
         }
     }
diff --git a/kotlin-native/build-tools/gradle.properties b/kotlin-native/build-tools/gradle.properties
index a9400305..f665255 100644
--- a/kotlin-native/build-tools/gradle.properties
+++ b/kotlin-native/build-tools/gradle.properties
@@ -12,3 +12,5 @@
   JDK_15_0,JDK_15,\
   JDK_16_0,\
   JDK_17_0
+
+kotlin.native.build.composite-bootstrap=true
\ No newline at end of file
diff --git a/kotlin-native/build-tools/settings.gradle.kts b/kotlin-native/build-tools/settings.gradle.kts
index d80b29a..bbdcd93 100644
--- a/kotlin-native/build-tools/settings.gradle.kts
+++ b/kotlin-native/build-tools/settings.gradle.kts
@@ -21,4 +21,18 @@
     dependencies {
         classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:$buildGradlePluginVersion")
     }
-}
\ No newline at end of file
+}
+
+include(":kotlin-native-shared")
+project(":kotlin-native-shared").projectDir = File("$rootDir/../shared")
+
+// This code could potentially remove the need of bootstrapping code that use util-klib and util-io
+// by building them, but it's not possible right now, because they use buildSrc plugins (like JPS) and methods (like commonDependency).
+// This could be fixed by replacing the buildSrc with the composite build like build-tools, and splitting it to several parts.
+//include(":native:kotlin-native-utils")
+//include(":kotlin-util-klib")
+//include(":kotlin-util-io")
+
+//project(":native:kotlin-native-utils").projectDir = File("$rootDir/../../native/kotlin-native-utils")
+//project(":kotlin-util-klib").projectDir = File("$rootDir/../../compiler/util-klib")
+//project(":kotlin-util-io").projectDir = File("$rootDir/../../compiler/util-io")
diff --git a/kotlin-native/shared/build.gradle.kts b/kotlin-native/shared/build.gradle.kts
index 72c6503..c8fcc36 100644
--- a/kotlin-native/shared/build.gradle.kts
+++ b/kotlin-native/shared/build.gradle.kts
@@ -15,6 +15,7 @@
  */
 @file:Suppress("UnstableApiUsage")
 
+import org.jetbrains.kotlin.gradle.plugin.extraProperties
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
@@ -24,8 +25,6 @@
 val rootBuildDirectory by extra(file(".."))
 apply(from = "../gradle/loadRootProperties.gradle")
 
-val kotlinVersion = project.bootstrapKotlinVersion
-
 group = "org.jetbrains.kotlin"
 
 repositories {
@@ -33,6 +32,12 @@
     mavenCentral()
 }
 
+java {
+    toolchain {
+        languageVersion.set(JavaLanguageVersion.of(8))
+    }
+}
+
 kotlin {
     sourceSets {
         main {
@@ -47,20 +52,37 @@
     kotlinOptions.freeCompilerArgs += listOf("-Xskip-prerelease-check")
 }
 
-tasks.jar {
-    archiveFileName.set("shared.jar")
-}
+// TODO: move it somewhere
+//projectTest(jUnitMode = JUnitMode.JUnit5) {
+//    useJUnitPlatform()
+//}
 
-projectTest(jUnitMode = JUnitMode.JUnit5) {
-    useJUnitPlatform()
+/**
+ * Depending on the `kotlin.native.build.composite-bootstrap` property returns either coordinates or project dependency.
+ * This is to use this project in composite build (build-tools) and as a project itself.
+ * Project should depend on a current snapshot builds while build-tools use bootstrap dependencies
+ */
+fun compositeDependency(coordinates: String, subproject: String = ""): Any {
+    val bootstrap = project.extraProperties.has("kotlin.native.build.composite-bootstrap")
+    val parts = coordinates.split(':')
+    check(parts.size == 3) {
+        "Full dependency coordinates should be specified group:name:version"
+    }
+    return if (!bootstrap) {
+        // returns dependency on the project specified with coordinates
+        dependencies.project("$subproject:${parts[1]}")
+    } else {
+        // returns full coordinates
+        coordinates
+    }
 }
 
 dependencies {
-    kotlinCompilerClasspath("org.jetbrains.kotlin:kotlin-compiler-embeddable:$kotlinVersion")
+    kotlinCompilerClasspath("org.jetbrains.kotlin:kotlin-compiler-embeddable:${project.bootstrapKotlinVersion}")
 
-    implementation(kotlinStdlib())
-    implementation(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false }
-    api(project(":native:kotlin-native-utils"))
-    api(project(":kotlin-util-klib"))
-    testApiJUnit5()
+    implementation("org.jetbrains.kotlin:kotlin-stdlib:${project.bootstrapKotlinVersion}")
+    api(compositeDependency("org.jetbrains.kotlin:kotlin-native-utils:${project.bootstrapKotlinVersion}", ":native"))
+    api(compositeDependency("org.jetbrains.kotlin:kotlin-util-klib:${project.bootstrapKotlinVersion}"))
+    api(compositeDependency("org.jetbrains.kotlin:kotlin-util-io:${project.bootstrapKotlinVersion}"))
+//    testApiJUnit5()
 }
diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt
index 0793b77..9d3dc3f 100644
--- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt
+++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt
@@ -73,9 +73,11 @@
 
     @TaskAction
     fun compile() {
-        check(klibUniqName == readKlibUniqNameFromManifest()) {
-            "klibUniqName mismatch: configured '$klibUniqName', resolved '${readKlibUniqNameFromManifest()}'"
-        }
+        // This code uses bootstrap version of util-klib and fails due to the older default ABI than library being used
+        // A possible solution is to read it manually from manifest file or this check should be done bu the compiler itself
+//        check(klibUniqName == readKlibUniqNameFromManifest()) {
+//            "klibUniqName mismatch: configured '$klibUniqName', resolved '${readKlibUniqNameFromManifest()}'"
+//        }
 
         // Compiler doesn't create a cache if the cacheFile already exists. So we need to remove it manually.
         if (cacheFile.exists()) {