From 1e66139bfc8f0b8e964a6deff03b066e1ee51784 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 30 Jun 2026 16:21:58 -0400 Subject: [PATCH 1/2] Replace HostPlatform with Gradle BuildPlatform service Co-Authored-By: Claude Opus 4.8 (1M context) --- build.gradle.kts | 8 +++--- .../gradle/plugin/BuildPlatformExtensions.kt | 27 +++++++++++++++++++ .../datadog/gradle/plugin/HostPlatform.kt | 21 --------------- .../InstrumentPostProcessingAction.kt | 4 +-- .../gradle/plugin/muzzle/tasks/MuzzleTask.kt | 4 +-- .../TestJvmConstraintsPlugin.kt | 4 +-- .../instrumentation/protobuf-3.0/build.gradle | 7 ++--- .../play-common/fix-play-linux-arm64.gradle | 4 +-- 8 files changed, 42 insertions(+), 37 deletions(-) create mode 100644 buildSrc/src/main/kotlin/datadog/gradle/plugin/BuildPlatformExtensions.kt delete mode 100644 buildSrc/src/main/kotlin/datadog/gradle/plugin/HostPlatform.kt diff --git a/build.gradle.kts b/build.gradle.kts index 22fca7f31a3..ebd1035bcbc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.diffplug.gradle.spotless.SpotlessExtension -import datadog.gradle.plugin.HostPlatform import datadog.gradle.plugin.ci.testAggregate +import datadog.gradle.plugin.isLinuxArm64 plugins { kotlin("jvm") version libs.versions.kotlin.plugin apply false @@ -90,8 +90,6 @@ allprojects { dependsOn(tasks.withType()) } - val isLinuxArm64 = HostPlatform.isLinuxArm64() - tasks.configureEach { if (this is JavaForkOptions) { maxHeapSize = System.getProperty("datadog.forkedMaxHeapSize") @@ -101,7 +99,7 @@ allprojects { "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/tmp" ) - if (isLinuxArm64) { + if (isLinuxArm64()) { // Disable CDS to avoid SIGSEGVs on Linux arm64. jvmArgs("-Xshare:off") } @@ -109,7 +107,7 @@ allprojects { } // Disable CDS to avoid SIGSEGVs on Linux arm64. - if (isLinuxArm64) { + if (isLinuxArm64()) { tasks.withType().configureEach { options.forkOptions.jvmArgs?.add("-Xshare:off") } diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/BuildPlatformExtensions.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/BuildPlatformExtensions.kt new file mode 100644 index 00000000000..3f6a49b7d7e --- /dev/null +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/BuildPlatformExtensions.kt @@ -0,0 +1,27 @@ +package datadog.gradle.plugin + +import org.gradle.api.Project +import org.gradle.kotlin.dsl.support.serviceOf +import org.gradle.platform.Architecture +import org.gradle.platform.BuildPlatform +import org.gradle.platform.OperatingSystem +import org.gradle.platform.internal.CurrentBuildPlatform + +/** + * Helpers built on Gradle's [BuildPlatform]. + * + * The public [BuildPlatform] interface is not directly available elsewhere. + * Build logic obtains it from the internal [CurrentBuildPlatform] service, + * resolved from a [Project] via `serviceOf` — see the [Project] overloads below. + */ +fun BuildPlatform.isLinuxArm64(): Boolean = + operatingSystem == OperatingSystem.LINUX && architecture == Architecture.AARCH64 + +fun BuildPlatform.isMacArm64(): Boolean = + operatingSystem == OperatingSystem.MAC_OS && architecture == Architecture.AARCH64 + +fun Project.isLinuxArm64(): Boolean = + serviceOf().toBuildPlatform().isLinuxArm64() + +fun Project.isMacArm64(): Boolean = + serviceOf().toBuildPlatform().isMacArm64() diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/HostPlatform.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/HostPlatform.kt deleted file mode 100644 index 40837194ecd..00000000000 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/HostPlatform.kt +++ /dev/null @@ -1,21 +0,0 @@ -package datadog.gradle.plugin - -import java.util.Locale - -object HostPlatform { - @JvmStatic - fun isLinuxArm64(): Boolean = isExpectedOs("linux") && isArm64() - - @JvmStatic - fun isMacArm64(): Boolean = isExpectedOs("mac") && isArm64() - - private fun isExpectedOs(expectedOs: String): Boolean { - val osName = System.getProperty("os.name", "").lowercase(Locale.ROOT) - return osName.contains(expectedOs) - } - - private fun isArm64(): Boolean { - val osArch = System.getProperty("os.arch", "").lowercase(Locale.ROOT) - return osArch.contains("aarch64") || osArch.contains("arm64") - } -} diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/instrument/InstrumentPostProcessingAction.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/instrument/InstrumentPostProcessingAction.kt index 839b41e0960..72691d50685 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/instrument/InstrumentPostProcessingAction.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/instrument/InstrumentPostProcessingAction.kt @@ -1,7 +1,7 @@ package datadog.gradle.plugin.instrument -import datadog.gradle.plugin.HostPlatform import datadog.gradle.plugin.instrument.BuildTimeInstrumentationPlugin.Companion.BUILD_TIME_INSTRUMENTATION_PLUGIN_CONFIGURATION +import datadog.gradle.plugin.isLinuxArm64 import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.Task @@ -74,7 +74,7 @@ abstract class InstrumentPostProcessingAction @Inject constructor( return workerExecutor.processIsolation { forkOptions { setExecutable(javaLauncher.executablePath.asFile.absolutePath) - if (HostPlatform.isLinuxArm64()) { + if (project.isLinuxArm64()) { // Disable CDS to avoid SIGSEGVs on Linux arm64. jvmArgs("-Xshare:off") } diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/tasks/MuzzleTask.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/tasks/MuzzleTask.kt index 76917c6a6c7..daf5bed001b 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/tasks/MuzzleTask.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/tasks/MuzzleTask.kt @@ -1,6 +1,6 @@ package datadog.gradle.plugin.muzzle.tasks -import datadog.gradle.plugin.HostPlatform +import datadog.gradle.plugin.isLinuxArm64 import datadog.gradle.plugin.muzzle.MuzzleAction import datadog.gradle.plugin.muzzle.MuzzleDirective import datadog.gradle.plugin.muzzle.MuzzleExtension @@ -103,7 +103,7 @@ abstract class MuzzleTask @Inject constructor( if(javaLauncher.metadata.languageVersion > JavaLanguageVersion.of(9)) { jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") } - if (HostPlatform.isLinuxArm64()) { + if (project.isLinuxArm64()) { // Disable CDS to avoid SIGSEGVs on Linux arm64. jvmArgs("-Xshare:off") } diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt index 02d1c0d0a9a..7b89babd29e 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt @@ -1,6 +1,6 @@ package datadog.gradle.plugin.testJvmConstraints -import datadog.gradle.plugin.HostPlatform +import datadog.gradle.plugin.isLinuxArm64 import datadog.gradle.plugin.testJvmConstraints.TestJvmConstraintsExtension.Companion.TEST_JVM_CONSTRAINTS import org.gradle.api.JavaVersion import org.gradle.api.Plugin @@ -90,7 +90,7 @@ class TestJvmConstraintsPlugin : Plugin { // Fix for Linux arm64 ByteBuddy error: // "Could not self-attach to current VM using external process" - if (HostPlatform.isLinuxArm64()) { + if (project.isLinuxArm64()) { conditionalJvmArgs( JavaVersion.VERSION_1_9, listOf("-Djdk.attach.allowAttachSelf=true") diff --git a/dd-java-agent/instrumentation/protobuf-3.0/build.gradle b/dd-java-agent/instrumentation/protobuf-3.0/build.gradle index cd5e818975f..9d3b49b9dc3 100644 --- a/dd-java-agent/instrumentation/protobuf-3.0/build.gradle +++ b/dd-java-agent/instrumentation/protobuf-3.0/build.gradle @@ -1,4 +1,5 @@ -import datadog.gradle.plugin.HostPlatform +import static datadog.gradle.plugin.BuildPlatformExtensionsKt.isLinuxArm64 +import static datadog.gradle.plugin.BuildPlatformExtensionsKt.isMacArm64 plugins { id 'com.google.protobuf' version '0.10.0' @@ -20,7 +21,7 @@ muzzle { protobuf { protoc { // There is no macOS arm64 support for protoc 3.0.0, so require Rosetta. - if (HostPlatform.isMacArm64()) { + if (isMacArm64(project)) { artifact = "com.google.protobuf:protoc:3.0.0:osx-x86_64" } else { artifact = "com.google.protobuf:protoc:3.0.0" @@ -29,7 +30,7 @@ protobuf { } // TODO: protobuf supports Linux arm64 since `3.12.0`, but it is not source-compatible with 3.0.0 -if (HostPlatform.isLinuxArm64()) { +if (isLinuxArm64(project)) { tasks.matching { it.name in [ "extractTestProto", diff --git a/dd-smoke-tests/play-common/fix-play-linux-arm64.gradle b/dd-smoke-tests/play-common/fix-play-linux-arm64.gradle index 1c3e27fabc0..c8cc419e2e4 100644 --- a/dd-smoke-tests/play-common/fix-play-linux-arm64.gradle +++ b/dd-smoke-tests/play-common/fix-play-linux-arm64.gradle @@ -1,9 +1,9 @@ -import datadog.gradle.plugin.HostPlatform +import static datadog.gradle.plugin.BuildPlatformExtensionsKt.isLinuxArm64 // Fix for JVM crashes (SIGSEGV / SIGABRT, exit 134) when the // org.gradle.playframework `compilePlayRoutes` Worker Daemon starts up on Linux arm64. // No-op on every other host/arch combination. -if (HostPlatform.isLinuxArm64()) { +if (isLinuxArm64(project)) { tasks.named("compilePlayRoutes").configure { task -> // Find the class in the hierarchy that declares the private `workerExecutor` field. def workerExecutorField = null From a4d701e85f4df703027358e2ea42737cae154dfa Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 30 Jun 2026 17:10:11 -0400 Subject: [PATCH 2/2] Fix :buildSrc:test by resolving Linux arm64 platform check lazily BuildPlatform relies on Gradle's native services, which are unavailable when configuring tasks under ProjectBuilder in unit tests. Evaluating project.isLinuxArm64() eagerly during test-task configuration made TestJvmConstraintsPluginTest fail with NativeIntegrationUnavailableException. Defer the check to execution time via the existing lazy additionalCondition on ProvideJvmArgsOnJvmLauncherVersion, keeping it out of the configuration path. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../testJvmConstraints/TestJvmConstraintsPlugin.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt index 7b89babd29e..6410df3bb6c 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsPlugin.kt @@ -90,12 +90,11 @@ class TestJvmConstraintsPlugin : Plugin { // Fix for Linux arm64 ByteBuddy error: // "Could not self-attach to current VM using external process" - if (project.isLinuxArm64()) { - conditionalJvmArgs( - JavaVersion.VERSION_1_9, - listOf("-Djdk.attach.allowAttachSelf=true") - ) - } + conditionalJvmArgs( + JavaVersion.VERSION_1_9, + listOf("-Djdk.attach.allowAttachSelf=true"), + project.providers.provider { project.isLinuxArm64() } + ) } /**