package mihon.buildlogic import com.android.build.api.dsl.CommonExtension import org.gradle.accessors.dm.LibrariesForAndroidx import org.gradle.accessors.dm.LibrariesForCompose import org.gradle.accessors.dm.LibrariesForKotlinx import org.gradle.accessors.dm.LibrariesForLibs import org.gradle.api.Project import org.gradle.api.tasks.testing.Test import org.gradle.api.tasks.testing.logging.TestLogEvent import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.the import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.File val Project.androidx get() = the() val Project.compose get() = the() val Project.kotlinx get() = the() val Project.libs get() = the() internal fun Project.configureAndroid(commonExtension: CommonExtension<*, *, *, *, *, *>) { commonExtension.apply { compileSdk = AndroidConfig.COMPILE_SDK defaultConfig { minSdk = AndroidConfig.MIN_SDK ndk { version = AndroidConfig.NDK } } compileOptions { sourceCompatibility = AndroidConfig.JavaVersion targetCompatibility = AndroidConfig.JavaVersion isCoreLibraryDesugaringEnabled = true } } tasks.withType().configureEach { compilerOptions { jvmTarget.set(AndroidConfig.JvmTarget) freeCompilerArgs.addAll( "-Xcontext-receivers", "-opt-in=kotlin.RequiresOptIn", ) // Treat all Kotlin warnings as errors (disabled by default) // Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties val warningsAsErrors: String? by project allWarningsAsErrors.set(warningsAsErrors.toBoolean()) } } dependencies { "coreLibraryDesugaring"(libs.desugar) } } internal fun Project.configureCompose(commonExtension: CommonExtension<*, *, *, *, *, *>) { pluginManager.apply(kotlinx.plugins.compose.compiler.get().pluginId) commonExtension.apply { buildFeatures { compose = true } dependencies { "implementation"(platform(compose.bom)) } } extensions.configure { featureFlags.set(setOf(ComposeFeatureFlag.OptimizeNonSkippingGroups)) val enableMetrics = project.providers.gradleProperty("enableComposeCompilerMetrics").orNull.toBoolean() val enableReports = project.providers.gradleProperty("enableComposeCompilerReports").orNull.toBoolean() val rootBuildDir = rootProject.layout.buildDirectory.asFile.get() val relativePath = projectDir.relativeTo(rootDir) if (enableMetrics) { rootBuildDir.resolve("compose-metrics").resolve(relativePath).let(metricsDestination::set) } if (enableReports) { rootBuildDir.resolve("compose-reports").resolve(relativePath).let(reportsDestination::set) } } } internal fun Project.configureTest() { tasks.withType { useJUnitPlatform() testLogging { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) } } } val Project.generatedBuildDir: File get() = project.layout.buildDirectory.asFile.get().resolve("generated/mihon")