Skip to content

Commit 4c7cf2d

Browse files
authored
Merge pull request #1 from touchlab/kpg/non_shadow
Kpg/non shadow
2 parents f497e20 + 28363a3 commit 4c7cf2d

File tree

11 files changed

+163
-239
lines changed

11 files changed

+163
-239
lines changed

build.gradle.kts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,16 @@ buildscript {
1919
}
2020

2121
plugins {
22-
kotlin("multiplatform") apply false
23-
id("com.android.library") version "4.1.2" apply false
2422
id("com.github.gmazzo.buildconfig") version "2.1.0" apply false
2523
}
2624

2725
val GROUP: String by project
28-
val VERSION_NAME: String by project
26+
val KOTLIN_VERSION: String by project
27+
val VERSION_EXTENSION: String by project
2928

3029
allprojects {
3130
group = GROUP
32-
version = VERSION_NAME
31+
version = "${KOTLIN_VERSION}.${VERSION_EXTENSION}"
3332
}
3433

3534
allprojects {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android.useAndroidX=true
1414
org.gradle.jvmargs=-Xmx2g
1515

1616
GROUP=co.touchlab
17-
VERSION_NAME=0.1.0
1817
KOTLIN_VERSION=1.5.31
18+
VERSION_EXTENSION=1
1919

2020
POM_NAME=CKlib
2121
POM_DESCRIPTION=C/C++ Bitcode Into Klib

plugin/build.gradle.kts

Lines changed: 3 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,17 @@
1-
import com.android.build.gradle.internal.tasks.factory.dependsOn
2-
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
3-
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
4-
51
plugins {
62
id("java-gradle-plugin")
73
kotlin("jvm")
84
id("com.github.gmazzo.buildconfig")
95
id("com.vanniktech.maven.publish")
10-
id("com.github.johnrengelman.shadow").version("7.0.0")
116
}
127

8+
val KOTLIN_VERSION: String by project
139

1410
dependencies {
15-
shadow(gradleApi())
16-
implementation(fileTree("lib") { include("*.jar") })
17-
implementation(fileTree("${System.getProperty("user.home")}/.konan/kotlin-native-prebuilt-macos-x86_64-1.5.30/konan/lib") { include("*.jar") })
18-
}
19-
20-
val shadowJarTask = tasks.shadowJar
21-
22-
// Add shadow jar to the Gradle module metadata api and runtime configurations
23-
configurations {
24-
artifacts {
25-
runtimeElements(shadowJarTask)
26-
apiElements(shadowJarTask)
27-
}
11+
implementation(gradleApi())
12+
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION")
2813
}
2914

30-
tasks.whenTaskAdded {
31-
if (name == "publishPluginJar" || name == "generateMetadataFileForPluginMavenPublication") {
32-
dependsOn(tasks.named("shadowJar"))
33-
}
34-
}
35-
36-
// Disabling default jar task as it is overridden by shadowJar
37-
tasks.named("jar").configure {
38-
enabled = false
39-
}
40-
41-
// Need to move publishing configuration into afterEvaluate {}
42-
// to override changes done by "com.gradle.plugin-publish" plugin in afterEvaluate {} block
43-
// See PublishPlugin class for details
44-
afterEvaluate {
45-
publishing {
46-
publications {
47-
withType<MavenPublication> {
48-
// Special workaround to publish shadow jar instead of normal one. Name to override peeked here:
49-
// https://github.com/gradle/gradle/blob/master/subprojects/plugin-development/src/main/java/org/gradle/plugin/devel/plugins/MavenPluginPublishPlugin.java#L73
50-
if (name == "pluginMaven") {
51-
setArtifacts(
52-
listOf(
53-
shadowJarTask.get()
54-
)
55-
)
56-
}
57-
}
58-
}
59-
}
60-
}
61-
62-
/*tasks.create("relocateShadowJar", ConfigureShadowRelocation::class.java) {
63-
target = tasks.shadowJar.get()
64-
prefix = "cklib" // Default value is "shadow"
65-
}
66-
67-
tasks.shadowJar.dependsOn(tasks.findByName("relocateShadowJar")!!)*/
68-
6915
buildConfig {
7016
packageName("co.touchlab.cklib.gradle")
7117
buildConfigField("String", "KOTLIN_PLUGIN_ID", "\"${rootProject.extra["kotlin_plugin_id"]}\"")
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* Copyright (c) 2021 Touchlab
3+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
4+
* You may obtain a copy of the License at
5+
*
6+
* http://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
9+
*/
10+
11+
object GradleValues {
12+
val KOTLIN_VERSION = "1.5.31"
13+
}

plugin/src/main/kotlin/co/touchlab/cklib/gradle/CKlibGradleExtension.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@
1010

1111
package co.touchlab.cklib.gradle
1212

13+
import co.touchlab.cklib.gradle.reflection.PlatformManager
1314
import org.gradle.api.Project
1415
import org.jetbrains.kotlin.konan.target.Distribution
15-
import org.jetbrains.kotlin.konan.target.PlatformManager
1616
import javax.inject.Inject
1717

1818
open class CKlibGradleExtension @Inject constructor(val project: Project){
19-
var konanHome: String = "${System.getProperty("user.home")}/.konan/kotlin-native-prebuilt-macos-x86_64-1.5.30"
19+
var konanHome: String = "${System.getProperty("user.home")}/.konan/kotlin-native-prebuilt-macos-x86_64-${GradleValues.KOTLIN_VERSION}"
2020
var llvmHome: String = "${System.getProperty("user.home")}/.konan/dependencies/clang-llvm-apple-8.0.0-darwin-macos"
2121
}
2222

2323
internal val Project.platformManager: PlatformManager
2424
get() {
2525
val cklibExtension = extensions.getByType(CKlibGradleExtension::class.java)
26-
return PlatformManager(Distribution(cklibExtension.konanHome))
26+
return PlatformManager(Distribution(cklibExtension.konanHome), cklibExtension.konanHome)
2727
}
2828

2929
internal val Project.llvmHome: String

plugin/src/main/kotlin/co/touchlab/cklib/gradle/CompileToBitcode.kt

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
package co.touchlab.cklib.gradle
1212

13+
import co.touchlab.cklib.gradle.CompileToBitcodePlugin.Companion.PLUGIN_NAME
1314
import org.gradle.api.DefaultTask
1415
import org.gradle.api.file.FileCollection
1516
import org.gradle.api.tasks.*
@@ -18,13 +19,12 @@ import javax.inject.Inject
1819

1920
open class CompileToBitcode @Inject constructor(
2021
srcRoot: File,
21-
@Input val folderName: String,
22-
@Input val target: String,
23-
@Input val outputGroup: String
22+
@Input val compileName: String,
23+
@Input val target: String
2424
) : DefaultTask() {
2525

2626
enum class Language {
27-
C, CPP
27+
C, CPP, OBJC
2828
}
2929

3030
// Compiler args are part of compilerFlags so we don't register them as an input.
@@ -34,13 +34,19 @@ open class CompileToBitcode @Inject constructor(
3434
val linkerArgs = mutableListOf<String>()
3535
@Input
3636
var excludeFiles: List<String> = listOf(
37+
"**/*Test.c",
38+
"**/*TestSupport.c",
39+
"**/*Test.m",
40+
"**/*TestSupport.m",
3741
"**/*Test.cpp",
3842
"**/*TestSupport.cpp",
3943
"**/*Test.mm",
4044
"**/*TestSupport.mm"
4145
)
4246
@Input
4347
var includeFiles: List<String> = listOf(
48+
"**/*.c",
49+
"**/*.m",
4450
"**/*.cpp",
4551
"**/*.mm"
4652
)
@@ -55,42 +61,30 @@ open class CompileToBitcode @Inject constructor(
5561
@Input
5662
var language = Language.CPP
5763

58-
@Input @Optional
59-
var sanitizer: org.jetbrains.kotlin.konan.target.SanitizerKind? = null
60-
61-
private val targetDir: File
64+
@get:Internal
65+
internal val targetDir: File
6266
get() {
63-
val sanitizerSuffix = when (sanitizer) {
64-
null -> ""
65-
org.jetbrains.kotlin.konan.target.SanitizerKind.ADDRESS -> "-asan"
66-
org.jetbrains.kotlin.konan.target.SanitizerKind.THREAD -> "-tsan"
67-
}
68-
return project.buildDir.resolve("bitcode/$outputGroup/$target$sanitizerSuffix")
67+
return project.buildDir.resolve("$PLUGIN_NAME/$compileName/$target")
6968
}
7069

7170
@get:OutputDirectory
7271
val objDir
73-
get() = File(targetDir, folderName)
72+
get() = File(targetDir, compileName)
7473

7574
private val org.jetbrains.kotlin.konan.target.KonanTarget.isMINGW
7675
get() = this.family == org.jetbrains.kotlin.konan.target.Family.MINGW
7776

7877
@get:Internal
7978
val executable
8079
get() = when (language) {
81-
Language.C -> "clang"
80+
Language.C, Language.OBJC -> "clang"
8281
Language.CPP -> "clang++"
8382
}
8483

8584
@get:Input
8685
val compilerFlags: List<String>
8786
get() {
8887
val commonFlags = listOf("-c", "-emit-llvm") + headersDirs.map { "-I$it" }
89-
val sanitizerFlags = when (sanitizer) {
90-
null -> listOf()
91-
org.jetbrains.kotlin.konan.target.SanitizerKind.ADDRESS -> listOf("-fsanitize=address")
92-
org.jetbrains.kotlin.konan.target.SanitizerKind.THREAD -> listOf("-fsanitize=thread")
93-
}
9488
val languageFlags = when (language) {
9589
Language.C ->
9690
// Used flags provided by original build of allocator C code.
@@ -100,8 +94,11 @@ open class CompileToBitcode @Inject constructor(
10094
"-Wall", "-Wextra",
10195
"-Wno-unused-parameter" // False positives with polymorphic functions.
10296
)
97+
Language.OBJC ->
98+
// Used flags provided by original build of allocator C code.
99+
listOf("-fobjc-arc", "-fmodules", "-mmacosx-version-min=10.6","-std=gnu11", "-O3", "-Wall", "-Wextra", "-Werror")
103100
}
104-
return commonFlags + sanitizerFlags + languageFlags + compilerArgs
101+
return commonFlags + languageFlags + compilerArgs
105102
}
106103

107104
@get:SkipWhenEmpty
@@ -147,7 +144,7 @@ open class CompileToBitcode @Inject constructor(
147144
return dirs.flatMap { dir ->
148145
project.fileTree(dir) {
149146
val includePatterns = when (language) {
150-
Language.C -> arrayOf("**/.h")
147+
Language.C, Language.OBJC -> arrayOf("**/.h")
151148
Language.CPP -> arrayOf("**/*.h", "**/*.hpp")
152149
}
153150
it.include(*includePatterns)
@@ -157,7 +154,7 @@ open class CompileToBitcode @Inject constructor(
157154

158155
@get:OutputFile
159156
val outFile: File
160-
get() = File(targetDir, "${folderName}.bc")
157+
get() = File(targetDir, "${compileName}.bc")
161158

162159
@TaskAction
163160
fun compile() {

plugin/src/main/kotlin/co/touchlab/cklib/gradle/CompileToBitcodeExtension.kt

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,52 +11,52 @@
1111
package co.touchlab.cklib.gradle
1212

1313
import org.gradle.api.Project
14+
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
15+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
1416
import javax.inject.Inject
1517

1618
open class CompileToBitcodeExtension @Inject constructor(val project: Project) {
17-
/*
18-
private val targetList = listOf(
19-
"linux_x64",
20-
"macos_x64",
21-
"ios_arm64",
22-
"ios_arm32",
23-
"ios_simulator_arm64",
24-
"ios_x64",
25-
"watchos_arm32",
26-
"watchos_arm64",
27-
"watchos_x86",
28-
"watchos_x64",
29-
"watchos_simulator_arm64",
30-
"tvos_arm64",
31-
"tvos_x64",
32-
"tvos_simulator_arm64",
33-
"macos_arm64"
34-
)*/
3519

3620
fun create(
3721
name: String,
38-
targets: List<String>,
3922
srcDir: java.io.File = project.file("src/$name"),
40-
outputGroup: String = "main",
23+
compilations: List<String> = listOf("main"),
4124
configurationBlock: CompileToBitcode.() -> Unit = {}
4225
) {
26+
val kmpExt = project.kmpExt
27+
4328
val allBitcode = project.tasks.register("all${name.snakeCaseToCamelCase().capitalize()}") {
4429
it.group = GROUP_NAME
4530
it.description = "Compiles '$name' to bitcode for all targets"
4631
}.get()
47-
val allTaskProviders = targets.map { targetName ->
48-
val taskName = "${targetName}${name.snakeCaseToCamelCase().capitalize()}"
49-
project.logger.warn("taskName $taskName")
32+
33+
val allTaskProviders = kmpExt.kotlinNativeTargets.map { knTarget ->
34+
val taskName = "${knTarget.name}${name.snakeCaseToCamelCase().capitalize()}"
35+
5036
val taskProvider = project.tasks.register(
5137
taskName,
5238
CompileToBitcode::class.java,
53-
srcDir, name, targetName, outputGroup
39+
srcDir, name, knTarget.konanTarget.name
5440
)
55-
taskProvider.configure {
56-
it.group = GROUP_NAME
57-
it.description = "Compiles '$name' to bitcode for $targetName"
58-
it.configurationBlock()
41+
42+
//tasks.getByName("compileKotlin${targetName.capitalize()}").dependsOn("${it.second}Quickjs")
43+
project.tasks.getByPath("compileKotlin${knTarget.name.capitalize()}")
44+
.dependsOn(taskName)
45+
46+
taskProvider.configure { compileToBitcodeTask ->
47+
compileToBitcodeTask.group = GROUP_NAME
48+
compileToBitcodeTask.description = "Compiles '$name' to bitcode for ${knTarget.name}"
49+
50+
compilations.forEach { compilation ->
51+
val knCompilation = knTarget.compilations.getByName(compilation)
52+
53+
knCompilation.kotlinOptions.freeCompilerArgs +=
54+
listOf("-native-library", compileToBitcodeTask.outFile.absolutePath)
55+
}
56+
57+
compileToBitcodeTask.configurationBlock()
5958
}
59+
6060
taskProvider
6161
}
6262
allBitcode.dependsOn(allTaskProviders)
@@ -66,6 +66,12 @@ open class CompileToBitcodeExtension @Inject constructor(val project: Project) {
6666
private fun String.snakeCaseToCamelCase() =
6767
split('_').joinToString(separator = "") { it.capitalize() }
6868

69-
const val GROUP_NAME = "bitcode"
69+
const val GROUP_NAME = CompileToBitcodePlugin.PLUGIN_NAME
7070
}
71-
}
71+
}
72+
73+
private val KotlinMultiplatformExtension.kotlinNativeTargets: Collection<KotlinNativeTarget>
74+
get() = targets.withType(KotlinNativeTarget::class.java)
75+
76+
private val Project.kmpExt: KotlinMultiplatformExtension
77+
get() = extensions.getByType(KotlinMultiplatformExtension::class.java)

plugin/src/main/kotlin/co/touchlab/cklib/gradle/CompileToBitcodePlugin.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,22 @@ class CompileToBitcodePlugin : Plugin<Project> {
1818
extensions.create(EXTENSION_NAME, CompileToBitcodeExtension::class.java, target)
1919
extensions.create(CKLIB_EXTENSION_NAME, CKlibGradleExtension::class.java, target)
2020

21-
afterEvaluate {
21+
// target.pluginManager.apply(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin::class.java)
22+
23+
Unit
24+
/*afterEvaluate {
2225
// TODO: Support providers (https://docs.gradle.org/current/userguide/lazy_configuration.html)
2326
// in database tasks and create them along with corresponding compile tasks (not in afterEvaluate).
2427
org.jetbrains.kotlin.createCompilationDatabasesFromCompileToBitcodeTasks(
2528
project,
2629
COMPILATION_DATABASE_TASK_NAME
2730
)
28-
}
31+
}*/
2932
}
3033

3134
companion object {
32-
const val EXTENSION_NAME = "bitcode"
33-
const val CKLIB_EXTENSION_NAME = "cklib"
34-
const val COMPILATION_DATABASE_TASK_NAME = "CompilationDatabase"
35+
const val EXTENSION_NAME = "cklib"
36+
const val CKLIB_EXTENSION_NAME = "cklibPaths"
37+
const val PLUGIN_NAME = "cklib"
3538
}
3639
}

0 commit comments

Comments
 (0)