aboutsummaryrefslogtreecommitdiffstats
path: root/anttasks/src/com/android/ant/AidlExecTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'anttasks/src/com/android/ant/AidlExecTask.java')
-rw-r--r--anttasks/src/com/android/ant/AidlExecTask.java127
1 files changed, 112 insertions, 15 deletions
diff --git a/anttasks/src/com/android/ant/AidlExecTask.java b/anttasks/src/com/android/ant/AidlExecTask.java
index 5fa1f30..98cac9b 100644
--- a/anttasks/src/com/android/ant/AidlExecTask.java
+++ b/anttasks/src/com/android/ant/AidlExecTask.java
@@ -27,7 +27,10 @@ import org.apache.tools.ant.types.PatternSet.NameEntry;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
/**
* Task to execute aidl.
@@ -93,21 +96,57 @@ public class AidlExecTask extends Task {
}
}
- // now loop on all the source folders to find all the aidl to compile
- // and compile them
- for (String sourceFolder : sourceFolders) {
- // create a fileset to find all the aidl files in the current source folder
- FileSet fs = new FileSet();
- fs.setProject(taskProject);
- fs.setDir(new File(sourceFolder));
- NameEntry include = fs.createInclude();
- include.setName("**/*.aidl");
-
- // loop through the results of the file set
- Iterator<?> iter = fs.iterator();
- while (iter.hasNext()) {
- Object next = iter.next();
+ // gather all the aidl files from all the source folders.
+ Set<String> sourceFiles = getFileListByExtension(taskProject, sourceFolders, "**/*.aidl");
+ if (sourceFiles.size() > 0) {
+ System.out.println(String.format("Found %d aidl files.", sourceFiles.size()));
+ }
+
+ // go look for all dependency files in the gen folder.
+ Set<String> depFiles = getFileListByExtension(taskProject, mGenFolder, "**/*.d");
+
+ // parse all the dep files and keep the ones that are aidl and check if they require
+ // compilation again.
+ ArrayList<String> toCompile = new ArrayList<String>();
+ ArrayList<File> toRemove = new ArrayList<File>();
+ ArrayList<String> depsToRemove = new ArrayList<String>();
+ for (String depFile : depFiles) {
+ DependencyGraph graph = new DependencyGraph(depFile, null /*watchPaths*/);
+
+ // get the source file. it's the first item in the pre-reqs
+ List<File> preReqs = graph.getPrereqs();
+ File sourceFile = preReqs.get(0);
+ String sourceFilePath = sourceFile.getAbsolutePath();
+
+ // The gen folder may contain other dependency files not generated by aidl.
+ // We only care if the first pre-rep is an aidl file.
+ if (sourceFilePath.toLowerCase().endsWith(".aidl")) {
+ // remove from the list of sourceFiles to mark as "processed" (but not compiled
+ // yet, that'll be done by adding it to toCompile)
+ if (sourceFiles.remove(sourceFilePath) == false) {
+ // looks like the source file does not exist anymore!
+ // we'll have to remove the output!
+ List<File> outputFiles = graph.getTargets();
+ toRemove.addAll(outputFiles);
+
+ // also need to remove the dep file.
+ depsToRemove.add(depFile);
+ } else if (graph.dependenciesHaveChanged(null /*extensionsToCheck*/,
+ false /*printStatus*/)) {
+ // need to recompile!
+ toCompile.add(sourceFilePath);
+ }
+ }
+ }
+
+ // add to the list of files to compile, whatever is left in sourceFiles. Those are
+ // new files that have never been compiled.
+ toCompile.addAll(sourceFiles);
+ if (toCompile.size() > 0) {
+ System.out.println(String.format("Compiling %d aidl files.", toCompile.size()));
+
+ for (String toCompilePath : toCompile) {
ExecTask task = new ExecTask();
task.setProject(taskProject);
task.setOwningTarget(getOwningTarget());
@@ -123,11 +162,69 @@ public class AidlExecTask extends Task {
task.createArg().setValue("-I" + importFolder);
}
- task.createArg().setValue(next.toString());
+ // set auto dependency file creation
+ task.createArg().setValue("-a");
+
+ task.createArg().setValue(toCompilePath);
// execute it.
task.execute();
}
+ } else {
+ System.out.println(String.format("No aidl files to compile."));
+ }
+
+ if (toRemove.size() > 0) {
+ System.out.println(String.format("%d obsolete output files to remove.",
+ toRemove.size()));
+ for (File toRemoveFile : toRemove) {
+ if (toRemoveFile.delete() == false) {
+ System.err.println("Failed to remove " + toRemoveFile.getAbsolutePath());
+ }
+ }
+ }
+
+ // remove the dependency files that are obsolete
+ if (depsToRemove.size() > 0) {
+ System.out.println(String.format("%d obsolete dependency files to remove.",
+ depsToRemove.size()));
+ for (String path : depsToRemove) {
+ if (new File(path).delete() == false) {
+ System.err.println("Failed to remove " + path);
+ }
+ }
+ }
+ }
+
+ private Set<String> getFileListByExtension(Project taskProject,
+ List<String> sourceFolders, String filter) {
+ HashSet<String> sourceFiles = new HashSet<String>();
+ for (String sourceFolder : sourceFolders) {
+ sourceFiles.addAll(getFileListByExtension(taskProject, sourceFolder, filter));
}
+
+ return sourceFiles;
}
+
+ private Set<String> getFileListByExtension(Project taskProject,
+ String sourceFolder, String filter) {
+ HashSet<String> sourceFiles = new HashSet<String>();
+
+ // create a fileset to find all the files in the folder
+ FileSet fs = new FileSet();
+ fs.setProject(taskProject);
+ fs.setDir(new File(sourceFolder));
+ NameEntry include = fs.createInclude();
+ include.setName(filter);
+
+ // loop through the results of the file set
+ Iterator<?> iter = fs.iterator();
+ while (iter.hasNext()) {
+ sourceFiles.add(iter.next().toString());
+ }
+
+ return sourceFiles;
+ }
+
+
}