diff --git a/README.md b/README.md index c974b96..ae77621 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ A runtime for executing AWS Lambda Functions written in Kotlin/Native, designed ## Supported [OS-only runtime machines](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) -- Amazon Linux 2023 (provided.al2023) with x86_64 architecture -- Amazon Linux 2 (provided.al2) with x86_64 architecture +- Amazon Linux 2023 (provided.al2023) with x86_64 or ARM architecture +- Amazon Linux 2 (provided.al2) with x86_64 or ARM architecture ## Performance @@ -151,6 +151,7 @@ $ aws lambda create-function --function-name LAMBDA_FUNCTION_NAME \ --handler YOUR_MODULE_NAME.kexe \ # Important to specify the name of the Lambda executable. --zip-file YOUR_MODULE_NAME.zip \ --runtime provided.al2023 \ # Change this to provided.al2 if you would like to use Amazon Linux 2 + --architecture x86_64 \ # or arm64 --role arn:aws:iam::XXXXXXXXXXXXX:role/YOUR_LAMBDA_EXECUTION_ROLE \ --tracing-config Mode=Active ``` diff --git a/gradle-plugin/src/main/kotlin/LambdaPlugin.kt b/gradle-plugin/src/main/kotlin/LambdaPlugin.kt index bb281c4..c171e0e 100644 --- a/gradle-plugin/src/main/kotlin/LambdaPlugin.kt +++ b/gradle-plugin/src/main/kotlin/LambdaPlugin.kt @@ -1,16 +1,55 @@ import org.gradle.api.DefaultTask import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction +import org.gradle.kotlin.dsl.property import java.io.File class LambdaPlugin : Plugin { override fun apply(project: Project) { - project.tasks.create("buildLambdaRelease", LambdaPackagerTask::class.java) + project.run { + val buildLambdaRelease = extensions.create( + "buildLambdaRelease", + LambdaPackagerExtension::class.java, + project + ) + tasks.apply { + register("buildLambdaRelease", LambdaPackagerTask::class.java).configure { + architecture.set(buildLambdaRelease.architecture) + } + } + } + } +} + +enum class Architecture(val path: String) { + LINUX_X64("linuxX64"), + LINUX_ARM64("linuxArm64"); + + override fun toString(): String = path +} + +/** + * Gradle project level extension object definition for the LambdaPackagerTask + * + */ +open class LambdaPackagerExtension(project: Project) { + /** + * The architecture of the desired Lambda runtime, default: LINUX_X64 + */ + val architecture = project.objects.property() + + init { + architecture.set(Architecture.LINUX_X64) } } abstract class LambdaPackagerTask : DefaultTask() { + @Input + val architecture: Property = + project.objects.property(Architecture::class.java).convention(Architecture.LINUX_X64) @TaskAction fun packageLambda() { @@ -20,7 +59,7 @@ abstract class LambdaPackagerTask : DefaultTask() { } val buildDir = project.layout.buildDirectory - val executableDir = project.file(buildDir.dir("bin/linuxX64/releaseExecutable")) + val executableDir = project.file(buildDir.dir("bin/${architecture.get()}/releaseExecutable")) val executable = executableDir .listFiles() ?.first { it.name.endsWith(".kexe") } diff --git a/lambda-events/build.gradle.kts b/lambda-events/build.gradle.kts index b51ed62..85fad39 100644 --- a/lambda-events/build.gradle.kts +++ b/lambda-events/build.gradle.kts @@ -8,7 +8,7 @@ plugins { kotlin { macosArm64() macosX64() - //linuxArm64() // https://youtrack.jetbrains.com/issue/KT-36871/Support-Aarch64-Linux-as-a-host-for-the-Kotlin-Native + linuxArm64() linuxX64() sourceSets { diff --git a/lambda-runtime/build.gradle.kts b/lambda-runtime/build.gradle.kts index 81ac562..84cf744 100644 --- a/lambda-runtime/build.gradle.kts +++ b/lambda-runtime/build.gradle.kts @@ -14,7 +14,7 @@ plugins { kotlin { macosArm64() macosX64() - //linuxArm64() // https://youtrack.jetbrains.com/issue/KT-36871/Support-Aarch64-Linux-as-a-host-for-the-Kotlin-Native + linuxArm64() linuxX64() @OptIn(ExperimentalKotlinGradlePluginApi::class) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index a854e23..8b05ab8 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -8,7 +8,7 @@ kotlin { listOf( macosArm64(), macosX64(), - //linuxArm64(), // https://youtrack.jetbrains.com/issue/KT-36871/Support-Aarch64-Linux-as-a-host-for-the-Kotlin-Native + linuxArm64(), linuxX64(), ).forEach { it.binaries { @@ -27,3 +27,7 @@ kotlin { } } } + +buildLambdaRelease { + architecture.set(Architecture.LINUX_X64) // or Architecture.LINUX_ARM64 +} \ No newline at end of file