diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ce74a90..8c3e82c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,7 +13,9 @@ application { applicationName = "gradle2nix" applicationDefaultJvmArgs += "-Dorg.nixos.gradle2nix.initScript=@APP_HOME@/gradle/init.gradle" applicationDistribution - .from(tasks.getByPath(":plugin:shadowJar")) + .from( + tasks.getByPath(":plugin:shadowJar"), + project(":plugin").file("src/main/resources/init.gradle")) .into("gradle") .rename("plugin.*\\.jar", "plugin.jar") } diff --git a/app/src/dist/gradle/init.gradle b/app/src/dist/gradle/init.gradle index f0c230f..7516f42 100644 --- a/app/src/dist/gradle/init.gradle +++ b/app/src/dist/gradle/init.gradle @@ -1,3 +1,5 @@ +package org.nixos.gradle2nix + initscript { dependencies { classpath files("plugin.jar") diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 24a63e1..ba3912a 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -40,6 +40,11 @@ tasks { kotlinDsl = true } + register("gradle2nixTest", Test::class) { + dependsOn(gradleTest) + + } + gradleTestGenerator { dependsOn(shadowJar) doLast { diff --git a/plugin/src/gradleTest/projectWithBuildSrc/build.gradle b/plugin/src/gradleTest/projectWithBuildSrc/build.gradle new file mode 100644 index 0000000..1a29485 --- /dev/null +++ b/plugin/src/gradleTest/projectWithBuildSrc/build.gradle @@ -0,0 +1,3 @@ +task runGradleTest { + dependsOn 'nixGradleEnv' +} \ No newline at end of file diff --git a/plugin/src/gradleTest/projectWithBuildSrc/build.gradle.kts b/plugin/src/gradleTest/projectWithBuildSrc/build.gradle.kts new file mode 100644 index 0000000..c77bb76 --- /dev/null +++ b/plugin/src/gradleTest/projectWithBuildSrc/build.gradle.kts @@ -0,0 +1,3 @@ +tasks.register("runGradleTest") { + dependsOn("nixGradleEnv") +} diff --git a/plugin/src/gradleTest/projectWithBuildSrc/buildSrc/build.gradle b/plugin/src/gradleTest/projectWithBuildSrc/buildSrc/build.gradle new file mode 100644 index 0000000..30b6e18 --- /dev/null +++ b/plugin/src/gradleTest/projectWithBuildSrc/buildSrc/build.gradle @@ -0,0 +1,10 @@ +apply plugin: "java" + +repositories { + jcenter() +} + +dependencies { + implementation("com.squareup.okio:okio:2.2.2") + implementation("com.squareup.moshi:moshi:1.8.0") +} diff --git a/plugin/src/gradleTest/projectWithBuildSrc/buildSrc/settings.gradle b/plugin/src/gradleTest/projectWithBuildSrc/buildSrc/settings.gradle new file mode 100644 index 0000000..e69de29 diff --git a/plugin/src/main/kotlin/org/nixos/gradle2nix/Gradle2NixPlugin.kt b/plugin/src/main/kotlin/org/nixos/gradle2nix/Gradle2NixPlugin.kt index 6d40da9..f97e0b0 100644 --- a/plugin/src/main/kotlin/org/nixos/gradle2nix/Gradle2NixPlugin.kt +++ b/plugin/src/main/kotlin/org/nixos/gradle2nix/Gradle2NixPlugin.kt @@ -45,6 +45,22 @@ open class Gradle2NixPlugin : Plugin { outputDir.set(extension.outputDir) } + val buildSrcDir = rootProject.projectDir.resolve("buildSrc") + if (buildSrcDir.exists() && buildSrcDir.isDirectory) { + val buildSrcEnv = + rootProject.tasks.register("nixBuildSrcEnv", NixBuildSrcEnv::class) { + dir = buildSrcDir + val buildFile = buildSrcDir.listFiles().let { files -> + files.find { it.name == "build.gradle.kts" } ?: + files.find { it.name == "build.gradle" } + } + if (buildFile != null) this.buildFile = buildFile + } + gradleEnv.configure { + dependsOn(buildSrcEnv) + } + } + val pluginEnv = rootProject.tasks.register("nixPluginEnv", NixPluginEnv::class, pluginRequests) gradleEnv.configure { @@ -115,6 +131,10 @@ open class Gradle2NixPlugin : Plugin { } } +internal val pluginJar by lazy { + File(Gradle2NixPlugin::class.java.protectionDomain.codeSource.location.toURI()).absoluteFile +} + internal val moshi by lazy { Moshi.Builder().build() } open class Gradle2NixExtension(project: Project, defaultConfigurations: List) { diff --git a/plugin/src/main/kotlin/org/nixos/gradle2nix/GradleCompat.kt b/plugin/src/main/kotlin/org/nixos/gradle2nix/GradleCompat.kt index b95107d..70117a2 100644 --- a/plugin/src/main/kotlin/org/nixos/gradle2nix/GradleCompat.kt +++ b/plugin/src/main/kotlin/org/nixos/gradle2nix/GradleCompat.kt @@ -1,5 +1,6 @@ package org.nixos.gradle2nix +import org.gradle.api.Project import org.gradle.api.file.Directory import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.RegularFile @@ -67,3 +68,21 @@ internal fun RegularFileProperty.conventionCompat( apply { set(valueProvider) } } } + +@Suppress("DEPRECATION") +internal fun Project.directoryPropertyCompat(): DirectoryProperty { + return if (versionAtLeast("5.0")) { + objects.directoryProperty() + } else { + layout.directoryProperty() + } +} + +@Suppress("DEPRECATION") +internal fun Project.filePropertyCompat(): RegularFileProperty { + return if (versionAtLeast("5.0")) { + objects.fileProperty() + } else { + layout.fileProperty() + } +} diff --git a/plugin/src/main/kotlin/org/nixos/gradle2nix/NixBuildSrcEnv.kt b/plugin/src/main/kotlin/org/nixos/gradle2nix/NixBuildSrcEnv.kt new file mode 100644 index 0000000..8408aa1 --- /dev/null +++ b/plugin/src/main/kotlin/org/nixos/gradle2nix/NixBuildSrcEnv.kt @@ -0,0 +1,31 @@ +package org.nixos.gradle2nix + +import org.gradle.api.tasks.GradleBuild +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional +import org.gradle.kotlin.dsl.configure +import java.io.File + +open class NixBuildSrcEnv : GradleBuild() { + init { + configure { + tasks = listOf("nixGradleEnv") + startParameter.addInitScript(writeInitScriptTo(dir.resolve("build/nix/init.gradle"))) + } + } +} + +private fun writeInitScriptTo(dest: File): File { + dest.parentFile.mkdirs() + dest.writeText(""" + initscript { + dependencies { + classpath files("$pluginJar") + } + } + + apply plugin: org.nixos.gradle2nix.Gradle2NixPlugin + """.trimIndent()) + return dest +} diff --git a/plugin/src/main/resources/gradle-env.nix b/plugin/src/main/resources/org/nixos/gradle2nix/gradle-env.nix similarity index 100% rename from plugin/src/main/resources/gradle-env.nix rename to plugin/src/main/resources/org/nixos/gradle2nix/gradle-env.nix