import org.gradle.api.NamedDomainObjectContainer import org.gradle.nativeplatform.platform.internal.Architectures import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import java.io.File /** * Created by Ugljesa Jovanovic * ugljesa.jovanovic@ionspin.com * on 30-May-2020 */ fun isInIdea() = System.getProperty("idea.active") == "true" fun isInGitlabCi() = System.getenv("GITLAB_CI") == "true" fun getProjectPath() : String { val path = System.getProperty("PROJECT_PATH") return path } fun getHostOsName(): String { val target = System.getProperty("os.name") if (target == "Linux") return "linux" if (target.startsWith("Windows")) return "windows" if (target.startsWith("Mac")) return "macos" return "unknown" } fun getHostArchitecture(): String { val architecture = System.getProperty("os.arch") DefaultNativePlatform.getCurrentArchitecture() println("Arch: $architecture") val resolvedArch = Architectures.forInput(architecture).name println("Resolved arch: $resolvedArch") return resolvedArch } fun KotlinMultiplatformExtension.isRunningInIdea(block: KotlinMultiplatformExtension.() -> Unit) { if (isInIdea()) { block(this) } } fun KotlinMultiplatformExtension.isNotRunningInIdea(block: KotlinMultiplatformExtension.() -> Unit) { if (!isInIdea()) { block(this) } } fun KotlinMultiplatformExtension.isRunningInGitlabCi(block: KotlinMultiplatformExtension.() -> Unit) { if (isInGitlabCi()) { block(this) } } fun KotlinMultiplatformExtension.runningOnLinuxx86_64(block: KotlinMultiplatformExtension.() -> Unit) { if (getHostOsName() == "linux" && getHostArchitecture() == "x86-64") { block(this) } } fun KotlinMultiplatformExtension.runningOnLinuxArm64(block: KotlinMultiplatformExtension.() -> Unit) { if (getHostOsName() == "linux" && getHostArchitecture() == "aarch64") { block(this) } } fun KotlinMultiplatformExtension.runningOnLinuxArm32(block: KotlinMultiplatformExtension.() -> Unit) { if (getHostOsName() == "linux" && getHostArchitecture() == "arm-v7") { block(this) } } fun KotlinMultiplatformExtension.runningOnMacos(block: KotlinMultiplatformExtension.() -> Unit) { if (getHostOsName() == "macos") { block(this) } } fun KotlinMultiplatformExtension.runningOnWindows(block: KotlinMultiplatformExtension.() -> Unit) { if (getHostOsName() == "windows") { block(this) } } fun independentDependencyBlock(nativeDeps: KotlinDependencyHandler.() -> Unit): KotlinDependencyHandler.() -> Unit { return nativeDeps } /** * On mac when two targets that have the same parent source set have cinterops defined, gradle creates a "common" * target task for that source set metadata, even though it's a native source set, to work around that, we create * an intermediary source set with the same set of dependancies * */ fun NamedDomainObjectContainer.createWorkaroundNativeMainSourceSet( name: String, nativeDeps: KotlinDependencyHandler.() -> Unit ): KotlinSourceSet { return create("${name}Workaround") { if (!isInIdea()) { kotlin.srcDir("src/nativeMain") dependencies { nativeDeps.invoke(this) } } } }