You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
7.0 KiB
242 lines
7.0 KiB
|
|
|
|
|
|
|
|
// BEGIN_EXCLUDE
|
|
import com.example.android.samples.build.SampleGenPlugin
|
|
apply plugin: SampleGenPlugin
|
|
|
|
samplegen {
|
|
pathToBuild "../../../../build"
|
|
pathToSamplesCommon "../../common"
|
|
}
|
|
|
|
task emitBrowseableAll {
|
|
println "Executing all tasks"
|
|
}
|
|
|
|
task emitGradleAll {
|
|
println "Executing all tasks"
|
|
}
|
|
|
|
task emitGradleZipAll {
|
|
println "Executing all tasks"
|
|
}
|
|
|
|
def tasksBrowseable = []
|
|
def tasksGradle = []
|
|
def tasksGradleZip = []
|
|
def samplesXml = (new XmlParser()).parse('samples.xml')
|
|
samplesXml.sample.each { sample ->
|
|
println "Creating task : " + sample.@name
|
|
|
|
//
|
|
//Browseable task
|
|
//
|
|
task "task${sample.@name}Browseable" (type:Copy) {
|
|
def outputPath =outPath("browseable", sample.@name);
|
|
//Get absolute path of input path
|
|
FileTree inputFileTree = project.fileTree(sample.@path)
|
|
def inputPath = inputFileTree.getFiles().iterator().next().parentFile.absolutePath //sample.@path
|
|
|
|
println "Input path : " + inputPath
|
|
|
|
mkdir outputPath
|
|
into outputPath
|
|
|
|
from("${inputPath}/AndroidManifest.xml")
|
|
from("${inputPath}/lint.xml")
|
|
from("${inputPath}/project.properties")
|
|
into("res") {
|
|
from("${inputPath}/res")
|
|
}
|
|
into("assets") {
|
|
from("${inputPath}/assets")
|
|
}
|
|
|
|
//Collect C++ files
|
|
into("jni") {
|
|
from("${inputPath}/jni")
|
|
}
|
|
|
|
//Collect java files
|
|
def javaDirs = ["${inputPath}/src"]
|
|
FileTree javaTree = null;
|
|
javaDirs.each { dir ->
|
|
FileTree tree = project.fileTree("${dir}")
|
|
javaTree = (javaTree == null) ? tree : javaTree.plus(tree)
|
|
}
|
|
|
|
println javaTree;
|
|
println javaDirs
|
|
Map collapsedPaths = collapsePaths(javaTree, javaDirs)
|
|
println collapsedPaths
|
|
|
|
javaDirs.each { srcPath ->
|
|
println srcPath
|
|
into("src") {
|
|
def javaPath = "${srcPath}"
|
|
from(javaPath)
|
|
setIncludeEmptyDirs(false)
|
|
include(["**/*.java", "**/*.xml"])
|
|
eachFile { FileCopyDetails fcd ->
|
|
if (fcd.file.isFile()) {
|
|
def filename = fcd.name;
|
|
String collapsed = collapsedPaths.get(fcd.file.path);
|
|
fcd.path = "src/${collapsed}";
|
|
} else {fcd.exclude()}
|
|
}
|
|
println "***************** done"
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
//Zipfile task
|
|
//
|
|
task "task${sample.@name}Gradle"(type:Copy) {
|
|
//dependsOn(preflight)
|
|
|
|
def outputPath =outPath("gradle", sample.@name);
|
|
def inputPath = sample.@path
|
|
// Copy entire sample into output -- since it's already in Gradle format, we'll explicitly exclude content that
|
|
// doesn't belong here.
|
|
mkdir outputPath
|
|
into outputPath
|
|
from("${inputPath}") {
|
|
// Paths to exclude from output
|
|
exclude ".classpath"
|
|
exclude ".cproject"
|
|
exclude ".project"
|
|
exclude ".settings"
|
|
exclude "bin"
|
|
exclude "gen"
|
|
exclude "obj"
|
|
exclude "libs"
|
|
exclude "**/proguard-project.txt"
|
|
exclude "${samplegen.targetSampleModule()}/**/README*.txt"
|
|
}
|
|
|
|
// Remove BEGIN_EXCLUDE/END_EXCLUDE blocks from source files
|
|
eachFile { file ->
|
|
if (file.name.endsWith(".gradle") || file.name.endsWith(".java")) {
|
|
// TODO(trevorjohns): Outputs a blank newline for each filtered line. Replace with java.io.FilterReader impl.
|
|
boolean outputLines = true;
|
|
def removeExcludeBlocksFilter = { line ->
|
|
if (line ==~ /\/\/ BEGIN_EXCLUDE/) {
|
|
outputLines = false;
|
|
} else if (line ==~ /\/\/ END_EXCLUDE/) {
|
|
outputLines = true;
|
|
} else if (outputLines) {
|
|
return line;
|
|
}
|
|
return ""
|
|
}
|
|
filter(removeExcludeBlocksFilter)
|
|
}
|
|
}
|
|
}
|
|
|
|
task "task${sample.@name}GradleZip"(type:Zip) {
|
|
def outputPath =outPath("browseable", "");
|
|
def folderName = "${sample.@name}"
|
|
archiveName = "${sample.@name}.zip"
|
|
def inputPath = outPath("gradle", sample.@name)
|
|
from inputPath
|
|
into folderName
|
|
include "**"
|
|
def outDir = project.file(outputPath)
|
|
destinationDir = outDir
|
|
}
|
|
|
|
//Add tasks to list
|
|
tasksBrowseable.add("task${sample.@name}Browseable")
|
|
tasksGradle.add("task${sample.@name}Gradle")
|
|
tasksGradleZip.add("task${sample.@name}GradleZip")
|
|
}
|
|
|
|
//Add generated tasks to dependency list
|
|
emitBrowseableAll.dependsOn(tasksBrowseable)
|
|
emitGradleAll.dependsOn(tasksGradle)
|
|
emitGradleZipAll.dependsOn([tasksGradle, tasksGradleZip])
|
|
|
|
String outPath(String buildType, String sampleName) {
|
|
/*
|
|
def repoInfo = "repo info platform/developers/build".execute().text
|
|
def buildPath = (repoInfo =~ /Mount path: (.*)/)[0][1]
|
|
*/
|
|
return "${samplegen.pathToBuild}/out/${buildType}/${sampleName}";
|
|
}
|
|
|
|
/**
|
|
* Collapse a path "IntelliJ-style" by putting dots rather than slashes between
|
|
* path components that have only one child. So the two paths
|
|
*
|
|
* com/example/android/foo/bar.java
|
|
* com/example/android/bar/foo.java
|
|
*
|
|
* Become
|
|
* com.example.android/foo/bar.java
|
|
* com.example.android/bar/foo.java
|
|
*
|
|
* @param path
|
|
* @param roots
|
|
* @return
|
|
*/
|
|
Map<String,String> collapsePaths(FileTree path, List<String> roots) {
|
|
Map result = new HashMap<String,String>();
|
|
|
|
println ("******************** Collapse *************************")
|
|
|
|
path.visit { FileVisitDetails f ->
|
|
if (f.isDirectory()) return;
|
|
StringBuilder collapsedPath = new StringBuilder("${f.name}");
|
|
File current = f.file;
|
|
|
|
//
|
|
// Starting at this file, walk back to the root of the path and
|
|
// substitute dots for any directory that has only one child.
|
|
//
|
|
|
|
// Don't substitute a dot for the separator between the end of the
|
|
// path and the filename, even if there's only one file in the directory.
|
|
if (!f.isDirectory()) {
|
|
current = current.parentFile;
|
|
collapsedPath.insert(0, "${current.name}/")
|
|
}
|
|
|
|
// For everything else, use a dot if there's only one child and
|
|
// a slash otherwise. Filter out the root paths, too--we only want
|
|
// the relative path. But wait, Groovy/Gradle is capricious and
|
|
// won't return the proper value from a call to roots.contains(String)!
|
|
// I'm using roots.sum here instead of tracking down why a list of
|
|
// strings can't return true from contains() when given a string that
|
|
// it quite obviously does contain.
|
|
current = current.parentFile;
|
|
while((current != null)
|
|
&& (roots.sum {String r-> return r.equals(current.absolutePath) ? 1 : 0 } == 0)) {
|
|
|
|
//Exclude files starting with "."
|
|
def files = 0
|
|
current.list().each { file ->
|
|
if (!file.startsWith("."))
|
|
files++
|
|
}
|
|
char separator = files > 1 ? '/' : '.';
|
|
collapsedPath.insert(0, "${current.name}${separator}");
|
|
current = current.parentFile;
|
|
}
|
|
result.put(f.file.path, collapsedPath.toString());
|
|
}
|
|
|
|
println ("******************** Results *************************")
|
|
|
|
result.each {entry -> println("${entry}\n\n");}
|
|
return result
|
|
}
|
|
|
|
|
|
//apply from: "ndkbuild.gradle"
|
|
// END_EXCLUDE
|
|
|