diff options
Diffstat (limited to 'anttasks/src/com/android')
-rw-r--r-- | anttasks/src/com/android/ant/AaptExecTask.java (renamed from anttasks/src/com/android/ant/AaptExecLoopTask.java) | 4 | ||||
-rw-r--r-- | anttasks/src/com/android/ant/AidlExecTask.java | 127 | ||||
-rw-r--r-- | anttasks/src/com/android/ant/BaseTask.java | 3 | ||||
-rw-r--r-- | anttasks/src/com/android/ant/DependencyGraph.java | 97 | ||||
-rw-r--r-- | anttasks/src/com/android/ant/RenderScriptTask.java | 9 |
5 files changed, 193 insertions, 47 deletions
diff --git a/anttasks/src/com/android/ant/AaptExecLoopTask.java b/anttasks/src/com/android/ant/AaptExecTask.java index 8a593f9..3e2350f 100644 --- a/anttasks/src/com/android/ant/AaptExecLoopTask.java +++ b/anttasks/src/com/android/ant/AaptExecTask.java @@ -50,7 +50,7 @@ import java.util.ArrayList; * <tr><td></td><td></td><td></td></tr> * </table> */ -public final class AaptExecLoopTask extends BaseTask { +public final class AaptExecTask extends BaseTask { /** * Class representing a <nocompress> node in the main task XML. @@ -352,6 +352,8 @@ public final class AaptExecLoopTask extends BaseTask { && dependenciesHaveChanged() == false) { System.out.println("No changed resources. R.java and Manifest.java untouched."); return; + } else { + System.out.println("Generating resource IDs..."); } } else { // Find our dependency file. It should have the same name as our target .ap_ but 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; + } + + } diff --git a/anttasks/src/com/android/ant/BaseTask.java b/anttasks/src/com/android/ant/BaseTask.java index 0ff7bf1..68dd6b5 100644 --- a/anttasks/src/com/android/ant/BaseTask.java +++ b/anttasks/src/com/android/ant/BaseTask.java @@ -102,6 +102,7 @@ public abstract class BaseTask extends Task { } assert mDependencies != null : "Dependencies have not been initialized"; - return mDependencies.dependenciesHaveChanged(mRestrictTouchedExtensionsTo); + return mDependencies.dependenciesHaveChanged(mRestrictTouchedExtensionsTo, + true /*printStatus*/); } } diff --git a/anttasks/src/com/android/ant/DependencyGraph.java b/anttasks/src/com/android/ant/DependencyGraph.java index 4c85860..11c09e4 100644 --- a/anttasks/src/com/android/ant/DependencyGraph.java +++ b/anttasks/src/com/android/ant/DependencyGraph.java @@ -23,7 +23,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -34,8 +34,10 @@ import java.util.Set; public class DependencyGraph { // Files that we know about from the dependency file - private Set<File> mTargets = Collections.emptySet(); - private Set<File> mPrereqs = mTargets; + private List<File> mTargets = Collections.emptyList(); + private List<File> mPrereqs = mTargets; + private boolean mMissingDepFile = false; + private long mDepFileLastModified; private final ArrayList<File> mWatchPaths; public DependencyGraph(String dependencyFilePath, ArrayList<File> watchPaths) { @@ -48,34 +50,45 @@ public class DependencyGraph { * @param extensionsToCheck a set of extensions. Only files with an extension in this set will * be considered for a modification check. All deleted/created files will still be * checked. If this is null, all files will be checked for modification date + * @param printStatus will print to {@link System#out} the dependencies status. * @return true if new prerequisites have appeared, target files are missing or if * prerequisite files have been modified since the last target generation. */ - public boolean dependenciesHaveChanged(Set<String> extensionsToCheck) { - boolean noFile = (mTargets.size() == 0); + public boolean dependenciesHaveChanged(Set<String> extensionsToCheck, boolean printStatus) { boolean missingPrereq = missingPrereqFile(); boolean newPrereq = newPrereqFile(); boolean missingTarget = missingTargetFile(); boolean modPrereq = modifiedPrereq(extensionsToCheck); - if (noFile) { - System.out.println("No Dependency File Found"); - } - if (missingPrereq) { - System.out.println("Found Deleted Prereq File"); - } - if (newPrereq) { - System.out.println("Found New Prereq File"); - } - if (missingTarget) { - System.out.println("Found Deleted Target File"); - } - if (modPrereq) { - System.out.println("Found Modified Prereq File"); + if (printStatus) { + if (mMissingDepFile) { + System.out.println("No Dependency File Found"); + } + if (missingPrereq) { + System.out.println("Found Deleted Prereq File"); + } + if (newPrereq) { + System.out.println("Found New Prereq File"); + } + if (missingTarget) { + System.out.println("Found Deleted Target File"); + } + if (modPrereq) { + System.out.println("Found Modified Prereq File"); + } } + // If no dependency file has been set up, then we'll just return true // if we have a dependency file, we'll check to see what's been changed - return noFile || missingPrereq || newPrereq || missingTarget || modPrereq; + return mMissingDepFile || missingPrereq || newPrereq || missingTarget || modPrereq; + } + + public List<File> getTargets() { + return mTargets; + } + + public List<File> getPrereqs() { + return mPrereqs; } /** @@ -84,6 +97,16 @@ public class DependencyGraph { * @param dependencyFilePath the dependency file */ private void parseDependencyFile(String dependencyFilePath) { + // first check if the dependency file is here. + File depFile = new File(dependencyFilePath); + if (depFile.isFile() == false) { + mMissingDepFile = true; + return; + } + + // get the modification time of the dep file as we may need it later + mDepFileLastModified = depFile.lastModified(); + // Read in our dependency file String content = readFile(dependencyFilePath); if (content == null) { @@ -121,14 +144,20 @@ public class DependencyGraph { prereqs = files[1].trim().split(" "); } - mTargets = new HashSet<File>(targets.length); + mTargets = new ArrayList<File>(targets.length); for (String path : targets) { - mTargets.add(new File(path)); + if (path.length() > 0) { + mTargets.add(new File(path)); + } } - mPrereqs = new HashSet<File>(prereqs.length); + mTargets = Collections.unmodifiableList(mTargets); + mPrereqs = new ArrayList<File>(prereqs.length); for (String path : prereqs) { - mPrereqs.add(new File(path)); + if (path.length() > 0) { + mPrereqs.add(new File(path)); + } } + mPrereqs = Collections.unmodifiableList(mPrereqs); } /** @@ -137,9 +166,11 @@ public class DependencyGraph { * @return true if a new file is encountered in the dependency folders */ private boolean newPrereqFile() { - for (File dir : mWatchPaths) { - if (newFileInTree(dir)) { - return true; + if (mWatchPaths != null) { + for (File dir : mWatchPaths) { + if (newFileInTree(dir)) { + return true; + } } } // If we make it all the way through our directories we're good. @@ -212,9 +243,14 @@ public class DependencyGraph { private boolean modifiedPrereq(Set<String> extensionsToCheck) { // Find the oldest target long oldestTarget = Long.MAX_VALUE; - for (File target : mTargets) { - if (target.lastModified() < oldestTarget) { - oldestTarget = target.lastModified(); + // if there's no output, then compare to the time of the dependency file. + if (mTargets.size() == 0) { + oldestTarget = mDepFileLastModified; + } else { + for (File target : mTargets) { + if (target.lastModified() < oldestTarget) { + oldestTarget = target.lastModified(); + } } } @@ -273,4 +309,5 @@ public class DependencyGraph { // Don't include the leading '.' in the extension return filename.substring(filename.lastIndexOf('.') + 1); } + } diff --git a/anttasks/src/com/android/ant/RenderScriptTask.java b/anttasks/src/com/android/ant/RenderScriptTask.java index 5aa6612..08eeeed 100644 --- a/anttasks/src/com/android/ant/RenderScriptTask.java +++ b/anttasks/src/com/android/ant/RenderScriptTask.java @@ -105,6 +105,8 @@ public class RenderScriptTask extends Task { File exe = new File(mExecutable); String execTaskName = exe.getName(); + int count = 0; + // now loop on all the source folders to find all the renderscript to compile // and compile them for (String sourceFolder : sourceFolders) { @@ -145,5 +147,12 @@ public class RenderScriptTask extends Task { task.execute(); } } + + if (count > 0) { + System.out.println(String.format("Compiled %d renderscript files.", count)); + } else { + System.out.println("No renderscript files to compile."); + } + } } |