• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.ndkports
2 
3 import org.gradle.api.DefaultTask
4 import org.gradle.api.NamedDomainObjectContainer
5 import org.gradle.api.Project
6 import org.gradle.api.file.Directory
7 import org.gradle.api.file.DirectoryProperty
8 import org.gradle.api.model.ObjectFactory
9 import org.gradle.api.provider.ListProperty
10 import org.gradle.api.provider.MapProperty
11 import org.gradle.api.provider.Property
12 import org.gradle.api.provider.Provider
13 import org.gradle.api.tasks.Input
14 import org.gradle.api.tasks.InputDirectory
15 import org.gradle.api.tasks.Internal
16 import org.gradle.api.tasks.Nested
17 import org.gradle.api.tasks.OutputDirectory
18 import org.gradle.api.tasks.TaskAction
19 import javax.inject.Inject
20 
21 abstract class ModuleProperty @Inject constructor(
22     objectFactory: ObjectFactory,
23     @get:Input val name: String,
24 ) {
25     @Suppress("UnstableApiUsage")
26     @get:Input
27     val static: Property<Boolean> =
28         objectFactory.property(Boolean::class.java).convention(false)
29 
30     @Suppress("UnstableApiUsage")
31     @get:Input
32     val headerOnly: Property<Boolean> =
33         objectFactory.property(Boolean::class.java).convention(false)
34 
35     @Suppress("UnstableApiUsage")
36     @get:Input
37     val includesPerAbi: Property<Boolean> =
38         objectFactory.property(Boolean::class.java).convention(false)
39 
40     @Suppress("UnstableApiUsage")
41     @get:Input
42     val dependencies: ListProperty<String> =
43         objectFactory.listProperty(String::class.java).convention(emptyList())
44 }
45 
46 abstract class PackageBuilderTask @Inject constructor(
47     objectFactory: ObjectFactory,
48 ) : DefaultTask() {
49     /**
50      * The name of the port. Will be used as the package name in prefab.json.
51      */
52     @Suppress("UnstableApiUsage")
53     @get:Input
54     val packageName: Property<String> =
55         objectFactory.property(String::class.java).convention(project.name)
56 
57     /**
58      * The version to encode in the prefab.json.
59      *
60      * This version must be compatible with CMake's `find_package` for
61      * config-style packages. This means that it must be one to four decimal
62      * separated integers. No other format is allowed.
63      *
64      * If not set, the default is [Project.getVersion] as interpreted by
65      * [CMakeCompatibleVersion.parse].
66      *
67      * For example, OpenSSL 1.1.1g will set this value to
68      * `CMakeCompatibleVersion(1, 1, 1, 7)`.
69      */
70     @get:Input
71     abstract val version: Property<CMakeCompatibleVersion>
72 
73     @get:Input
74     abstract val minSdkVersion: Property<Int>
75 
76     @get:Nested
77     abstract val modules: NamedDomainObjectContainer<ModuleProperty>
78 
79     @Suppress("UnstableApiUsage")
80     @get:Input
81     val licensePath: Property<String> =
82         objectFactory.property(String::class.java).convention("LICENSE")
83 
84     @Suppress("UnstableApiUsage")
85     @get:Input
86     abstract val dependencies: MapProperty<String, String>
87 
88     @get:InputDirectory
89     abstract val sourceDirectory: DirectoryProperty
90 
91     @get:InputDirectory
92     abstract val installDirectory: DirectoryProperty
93 
94     @get:Internal
95     abstract val outDir: DirectoryProperty
96 
97     @get:OutputDirectory
98     val intermediatesDirectory: Provider<Directory>
99         get() = outDir.dir("aar")
100 
101     @get:InputDirectory
102     abstract val ndkPath: DirectoryProperty
103 
104     private val ndk: Ndk
105         get() = Ndk(ndkPath.asFile.get())
106 
107     @TaskAction
runnull108     fun run() {
109         val modules = modules.asMap.values.map {
110             ModuleDescription(
111                 it.name,
112                 it.static.get(),
113                 it.headerOnly.get(),
114                 it.includesPerAbi.get(),
115                 it.dependencies.get()
116             )
117         }
118         PrefabPackageBuilder(
119             PackageData(
120                 packageName.get(),
121                 project.version as String,
122                 version.get(),
123                 minSdkVersion.get(),
124                 licensePath.get(),
125                 modules,
126                 dependencies.get(),
127             ),
128             intermediatesDirectory.get().asFile,
129             installDirectory.get().asFile,
130             sourceDirectory.get().asFile,
131             ndk,
132         ).build()
133     }
134 }