Wizard: fix not created by default xcode framework in shared module

the runForXcode task is not generating xcode framework
if there is no source files in shared module
This commit is contained in:
Ilya Kirillov
2020-04-27 17:42:29 +03:00
parent 47125553cb
commit 6a9a97006b
5 changed files with 51 additions and 8 deletions
@@ -0,0 +1,2 @@
// This file is needed because the packForXcode task requires the source code to be present to generate the XCode framework.
// Feel free to remove this file as soon as you have created some code in this source set.
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
interface NativeTargetConfigurator : TargetConfigurator { interface NativeTargetConfigurator : TargetConfigurator {
val isDesktopTarget: Boolean val isDesktopTarget: Boolean
val isIosTarget: Boolean
} }
class RealNativeTargetConfigurator private constructor( class RealNativeTargetConfigurator private constructor(
@@ -25,6 +26,9 @@ class RealNativeTargetConfigurator private constructor(
override val isDesktopTarget: Boolean override val isDesktopTarget: Boolean
get() = moduleSubType.isNativeDesktop get() = moduleSubType.isNativeDesktop
override val isIosTarget: Boolean
get() = moduleSubType.isIOS
override fun createInnerTargetIrs(reader: Reader, module: Module): List<BuildSystemIR> = if (moduleSubType.isIOS) irsList { override fun createInnerTargetIrs(reader: Reader, module: Module): List<BuildSystemIR> = if (moduleSubType.isIOS) irsList {
"binaries" { "binaries" {
"framework" { "framework" {
@@ -45,6 +49,7 @@ class RealNativeTargetConfigurator private constructor(
object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenceTargetConfigurator { object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenceTargetConfigurator {
override val moduleType = ModuleType.native override val moduleType = ModuleType.native
override val isDesktopTarget: Boolean = true override val isDesktopTarget: Boolean = true
override val isIosTarget: Boolean = false
@NonNls @NonNls
override val id = "nativeForCurrentSystem" override val id = "nativeForCurrentSystem"
@@ -124,7 +124,14 @@ class ModulesToIRsConverter(
with(dependencyType) { with(dependencyType) {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
with(unsafeSettingWriter) { runArbitraryTask(module, to, data).ensure() } with(unsafeSettingWriter) {
runArbitraryTask(
module,
to,
to.path.considerSingleRootModuleMode(data.isSingleRootModuleMode).asPath(),
data
).ensure()
}
irsToAddToModules.getOrPut(to) { mutableListOf() } += createToIRs(module, to, data).get() irsToAddToModules.getOrPut(to) { mutableListOf() } += createToIRs(module, to, data).get()
createDependencyIrs(module, to, data) createDependencyIrs(module, to, data)
} }
@@ -17,7 +17,11 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.isIOS import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.isIOS
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
import kotlin.collections.buildList import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
import java.nio.file.Path
import kotlin.reflect.KClass import kotlin.reflect.KClass
sealed class ModuleDependencyType( sealed class ModuleDependencyType(
@@ -25,7 +29,11 @@ sealed class ModuleDependencyType(
val to: KClass<out ModuleConfigurator> val to: KClass<out ModuleConfigurator>
) { ) {
fun accepts(from: Module, to: Module) = fun accepts(from: Module, to: Module) =
this.from.isInstance(from.configurator) && this.to.isInstance(to.configurator) this.from.isInstance(from.configurator)
&& this.to.isInstance(to.configurator)
&& additionalAcceptanceChecker(from, to)
open fun additionalAcceptanceChecker(from: Module, to: Module) = true
open fun createDependencyIrs(from: Module, to: Module, data: ModulesToIrConversionData): List<BuildSystemIR> { open fun createDependencyIrs(from: Module, to: Module, data: ModulesToIrConversionData): List<BuildSystemIR> {
val path = to.path val path = to.path
@@ -42,7 +50,12 @@ sealed class ModuleDependencyType(
}.asSingletonList() }.asSingletonList()
} }
open fun SettingsWriter.runArbitraryTask(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<Unit> = open fun SettingsWriter.runArbitraryTask(
from: Module,
to: Module,
toModulePath: Path,
data: ModulesToIrConversionData
): TaskResult<Unit> =
UNIT_SUCCESS UNIT_SUCCESS
open fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<List<BuildSystemIR>> = open fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<List<BuildSystemIR>> =
@@ -68,18 +81,31 @@ sealed class ModuleDependencyType(
override fun SettingsWriter.runArbitraryTask( override fun SettingsWriter.runArbitraryTask(
from: Module, from: Module,
to: Module, to: Module,
toModulePath: Path,
data: ModulesToIrConversionData data: ModulesToIrConversionData
): TaskResult<Unit> = withSettingsOf(from) { ): TaskResult<Unit> = withSettingsOf(from) {
IOSSinglePlatformModuleConfigurator.dependentModule.reference IOSSinglePlatformModuleConfigurator.dependentModule.reference
.setValue(IOSSinglePlatformModuleConfigurator.DependentModuleReference(to)) .setValue(IOSSinglePlatformModuleConfigurator.DependentModuleReference(to))
UNIT_SUCCESS val dummyFilePath = Defaults.SRC_DIR / "${to.iosTargetSafe()!!.name}Main" / to.configurator.kotlinDirectoryName / "dummyFile.kt"
TemplatesPlugin::addFileTemplate.execute(
FileTemplate(
FileTemplateDescriptor("ios/dummyFile.kt", dummyFilePath),
projectPath / toModulePath
)
)
}
override fun additionalAcceptanceChecker(from: Module, to: Module): Boolean =
to.iosTargetSafe() != null
private fun Module.iosTargetSafe(): Module? = subModules.firstOrNull { module ->
module.configurator.safeAs<NativeTargetConfigurator>()?.isIosTarget == true
} }
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
override fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<List<BuildSystemIR>> { override fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<List<BuildSystemIR>> {
val iosTargetName = to.subModules.firstOrNull { module -> val iosTargetName = to.iosTargetSafe()?.name
module.configurator.safeAs<SimpleTargetConfigurator>()?.moduleSubType?.isIOS == true ?: return Failure(InvalidModuleDependencyError(from, to, "Module ${to.name} should contain at least one iOS target"))
}?.name ?: return Failure(InvalidModuleDependencyError(from, to, "Module ${to.name} should contain at least one iOS target"))
return irsList { return irsList {
@@ -9,11 +9,14 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import java.nio.file.Paths
inline class ModulePath(val parts: List<String>) { inline class ModulePath(val parts: List<String>) {
constructor(path: String) : this(path.trim().split('.')) constructor(path: String) : this(path.trim().split('.'))
fun asString(separator: String = ".") = parts.joinToString(separator) fun asString(separator: String = ".") = parts.joinToString(separator)
fun asPath() = Paths.get(parts.first(), *parts.subList(1, parts.size).toTypedArray())
override fun toString(): String = asString() override fun toString(): String = asString()
companion object { companion object {