From 668fbb4e29b7f5e4bb81e99ab057f4622895affa Mon Sep 17 00:00:00 2001 From: david-perez Date: Thu, 26 May 2022 13:42:04 +0200 Subject: [PATCH] Avoid unnecessary Cargo crate rebuilds This commit modifies the Gradle buildscripts to avoid unnecessary Cargo rebuilds of the generated crates, decreasing development iteration cycles. Prior to this commit, if you ran a crate-generating command _twice_ on any of the `codegen-test`, `codegen-server-test`, `sdk-codegen-test`, and `codegen-server-test:python` subprojects (without making any changes to the codegen code), both invocations would take the same time: Cargo would recompile the crate and its dependencies, even when the generated crate is identical. This is because Gradle deletes everything under `buildDir` when running the `generateSmithyBuild` task: ``` > Task :codegen-server-test:smithyBuildJar Deleting stale output file: /local/home/davidpz/workplace/smithy-ws/src/SmithyRsSource/codegen-server-test/build/smithyprojections/codegen-server-test ``` So the files get recreated each time. While developing, it is likely that only a small number of the generated crate files are modified across rebuilds. [Cargo uses `mtime`](https://github.com/rust-lang/cargo/issues/6529) (among other factors) to determine whether it needs to recompile a unit. Indeed, running with `CARGO_LOG=cargo::core::compiler::fingerprint=trace` yields `err: current filesystem status shows we're outdated`. This commit adds a Gradle task that compares the hashes of the newly generated files with the (previously cached) old ones, and restores their `mtime`s if the hashes coincide. Another issue was causing unnecessary crate rebuilds. Prior to this commit, we were sending `RUSTFLAGS=-D warnings` when invoking Cargo. However, a common thing to do after generating a crate is to open its contents in an editor. The editor's `rust-analyzer` would compile the crate and its dependencies without the `RUSTFLAGS` we had used earlier. The next time you rebuilt the crate, Cargo would claim `err: RUSTFLAGS has changed: previously [], now ["-D", "warnings"]` and recompile everything again. This commit refactors the Gradle tasks so as to not send these flags when invoking Cargo, instead generating a `.cargo/config.toml` containing these flags. This way, `rust-analyzer` also picks them up and does not need to recompile the crates. With both patches, Cargo avoids unnecessary crate rebuilds. All in all, the second invocation of a `./gradlew --info -P modules='simple' -P cargoCommands='test' codegen-server-test:build` command now takes 15 seconds less than the first invocation on my `c5.4xlarge` machine; Cargo does not need to do _any_ work on the second invocation. This commit also refactors the `build.gradle.kts` files of the `sdk`, `sdk-codegen-test`, `codegen-test`, `codegen-server-test`, and `codegen-server-test:python` subprojects to make them DRYer and more consistent. The last 4 subprojects' buildscripts are now much shorter, with all the common logic having been moved to `CodegenTestCommon.kt`. Note that we have made the last 4 subprojects' `cargo check` and `cargo doc` invocations use the same set of flags than in the `sdk` subproject for consistency. Closes #1378. Closes #1412. --- aws/sdk-codegen-test/build.gradle.kts | 98 ++---------- aws/sdk/build.gradle.kts | 32 +--- buildSrc/src/main/kotlin/CodegenTestCommon.kt | 139 +++++++++++++++++- buildSrc/src/main/kotlin/HashUtils.kt | 86 +++++++++++ codegen-server-test/build.gradle.kts | 56 +------ codegen-server-test/python/build.gradle.kts | 54 +------ codegen-test/build.gradle.kts | 62 +------- gradle.properties | 3 - 8 files changed, 257 insertions(+), 273 deletions(-) create mode 100644 buildSrc/src/main/kotlin/HashUtils.kt diff --git a/aws/sdk-codegen-test/build.gradle.kts b/aws/sdk-codegen-test/build.gradle.kts index 2f92e0504d..fa00639fcd 100644 --- a/aws/sdk-codegen-test/build.gradle.kts +++ b/aws/sdk-codegen-test/build.gradle.kts @@ -8,13 +8,14 @@ extra["moduleName"] = "software.amazon.smithy.kotlin.codegen.test" tasks["jar"].enabled = false -plugins { - id("software.amazon.smithy").version("0.5.3") -} +plugins { id("software.amazon.smithy").version("0.5.3") } val smithyVersion: String by project -val defaultRustFlags: String by project val defaultRustDocFlags: String by project +val properties = PropertyRetriever(rootProject, project) + +val pluginName = "rust-codegen" +val workingDirUnderBuildDir = "smithyprojections/sdk-codegen-test/" dependencies { implementation(project(":aws:sdk-codegen")) @@ -23,94 +24,19 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") } -data class CodegenTest(val service: String, val module: String, val extraConfig: String? = null) - -val CodegenTests = listOf( +val allCodegenTests = listOf( CodegenTest("com.amazonaws.apigateway#BackplaneControlService", "apigateway") ) -fun generateSmithyBuild(tests: List): String { - val projections = tests.joinToString(",\n") { - """ - "${it.module}": { - "plugins": { - "rust-codegen": { - "runtimeConfig": { - "relativePath": "${rootProject.projectDir.absolutePath}/rust-runtime" - }, - "service": "${it.service}", - "module": "${it.module}", - "moduleAuthors": ["protocoltest@example.com"], - "moduleVersion": "0.0.1" - ${it.extraConfig ?: ""} - } - } - } - """.trimIndent() - } - return """ - { - "version": "1.0", - "projections": { $projections } - } - """ -} - -task("generateSmithyBuild") { - description = "generate smithy-build.json" - doFirst { - buildDir.resolve("smithy-build.json").writeText(generateSmithyBuild(CodegenTests)) - } -} - -fun generateCargoWorkspace(tests: List): String { - return """ - [workspace] - members = [ - ${tests.joinToString(",") { "\"${it.module}/rust-codegen\"" }} - ] - """.trimIndent() -} -task("generateCargoWorkspace") { - description = "generate Cargo.toml workspace file" - doFirst { - buildDir.resolve("smithyprojections/sdk-codegen-test/Cargo.toml").writeText(generateCargoWorkspace(CodegenTests)) - } -} +registerGenerateSmithyBuildTask(rootProject, project, pluginName, allCodegenTests) +registerGenerateCargoWorkspaceTask(rootProject, project, pluginName, allCodegenTests, workingDirUnderBuildDir) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") -tasks.register("cargoCheck") { - workingDir("build/smithyprojections/sdk-codegen-test/") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "check") - dependsOn("assemble") -} - -tasks.register("cargoTest") { - workingDir("build/smithyprojections/sdk-codegen-test/") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "test") - dependsOn("assemble") -} - -tasks.register("cargoDocs") { - workingDir("build/smithyprojections/sdk-codegen-test/") - environment("RUSTDOCFLAGS", defaultRustDocFlags) - commandLine("cargo", "doc", "--no-deps") - dependsOn("assemble") -} - -tasks.register("cargoClippy") { - workingDir("build/smithyprojections/sdk-codegen-test/") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "clippy") - dependsOn("assemble") -} +registerModifyMtimeTask(project) +registerCargoCommandsTasks(project, buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) -tasks["test"].finalizedBy("cargoCheck", "cargoClippy", "cargoTest", "cargoDocs") +tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) -tasks["clean"].doFirst { - delete("smithy-build.json") -} +tasks["clean"].doFirst { delete("smithy-build.json") } diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index 2ba2b2cb1d..5fdbe9b3b1 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -23,7 +23,6 @@ configure { } val smithyVersion: String by project -val defaultRustFlags: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) @@ -388,35 +387,10 @@ tasks["assemble"].apply { finalizedBy("finalizeSdk") } -tasks.register("cargoCheck") { - workingDir(outputDir) - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "check", "--lib", "--tests", "--benches") - dependsOn("assemble") -} - -tasks.register("cargoTest") { - workingDir(outputDir) - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "test") - dependsOn("assemble") -} - -tasks.register("cargoDocs") { - workingDir(outputDir) - environment("RUSTDOCFLAGS", defaultRustDocFlags) - commandLine("cargo", "doc", "--no-deps", "--document-private-items") - dependsOn("assemble") -} - -tasks.register("cargoClippy") { - workingDir(outputDir) - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "clippy") - dependsOn("assemble") -} +registerCargoCommandsTasks(project, outputDir, defaultRustDocFlags) +registerGenerateCargoConfigTomlTask(project, outputDir) -tasks["test"].finalizedBy("cargoClippy", "cargoTest", "cargoDocs") +tasks["test"].finalizedBy(Cargo.CLIPPY, Cargo.TEST, Cargo.DOCS) tasks.register("deleteSdk") { delete = setOf(outputDir) diff --git a/buildSrc/src/main/kotlin/CodegenTestCommon.kt b/buildSrc/src/main/kotlin/CodegenTestCommon.kt index f3f29ab7b9..41b310047a 100644 --- a/buildSrc/src/main/kotlin/CodegenTestCommon.kt +++ b/buildSrc/src/main/kotlin/CodegenTestCommon.kt @@ -1,4 +1,8 @@ -import java.lang.IllegalArgumentException +import org.gradle.api.Project +import org.gradle.api.tasks.Exec +import org.gradle.kotlin.dsl.extra +import org.gradle.kotlin.dsl.register +import java.io.File /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. @@ -76,6 +80,7 @@ fun codegenTests(properties: PropertyRetriever, allTests: List): Li } val AllCargoCommands = listOf(Cargo.CHECK, Cargo.TEST, Cargo.CLIPPY, Cargo.DOCS) + /** * Filter the Cargo commands to be run on the generated Rust crates using the given [properties]. * The list of Cargo commands that is run by default is defined in [AllCargoCommands]. @@ -102,3 +107,135 @@ fun cargoCommands(properties: PropertyRetriever): List { } return ret } + +fun registerGenerateSmithyBuildTask( + rootProject: Project, + project: Project, + pluginName: String, + allCodegenTests: List +) { + val properties = PropertyRetriever(rootProject, project) + project.tasks.register("generateSmithyBuild") { + description = "generate smithy-build.json" + outputs.file(project.projectDir.resolve("smithy-build.json")) + + doFirst { + project.projectDir.resolve("smithy-build.json") + .writeText( + generateSmithyBuild( + rootProject.projectDir.absolutePath, + pluginName, + codegenTests(properties, allCodegenTests) + ) + ) + + // If this is a rebuild, cache all the hashes of the generated Rust files. These are later used by the + // `modifyMtime` task. + project.extra["previousBuildHashes"] = project.buildDir.walk() + .filter { it.name.endsWith(".rs") || it.name == "Cargo.toml" || it.name == "Cargo.lock" } + .map { + HashUtils.getCheckSumFromFile(it) to it.lastModified() + } + .toMap() + } + } +} + +fun registerGenerateCargoWorkspaceTask( + rootProject: Project, + project: Project, + pluginName: String, + allCodegenTests: List, + workingDirUnderBuildDir: String +) { + val properties = PropertyRetriever(rootProject, project) + project.tasks.register("generateCargoWorkspace") { + description = "generate Cargo.toml workspace file" + doFirst { + project.buildDir.resolve("$workingDirUnderBuildDir/Cargo.toml") + .writeText(generateCargoWorkspace(pluginName, codegenTests(properties, allCodegenTests))) + } + } +} + +fun registerGenerateCargoConfigTomlTask( + project: Project, + outputDir: File +) { + project.tasks.register("generateCargoConfigToml") { + description = "generate `.cargo/config.toml`" + doFirst { + outputDir.resolve(".cargo").mkdir() + outputDir.resolve(".cargo/config.toml") + .writeText( + """ + [build] + rustflags = ["--deny", "warnings"] + """.trimIndent() + ) + } + } +} + +fun registerModifyMtimeTask( + project: Project +) { + // Cargo uses `mtime` (among other factors) to determine whether a compilation unit needs a rebuild. While developing, + // it is likely that only a small number of the generated crate files are modified across rebuilds. This task compares + // the hashes of the newly generated files with the (previously cached) old ones, and restores their `mtime`s if the + // hashes coincide. + // Debugging tip: it is useful to run with `CARGO_LOG=cargo::core::compiler::fingerprint=trace` to learn why Cargo + // determines a compilation unit needs a rebuild. + // For more information see https://github.com/awslabs/smithy-rs/issues/1412. + project.tasks.register("modifyMtime") { + description = "modify Rust files' `mtime` if the contents did not change" + dependsOn("generateSmithyBuild") + + doFirst { + val previousBuildHashes: Map = project.extra["previousBuildHashes"] as Map + + project.buildDir.walk() + .filter { it.name.endsWith(".rs") || it.name == "Cargo.toml" } + .map { + HashUtils.getCheckSumFromFile(it) to it + } + .forEach { (currentHash, currentFile) -> + previousBuildHashes[currentHash]?.also { oldMtime -> + println("Setting `mtime` of $currentFile back to `$oldMtime` because its hash `$currentHash` remained unchanged after a rebuild.") + currentFile.setLastModified(oldMtime) + } + } + } + } +} + +fun registerCargoCommandsTasks( + project: Project, + outputDir: File, + defaultRustDocFlags: String +) { + project.tasks.register(Cargo.CHECK.toString) { + dependsOn("assemble", "modifyMtime", "generateCargoConfigToml") + workingDir(outputDir) + commandLine("cargo", "check", "--lib", "--tests", "--benches") + } + + project.tasks.register(Cargo.TEST.toString) { + dependsOn("assemble", "modifyMtime", "generateCargoConfigToml") + workingDir(outputDir) + commandLine("cargo", "test") + } + + project.tasks.register(Cargo.DOCS.toString) { + dependsOn("assemble", "modifyMtime", "generateCargoConfigToml") + workingDir(outputDir) + environment("RUSTDOCFLAGS", defaultRustDocFlags) + commandLine("cargo", "doc", "--no-deps", "--document-private-items") + } + + project.tasks.register(Cargo.CLIPPY.toString) { + dependsOn("assemble", "modifyMtime", "generateCargoConfigToml") + workingDir(outputDir) + commandLine("cargo", "clippy") + } +} diff --git a/buildSrc/src/main/kotlin/HashUtils.kt b/buildSrc/src/main/kotlin/HashUtils.kt new file mode 100644 index 0000000000..99b1158205 --- /dev/null +++ b/buildSrc/src/main/kotlin/HashUtils.kt @@ -0,0 +1,86 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +// This code has been adapted from https://gist.github.com/LongClipeus/84db46e7d9714f67c4cbc40a67c8be1e + +import StringUtils.encodeHex +import java.io.File +import java.io.FileInputStream +import java.io.InputStream +import java.security.MessageDigest + +object HashUtils { + const val STREAM_BUFFER_LENGTH = 1024 + + fun getCheckSumFromFile(file: File, digest: MessageDigest = MessageDigest.getInstance("MD5")): String { + val fileInputStream = FileInputStream(file) + val byteArray = updateDigest(digest, fileInputStream).digest() + fileInputStream.close() + val hexCode = encodeHex(byteArray, true) + return String(hexCode) + } + + /** + * Reads through an InputStream and updates the digest for the data. + * + * @param digest The MessageDigest to use (e.g. MD5) + * @param data Data to digest + * @return the digest + */ + private fun updateDigest(digest: MessageDigest, data: InputStream): MessageDigest { + val buffer = ByteArray(STREAM_BUFFER_LENGTH) + var read = data.read(buffer, 0, STREAM_BUFFER_LENGTH) + while (read > -1) { + digest.update(buffer, 0, read) + read = data.read(buffer, 0, STREAM_BUFFER_LENGTH) + } + return digest + } +} + +object StringUtils { + private val DIGITS_LOWER = + charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f') + + private val DIGITS_UPPER = + charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F') + + /** + * Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order. + * The returned array will be double the length of the passed array, as it takes two characters to represent any + * given byte. + * + * @param data a byte[] to convert to hex characters + * @param toLowerCase `true` converts to lowercase, `false` to uppercase + * @return A char[] containing hexadecimal characters in the selected case + */ + fun encodeHex(data: ByteArray, toLowerCase: Boolean): CharArray { + return encodeHex(data, if (toLowerCase) DIGITS_LOWER else DIGITS_UPPER) + } + + /** + * Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order. + * The returned array will be double the length of the passed array, as it takes two characters to represent any + * given byte. + * + * @param data a byte[] to convert to hex characters + * @param toDigits the output alphabet (must contain at least 16 chars) + * @return A char[] containing the appropriate characters from the alphabet + * For best results, this should be either upper- or lower-case hex. + */ + fun encodeHex(data: ByteArray, toDigits: CharArray): CharArray { + val l = data.size + val out = CharArray(l shl 1) + // Two characters form the hex value. + var i = 0 + var j = 0 + while (i < l) { + out[j++] = toDigits[0xF0 and data[i].toInt() ushr 4] + out[j++] = toDigits[0x0F and data[i].toInt()] + i++ + } + return out + } +} diff --git a/codegen-server-test/build.gradle.kts b/codegen-server-test/build.gradle.kts index bbb5aba6e3..fac9b1f87d 100644 --- a/codegen-server-test/build.gradle.kts +++ b/codegen-server-test/build.gradle.kts @@ -12,7 +12,6 @@ tasks["jar"].enabled = false plugins { id("software.amazon.smithy").version("0.5.3") } val smithyVersion: String by project -val defaultRustFlags: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) @@ -45,58 +44,15 @@ val allCodegenTests = listOf( CodegenTest("com.aws.example#PokemonService", "pokemon_service_sdk") ) -tasks.register("generateSmithyBuild") { - description = "generate smithy-build.json" - doFirst { - projectDir.resolve("smithy-build.json") - .writeText( - generateSmithyBuild( - rootProject.projectDir.absolutePath, - pluginName, - codegenTests(properties, allCodegenTests) - ) - ) - } -} - -tasks.register("generateCargoWorkspace") { - description = "generate Cargo.toml workspace file" - doFirst { - buildDir.resolve("$workingDirUnderBuildDir/Cargo.toml") - .writeText(generateCargoWorkspace(pluginName, codegenTests(properties, allCodegenTests))) - } -} +registerGenerateSmithyBuildTask(rootProject, project, pluginName, allCodegenTests) +registerGenerateCargoWorkspaceTask(rootProject, project, pluginName, allCodegenTests, workingDirUnderBuildDir) +registerGenerateCargoConfigTomlTask(project, buildDir.resolve(workingDirUnderBuildDir)) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") -tasks["assemble"].finalizedBy("generateCargoWorkspace") - -tasks.register(Cargo.CHECK.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "check") - dependsOn("assemble") -} - -tasks.register(Cargo.TEST.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "test") - dependsOn("assemble") -} +tasks["assemble"].finalizedBy("generateCargoWorkspace", "generateCargoConfigToml") -tasks.register(Cargo.DOCS.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTDOCFLAGS", defaultRustDocFlags) - commandLine("cargo", "doc", "--no-deps") - dependsOn("assemble") -} - -tasks.register(Cargo.CLIPPY.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "clippy") - dependsOn("assemble") -} +registerModifyMtimeTask(project) +registerCargoCommandsTasks(project, buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/codegen-server-test/python/build.gradle.kts b/codegen-server-test/python/build.gradle.kts index 9bc81a5f24..179a02249c 100644 --- a/codegen-server-test/python/build.gradle.kts +++ b/codegen-server-test/python/build.gradle.kts @@ -12,7 +12,6 @@ tasks["jar"].enabled = false plugins { id("software.amazon.smithy") } val smithyVersion: String by project -val defaultRustFlags: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) @@ -49,58 +48,15 @@ val allCodegenTests = listOf( CodegenTest("com.aws.example#PokemonService", "pokemon_service_sdk") ) -task("generateSmithyBuild") { - description = "generate smithy-build.json" - doFirst { - projectDir.resolve("smithy-build.json") - .writeText( - generateSmithyBuild( - rootProject.projectDir.absolutePath, - pluginName, - codegenTests(properties, allCodegenTests) - ) - ) - } -} - -task("generateCargoWorkspace") { - description = "generate Cargo.toml workspace file" - doFirst { - buildDir.resolve("$workingDirUnderBuildDir/Cargo.toml") - .writeText(generateCargoWorkspace(pluginName, codegenTests(properties, allCodegenTests))) - } -} +registerGenerateSmithyBuildTask(rootProject, project, pluginName, allCodegenTests) +registerGenerateCargoWorkspaceTask(rootProject, project, pluginName, allCodegenTests, workingDirUnderBuildDir) +registerGenerateCargoConfigTomlTask(project, buildDir.resolve("$workingDirUnderBuildDir/.cargo")) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") -tasks.register(Cargo.CHECK.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "check") - dependsOn("assemble") -} - -tasks.register(Cargo.TEST.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "test") - dependsOn("assemble") -} - -tasks.register(Cargo.DOCS.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTDOCFLAGS", defaultRustDocFlags) - commandLine("cargo", "doc", "--no-deps") - dependsOn("assemble") -} - -tasks.register(Cargo.CLIPPY.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "clippy") - dependsOn("assemble") -} +registerModifyMtimeTask(project) +registerCargoCommandsTasks(project, buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/codegen-test/build.gradle.kts b/codegen-test/build.gradle.kts index e9755f9500..3c9b45054f 100644 --- a/codegen-test/build.gradle.kts +++ b/codegen-test/build.gradle.kts @@ -8,12 +8,9 @@ extra["moduleName"] = "software.amazon.smithy.kotlin.codegen.test" tasks["jar"].enabled = false -plugins { - id("software.amazon.smithy").version("0.5.3") -} +plugins { id("software.amazon.smithy").version("0.5.3") } val smithyVersion: String by project -val defaultRustFlags: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) @@ -88,61 +85,16 @@ val allCodegenTests = listOf( CodegenTest("com.aws.example#PokemonService", "pokemon_service_client") ) -tasks.register("generateSmithyBuild") { - description = "generate smithy-build.json" - doFirst { - projectDir.resolve("smithy-build.json") - .writeText( - generateSmithyBuild( - rootProject.projectDir.absolutePath, - pluginName, - codegenTests(properties, allCodegenTests) - ) - ) - } -} - -tasks.register("generateCargoWorkspace") { - description = "generate Cargo.toml workspace file" - doFirst { - buildDir.resolve("$workingDirUnderBuildDir/Cargo.toml") - .writeText(generateCargoWorkspace(pluginName, codegenTests(properties, allCodegenTests))) - } -} +registerGenerateSmithyBuildTask(rootProject, project, pluginName, allCodegenTests) +registerGenerateCargoWorkspaceTask(rootProject, project, pluginName, allCodegenTests, workingDirUnderBuildDir) +registerGenerateCargoConfigTomlTask(project, buildDir.resolve("$workingDirUnderBuildDir/.cargo")) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") -tasks.register(Cargo.CHECK.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "check") - dependsOn("assemble") -} - -tasks.register(Cargo.TEST.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "test") - dependsOn("assemble") -} - -tasks.register(Cargo.DOCS.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTDOCFLAGS", defaultRustDocFlags) - commandLine("cargo", "doc", "--no-deps") - dependsOn("assemble") -} - -tasks.register(Cargo.CLIPPY.toString) { - workingDir("$buildDir/$workingDirUnderBuildDir") - environment("RUSTFLAGS", defaultRustFlags) - commandLine("cargo", "clippy") - dependsOn("assemble") -} +registerModifyMtimeTask(project) +registerCargoCommandsTasks(project, buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) -tasks["clean"].doFirst { - delete("smithy-build.json") -} +tasks["clean"].doFirst { delete("smithy-build.json") } diff --git a/gradle.properties b/gradle.properties index 2861709002..14424f5a5c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,9 +27,6 @@ kotlinVersion=1.6.20 ktlintVersion=0.45.2 kotestVersion=5.2.3 -# rustc -defaultRustFlags=-D warnings - # TODO(https://github.com/awslabs/smithy-rs/issues/1068): Once doc normalization # is completed, warnings can be prohibited in rustdoc. #