diff options
Diffstat (limited to 'anttasks/src/com/android/ant/AidlExecTask.java')
-rw-r--r-- | anttasks/src/com/android/ant/AidlExecTask.java | 127 |
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; + } + + } |