[Commonizer] Gracefully handle absent targets for hierarchical commonization
This commit is contained in:
@@ -25,7 +25,7 @@ public class CliCommonizer(private val executor: Executor) : Commonizer {
|
||||
override fun commonizeLibraries(
|
||||
konanHome: File,
|
||||
inputLibraries: Set<File>,
|
||||
dependencyLibraries: Set<File>,
|
||||
dependencyLibraries: Set<CommonizerDependency>,
|
||||
outputCommonizerTarget: SharedCommonizerTarget,
|
||||
outputDirectory: File
|
||||
) {
|
||||
@@ -37,7 +37,7 @@ public class CliCommonizer(private val executor: Executor) : Commonizer {
|
||||
add("-output-commonizer-target"); add(outputCommonizerTarget.identityString)
|
||||
add("-output-path"); add(outputDirectory.absolutePath)
|
||||
if (dependencyLibraries.isNotEmpty()) {
|
||||
add("-dependency-libraries"); add(dependencyLibraries.joinToString(";") { it.absolutePath })
|
||||
add("-dependency-libraries"); add(dependencyLibraries.joinToString(";"))
|
||||
}
|
||||
}
|
||||
executor(arguments)
|
||||
|
||||
@@ -14,7 +14,7 @@ public interface Commonizer : Serializable {
|
||||
public fun commonizeLibraries(
|
||||
konanHome: File,
|
||||
inputLibraries: Set<File>,
|
||||
dependencyLibraries: Set<File>,
|
||||
dependencyLibraries: Set<CommonizerDependency>,
|
||||
outputCommonizerTarget: SharedCommonizerTarget,
|
||||
outputDirectory: File
|
||||
)
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.commonizer
|
||||
|
||||
import java.io.File
|
||||
|
||||
public sealed class CommonizerDependency {
|
||||
public abstract val file: File
|
||||
|
||||
final override fun toString(): String {
|
||||
return this.identityString
|
||||
}
|
||||
}
|
||||
|
||||
public data class TargetedCommonizerDependency(
|
||||
public val target: CommonizerTarget,
|
||||
public override val file: File
|
||||
) : CommonizerDependency()
|
||||
|
||||
public data class NonTargetedCommonizerDependency(
|
||||
public override val file: File
|
||||
) : CommonizerDependency()
|
||||
|
||||
public val CommonizerDependency.identityString: String
|
||||
get() = when (this) {
|
||||
is NonTargetedCommonizerDependency -> this.file.canonicalPath
|
||||
is TargetedCommonizerDependency -> "${target.identityString}::${file.canonicalPath}"
|
||||
}
|
||||
|
||||
|
||||
public fun parseCommonizerDependency(identityString: String): CommonizerDependency {
|
||||
val split = identityString.split("::", limit = 2)
|
||||
if (split.size == 2) {
|
||||
parseTargetedCommonizerDependencyOrNull(split[0], split[1])?.let { return it }
|
||||
}
|
||||
return NonTargetedCommonizerDependency(File(identityString))
|
||||
}
|
||||
|
||||
private fun parseTargetedCommonizerDependencyOrNull(commonizerTarget: String, canonicalFilePath: String): TargetedCommonizerDependency? {
|
||||
return TargetedCommonizerDependency(
|
||||
target = parseCommonizerTargetOrNull(commonizerTarget) ?: return null,
|
||||
file = File(canonicalFilePath)
|
||||
)
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.commonizer
|
||||
|
||||
public fun isCommonizerTargetIdentityString(value: String): Boolean {
|
||||
return parseCommonizerTargetOrNull(value) != null
|
||||
}
|
||||
@@ -9,6 +9,14 @@ import org.jetbrains.kotlin.commonizer.IdentityStringSyntaxNode.LeafTargetSyntax
|
||||
import org.jetbrains.kotlin.commonizer.IdentityStringSyntaxNode.SharedTargetSyntaxNode
|
||||
import org.jetbrains.kotlin.commonizer.IdentityStringToken.*
|
||||
|
||||
public fun parseCommonizerTargetOrNull(identityString: String): CommonizerTarget? {
|
||||
return try {
|
||||
parseCommonizerTarget(identityString)
|
||||
} catch (t: IllegalArgumentException) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
public fun parseCommonizerTarget(identityString: String): CommonizerTarget {
|
||||
try {
|
||||
val tokens = tokenizeIdentityString(identityString)
|
||||
|
||||
@@ -28,8 +28,13 @@ class CommonizeLibcurlTest {
|
||||
commonizer.commonizeLibraries(
|
||||
konanHome = konanHome,
|
||||
inputLibraries = libraries,
|
||||
dependencyLibraries = KonanDistribution(konanHome).platformLibsDir.resolve(LINUX_X64.name).listFiles().orEmpty().toSet() +
|
||||
KonanDistribution(konanHome).platformLibsDir.resolve(LINUX_ARM64.name).listFiles().orEmpty().toSet(),
|
||||
dependencyLibraries = emptySet<CommonizerDependency>() +
|
||||
KonanDistribution(konanHome).platformLibsDir.resolve(LINUX_X64.name).listFiles().orEmpty()
|
||||
.map { TargetedCommonizerDependency(LeafCommonizerTarget(LINUX_X64), it) }.toSet() +
|
||||
|
||||
KonanDistribution(konanHome).platformLibsDir.resolve(LINUX_ARM64.name).listFiles().orEmpty()
|
||||
.map { TargetedCommonizerDependency(LeafCommonizerTarget(LINUX_ARM64), it) }
|
||||
.toSet(),
|
||||
outputCommonizerTarget = CommonizerTarget(LINUX_ARM64, LINUX_X64),
|
||||
outputDirectory = temporaryOutputDirectory.root
|
||||
)
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.commonizer
|
||||
|
||||
import java.io.File
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class CommonizerDependencyTest {
|
||||
|
||||
@Test
|
||||
fun `sample identityString`() {
|
||||
assertEquals(
|
||||
"((a, b), c)::/hello.txt",
|
||||
TargetedCommonizerDependency(parseCommonizerTarget("((a,b), c)"), File("/hello.txt")).identityString
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test serialize deserialize`() {
|
||||
assertEquals(
|
||||
parseCommonizerDependency(NonTargetedCommonizerDependency(File("hello.txt")).identityString),
|
||||
NonTargetedCommonizerDependency(File("hello.txt").canonicalFile)
|
||||
)
|
||||
|
||||
assertEquals(
|
||||
parseCommonizerDependency(TargetedCommonizerDependency(parseCommonizerTarget("((a,b), c)"), File("hello.txt")).identityString),
|
||||
TargetedCommonizerDependency(parseCommonizerTarget("((a,b), c)"), File("hello.txt").canonicalFile)
|
||||
)
|
||||
}
|
||||
}
|
||||
+17
-2
@@ -7,8 +7,7 @@ package org.jetbrains.kotlin.commonizer
|
||||
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget.*
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.*
|
||||
|
||||
class CommonizerTargetIdentityStringTest {
|
||||
|
||||
@@ -134,4 +133,20 @@ class CommonizerTargetIdentityStringTest {
|
||||
fun `fail parsing CommonizerTarget 10`() {
|
||||
parseCommonizerTarget("(x, (x, y)")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun isCommonizerIdentityString() {
|
||||
assertFalse(isCommonizerTargetIdentityString(""))
|
||||
assertTrue(isCommonizerTargetIdentityString("()"))
|
||||
assertTrue(isCommonizerTargetIdentityString("(a,b)"))
|
||||
assertFalse(isCommonizerTargetIdentityString("..."))
|
||||
assertTrue(isCommonizerTargetIdentityString("x"))
|
||||
assertFalse(isCommonizerTargetIdentityString("((a)"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun parseCommonizerTargetOrNull() {
|
||||
assertEquals(parseCommonizerTarget("((a,b),c)"), parseCommonizerTargetOrNull("((a,b),c)"))
|
||||
assertNull(parseCommonizerTargetOrNull(""))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user