Fix embedding static libraries by cinterop

Fix 'staticLibraries' '.def' file option and '-staticLibrary' cinterop
flag.

 #KT-39396 Fixed.
This commit is contained in:
SvyatoslavScherbina
2020-06-11 10:38:55 +03:00
committed by GitHub
parent 7cad336013
commit e279adaa14
11 changed files with 87 additions and 2 deletions
@@ -33,7 +33,8 @@ fun createInteropLibrary(
manifest: Properties,
dependencies: List<KotlinLibrary>,
nopack: Boolean,
shortName: String?
shortName: String?,
staticLibraries: List<String>
) {
val version = KotlinLibraryVersioning(
libraryVersion = null,
@@ -58,6 +59,7 @@ fun createInteropLibrary(
nativeBitcodeFiles.forEach(this::addNativeBitcode)
addManifestAddend(manifest)
addLinkDependencies(dependencies)
staticLibraries.forEach(this::addIncludedBinary)
commit()
}
}
@@ -377,7 +377,8 @@ private fun processCLib(flavorName: String, cinteropArguments: CInteropArguments
manifest = def.manifestAddendProperties,
dependencies = stdlibDependency + imports.requiredLibraries.toList(),
nopack = cinteropArguments.nopack,
shortName = cinteropArguments.shortModuleName
shortName = cinteropArguments.shortModuleName,
staticLibraries = staticLibraries
)
return null
}
+28
View File
@@ -3506,6 +3506,28 @@ createInterop("auxiliaryCppSources") {
it.extraOpts "-Xsource-compiler-option", "-std=c++17"
}
createInterop("embedStaticLibraries") {
it.defFile 'interop/embedStaticLibraries/embedStaticLibraries.def'
it.headers "$projectDir/interop/embedStaticLibraries/embedStaticLibraries.h"
// Note: also hardcoded in def file.
final String libDir = "$buildDir/embedStaticLibraries/"
it.getByTarget(target.name).doFirst {
1.upto(4) {
UtilsKt.buildStaticLibrary(
project,
[file("$projectDir/interop/embedStaticLibraries/${it}.c")],
file("$libDir/${it}.a"),
file("$libDir/${it}.objs"),
)
}
}
it.extraOpts '-staticLibrary', "$libDir/1.a"
it.extraOpts '-staticLibrary', "$libDir/2.a"
}
if (PlatformInfo.isAppleTarget(project)) {
createInterop("objcSmoke") {
it.defFile 'interop/objc/objcSmoke.def'
@@ -3719,6 +3741,12 @@ interopTest("interop_auxiliarySources") {
interop = 'auxiliaryCppSources'
}
interopTest("interop_embedStaticLibraries") {
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
source = "interop/embedStaticLibraries/main.kt"
interop = 'embedStaticLibraries'
}
interopTest("interop_values") {
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
source = "interop/basics/values.kt"
@@ -0,0 +1,3 @@
int get1() {
return 1;
}
@@ -0,0 +1,3 @@
int get2() {
return 2;
}
@@ -0,0 +1,3 @@
int get3() {
return 3;
}
@@ -0,0 +1,3 @@
int get4() {
return 4;
}
@@ -0,0 +1,3 @@
staticLibraries = \
backend.native/tests/build/embedStaticLibraries/3.a \
backend.native/tests/build/embedStaticLibraries/4.a
@@ -0,0 +1,4 @@
int get1(void);
int get2(void);
int get3(void);
int get4(void);
@@ -0,0 +1,9 @@
import kotlin.test.*
import embedStaticLibraries.*
fun main() {
assertEquals(1, get1())
assertEquals(2, get2())
assertEquals(3, get3())
assertEquals(4, get4())
}
@@ -319,4 +319,30 @@ fun Project.mergeManifestsByTargets(source: File, destination: File) {
destinationProperties[KLIB_PROPERTY_NATIVE_TARGETS] = mergedNativeTargets.joinToString(" ")
destinationFile.saveProperties(destinationProperties)
}
fun Project.buildStaticLibrary(cSources: Collection<File>, output: File, objDir: File) {
delete(objDir)
delete(output)
val platform = platformManager.platform(testTarget)
objDir.mkdirs()
exec {
it.commandLine(platform.clang.clangC(
"-c",
*cSources.map { it.absolutePath }.toTypedArray()
))
it.workingDir(objDir)
}
output.parentFile.mkdirs()
exec {
it.commandLine(
"${platform.configurables.absoluteLlvmHome}/bin/llvm-ar",
"-rc",
output,
*fileTree(objDir).files.toTypedArray()
)
}
}