mirror of
https://github.com/ethauvin/kobalt.git
synced 2025-04-27 00:38:11 -07:00
Android variant work.
This commit is contained in:
parent
c004431946
commit
b422fb1b83
11 changed files with 133 additions and 29 deletions
|
@ -3,6 +3,7 @@ package com.beust.kobalt
|
|||
import com.beust.kobalt.api.*
|
||||
import com.beust.kobalt.misc.KFiles
|
||||
import com.beust.kobalt.misc.log
|
||||
import com.beust.kobalt.misc.warn
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
|
@ -131,7 +132,8 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
|
|||
|
||||
fun toIntermediateDir() : String {
|
||||
if (isDefault) {
|
||||
throw AssertionError("DEFAULT VARIANT NOT IMPLEMENTED")
|
||||
warn("DEFAULT VARIANT NOT IMPLEMENTED")
|
||||
return ""
|
||||
} else {
|
||||
return KFiles.joinDir(productFlavor.name, buildType.name)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package com.beust.kobalt.api
|
||||
|
||||
/**
|
||||
* Plug-ins can alter the build directory by implementing this interface.
|
||||
*/
|
||||
interface IBuildDirectoryIncerceptor : IPluginActor {
|
||||
fun intercept(project: Project, context: KobaltContext, buildDirectory: String) : String
|
||||
}
|
||||
|
10
src/main/kotlin/com/beust/kobalt/api/ICompilerInterceptor.kt
Normal file
10
src/main/kotlin/com/beust/kobalt/api/ICompilerInterceptor.kt
Normal file
|
@ -0,0 +1,10 @@
|
|||
package com.beust.kobalt.api
|
||||
|
||||
import com.beust.kobalt.internal.CompilerActionInfo
|
||||
|
||||
/**
|
||||
* Plug-ins can alter what is passed to the compiler by implementing this interface.
|
||||
*/
|
||||
interface ICompilerInterceptor : IPluginActor {
|
||||
fun intercept(project: Project, context: KobaltContext, actionInfo: CompilerActionInfo) : CompilerActionInfo
|
||||
}
|
|
@ -1,4 +1,7 @@
|
|||
package com.beust.kobalt.api
|
||||
|
||||
interface IContributor
|
||||
interface IPluginActor
|
||||
|
||||
interface IContributor : IPluginActor
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
package com.beust.kobalt.api
|
||||
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* Plug-ins can alter the source directories by implementing this interface.
|
||||
*/
|
||||
interface ISourceDirectoriesIncerceptor : IPluginActor {
|
||||
fun intercept(project: Project, context: KobaltContext, sourceDirectories: List<File>) : List<File>
|
||||
}
|
||||
|
|
@ -112,6 +112,14 @@ open public class Project(
|
|||
fun addBuildType(name: String, bt: BuildTypeConfig) {
|
||||
buildTypes.put(name, bt)
|
||||
}
|
||||
|
||||
fun classesDir(context: KobaltContext): String {
|
||||
val initial = KFiles.joinDir(buildDirectory, "classes")
|
||||
val result = context.pluginInfo.buildDirectoryInterceptors.fold(initial, { dir, intercept ->
|
||||
intercept.intercept(this, context, dir)
|
||||
})
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
public class Sources(val project: Project, val sources: HashSet<String>) {
|
||||
|
|
|
@ -28,9 +28,6 @@ abstract class JvmCompilerPlugin @Inject constructor(
|
|||
open val jvmCompiler: JvmCompiler) : BasePlugin(), IProjectContributor {
|
||||
|
||||
companion object {
|
||||
@ExportedProjectProperty(doc = "The location of the build directory", type = "String")
|
||||
const val BUILD_DIR = "buildDir"
|
||||
|
||||
@ExportedProjectProperty(doc = "Projects this project depends on", type = "List<ProjectDescription>")
|
||||
const val DEPENDENT_PROJECTS = "dependentProjects"
|
||||
|
||||
|
@ -54,7 +51,6 @@ abstract class JvmCompilerPlugin @Inject constructor(
|
|||
|
||||
override fun apply(project: Project, context: KobaltContext) {
|
||||
super.apply(project, context)
|
||||
project.projectProperties.put(BUILD_DIR, project.buildDirectory + File.separator + "classes")
|
||||
project.projectProperties.put(DEPENDENT_PROJECTS, projects())
|
||||
addVariantTasks(project, "compile", runTask = { taskCompile(project) })
|
||||
}
|
||||
|
@ -176,17 +172,23 @@ abstract class JvmCompilerPlugin @Inject constructor(
|
|||
project.compileDependencies)
|
||||
|
||||
val projectDirectory = File(project.directory)
|
||||
val buildDirectory = File(project.projectProperties.getString(BUILD_DIR))
|
||||
val buildDirectory = File(project.classesDir(context))
|
||||
buildDirectory.mkdirs()
|
||||
|
||||
val sourceDirectories = context.variant.sourceDirectories(project)
|
||||
val initialSourceDirectories = context.variant.sourceDirectories(project)
|
||||
val sourceDirectories = context.pluginInfo.sourceDirectoriesInterceptors.fold(initialSourceDirectories,
|
||||
{ sd, interceptor -> interceptor.intercept(project, context, sd) })
|
||||
|
||||
val sourceFiles = files.findRecursively(projectDirectory, sourceDirectories,
|
||||
{ it .endsWith(project.sourceSuffix) })
|
||||
.map { File(projectDirectory, it).absolutePath }
|
||||
.map { File(projectDirectory, it).path }
|
||||
|
||||
val cai = CompilerActionInfo(projectDirectory.path, classpath, sourceFiles, buildDirectory,
|
||||
val initialActionInfo = CompilerActionInfo(projectDirectory.path, classpath, sourceFiles, buildDirectory,
|
||||
emptyList())
|
||||
return cai
|
||||
val result = context.pluginInfo.compilerInterceptors.fold(initialActionInfo, { ai, interceptor ->
|
||||
interceptor.intercept(project, context, ai)
|
||||
})
|
||||
return result
|
||||
}
|
||||
|
||||
abstract fun doCompile(project: Project, cai: CompilerActionInfo) : TaskResult
|
||||
|
|
|
@ -52,6 +52,15 @@ class KobaltPluginXml {
|
|||
|
||||
@XmlElement(name = "compiler-flag-contributors") @JvmField
|
||||
var compilerFlagContributors: ClassNameXml? = null
|
||||
|
||||
@XmlElement(name = "compiler-interceptors") @JvmField
|
||||
var compilerInterceptors: ClassNameXml? = null
|
||||
|
||||
@XmlElement(name = "source-directories-interceptors") @JvmField
|
||||
var sourceDirectoriesInterceptors: ClassNameXml? = null
|
||||
|
||||
@XmlElement(name = "build-directory-interceptors") @JvmField
|
||||
var buildDirectoryInterceptors: ClassNameXml? = null
|
||||
}
|
||||
|
||||
class ContributorXml {
|
||||
|
@ -76,6 +85,9 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) {
|
|||
val initContributors = arrayListOf<IInitContributor>()
|
||||
val repoContributors = arrayListOf<IRepoContributor>()
|
||||
val compilerFlagContributors = arrayListOf<ICompilerFlagContributor>()
|
||||
val compilerInterceptors = arrayListOf<ICompilerInterceptor>()
|
||||
val sourceDirectoriesInterceptors = arrayListOf<ISourceDirectoriesIncerceptor>()
|
||||
val buildDirectoryInterceptors = arrayListOf<IBuildDirectoryIncerceptor>()
|
||||
|
||||
// Future contributors:
|
||||
// source files
|
||||
|
@ -140,6 +152,15 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) {
|
|||
xml.compilerFlagContributors?.className?.forEach {
|
||||
compilerFlagContributors.add(factory.instanceOf(forName(it)) as ICompilerFlagContributor)
|
||||
}
|
||||
xml.compilerInterceptors?.className?.forEach {
|
||||
compilerInterceptors.add(factory.instanceOf(forName(it)) as ICompilerInterceptor)
|
||||
}
|
||||
xml.sourceDirectoriesInterceptors?.className?.forEach {
|
||||
sourceDirectoriesInterceptors.add(factory.instanceOf(forName(it)) as ISourceDirectoriesIncerceptor)
|
||||
}
|
||||
xml.buildDirectoryInterceptors?.className?.forEach {
|
||||
buildDirectoryInterceptors.add(factory.instanceOf(forName(it)) as IBuildDirectoryIncerceptor)
|
||||
}
|
||||
}
|
||||
|
||||
fun addPluginInfo(pluginInfo: PluginInfo) {
|
||||
|
|
|
@ -4,7 +4,6 @@ import com.beust.kobalt.api.IClasspathContributor
|
|||
import com.beust.kobalt.api.KobaltContext
|
||||
import com.beust.kobalt.api.Project
|
||||
import com.beust.kobalt.api.ProjectDescription
|
||||
import com.beust.kobalt.internal.JvmCompilerPlugin
|
||||
import com.beust.kobalt.misc.KFiles
|
||||
import com.beust.kobalt.misc.KobaltExecutors
|
||||
import com.beust.kobalt.misc.warn
|
||||
|
@ -101,7 +100,7 @@ public class DependencyManager @Inject constructor(val executors: KobaltExecutor
|
|||
it.project.name == project?.name
|
||||
}.forEach { pd ->
|
||||
pd.dependsOn.forEach { p ->
|
||||
val classesDir = p.projectProperties.getString(JvmCompilerPlugin.BUILD_DIR)
|
||||
val classesDir = p.classesDir(context)
|
||||
if (classesDir != null) {
|
||||
result.add(FileDependency(KFiles.joinDir(p.directory, classesDir)))
|
||||
} else {
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
package com.beust.kobalt.plugin.android
|
||||
|
||||
import com.beust.kobalt.OperatingSystem
|
||||
import com.beust.kobalt.TaskResult
|
||||
import com.beust.kobalt.Variant
|
||||
import com.beust.kobalt.*
|
||||
import com.beust.kobalt.api.*
|
||||
import com.beust.kobalt.api.annotation.Directive
|
||||
import com.beust.kobalt.api.annotation.Task
|
||||
import com.beust.kobalt.homeDir
|
||||
import com.beust.kobalt.internal.CompilerActionInfo
|
||||
import com.beust.kobalt.internal.JvmCompilerPlugin
|
||||
import com.beust.kobalt.maven.FileDependency
|
||||
|
@ -41,12 +38,13 @@ fun Project.android(init: AndroidConfig.() -> Unit) : AndroidConfig {
|
|||
return pd
|
||||
}
|
||||
|
||||
val Project.isAndroid : Boolean
|
||||
get() = (Kobalt.findPlugin("android") as AndroidPlugin).isAndroid(this)
|
||||
//val Project.isAndroid : Boolean
|
||||
// get() = (Kobalt.findPlugin("android") as AndroidPlugin).isAndroid(this)
|
||||
|
||||
@Singleton
|
||||
public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler)
|
||||
: ConfigPlugin<AndroidConfig>(), IClasspathContributor, IRepoContributor, ICompilerFlagContributor {
|
||||
: ConfigPlugin<AndroidConfig>(), IClasspathContributor, IRepoContributor, ICompilerFlagContributor,
|
||||
ICompilerInterceptor, ISourceDirectoriesIncerceptor, IBuildDirectoryIncerceptor {
|
||||
override val name = "android"
|
||||
|
||||
fun isAndroid(project: Project) = configurationFor(project) != null
|
||||
|
@ -305,19 +303,30 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler)
|
|||
val buildToolsDir = buildToolsVersion(project)
|
||||
val dx = "${androidHome(project)}/build-tools/$buildToolsDir/dx" +
|
||||
if (OperatingSystem.current().isWindows()) ".bat" else ""
|
||||
val classesDexDir = KFiles.joinDir(intermediates(project), "dex", context.variant.shortArchiveName)
|
||||
val classesDexDir = KFiles.joinDir(intermediates(project), "dex", context.variant.toIntermediateDir())
|
||||
File(classesDexDir).mkdirs()
|
||||
val classesDex = "classes.dex"
|
||||
val outClassesDex = KFiles.joinDir(classesDexDir, classesDex)
|
||||
|
||||
val args = listOf("--dex", "--output", outClassesDex)
|
||||
val otherArgs =
|
||||
project.dependencies?.let {
|
||||
it.dependencies.map {
|
||||
it.jarFile.get().path
|
||||
}.filter { ! it.endsWith(".aar") && ! it.endsWith("android.jar") }
|
||||
} ?: emptyList()
|
||||
RunCommand(dx).run(args + otherArgs)
|
||||
// java.exe -Xmx1024M -Dfile.encoding=windows-1252 -Duser.country=US -Duser.language=en -Duser.variant -cp D:\android\adt-bundle-windows-x86_64-20140321\sdk\build-tools\23.0.1\lib\dx.jar com.android.dx.command.Main --dex --verbose --num-threads=4 --output C:\Users\cbeust\android\android_hello_world\app\build\intermediates\dex\pro\debug C:\Users\cbeust\android\android_hello_world\app\build\intermediates\classes\pro\debug
|
||||
|
||||
val javaExecutable = JavaInfo.create(File(SystemProperties.javaBase)).javaExecutable!!
|
||||
RunCommand(javaExecutable.absolutePath).run(listOf(
|
||||
"-cp", KFiles.joinDir(androidHome(project), "build-tools", buildToolsVersion(project), "lib", "dx.jar"),
|
||||
"com.android.dx.command.Main",
|
||||
"--dex", "--verbose", "--num-threads=4",
|
||||
"--output", outClassesDex,
|
||||
//KFiles.joinDir(intermediates(project), "dex", context.variant.toIntermediateDir()),
|
||||
project.classesDir(context)
|
||||
))
|
||||
// val args = listOf("--dex", "--output", outClassesDex)
|
||||
// val otherArgs =
|
||||
// project.dependencies?.let {
|
||||
// it.dependencies.map {
|
||||
// it.jarFile.get().path
|
||||
// }.filter { ! it.endsWith(".aar") && ! it.endsWith("android.jar") }
|
||||
// } ?: emptyList()
|
||||
// RunCommand(dx).run(args + otherArgs)
|
||||
|
||||
//
|
||||
// Add classes.dex to existing .ap_
|
||||
|
@ -376,4 +385,25 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler)
|
|||
emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
// IBuildDirectoryInterceptor
|
||||
override fun intercept(project: Project, context: KobaltContext, buildDirectory: String): String {
|
||||
val result = KFiles.joinDir(intermediates(project), "classes", context.variant.toIntermediateDir())
|
||||
return result
|
||||
}
|
||||
|
||||
// ISourceDirectoriesInterceptor
|
||||
override fun intercept(project: Project, context: KobaltContext, sourceDirectories: List<File>): List<File> {
|
||||
return sourceDirectories.map { File("app", it.path)}
|
||||
}
|
||||
|
||||
// ICompilerInterceptor
|
||||
override fun intercept(project: Project, context: KobaltContext, actionInfo: CompilerActionInfo)
|
||||
: CompilerActionInfo {
|
||||
val newOutputDir = KFiles.joinDir("kobaltBuild", "intermediates", "classes",
|
||||
context.variant.toIntermediateDir())
|
||||
return actionInfo.copy(outputDir = File(newOutputDir))
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -31,4 +31,13 @@
|
|||
<class-name>com.beust.kobalt.plugin.android.AndroidPlugin</class-name>
|
||||
<class-name>com.beust.kobalt.plugin.apt.AptPlugin</class-name>
|
||||
</compiler-flag-contributors>
|
||||
<build-directory-interceptors>
|
||||
<class-name>com.beust.kobalt.plugin.android.AndroidPlugin</class-name>
|
||||
</build-directory-interceptors>
|
||||
<source-directories-interceptors>
|
||||
<class-name>com.beust.kobalt.plugin.android.AndroidPlugin</class-name>
|
||||
</source-directories-interceptors>
|
||||
<compiler-interceptors>
|
||||
<class-name>com.beust.kobalt.plugin.android.AndroidPlugin</class-name>
|
||||
</compiler-interceptors>
|
||||
</kobalt-plugin>
|
Loading…
Add table
Add a link
Reference in a new issue