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 }