diff --git a/.gitignore b/.gitignore index 5111db4..a359d69 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ bin/ ### Mac OS ### .DS_Store + +### Android Studio ### +local.properties diff --git a/artifact-info-template/ArtifactInfo.kt b/artifact-info-template/ArtifactInfo.kt new file mode 100644 index 0000000..5297ed1 --- /dev/null +++ b/artifact-info-template/ArtifactInfo.kt @@ -0,0 +1,13 @@ +package $basePackage + +internal object ArtifactInfo { + const val GROUP = "$publishGroup" + const val VERSION = "$publishVersion" + + const val COMPILER_PLUGIN_ARTIFACT = "compiler-plugin" + const val GRADLE_PLUGIN_ARTIFACT = "gradle-plugin" + const val RUNTIME_ARTIFACT = "runtime" + + const val DEFAULT_TRACELOG_ENABLED = true + const val DEFAULT_TRACELOG_ANNOTATION = "dev/msfjarvis/tracelog/runtime/annotations/DebugLog" +} diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 5f160e2..348da1d 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -1,6 +1,18 @@ plugins { `kotlin-dsl` } -dependencies { - implementation(libs.android.gradle.plugin) - implementation(libs.kotlin.gradlePlugin) +dependencies { implementation(libs.kotlin.gradlePlugin.api) } + +kotlin.jvmToolchain(11) + +gradlePlugin { + plugins { + create("build") { + id = "dev.msfjarvis.tracelog.build" + implementationClass = "dev.msfjarvis.tracelog.build.TraceLogBuildPlugin" + } + create("settings") { + id = "dev.msfjarvis.tracelog.settings" + implementationClass = "dev.msfjarvis.tracelog.build.TraceLogSettingsPlugin" + } + } } diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index a009f83..c161c26 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -39,6 +39,6 @@ dependencyResolutionManagement { versionCatalogs { maybeCreate("libs").apply { from(files("../gradle/libs.versions.toml")) } } } -rootProject.name = "buildSrc" +rootProject.name = "build-logic" enableFeaturePreview("STABLE_CONFIGURATION_CACHE") diff --git a/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/ArtifactInfoCopyAction.kt b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/ArtifactInfoCopyAction.kt new file mode 100644 index 0000000..6cd7853 --- /dev/null +++ b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/ArtifactInfoCopyAction.kt @@ -0,0 +1,22 @@ +package dev.msfjarvis.tracelog.build + +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.api.tasks.Copy + +class ArtifactInfoCopyAction( + private val project: Project, + private val basePackage: String, +) : Action { + + override fun execute(t: Copy) { + t.expand( + mapOf( + "basePackage" to basePackage, + "publishGroup" to "${project.rootProject.findProperty("GROUP")}", + "publishVersion" to "${project.rootProject.findProperty("VERSION_NAME")}", + ) + ) + t.filteringCharset = "UTF-8" + } +} diff --git a/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildExtension.kt b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildExtension.kt new file mode 100644 index 0000000..70dd999 --- /dev/null +++ b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildExtension.kt @@ -0,0 +1,6 @@ +package dev.msfjarvis.tracelog.build + +interface TraceLogBuildExtension { + fun publishing() + fun generateArtifactInfo(basePackage: String) +} diff --git a/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildExtensionImpl.kt b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildExtensionImpl.kt new file mode 100644 index 0000000..4805ba9 --- /dev/null +++ b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildExtensionImpl.kt @@ -0,0 +1,43 @@ +package dev.msfjarvis.tracelog.build + +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.api.plugins.AppliedPlugin +import org.gradle.api.tasks.Copy +import org.gradle.api.tasks.SourceSetContainer +import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtensionConfig + +class TraceLogBuildExtensionImpl( + private val project: Project, +) : TraceLogBuildExtension { + override fun publishing() { + project.pluginManager.apply("com.vanniktech.maven.publish") + project.pluginManager.apply("org.jetbrains.dokka") + project.pluginManager.apply("org.jetbrains.kotlinx.binary-compatibility-validator") + + // Published modules should be explicit about their API visibility. + val kotlinPluginHandler = Action { + val kotlin = project.extensions.getByType( + KotlinTopLevelExtensionConfig::class.java + ) + kotlin.explicitApi() + } + project.pluginManager.withPlugin("org.jetbrains.kotlin.jvm", kotlinPluginHandler) + project.pluginManager.withPlugin("org.jetbrains.kotlin.multiplatform", kotlinPluginHandler) + } + + override fun generateArtifactInfo(basePackage: String) { + val generateArtifactInfoProvider = project.tasks.register( + "generateArtifactInfo", + Copy::class.java, + ArtifactInfoCopyAction(project, basePackage), + ) + generateArtifactInfoProvider.configure { + from(project.rootProject.layout.projectDirectory.dir("artifact-info-template")) + into(project.layout.buildDirectory.dir("generated/source/artifact-info-template/main")) + } + project.extensions.configure("sourceSets") { + getByName("main").java.srcDir(generateArtifactInfoProvider) + } + } +} diff --git a/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildPlugin.kt b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildPlugin.kt new file mode 100644 index 0000000..4fa2234 --- /dev/null +++ b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogBuildPlugin.kt @@ -0,0 +1,24 @@ +package dev.msfjarvis.tracelog.build + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.KotlinCompile + +class TraceLogBuildPlugin : Plugin { + override fun apply(target: Project) { + target.extensions.add( + TraceLogBuildExtension::class.java, + "traceLogBuild", + TraceLogBuildExtensionImpl(target) + ) + + commonKotlinConfiguration(target) + } + + private fun commonKotlinConfiguration(project: Project) { + project.tasks.withType>().configureEach { + kotlinOptions.freeCompilerArgs += "-progressive" + } + } +} diff --git a/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogSettingsPlugin.kt b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogSettingsPlugin.kt new file mode 100644 index 0000000..bea9483 --- /dev/null +++ b/build-logic/src/main/kotlin/dev/msfjarvis/tracelog/build/TraceLogSettingsPlugin.kt @@ -0,0 +1,12 @@ +package dev.msfjarvis.tracelog.build + +import org.gradle.api.Plugin +import org.gradle.api.initialization.Settings + +class TraceLogSettingsPlugin : Plugin { + override fun apply(target: Settings) { + target.gradle.allprojects { + pluginManager.apply("dev.msfjarvis.tracelog.build") + } + } +} diff --git a/build-logic/src/main/kotlin/tracelog-common.gradle.kts b/build-logic/src/main/kotlin/tracelog-common.gradle.kts deleted file mode 100644 index 3163111..0000000 --- a/build-logic/src/main/kotlin/tracelog-common.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -plugins { `maven-publish` } - -group = "dev.msfjarvis.tracelog" - -version = "1.0.0-SNAPSHOT" diff --git a/build-logic/src/main/kotlin/tracelog-jvm-library.gradle.kts b/build-logic/src/main/kotlin/tracelog-jvm-library.gradle.kts deleted file mode 100644 index 95ae42e..0000000 --- a/build-logic/src/main/kotlin/tracelog-jvm-library.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("org.jetbrains.kotlin.jvm") - id("tracelog-common") -} - -kotlin { - jvmToolchain(11) - explicitApi() -} diff --git a/build-logic/src/main/kotlin/tracelog-kmp-library.gradle.kts b/build-logic/src/main/kotlin/tracelog-kmp-library.gradle.kts deleted file mode 100644 index a120c75..0000000 --- a/build-logic/src/main/kotlin/tracelog-kmp-library.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -plugins { - id("org.jetbrains.kotlin.multiplatform") - id("com.android.library") - id("tracelog-common") -} - -kotlin { - jvmToolchain(11) - explicitApi() - jvm() - androidTarget() - iosX64() - iosArm64() - tvosX64() - tvosArm64() - watchosX64() - watchosArm32() - watchosArm64() - macosX64() - macosArm64() - iosSimulatorArm64() - watchosSimulatorArm64() - tvosSimulatorArm64() - mingwX64() - linuxX64() - androidNativeArm32() - androidNativeArm64() -} diff --git a/build.gradle.kts b/build.gradle.kts index 4d1e54e..7783dbe 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,17 @@ plugins { alias(libs.plugins.spotless) - id("tracelog-jvm-library") apply false - id("tracelog-kmp-library") apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.dokka) apply false + alias(libs.plugins.kotlinx.binaryCompatibilityValidator) apply false + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.kotlin.multiplatform) apply false + alias(libs.plugins.mavenPublish) apply false } spotless { kotlin { target("**/*.kt") - targetExclude("**/build/") + targetExclude("**/build/", "**/artifact-info-template/*") ktfmt().googleStyle() } kotlinGradle { diff --git a/compiler-plugin/api/compiler-plugin.api b/compiler-plugin/api/compiler-plugin.api new file mode 100644 index 0000000..83545b7 --- /dev/null +++ b/compiler-plugin/api/compiler-plugin.api @@ -0,0 +1,24 @@ +public final class dev/msfjarvis/tracelog/compiler/plugin/DebugLogTransformer : org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext { + public fun (Lorg/jetbrains/kotlin/backend/common/extensions/IrPluginContext;Lorg/jetbrains/kotlin/ir/symbols/IrClassSymbol;Lorg/jetbrains/kotlin/ir/symbols/IrSimpleFunctionSymbol;)V + public fun visitFunctionNew (Lorg/jetbrains/kotlin/ir/declarations/IrFunction;)Lorg/jetbrains/kotlin/ir/IrStatement; +} + +public final class dev/msfjarvis/tracelog/compiler/plugin/TracingCommandLineProcessor : org/jetbrains/kotlin/compiler/plugin/CommandLineProcessor { + public fun ()V + public fun getPluginId ()Ljava/lang/String; + public fun getPluginOptions ()Ljava/util/Collection; + public fun processOption (Lorg/jetbrains/kotlin/compiler/plugin/AbstractCliOption;Ljava/lang/String;Lorg/jetbrains/kotlin/config/CompilerConfiguration;)V +} + +public final class dev/msfjarvis/tracelog/compiler/plugin/TracingCompilerPluginRegistrar : org/jetbrains/kotlin/compiler/plugin/CompilerPluginRegistrar { + public fun ()V + public fun getSupportsK2 ()Z + public fun registerExtensions (Lorg/jetbrains/kotlin/compiler/plugin/CompilerPluginRegistrar$ExtensionStorage;Lorg/jetbrains/kotlin/config/CompilerConfiguration;)V +} + +public final class dev/msfjarvis/tracelog/compiler/plugin/TracingIrGenerationExtension : org/jetbrains/kotlin/backend/common/extensions/IrGenerationExtension { + public fun (Lorg/jetbrains/kotlin/cli/common/messages/MessageCollector;Ljava/lang/String;Ljava/lang/String;)V + public fun generate (Lorg/jetbrains/kotlin/ir/declarations/IrModuleFragment;Lorg/jetbrains/kotlin/backend/common/extensions/IrPluginContext;)V + public fun resolveSymbol (Lorg/jetbrains/kotlin/ir/symbols/IrSymbol;Lorg/jetbrains/kotlin/ir/builders/TranslationPluginContext;)Lorg/jetbrains/kotlin/ir/declarations/IrDeclaration; +} + diff --git a/compiler-plugin/build.gradle.kts b/compiler-plugin/build.gradle.kts index 053d6cc..a16051f 100644 --- a/compiler-plugin/build.gradle.kts +++ b/compiler-plugin/build.gradle.kts @@ -1,17 +1,15 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent plugins { - id("tracelog-jvm-library") + alias(libs.plugins.kotlin.jvm) alias(libs.plugins.ksp) - alias(libs.plugins.buildconfig) } -buildConfig { - packageName("${group}.compiler.plugin") - useKotlinOutput { internalVisibility = true } - buildConfigField("String", "KOTLIN_PLUGIN_GROUP", "\"${project.group}\"") - buildConfigField("String", "KOTLIN_PLUGIN_NAME", "\"${project.name}\"") - buildConfigField("String", "KOTLIN_PLUGIN_VERSION", "\"${project.version}\"") +kotlin.jvmToolchain(11) + +traceLogBuild { + publishing() + generateArtifactInfo("dev.msfjarvis.tracelog") } tasks.test.configure { @@ -20,7 +18,6 @@ tasks.test.configure { } dependencies { - implementation(platform(embeddedKotlin("bom"))) compileOnly(libs.kotlin.compiler) ksp(libs.auto.ksp) compileOnly(libs.auto.annotations) diff --git a/compiler-plugin/gradle.properties b/compiler-plugin/gradle.properties new file mode 100644 index 0000000..2f7d75d --- /dev/null +++ b/compiler-plugin/gradle.properties @@ -0,0 +1 @@ +POM_ARTIFACT_ID=compiler-plugin diff --git a/compiler-plugin/src/main/kotlin/dev/msfjarvis/tracelog/compiler/plugin/TracingCommandLineProcessor.kt b/compiler-plugin/src/main/kotlin/dev/msfjarvis/tracelog/compiler/plugin/TracingCommandLineProcessor.kt index 84c7cb3..649a543 100644 --- a/compiler-plugin/src/main/kotlin/dev/msfjarvis/tracelog/compiler/plugin/TracingCommandLineProcessor.kt +++ b/compiler-plugin/src/main/kotlin/dev/msfjarvis/tracelog/compiler/plugin/TracingCommandLineProcessor.kt @@ -1,6 +1,7 @@ package dev.msfjarvis.tracelog.compiler.plugin import com.google.auto.service.AutoService +import dev.msfjarvis.tracelog.ArtifactInfo import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption import org.jetbrains.kotlin.compiler.plugin.CliOption import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor @@ -25,7 +26,7 @@ public class TracingCommandLineProcessor : CommandLineProcessor { val OPTION_ANNOTATION_NAME = CliOption( optionName = "debugAnnotation", - valueDescription = "${BuildConfig.KOTLIN_PLUGIN_GROUP}.runtime.annotations.DebugLog", + valueDescription = ArtifactInfo.DEFAULT_TRACELOG_ANNOTATION, description = ANNOTATION_NAME.toString(), required = true, allowMultipleOccurrences = false, diff --git a/gradle-plugin/artifact-info-template b/gradle-plugin/artifact-info-template new file mode 120000 index 0000000..eb792e8 --- /dev/null +++ b/gradle-plugin/artifact-info-template @@ -0,0 +1 @@ +../artifact-info-template \ No newline at end of file diff --git a/gradle-plugin/build.gradle.kts b/gradle-plugin/build.gradle.kts index 14d6ad8..645ef15 100644 --- a/gradle-plugin/build.gradle.kts +++ b/gradle-plugin/build.gradle.kts @@ -1,25 +1,43 @@ +@file:Suppress("UnstableApiUsage") + +import java.util.Properties + plugins { - id("tracelog-jvm-library") + alias(libs.plugins.kotlin.jvm) `java-gradle-plugin` - alias(libs.plugins.buildconfig) alias(libs.plugins.ksp) + alias(libs.plugins.mavenPublish).apply(false) + alias(libs.plugins.dokka).apply(false) + alias(libs.plugins.kotlinx.binaryCompatibilityValidator).apply(false) } -buildConfig { - packageName("${group}.gradle.plugin") - useKotlinOutput { internalVisibility = true } - buildConfigField("String", "KOTLIN_PLUGIN_GROUP", "\"${project.group}\"") - buildConfigField("String", "KOTLIN_PLUGIN_NAME", "\"${project.name}\"") - buildConfigField("String", "KOTLIN_PLUGIN_VERSION", "\"${project.version}\"") +kotlin.jvmToolchain(11) + +fun loadParentProperties() { + val properties = Properties() + file("../gradle.properties").inputStream().use { properties.load(it) } + + properties.forEach { (k, v) -> + val key = k.toString() + val value = providers.gradleProperty(name).getOrElse(v.toString()) + extra.set(key, value) + } +} + +loadParentProperties() + +traceLogBuild { + publishing() + generateArtifactInfo("dev.msfjarvis.tracelog") } gradlePlugin.plugins.register("dev.msfjarvis.tracelog") { - id = group.toString() - implementationClass = "$group.gradle.plugin.TraceLogGradlePlugin" + id = properties["GROUP"].toString() + implementationClass = "${properties["GROUP"]}.gradle.plugin.TraceLogGradlePlugin" } dependencies { - implementation(platform(embeddedKotlin("bom"))) + compileOnly(gradleKotlinDsl()) compileOnly(libs.auto.annotations) compileOnly(libs.kotlin.gradlePlugin.api) compileOnly(libs.kotlin.stdlib) diff --git a/gradle-plugin/gradle.properties b/gradle-plugin/gradle.properties index 0d6aa7b..561cca9 100644 --- a/gradle-plugin/gradle.properties +++ b/gradle-plugin/gradle.properties @@ -1 +1,2 @@ +POM_ARTIFACT_ID=gradle-plugin kotlin.stdlib.default.dependency=false diff --git a/gradle-plugin/settings.gradle.kts b/gradle-plugin/settings.gradle.kts index 69fc3e4..0d2d3bb 100644 --- a/gradle-plugin/settings.gradle.kts +++ b/gradle-plugin/settings.gradle.kts @@ -48,6 +48,8 @@ dependencyResolutionManagement { versionCatalogs { create("libs") { from(files("../gradle/libs.versions.toml")) } } } +plugins { id("dev.msfjarvis.tracelog.settings") } + rootProject.name = "TraceLog-Gradle-Plugin" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") diff --git a/gradle-plugin/src/main/kotlin/dev/msfjarvis/tracelog/gradle/plugin/TraceLogExtension.kt b/gradle-plugin/src/main/kotlin/dev/msfjarvis/tracelog/gradle/plugin/TraceLogExtension.kt new file mode 100644 index 0000000..b9ce377 --- /dev/null +++ b/gradle-plugin/src/main/kotlin/dev/msfjarvis/tracelog/gradle/plugin/TraceLogExtension.kt @@ -0,0 +1,10 @@ +package dev.msfjarvis.tracelog.gradle.plugin + +import org.gradle.api.provider.Property + +public abstract class TraceLogExtension { + + public abstract val annotationClass: Property + + public abstract val loggerFunction: Property +} diff --git a/gradle-plugin/src/main/kotlin/dev/msfjarvis/tracelog/gradle/plugin/TraceLogGradlePlugin.kt b/gradle-plugin/src/main/kotlin/dev/msfjarvis/tracelog/gradle/plugin/TraceLogGradlePlugin.kt index 16951ed..ed4b92a 100644 --- a/gradle-plugin/src/main/kotlin/dev/msfjarvis/tracelog/gradle/plugin/TraceLogGradlePlugin.kt +++ b/gradle-plugin/src/main/kotlin/dev/msfjarvis/tracelog/gradle/plugin/TraceLogGradlePlugin.kt @@ -1,31 +1,75 @@ package dev.msfjarvis.tracelog.gradle.plugin import com.google.auto.service.AutoService +import dev.msfjarvis.tracelog.ArtifactInfo import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.getByType import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet.Companion.COMMON_MAIN_SOURCE_SET_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetContainer import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact import org.jetbrains.kotlin.gradle.plugin.SubpluginOption @AutoService(Plugin::class) public class TraceLogGradlePlugin : KotlinCompilerPluginSupportPlugin { - override fun applyToCompilation( - kotlinCompilation: KotlinCompilation<*> - ): Provider> { - return kotlinCompilation.target.project.provider { - buildList { add(SubpluginOption(key = "loggerFunction", value = "kotlin.io.println")) } + override fun apply(target: Project) { + val extension = target.extensions.create("traceLog") + extension.loggerFunction.convention("kotlin.io.println") + extension.annotationClass.convention(ArtifactInfo.DEFAULT_TRACELOG_ANNOTATION) + + target.afterEvaluate { + val useLocal = + it.rootProject.findProperty("tracelog.internal.project-dependency").toString().toBoolean() + val annotationDependency = + when (extension.annotationClass.get()) { + ArtifactInfo.DEFAULT_TRACELOG_ANNOTATION -> + if (useLocal) { + it.project(":runtime") + } else { + "dev.msfjarvis.tracelog:runtime:1.0.0-SNAPSHOT" + } + else -> null + } + if (annotationDependency != null) { + if (target.plugins.hasPlugin("org.jetbrains.kotlin.multiplatform")) { + val kotlin = target.extensions.getByName("kotlin") as KotlinSourceSetContainer + kotlin.sourceSets.getByName(COMMON_MAIN_SOURCE_SET_NAME) { sourceSet -> + sourceSet.dependencies { implementation(annotationDependency) } + } + } else { + target.dependencies.add(IMPLEMENTATION_CONFIGURATION_NAME, annotationDependency) + } + } } } - override fun getCompilerPluginId(): String = BuildConfig.KOTLIN_PLUGIN_GROUP + override fun applyToCompilation( + kotlinCompilation: KotlinCompilation<*> + ): Provider> { + val project = kotlinCompilation.target.project + val extension = project.extensions.getByType() + + return kotlinCompilation.target.project.provider { + buildList { + add(SubpluginOption(key = "loggerFunction", value = extension.loggerFunction.get())) + add(SubpluginOption(key = "debugAnnotation", value = extension.annotationClass.get())) + } + } + } + + override fun getCompilerPluginId(): String = ArtifactInfo.GROUP override fun getPluginArtifact(): SubpluginArtifact = SubpluginArtifact( - groupId = BuildConfig.KOTLIN_PLUGIN_GROUP, - artifactId = BuildConfig.KOTLIN_PLUGIN_NAME, - version = BuildConfig.KOTLIN_PLUGIN_VERSION, + groupId = ArtifactInfo.GROUP, + artifactId = ArtifactInfo.COMPILER_PLUGIN_ARTIFACT, + version = ArtifactInfo.VERSION, ) override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean = true diff --git a/gradle.properties b/gradle.properties index 2a41ee6..be49790 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,3 +19,4 @@ POM_LICENCE_DIST=repo POM_DEVELOPER_ID=msfjarvis POM_DEVELOPER_NAME=Harsh Shandilya POM_DEVELOPER_URL=https://msfjarvis.dev +tracelog.internal.project-dependency=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f7989c4..0595a2c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,17 @@ [versions] +kotlin = "1.9.0" junit = "5.10.0" [plugins] +android-library = { id = "com.android.library", version = "8.1.1" } buildconfig = "com.github.gmazzo.buildconfig:4.1.2" +dokka = { id = "org.jetbrains.dokka", version = "1.8.20" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +kotlinx-binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.13.2" } ksp = "com.google.devtools.ksp:1.9.0-1.0.13" +mavenPublish = { id = "com.vanniktech.maven.publish", version = "0.25.3" } spotless = "com.diffplug.spotless:6.21.0" [libraries] @@ -14,9 +22,9 @@ junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.re junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" } junit-legacy = "junit:junit:4.13.2" kct = "dev.zacsweers.kctfork:core:0.3.2" -kotlin-compiler = { module = "org.jetbrains.kotlin:kotlin-compiler-embeddable" } -kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin" } -kotlin-gradlePlugin-api = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin-api" } -kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib" } +kotlin-compiler = { module = "org.jetbrains.kotlin:kotlin-compiler-embeddable", version.ref = "kotlin" } +kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +kotlin-gradlePlugin-api = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin-api", version.ref = "kotlin" } +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } mordant = "com.github.ajalt.mordant:mordant:2.1.0" truth = "com.google.truth:truth:1.1.5" diff --git a/runtime/api/android/runtime.api b/runtime/api/android/runtime.api new file mode 100644 index 0000000..cb6375c --- /dev/null +++ b/runtime/api/android/runtime.api @@ -0,0 +1,7 @@ +public abstract interface class dev/msfjarvis/tracelog/runtime/TracingConsumer { + public abstract fun trace (JLjava/lang/String;Ljava/lang/String;B)V +} + +public abstract interface annotation class dev/msfjarvis/tracelog/runtime/annotations/DebugLog : java/lang/annotation/Annotation { +} + diff --git a/runtime/api/jvm/runtime.api b/runtime/api/jvm/runtime.api new file mode 100644 index 0000000..cb6375c --- /dev/null +++ b/runtime/api/jvm/runtime.api @@ -0,0 +1,7 @@ +public abstract interface class dev/msfjarvis/tracelog/runtime/TracingConsumer { + public abstract fun trace (JLjava/lang/String;Ljava/lang/String;B)V +} + +public abstract interface annotation class dev/msfjarvis/tracelog/runtime/annotations/DebugLog : java/lang/annotation/Annotation { +} + diff --git a/runtime/build.gradle.kts b/runtime/build.gradle.kts index 62ac957..74d1fd6 100644 --- a/runtime/build.gradle.kts +++ b/runtime/build.gradle.kts @@ -1,4 +1,31 @@ -plugins { id("tracelog-kmp-library") } +plugins { + alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.android.library) +} + +traceLogBuild { publishing() } + +kotlin { + jvmToolchain(11) + jvm() + androidTarget() + iosX64() + iosArm64() + tvosX64() + tvosArm64() + watchosX64() + watchosArm32() + watchosArm64() + macosX64() + macosArm64() + iosSimulatorArm64() + watchosSimulatorArm64() + tvosSimulatorArm64() + mingwX64() + linuxX64() + androidNativeArm32() + androidNativeArm64() +} android { compileSdk = 33 diff --git a/runtime/gradle.properties b/runtime/gradle.properties new file mode 100644 index 0000000..b43e909 --- /dev/null +++ b/runtime/gradle.properties @@ -0,0 +1 @@ +POM_ARTIFACT_ID=runtime diff --git a/sample-jvm/build.gradle.kts b/sample-jvm/build.gradle.kts index 11c2be2..da1df8a 100644 --- a/sample-jvm/build.gradle.kts +++ b/sample-jvm/build.gradle.kts @@ -1,24 +1,16 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { - id("tracelog-jvm-library") + alias(libs.plugins.kotlin.jvm) + id("dev.msfjarvis.tracelog") application } +kotlin.jvmToolchain(11) + +traceLog { loggerFunction.set("dev.msfjarvis.tracelog.sample.recordMessage") } + application { mainClass.set("dev.msfjarvis.tracelog.sample.MainKt") } -tasks.withType().configureEach { - compilerOptions.freeCompilerArgs.addAll( - "-P", - "plugin:dev.msfjarvis.tracelog:loggerFunction=dev.msfjarvis.tracelog.sample.recordMessage", - "-P", - "plugin:dev.msfjarvis.tracelog:debugAnnotation=dev/msfjarvis/tracelog/runtime/annotations/DebugLog", - ) -} - dependencies { - implementation(platform(embeddedKotlin("bom"))) - kotlinCompilerPluginClasspath(projects.compilerPlugin) implementation(projects.runtime) implementation(libs.mordant) } diff --git a/sample-kmp/build.gradle.kts b/sample-kmp/build.gradle.kts index 0ab4015..43ecf79 100644 --- a/sample-kmp/build.gradle.kts +++ b/sample-kmp/build.gradle.kts @@ -1,17 +1,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithHostTests -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -plugins { kotlin("multiplatform") } - -tasks.withType().configureEach { - compilerOptions.freeCompilerArgs.addAll( - "-P", - "plugin:dev.msfjarvis.tracelog:loggerFunction=recordMessage", - "-P", - "plugin:dev.msfjarvis.tracelog:debugAnnotation=dev/msfjarvis/tracelog/runtime/annotations/DebugLog", - ) +plugins { + alias(libs.plugins.kotlin.multiplatform) + id("dev.msfjarvis.tracelog") } +traceLog { loggerFunction.set("recordMessage") } + fun KotlinNativeTargetWithHostTests.configureTarget() = binaries { executable { entryPoint = "main" } } @@ -22,8 +17,6 @@ kotlin { macosX64 { configureTarget() } dependencies { - commonMainImplementation(platform(embeddedKotlin("bom"))) - kotlinCompilerPluginClasspath(projects.compilerPlugin) commonMainImplementation(projects.runtime) commonMainImplementation(libs.mordant) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 066ccf4..a7c988b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,6 +20,7 @@ pluginManagement { includeGroup("com.android.tools.lint") includeGroup("com.android.tools.utp") includeGroup("com.google.testing.platform") + includeModule("com.android.library", "com.android.library.gradle.plugin") includeModule("com.android.tools", "annotations") includeModule("com.android.tools", "common") includeModule("com.android.tools", "desugar_jdk_libs") @@ -61,10 +62,13 @@ dependencyResolutionManagement { includeGroup("com.android.tools.lint") } } + mavenLocal { content { includeModule("dev.msfjarvis.tracelog", "compiler-plugin") } } mavenCentral() } } +plugins { id("dev.msfjarvis.tracelog.settings") } + rootProject.name = "TraceLog" include(