Reapply "Update generation of SPDX namespace"
This reverts commit 00dd7da92de7d1d306e935aba4f858bfc851e1b5.
With changes to fix gradle configuration.
Bug: b/281085038
Change-Id: I91f981c400a4a9201bdd8f8292ab42538a375079
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index 32e3732..370ad69 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -4,8 +4,9 @@
import DependenciesPlugin.Companion.computeRoot
import java.io.File
-import java.net.URI
import java.nio.file.Paths
+import java.security.MessageDigest
+import java.util.UUID
import kotlin.reflect.full.declaredMemberProperties
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
@@ -22,6 +23,7 @@
import org.gradle.nativeplatform.platform.OperatingSystem
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
+
class DependenciesPlugin: Plugin<Project> {
override fun apply(target: Project) {
@@ -81,6 +83,43 @@
return computeRoot(this.projectDir)
}
+// See https://datatracker.ietf.org/doc/html/rfc4122#section-4.3 for the algorithm.
+fun uuid5(namespace: UUID, name: String): UUID? {
+ val md = MessageDigest.getInstance("SHA-1")
+ md.update(uuidToBytes(namespace))
+ md.update(name.encodeToByteArray())
+ val sha1Bytes = md.digest()
+ // Set version 5 (upper 4 bits of octet 6).
+ sha1Bytes[6] = (sha1Bytes[6].toInt() and 0x0f).toByte()
+ sha1Bytes[6] = (sha1Bytes[6].toInt() or 0x50).toByte()
+ // Set two upper bits of octet 8 to 10.
+ sha1Bytes[8] = (sha1Bytes[8].toInt() and 0x3f).toByte()
+ sha1Bytes[8] = (sha1Bytes[8].toInt() or 0x80).toByte()
+ return uuidFromBytes(sha1Bytes)
+}
+
+private fun uuidFromBytes(data: ByteArray): UUID? {
+ assert(data.size >= 16)
+ return UUID(toNetworkOrder(data, 0), toNetworkOrder(data, 8))
+}
+
+private fun uuidToBytes(uuid: UUID): ByteArray? {
+ val result = ByteArray(16)
+ fromNetworkByteOrder(uuid.mostSignificantBits, result, 0)
+ fromNetworkByteOrder(uuid.leastSignificantBits, result, 8)
+ return result
+}
+
+private fun toNetworkOrder(data: ByteArray, dataIndex: Int): Long {
+ var result: Long = 0
+ for (i in 0..7) result = result shl 8 or (data[dataIndex + i].toInt() and 0xff).toLong()
+ return result
+}
+
+private fun fromNetworkByteOrder(value: Long, dest: ByteArray, destIndex: Int) {
+ for (i in 0..7) dest[i + destIndex] = (value shr (7 - i) * 8 and 0xffL).toByte()
+}
+
fun Project.header(title : String) : String {
return "****** ${title} ******"
}
@@ -176,7 +215,8 @@
}
fun Project.resolve(
- thirdPartyDependency: ThirdPartyDependency, vararg paths: String) : ConfigurableFileCollection {
+ thirdPartyDependency: ThirdPartyDependency, vararg paths: String,
+) : ConfigurableFileCollection {
return files(project.getRoot().resolve(thirdPartyDependency.path).resolveAll(*paths))
}
@@ -275,7 +315,7 @@
debugVariant: Boolean,
lib: List<File> = listOf(),
classpath: List<File> = listOf(),
- pgInputMap: File? = null
+ pgInputMap: File? = null,
) : List<String> {
return buildList {
add("python3")
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts
index bba3b84..ab4f252 100644
--- a/d8_r8/main/build.gradle.kts
+++ b/d8_r8/main/build.gradle.kts
@@ -15,6 +15,7 @@
import org.spdx.sbom.gradle.extensions.DefaultSpdxSbomTaskExtension
import com.google.gson.Gson
+import java.util.UUID
plugins {
`kotlin-dsl`
@@ -47,7 +48,7 @@
}
if (project.hasProperty("spdxVersion")) {
- project.version = project.property("spdxVersion")
+ project.version = project.property("spdxVersion")!!
}
spdxSbom {
@@ -65,7 +66,17 @@
}
document {
name.set("R8 Compiler Suite")
- namespace.set("https://r8.googlesource.com/r8/-" + project.version + ".jar")
+ // Generate version 5 UUID from fixed namespace UUID and name generated from revision
+ // (git hash) and artifact name.
+ if (project.hasProperty("spdxRevision")) {
+ namespace.set(
+ "https://spdx.google/"
+ + uuid5(
+ UUID.fromString("df17ea25-709b-4edc-8dc1-d3ca82c74e8e"),
+ project.property("spdxRevision").toString() + "-r8"
+ )
+ )
+ }
creator.set("Organization: Google LLC")
packageSupplier.set("Organization: Google LLC")
}