Update GRADLE_PLUGIN.md (#2168)
This commit is contained in:
committed by
Nikolay Igotti
parent
b476e7b613
commit
efc3461fd9
+21
-801
@@ -1,36 +1,16 @@
|
|||||||
# Kotlin/Native Gradle plugin
|
# Kotlin/Native Gradle plugin
|
||||||
|
|
||||||
_Note: For the experimental DSL see the [corresponding section](#experimental-plugin)_.
|
### Overview
|
||||||
|
|
||||||
## Overview
|
You may use the Gradle plugin to build _Kotlin/Native_ projects. Builds of the plugin are
|
||||||
|
[available](https://plugins.gradle.org/plugin/org.jetbrains.kotlin.platform.native) at the Gradle plugin portal, so you can apply it
|
||||||
You may use the Gradle plugin to build _Kotlin/Native_ projects. Since version 0.8 release builds of the plugin are
|
|
||||||
[available](https://plugins.gradle.org/plugin/org.jetbrains.kotlin.konan) at the Gradle plugin portal, so you can apply it
|
|
||||||
using Gradle plugin DSL:
|
using Gradle plugin DSL:
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
||||||
|
|
||||||
```groovy
|
```groovy
|
||||||
plugins {
|
plugins {
|
||||||
id "org.jetbrains.kotlin.konan" version "0.9"
|
id "org.jetbrains.kotlin.platform.native" version "1.3.0-rc-146"
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
__Note__: The 0.9 version of Kotlin/Native is based on Kotlin 1.3-M1 which is an EAP version and isn't available on
|
|
||||||
the plugin portal. In this case you need to add a Kotlin EAP repository in your `settings.gradle`:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
pluginManagement {
|
|
||||||
repositories {
|
|
||||||
gradlePluginPortal()
|
|
||||||
maven {
|
|
||||||
url = 'https://dl.bintray.com/kotlin/kotlin-eap'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -49,25 +29,18 @@ buildscript {
|
|||||||
maven {
|
maven {
|
||||||
url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies"
|
url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies"
|
||||||
}
|
}
|
||||||
maven {
|
|
||||||
url "https://dl.bintray.com/kotlin/kotlin-eap"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.8-dev-*"
|
classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:1.3.0-rc-146"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'konan'
|
apply plugin: 'org.jetbrains.kotlin.platform.native'
|
||||||
```
|
```
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
The Kotlin/Native plugin depends on `org.jetbrains.kotlin:kotlin-gradle-plugin`. So if a build contains both these
|
|
||||||
plugins as buildscript dependencies, it's recommended to **declare them in the same `build.gradle`** to avoid issues with
|
|
||||||
plugin classpath.
|
|
||||||
|
|
||||||
By default the plugin downloads the Kotlin/Native compiler during the first run. If you have already downloaded the compiler
|
By default the plugin downloads the Kotlin/Native compiler during the first run. If you have already downloaded the compiler
|
||||||
manually you can specify the path to its root directory using `konan.home` project property (e.g. in `gradle.properties`).
|
manually you can specify the path to its root directory using `konan.home` project property (e.g. in `gradle.properties`).
|
||||||
|
|
||||||
@@ -81,769 +54,13 @@ konan.home=/home/user/kotlin-native-0.8
|
|||||||
|
|
||||||
In this case the compiler will not be downloaded by the plugin.
|
In this case the compiler will not be downloaded by the plugin.
|
||||||
|
|
||||||
## Building artifacts
|
|
||||||
|
|
||||||
The Kotlin/Native Gradle plugin allows building artifacts of the following types:
|
|
||||||
|
|
||||||
* Executable
|
|
||||||
* KLibrary - a library used by Kotlin/Native compiler (`*.klib`)
|
|
||||||
* Interoperability library - a special type of library providing an interoperability with some native API. See [INTEROP.md](INTEROP.md) for details
|
|
||||||
* Dynamic library (`*.so`/`*.dylib`/`*.dll`)
|
|
||||||
* Objective-C framework
|
|
||||||
* LLVM bitcode
|
|
||||||
|
|
||||||
All Kotlin/Native artifacts should be declared in the `konanArtifacts` block. Note that the `konanInterop` script block was removed in
|
|
||||||
v0.3.4. Use the `interop` method of the `konanArtifact` block instead:
|
|
||||||
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
program('foo') // executable 'foo'
|
|
||||||
library('bar') // library 'bar'
|
|
||||||
bitcode('baz') // bitcode file 'baz'
|
|
||||||
interop('qux') // interoperability library 'qux'. Use it instead of konanInterop block.
|
|
||||||
dynamic('quux') // dynamic library
|
|
||||||
framework ('quuux') // Objective-C framework
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
All artifacts except interop libraries are built by the Kotlin/Native compiler. Such an artifact may be configured using its script block.
|
|
||||||
It is here that you can specify source directories, used libraries, and compilation flags (see [**Plugin DSL**](#plugin-dsl) section for details). The plugin
|
|
||||||
uses `src/main/kotlin/` as a default source directory for all compiler artifacts:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
// Build foo.klib
|
|
||||||
library('foo') {
|
|
||||||
srcDir 'src/foo/kotlin' // Use custom source path
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build executable 'bar'
|
|
||||||
program('bar') {
|
|
||||||
// The default source path is used (src/main/kotlin)
|
|
||||||
|
|
||||||
// Optimize the output code
|
|
||||||
enableOptimizations true
|
|
||||||
|
|
||||||
libraries {
|
|
||||||
// Use foo.klib as a library
|
|
||||||
artifact 'foo'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Interop libraries are built using the `cinterop` tool. They also may have configuration blocks but the options available in these blocks
|
|
||||||
differ from ones available for compiler artifacts. The input for such an artifact is a def-file describing a native API. By default the
|
|
||||||
def-file path is `src/main/c_interop/<library-name>.def` but it may be changed using the `defFile` method of the configuration block of
|
|
||||||
an interoperability library:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
// Interoperability library stdio.klib
|
|
||||||
// Use the default def-file path: src/main/c_interop/stdio.def
|
|
||||||
interop('stdio')
|
|
||||||
|
|
||||||
// Interoperability library openal.klib
|
|
||||||
interop('openal') {
|
|
||||||
defFile 'src/openal/openal.def'
|
|
||||||
}
|
|
||||||
|
|
||||||
program('main') {
|
|
||||||
libraries {
|
|
||||||
// Link with stdio.klib
|
|
||||||
artifact 'stdio'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Building for different targets
|
|
||||||
|
|
||||||
All the artifacts declared in a project may be built for different targets. By default they are built only for the `host` target i.e. a
|
|
||||||
computer used for building. One may change the default target list using the `konan.targets` project extension:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konan.targets = [ 'linux', 'android_arm64', 'android_arm32' ]
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
One may specify a custom target set for each particular artifact using the `targets` parameter of an artifact declaration:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konan.targets = [ 'linux', 'android_arm64' ]
|
|
||||||
|
|
||||||
konanArtifacts {
|
|
||||||
// This artifact has no custom targets and will be built
|
|
||||||
// for all the default ones: 'linux', 'android_arm64'
|
|
||||||
program('foo') { /* ... */ }
|
|
||||||
|
|
||||||
// This artifact will be built only for Linux and Wasm32
|
|
||||||
program('bar', targets: ['linux', 'wasm32']) { /* ... */ }
|
|
||||||
|
|
||||||
// An Objective-C framework cannot be built for Linux and Wasm32 thus
|
|
||||||
// these targets will be skipped and the artifact will be built only for iOS
|
|
||||||
framework('baz', targets: [ 'linux', 'wasm32', 'iphone' ]) { /* ... */ }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
The plugin creates tasks to compile each artifact for all the targets supported by the current host and declared in the `konan.targets` list.
|
|
||||||
You can perform additional configuration for a target using the `target` method of an artifact configuration block:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konan.targets = [ 'linux', 'macbook', 'wasm32' ]
|
|
||||||
|
|
||||||
konanArtifacts {
|
|
||||||
program('foo') {
|
|
||||||
// This source file is used for all targets
|
|
||||||
srcFiles 'common.kt'
|
|
||||||
|
|
||||||
target('linux') {
|
|
||||||
// For Linux common.kt and linux.kt will be compiled
|
|
||||||
srcFiles 'linux.kt'
|
|
||||||
}
|
|
||||||
|
|
||||||
target('macbook') {
|
|
||||||
// For MacOS common.kt and macbook.kt will be compiled
|
|
||||||
srcFiles 'macbook.kt'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only common.kt will be compiled for wasm32
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
One may access to a task for some target via artifact methods or properties:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
// Both of them return a task building artifact 'foo' for MacOS
|
|
||||||
konanArtifacts.foo.getByTarget("macbook")
|
|
||||||
konanArtifacts.foo.macbook
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Using libraries
|
|
||||||
|
|
||||||
You can specify used libraries for artifacts of all types using the `libraries` script block:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
program('foo') {
|
|
||||||
libraries {
|
|
||||||
// configure the libraries used
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
There are several ways to describe a library used by an artifact:
|
|
||||||
|
|
||||||
* Specify a library file directly. You can specify it using the `file` method of the `libraries` script block. All the objects accepted by
|
|
||||||
the [`Project.file`](https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:file(java.lang.Object))
|
|
||||||
method may be passed there:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
libraries {
|
|
||||||
file 'libs/foo.klib'
|
|
||||||
files 'lib1.klib', 'lib2.klib'
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
* Specify a Kotlin/Native artifact object or its name. In this case the plugin automatically chooses a library with the correct target
|
|
||||||
and sets dependencies between building tasks.
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
libraries {
|
|
||||||
// Artifact object or just its name may be used
|
|
||||||
artifact 'foo'
|
|
||||||
artifact kotlinArtifacts.bar
|
|
||||||
|
|
||||||
// Artifacts from other projects are also allowed
|
|
||||||
artifact project(':bazProject'), 'bazLibrary'
|
|
||||||
|
|
||||||
// Interopability libraries are also allowed
|
|
||||||
// Use it instead of the `useInterop` method available in versions before 0.3.4
|
|
||||||
artifact 'stdio'
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
* Specify a project containing libraries. In this case all libraries built by the project specified will be used:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
libraries {
|
|
||||||
allLibrariesFrom project(':subproject')
|
|
||||||
|
|
||||||
// If we need only interoperability libraries
|
|
||||||
allInteropLibrariesFrom project(':interop')
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
* Specify only the name of a library. In this case the compiler will look for the library in its repositories.
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
libraries {
|
|
||||||
klib 'foo'
|
|
||||||
klibs 'lib1', 'lib2'
|
|
||||||
|
|
||||||
// One may specify additional repositories
|
|
||||||
// All objects accepted by the Project.file method may be used here
|
|
||||||
useRepo 'build/libraries'
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Multiplatform build
|
|
||||||
|
|
||||||
Kotlin/Native, Kotlin/JVM, and Kotlin/JS, support multiplatform projects. Such support is included in the
|
|
||||||
Kotlin/Native Gradle plugin by default and there is no need to apply any additional plugins to use it. By default
|
|
||||||
multiplatform support is turned off, and can be enabled with the `enableMultiplatform` DSL method:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
apply 'konan'
|
|
||||||
|
|
||||||
konanArtifacts {
|
|
||||||
program('foo') {
|
|
||||||
enableMultiplatform true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
The Gradle plugin adds an `expectedBy` dependency configuration that is used to specify a dependency from a Kotlin/Native
|
|
||||||
project to a common project:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
apply 'konan'
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
expectedBy project('commonProject')
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
When a common project is added as an `expectedBy` dependency, all the artifacts with the multiplatform support enabled
|
|
||||||
will use its `main` source set as a common module. One may specify custom source sets for each artifact using the
|
|
||||||
`commonSourceSets` DSL method. In this case the multiplatform support will be also enabled for this artifact.
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
program('foo') {
|
|
||||||
commonSourceSets 'customSourceSet', 'anotherCustomSourceSet'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
See more about multiplatform projects [here](https://kotlinlang.org/docs/reference/multiplatform.html).
|
|
||||||
|
|
||||||
## Tasks
|
|
||||||
|
|
||||||
The Kotlin/Native plugin creates the following tasks:
|
|
||||||
|
|
||||||
* __compileKonan\<ArtifactName>\<Target>__. The plugin creates a task for each target declared in the `konan.targets` list and
|
|
||||||
for each an artifact is defined in a `konanArtifacts` block. Such a task may have different properties depending on the artifact type:
|
|
||||||
|
|
||||||
**Properties available for a compiler task (executable, library or bitcode building task):**
|
|
||||||
|
|
||||||
|Property |Type |Description |
|
|
||||||
|---------------------|----------------------------|----------------------------------------------------------|
|
|
||||||
|`target `|`String` |Target the artifact is built for. Read only |
|
|
||||||
|`artifactName `|`String` |Base name for the output file (without an extension) |
|
|
||||||
|`destinationDir `|`File` |Directory to place the output artifact |
|
|
||||||
|`artifact `|`File` |The output artifact. Read only |
|
|
||||||
|`headerFile `|`File` |The output C header. Only for dynamic libraries, read only|
|
|
||||||
|`srcFiles `|`Collection<FileCollection>`|Compiled files |
|
|
||||||
|`nativeLibraries `|`Collection<FileCollection>`|*.bc libraries used by the artifact |
|
|
||||||
|`linkerOpts `|`List<String>` |Additional options passed to the linker |
|
|
||||||
|`enableDebug `|`boolean` |Is the debugging support enabled |
|
|
||||||
|`noStdLib `|`boolean` |Is the artifact not linked with stdlib |
|
|
||||||
|`noMain `|`boolean` |Is the `main` function provided by a library used |
|
|
||||||
|`enableOptimizations`|`boolean` |Are the optimizations enabled |
|
|
||||||
|`enableAssertions `|`boolean` |Is the assertion support enabled |
|
|
||||||
|`measureTime `|`boolean` |Does the compiler print phase time |
|
|
||||||
|`enableMultiplatform`|`boolean` |Is multiplatform support enabled for this artifact |
|
|
||||||
|`commonSourceSets` |`Collection<String>` |Names of source sets used as a common module |
|
|
||||||
|
|
||||||
**Properties available for a cinterop task (task building an interoperability library):**
|
|
||||||
|
|
||||||
|Property |Type |Description |
|
|
||||||
|----------------|----------------------------|---------------------------------------------------------|
|
|
||||||
|`target `|`String` |Target the artifact is built for. Read only. |
|
|
||||||
|`artifactName `|`String` |Base name for the output file (without an extension) |
|
|
||||||
|`destinationDir`|`File` |Directory to place the output artifact |
|
|
||||||
|`artifact `|`File` |The output artifact. Read only. |
|
|
||||||
|`defFile `|`File` |Def-file used by the interop |
|
|
||||||
|`compilerOpts `|`List<String>` |Additional options passed to clang |
|
|
||||||
|`linkerOpts `|`List<String>` |Additional options passed to a linker |
|
|
||||||
|`headers `|`Collection<FileCollection>`|Additional headers used for stub generation |
|
|
||||||
|`linkFiles `|`Collection<FileCollection>`|Additional files linked with the stubs |
|
|
||||||
|
|
||||||
|
|
||||||
* __compileKonan\<ArtifactName>__. Aggregate task allowing you to build an artifact for several targets. By default it builds
|
|
||||||
the artifact for all the supported targets declared for the project. You can change this behavior by specifying the space-separated
|
|
||||||
target list in the `konan.build.targets` project property:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="shell">
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./gradlew compileKonanFoo -Pkonan.build.targets='android_arm32 android_arm64'
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
The task has no properties to use by a build script.
|
|
||||||
|
|
||||||
* __compileKonan__. Aggregate task to build all the Kotlin/Native artifacts for all available targets. `konan.build.targets` project
|
|
||||||
property also may be used to override the target list. The task has no properties that can be used by a build script.
|
|
||||||
|
|
||||||
* __run\<ArtifactName>__. Such a task is created for each executable supported by the current host and allows you to run this
|
|
||||||
executable. The task is an instance of Gradle's [`Exec`](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html)
|
|
||||||
so it supports all the settings provided by `Exec`. Additionally, run parameters may be passed to the task using the `runArgs`
|
|
||||||
project property:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="shell">
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./gradlew runFoo -PrunArgs='foo bar'
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
The plugin also edits the default `build` and `clean` tasks so that the first one allows you to build all the artifacts supported
|
|
||||||
(it's dependent on the `compileKonan` task) and the second one removes the files created by the Kotlin/Native build.
|
|
||||||
|
|
||||||
## Building dynamic libraries and frameworks
|
|
||||||
|
|
||||||
Kotlin/Native supports building artifacts to be used by other native languages. There are two types of such artifacts:
|
|
||||||
Objective-C framework and dynamic library.
|
|
||||||
|
|
||||||
### Dynamic library
|
|
||||||
|
|
||||||
A dynamic library may be built using the `dynamic` artifact block. This block contains the same
|
|
||||||
options as the other ones (except `interop`) allowing you to specify source files, compiler options, and the libraries used.
|
|
||||||
Each task building a dynamic library produces two files: the library itself (a `*.so`/`*.dylib`/`*.dll` file depending
|
|
||||||
on the target platform) and a C language header. Both of them may be accessed via properties of a building task
|
|
||||||
(both properties have type `File`):
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
// Build a dynamic library
|
|
||||||
dynamic('foo') { /* ... */ }
|
|
||||||
}
|
|
||||||
|
|
||||||
konanArtifacts.foo.getByTarget('host').artifact // Points to the library file
|
|
||||||
konanArtifacts.foo.getByTarget('host').headerFile // Points to the header file
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Using a dynamic library is shown in the [python extension sample](https://github.com/JetBrains/kotlin-native/tree/master/samples/python_extension).
|
|
||||||
|
|
||||||
### Framework
|
|
||||||
|
|
||||||
An Objective-C framework can be built using the `framework` artifact block. This block contains the
|
|
||||||
same options as other ones. One may access the framework built using `artifact` property of the building task
|
|
||||||
(see the [**Tasks**](#tasks) section). Unlike other artifacts this property points to a directory instead of a regular file.
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
// Build an Objective-C framework
|
|
||||||
framework('foo') { /* ... */ }
|
|
||||||
}
|
|
||||||
|
|
||||||
konanArtifacts.foo.getByTarget('host').artifact // Points to the framework directory
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Using a framework is shown in the [calculator sample](https://github.com/JetBrains/kotlin-native/tree/master/samples/calculator).
|
|
||||||
|
|
||||||
## Additional options
|
|
||||||
|
|
||||||
You can also pass additional command line keys to the compiler or cinterop tool using the `extraOpts` expression
|
|
||||||
available in the artifact configuration script block. For example this sample enables a verbose output for a link and bitcode
|
|
||||||
generation stages and prints the execution time for all the compiler phases:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
program('foo') {
|
|
||||||
extraOpts '--verbose', 'linker', '--verbose', 'bitcode', '--time'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Any command line key supported by the according tool (compiler or cinterop) can be used. Some of them are listed in the
|
|
||||||
tables below.
|
|
||||||
|
|
||||||
##### Compiler additional options
|
|
||||||
|
|
||||||
|Key |Description |
|
|
||||||
|-------------------|-----------------------------------------|
|
|
||||||
|`--disable <Phase>`|Disable backend phase |
|
|
||||||
|`--enable <Phase> `|Enable backend phase |
|
|
||||||
|`--list_phases `|List all backend phases |
|
|
||||||
|`--time `|Report execution time for compiler phases|
|
|
||||||
|`--verbose <Phase>`|Trace phase execution |
|
|
||||||
|`-verbose `|Enable verbose logging output |
|
|
||||||
|
|
||||||
##### Cinterop additional options
|
|
||||||
|
|
||||||
|Key |Description |
|
|
||||||
|--------------------|----------------------------------------------------|
|
|
||||||
|`-verbose <boolean>`|Increase verbosity |
|
|
||||||
|`-shims <boolean>` |Add generation of shims tracing native library calls|
|
|
||||||
|
|
||||||
## Plugin DSL
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
// Default targets to build for.
|
|
||||||
konan.targets = ['macbook', 'linux', 'wasm32']
|
|
||||||
|
|
||||||
// Language and API version.
|
|
||||||
konan.languageVersion = 'version'
|
|
||||||
konan.apiVersion = 'version'
|
|
||||||
|
|
||||||
konanArtifacts {
|
|
||||||
// Targets to build this artifact for (optional, override the konan.targets list)
|
|
||||||
program('foo', targets: ['android_arm32', 'android_arm64']) {
|
|
||||||
|
|
||||||
// Directory with source files. The default path is src/main/kotlin.
|
|
||||||
srcDir 'src/other'
|
|
||||||
|
|
||||||
// Source files.
|
|
||||||
srcFiles project.fileTree('src')
|
|
||||||
srcFiles 'foo.kt', 'bar.kt'
|
|
||||||
|
|
||||||
// Custom output artifact name (without extension).
|
|
||||||
// The default is a name of the artifact
|
|
||||||
artifactName 'customName'
|
|
||||||
|
|
||||||
// Base Directory for the output artifacts.
|
|
||||||
// Separate subdirectories for each target will be created
|
|
||||||
// The default is build/konan/bin
|
|
||||||
baseDir 'path/to/output/dir'
|
|
||||||
|
|
||||||
libraries {
|
|
||||||
// Library files
|
|
||||||
file 'foo.klib'
|
|
||||||
files 'file1.klib', file2.klib
|
|
||||||
files project.files('file3.klib', 'file4.klib')
|
|
||||||
|
|
||||||
// An artifact from the current project
|
|
||||||
artifact konanArtifacts.bar
|
|
||||||
artifact 'baz'
|
|
||||||
|
|
||||||
// An artifact from another project
|
|
||||||
artifact project(':path:to:a:project'), 'artifactName'
|
|
||||||
|
|
||||||
// All libraries from another project
|
|
||||||
allLibrariesFrom project(':some:project')
|
|
||||||
|
|
||||||
// Only interoperability libraries from another project
|
|
||||||
allInteropLibrariesFrom project(':some:interop:project')
|
|
||||||
|
|
||||||
// Named libraries for search in repositories
|
|
||||||
klib 'foo'
|
|
||||||
klib 'bar', 'baz'
|
|
||||||
|
|
||||||
// Custom repository paths
|
|
||||||
useRepo 'path/to/a/repo'
|
|
||||||
useRepos 'another/repo/1', 'another/repo/2'
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// A native library (*.bc) for linking.
|
|
||||||
nativeLibrary project.file('path/to/native/library.bc')
|
|
||||||
nativeLibraries 'library1.bc', 'library2.bc'
|
|
||||||
|
|
||||||
noStdLib true // Don't link with stdlib (true/false).
|
|
||||||
enableOptimizations true // Enable compiler optimizations (true/false).
|
|
||||||
enableAssertions true // Enable assertions in binaries generated (true/false).
|
|
||||||
enableDebug true // Enable debugging for binaries generated (true/false).
|
|
||||||
noDefaultLibs true // Don't link with default libraries
|
|
||||||
|
|
||||||
// Custom entry point
|
|
||||||
entryPoint 'org.demo.foo'
|
|
||||||
|
|
||||||
// Arguments to be passed to a linker.
|
|
||||||
linkerOpts 'Some linker option', 'More linker options'
|
|
||||||
|
|
||||||
// Print all parameters during the build.
|
|
||||||
dumpParameters true
|
|
||||||
|
|
||||||
// Print time of compilation phases (equivalent of the `--time` command line option).
|
|
||||||
measureTime true
|
|
||||||
|
|
||||||
// Add the `anotherTask` to the compilation task dependencies.
|
|
||||||
dependsOn anotherTask
|
|
||||||
|
|
||||||
// Pass additional command line options to the compiler.
|
|
||||||
extraOpts '--time', '--verbose', 'linker'
|
|
||||||
|
|
||||||
// Additional configuration for Linux.
|
|
||||||
target('linux') {
|
|
||||||
// Exact output directory for a file compile for the given target
|
|
||||||
// The default is <baseDir>/<target>
|
|
||||||
destinationDir 'exact/output/path'
|
|
||||||
|
|
||||||
// Also all options described for this artifact above are available here.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
library('bar') {
|
|
||||||
// Library has the same parameters as an executable
|
|
||||||
// The default baseDir is build/konan/libs
|
|
||||||
}
|
|
||||||
|
|
||||||
bitcode('baz') {
|
|
||||||
// Bitcode has the same parameters as an executable
|
|
||||||
// The default baseDir is build/konan/bitcode
|
|
||||||
}
|
|
||||||
|
|
||||||
dynamic('quux') {
|
|
||||||
// Dynamic library has the same parameters as an executable
|
|
||||||
// The default baseDir is build/konan/bin
|
|
||||||
}
|
|
||||||
|
|
||||||
framework('quuux') {
|
|
||||||
// Framework has the same parameters as an executable
|
|
||||||
// The default baseDir is build/konan/bin
|
|
||||||
}
|
|
||||||
|
|
||||||
interop('qux') {
|
|
||||||
// Def-file describing the native API.
|
|
||||||
// The default path is src/main/c_interop/<interop-name>.def
|
|
||||||
defFile project.file("deffile.def")
|
|
||||||
|
|
||||||
// Custom output artifact name (without extension).
|
|
||||||
// The default is a name of the artifact
|
|
||||||
artifactName 'customName'
|
|
||||||
|
|
||||||
// Base Directory for the output artifacts.
|
|
||||||
// Separate subdirectories for each target will be created
|
|
||||||
// The default is build/konan/libs
|
|
||||||
baseDir 'path/to/output/dir'
|
|
||||||
|
|
||||||
// Package to place the Kotlin API generated.
|
|
||||||
packageName 'org.sample'
|
|
||||||
|
|
||||||
libraries {
|
|
||||||
// All library options from the executable example above are available here.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Options to be passed to compiler and linker by cinterop tool.
|
|
||||||
compilerOpts 'Options for native stubs compilation'
|
|
||||||
linkerOpts 'Options for native stubs'
|
|
||||||
|
|
||||||
// Additional headers to parse.
|
|
||||||
headers project.files('header1.h', 'header2.h')
|
|
||||||
|
|
||||||
// Directories to look for headers.
|
|
||||||
includeDirs {
|
|
||||||
// All objects accepted by the Project.file method may be used with both options.
|
|
||||||
|
|
||||||
// Directories for header search (an analogue of the -I<path> compiler option).
|
|
||||||
allHeaders 'path1', 'path2'
|
|
||||||
|
|
||||||
// Additional directories to search headers listed in the 'headerFilter' def-file option.
|
|
||||||
// -headerFilterAdditionalSearchPrefix command line option analogue.
|
|
||||||
headerFilterOnly 'path1', 'path2'
|
|
||||||
}
|
|
||||||
// A shortcut for includeDirs.allHeaders.
|
|
||||||
includeDirs "include/directory" "another/directory"
|
|
||||||
|
|
||||||
// Additional files to link with native stubs.
|
|
||||||
link <files which will be linked with native stubs>
|
|
||||||
|
|
||||||
// Print all parameters during the build.
|
|
||||||
dumpParameters true
|
|
||||||
|
|
||||||
// Add the `anotherTask` to the stub generation task dependencies.
|
|
||||||
dependsOn anotherTask
|
|
||||||
|
|
||||||
// Pass additional command line options to the cinterop tool.
|
|
||||||
extraOpts '-shims', 'true'
|
|
||||||
|
|
||||||
// Additional configuration for Linux.
|
|
||||||
target('linux') {
|
|
||||||
// Exact output directory for a file compile for the given target
|
|
||||||
// The default is <baseDir>/<target>
|
|
||||||
destinationDir 'exact/output/path'
|
|
||||||
|
|
||||||
// Also all options described for this artifact above are available here.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
## Multiplatform DSL
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
apply plugin: 'konan'
|
|
||||||
|
|
||||||
// In this example common code is located in 'foo' and 'bar' source sets of ':common' project.
|
|
||||||
|
|
||||||
konanArtifacts {
|
|
||||||
// All the artifact types except interop libraries may use common modules.
|
|
||||||
program('foo') {
|
|
||||||
// All artifact settings described above are available here.
|
|
||||||
|
|
||||||
// Enable multiplatform support for this artifact.
|
|
||||||
enableMultiplatform true
|
|
||||||
|
|
||||||
// Set a custom names for source sets used as a common module.
|
|
||||||
// The default source set is 'main'
|
|
||||||
commonSourceSets 'foo', 'bar'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
// Use the ':foo' project as a common project for multiplatform build.
|
|
||||||
expectedBy project(':common')
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Publishing to Maven
|
|
||||||
|
|
||||||
Publishing the Kotlin/Native artifacts depends on mechanisms which were introduced in Gradle Native support, e.g. Gradle's
|
|
||||||
metadata feature. So some additional steps are required. First of all, the gradle version shouldn't be less
|
|
||||||
than the gradle version of kotlin native plugin that it depends on (currently Gradle 4.7). Before Gradle 5.0, the feature
|
|
||||||
[GRADLE_METADATA](https://github.com/gradle/gradle/blob/master/subprojects/docs/src/docs/design/gradle-module-metadata-specification.md)
|
|
||||||
should be enabled for the build. e.g. in settings.gradle
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
enableFeaturePreview('GRADLE_METADATA')
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
Some Maven repositories require some declarations in the `pom` files, that should be present in all auxiliary `pom` files (
|
|
||||||
platform x build types). To meet this requirement the Kotlin/Native plugin has the following syntax to do it:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
konanArtifacts {
|
|
||||||
interop('libcurl') {
|
|
||||||
target('linux') {
|
|
||||||
includeDirs.headerFilterOnly '/usr/include'
|
|
||||||
}
|
|
||||||
target('macbook') {
|
|
||||||
includeDirs.headerFilterOnly '/opt/local/include', '/usr/local/include'
|
|
||||||
}
|
|
||||||
pom {
|
|
||||||
withXml {
|
|
||||||
def root = asNode()
|
|
||||||
root.appendNode('name', 'libcurl interop library')
|
|
||||||
root.appendNode('description', 'A library providing interoperability with host libcurl')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
In this example `name` and `description` tags will be added to each generated `pom` file for _libcurl_ published artifact.
|
|
||||||
|
|
||||||
## Experimental plugin
|
|
||||||
|
|
||||||
|
|
||||||
In the version 0.8 a new experimental plugin has been introduced. It is integrated with new Gradle support
|
|
||||||
for native languages and provides a new DSL which is much closer to the DSL of Kotlin/JVM and Kotlin/JS
|
|
||||||
plugins than the old one.
|
|
||||||
The plugin is available at the Gradle plugin portal:
|
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
|
||||||
|
|
||||||
```groovy
|
|
||||||
plugins {
|
|
||||||
id "org.jetbrains.kotlin.platform.native" version "0.9"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
### Source management
|
### Source management
|
||||||
|
|
||||||
Source management in the `kotlin.platform.native` plugin is uniform with other Kotlin plugins and is based on source sets. A source set is a group of Kotlin/Native source which may contain both common and platform-specific code. The plugin provides a top-level script block `sourceSets` allowing you to configure source sets. Also it creates the default source sets `main` and `test` (for production and test code respectively).
|
Source management in the `kotlin.platform.native` plugin is uniform with other Kotlin plugins and is based on source sets.
|
||||||
|
A source set is a group of Kotlin/Native source which may contain both common and platform-specific code. The plugin
|
||||||
|
provides a top-level script block `sourceSets` allowing you to configure source sets. Also it creates the default
|
||||||
|
source sets `main` and `test` (for production and test code respectively).
|
||||||
|
|
||||||
By default the production sources are located in `src/main/kotlin` and the test sources - in `src/test/kotlin`.
|
By default the production sources are located in `src/main/kotlin` and the test sources - in `src/test/kotlin`.
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
||||||
@@ -862,7 +79,8 @@ sourceSets {
|
|||||||
|
|
||||||
### Targets and output kinds
|
### Targets and output kinds
|
||||||
|
|
||||||
By default the plugin creates software components for the main and test source sets. You can access them via the `components` container provided by Gradle or via the `component` property of a corresponding source set:
|
By default the plugin creates software components for the main and test source sets. You can access them via the
|
||||||
|
`components` container provided by Gradle or via the `component` property of a corresponding source set:
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
||||||
|
|
||||||
@@ -921,7 +139,9 @@ The plugin supports producing binaries of the following kinds:
|
|||||||
* `DYNAMIC` - shared native library;
|
* `DYNAMIC` - shared native library;
|
||||||
* `STATIC` - static native library.
|
* `STATIC` - static native library.
|
||||||
|
|
||||||
Also each binary is built in two variants (build types): `debug` (debuggable, not optimized) and `release` (not debuggable, optimized).
|
Also each native binary is built in two variants (build types): `debug` (debuggable, not optimized) and `release` (not debuggable, optimized).
|
||||||
|
Note that Kotlin/Native libraries have only `debug` variant because optimizations are preformed only during compilation
|
||||||
|
of a final binary (executable, static lib etc) and affect all libraries used to build it.
|
||||||
|
|
||||||
### Compile tasks
|
### Compile tasks
|
||||||
|
|
||||||
@@ -1000,7 +220,7 @@ dependencies {
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
`implementation`-dependencies are also available in the component block:
|
Dependency declaraion is also possible in the component block:
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
||||||
|
|
||||||
@@ -1013,7 +233,7 @@ components.main {
|
|||||||
|
|
||||||
components.test {
|
components.test {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation org.sample.test:testlibrary:1.0'
|
implementation 'org.sample.test:testlibrary:1.0'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1023,7 +243,7 @@ components.test {
|
|||||||
|
|
||||||
### Using cinterop
|
### Using cinterop
|
||||||
|
|
||||||
It's possible to declare a cinterop dependency for a component. The DSL here is similar to the one used in the `konan` plugin:
|
It's possible to declare a cinterop dependency for a component:
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
||||||
|
|
||||||
@@ -1064,7 +284,7 @@ components.main {
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Also the `allTargets` block is available
|
Also the `allTargets` block is available.
|
||||||
|
|
||||||
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
<div class="sample" markdown="1" theme="idea" mode="groovy">
|
||||||
|
|
||||||
@@ -1127,7 +347,7 @@ See also the example projects that use this plugin, e.g.
|
|||||||
|
|
||||||
```groovy
|
```groovy
|
||||||
plugins {
|
plugins {
|
||||||
id "org.jetbrains.kotlin.platform.native" version "0.9"
|
id "org.jetbrains.kotlin.platform.native" version "1.3.0-rc-146"
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets.main {
|
sourceSets.main {
|
||||||
|
|||||||
Reference in New Issue
Block a user