EXPERIMENT: produce dynamic frameworks for CocoaPods
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt
index d2cb59b..90d48b0 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt
@@ -14,6 +14,7 @@
 import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
 import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
 import org.jetbrains.kotlin.gradle.plugin.addExtension
+import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
 import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
 import org.jetbrains.kotlin.gradle.tasks.*
@@ -65,7 +66,7 @@
     private fun createDefaultFrameworks(kotlinExtension: KotlinMultiplatformExtension) {
         kotlinExtension.supportedTargets().all { target ->
             target.binaries.framework {
-                isStatic = true
+                isStatic = false
             }
         }
     }
@@ -225,6 +226,13 @@
                     }
 
                 }
+
+                target.binaries.withType(Framework::class.java) {
+                    it.linkerOpts("-framework", pod.moduleName)
+                    project.findProperty(FRAMEWORK_PATHS_PROPERTY)?.toString()?.let { args ->
+                        it.linkerOpts.addAll(args.splitQuotedArgs().map { "-F$it" })
+                    }
+                }
             }
         }
     }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt
index af06bc1..f8cc9b94 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt
@@ -66,7 +66,6 @@
             |    spec.license                  = '${settings.license.orEmpty()}'
             |    spec.summary                  = '${settings.summary.orEmpty()}'
             |
-            |    spec.static_framework         = true
             |    spec.vendored_frameworks      = "$frameworkDir/#{spec.name}.framework"
             |    spec.libraries                = "c++"
             |    spec.module_name              = "#{spec.name}_umbrella"
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Headers/dummy.h b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Headers/dummy.h
index a913202..891e763 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Headers/dummy.h
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Headers/dummy.h
@@ -1,5 +1,146 @@
-//! Project version number for dummy.
-FOUNDATION_EXPORT double dummyVersionNumber;
+#import <Foundation/NSArray.h>
+#import <Foundation/NSDictionary.h>
+#import <Foundation/NSError.h>
+#import <Foundation/NSObject.h>
+#import <Foundation/NSSet.h>
+#import <Foundation/NSString.h>
+#import <Foundation/NSValue.h>
 
-//! Project version string for dummy.
-FOUNDATION_EXPORT const unsigned char dummyVersionString[];
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KotlinBase : NSObject
+- (instancetype)init __attribute__((unavailable));
++ (instancetype)new __attribute__((unavailable));
++ (void)initialize __attribute__((objc_requires_super));
+@end;
+
+@interface KotlinBase (KotlinBaseCopying) <NSCopying>
+@end;
+
+__attribute__((objc_runtime_name("KotlinMutableSet")))
+__attribute__((swift_name("KotlinMutableSet")))
+@interface DummyMutableSet<ObjectType> : NSMutableSet<ObjectType>
+@end;
+
+__attribute__((objc_runtime_name("KotlinMutableDictionary")))
+__attribute__((swift_name("KotlinMutableDictionary")))
+@interface DummyMutableDictionary<KeyType, ObjectType> : NSMutableDictionary<KeyType, ObjectType>
+@end;
+
+@interface NSError (NSErrorKotlinException)
+@property (readonly) id _Nullable kotlinException;
+@end;
+
+__attribute__((objc_runtime_name("KotlinNumber")))
+__attribute__((swift_name("KotlinNumber")))
+@interface DummyNumber : NSNumber
+- (instancetype)initWithChar:(char)value __attribute__((unavailable));
+- (instancetype)initWithUnsignedChar:(unsigned char)value __attribute__((unavailable));
+- (instancetype)initWithShort:(short)value __attribute__((unavailable));
+- (instancetype)initWithUnsignedShort:(unsigned short)value __attribute__((unavailable));
+- (instancetype)initWithInt:(int)value __attribute__((unavailable));
+- (instancetype)initWithUnsignedInt:(unsigned int)value __attribute__((unavailable));
+- (instancetype)initWithLong:(long)value __attribute__((unavailable));
+- (instancetype)initWithUnsignedLong:(unsigned long)value __attribute__((unavailable));
+- (instancetype)initWithLongLong:(long long)value __attribute__((unavailable));
+- (instancetype)initWithUnsignedLongLong:(unsigned long long)value __attribute__((unavailable));
+- (instancetype)initWithFloat:(float)value __attribute__((unavailable));
+- (instancetype)initWithDouble:(double)value __attribute__((unavailable));
+- (instancetype)initWithBool:(BOOL)value __attribute__((unavailable));
+- (instancetype)initWithInteger:(NSInteger)value __attribute__((unavailable));
+- (instancetype)initWithUnsignedInteger:(NSUInteger)value __attribute__((unavailable));
++ (instancetype)numberWithChar:(char)value __attribute__((unavailable));
++ (instancetype)numberWithUnsignedChar:(unsigned char)value __attribute__((unavailable));
++ (instancetype)numberWithShort:(short)value __attribute__((unavailable));
++ (instancetype)numberWithUnsignedShort:(unsigned short)value __attribute__((unavailable));
++ (instancetype)numberWithInt:(int)value __attribute__((unavailable));
++ (instancetype)numberWithUnsignedInt:(unsigned int)value __attribute__((unavailable));
++ (instancetype)numberWithLong:(long)value __attribute__((unavailable));
++ (instancetype)numberWithUnsignedLong:(unsigned long)value __attribute__((unavailable));
++ (instancetype)numberWithLongLong:(long long)value __attribute__((unavailable));
++ (instancetype)numberWithUnsignedLongLong:(unsigned long long)value __attribute__((unavailable));
++ (instancetype)numberWithFloat:(float)value __attribute__((unavailable));
++ (instancetype)numberWithDouble:(double)value __attribute__((unavailable));
++ (instancetype)numberWithBool:(BOOL)value __attribute__((unavailable));
++ (instancetype)numberWithInteger:(NSInteger)value __attribute__((unavailable));
++ (instancetype)numberWithUnsignedInteger:(NSUInteger)value __attribute__((unavailable));
+@end;
+
+__attribute__((objc_runtime_name("KotlinByte")))
+__attribute__((swift_name("KotlinByte")))
+@interface DummyByte : DummyNumber
+- (instancetype)initWithChar:(char)value;
++ (instancetype)numberWithChar:(char)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinUByte")))
+__attribute__((swift_name("KotlinUByte")))
+@interface DummyUByte : DummyNumber
+- (instancetype)initWithUnsignedChar:(unsigned char)value;
++ (instancetype)numberWithUnsignedChar:(unsigned char)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinShort")))
+__attribute__((swift_name("KotlinShort")))
+@interface DummyShort : DummyNumber
+- (instancetype)initWithShort:(short)value;
++ (instancetype)numberWithShort:(short)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinUShort")))
+__attribute__((swift_name("KotlinUShort")))
+@interface DummyUShort : DummyNumber
+- (instancetype)initWithUnsignedShort:(unsigned short)value;
++ (instancetype)numberWithUnsignedShort:(unsigned short)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinInt")))
+__attribute__((swift_name("KotlinInt")))
+@interface DummyInt : DummyNumber
+- (instancetype)initWithInt:(int)value;
++ (instancetype)numberWithInt:(int)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinUInt")))
+__attribute__((swift_name("KotlinUInt")))
+@interface DummyUInt : DummyNumber
+- (instancetype)initWithUnsignedInt:(unsigned int)value;
++ (instancetype)numberWithUnsignedInt:(unsigned int)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinLong")))
+__attribute__((swift_name("KotlinLong")))
+@interface DummyLong : DummyNumber
+- (instancetype)initWithLongLong:(long long)value;
++ (instancetype)numberWithLongLong:(long long)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinULong")))
+__attribute__((swift_name("KotlinULong")))
+@interface DummyULong : DummyNumber
+- (instancetype)initWithUnsignedLongLong:(unsigned long long)value;
++ (instancetype)numberWithUnsignedLongLong:(unsigned long long)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinFloat")))
+__attribute__((swift_name("KotlinFloat")))
+@interface DummyFloat : DummyNumber
+- (instancetype)initWithFloat:(float)value;
++ (instancetype)numberWithFloat:(float)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinDouble")))
+__attribute__((swift_name("KotlinDouble")))
+@interface DummyDouble : DummyNumber
+- (instancetype)initWithDouble:(double)value;
++ (instancetype)numberWithDouble:(double)value;
+@end;
+
+__attribute__((objc_runtime_name("KotlinBoolean")))
+__attribute__((swift_name("KotlinBoolean")))
+@interface DummyBoolean : DummyNumber
+- (instancetype)initWithBool:(BOOL)value;
++ (instancetype)numberWithBool:(BOOL)value;
+@end;
+
+NS_ASSUME_NONNULL_END
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Info.plist b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Info.plist
index bb36316..3d29f91 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Info.plist
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Info.plist
Binary files differ
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Modules/module.modulemap b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Modules/module.modulemap
index 9a96072..929996c 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Modules/module.modulemap
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Modules/module.modulemap
@@ -1,6 +1,6 @@
 framework module dummy {
-  umbrella header "dummy.h"
+    umbrella header "dummy.h"
 
-  export *
-  module * { export * }
-}
+    export *
+    module * { export * }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/dummy b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/dummy
old mode 100644
new mode 100755
index 99a9ede..5069c145
--- a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/dummy
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/dummy
Binary files differ