diff options
Diffstat (limited to 'jack')
5 files changed, 54 insertions, 48 deletions
diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java index 5dd65259..b4ae1360 100644 --- a/jack/src/com/android/jack/Options.java +++ b/jack/src/com/android/jack/Options.java @@ -19,6 +19,7 @@ package com.android.jack; import com.android.jack.backend.dex.FieldInitializerRemover; import com.android.jack.backend.dex.rop.CodeItemBuilder; import com.android.jack.config.id.JavaVersionPropertyId; +import com.android.jack.experimental.incremental.JackIncremental; import com.android.jack.ir.ast.JMethod; import com.android.jack.shrob.obfuscation.MappingPrinter; import com.android.jack.shrob.obfuscation.NameProviderFactory; @@ -190,6 +191,10 @@ public class Options { metaVar = "[error | warning | info | debug | trace]") protected VerbosityLevel verbose = VerbosityLevel.WARNING; + @Option(name = "--incremental-folder", + usage = "Folder used for incremental data", metaVar = "FILE") + protected File incrementalFolder = null; + @Option(name = "-o", aliases = "--output", usage = "output to this dex file (default: ./classes.dex)", metaVar = "FILE") protected File out = new File("./classes.dex"); @@ -581,6 +586,12 @@ public class Options { configBuilder.set( FieldInitializerRemover.STRING_AS_INITIALVALUE_OF_OBJECT, !runtimeLegacy); + if (incrementalFolder != null) { + configBuilder.set(JackIncremental.GENERATE_COMPILER_STATE, true); + configBuilder.setString(JackIncremental.COMPILER_STATE_OUTPUT_DIR, + incrementalFolder.getAbsolutePath()); + } + if (tracerDir != null) { configBuilder.setString(TracerFactory.TRACER, "html"); configBuilder.setString(StatsTracerFtl.TRACER_DIR, tracerDir.getAbsolutePath()); @@ -760,4 +771,13 @@ public class Options { public List<File> getJayceImport() { return jayceImport; } + + @CheckForNull + public File getIncrementalFolder() { + return incrementalFolder; + } + + public void setIncrementalFolder(@Nonnull File incrementalFolder) { + this.incrementalFolder = incrementalFolder; + } } diff --git a/jack/src/com/android/jack/experimental/incremental/CompilerState.java b/jack/src/com/android/jack/experimental/incremental/CompilerState.java index 225560ff..f2229f81 100644 --- a/jack/src/com/android/jack/experimental/incremental/CompilerState.java +++ b/jack/src/com/android/jack/experimental/incremental/CompilerState.java @@ -21,7 +21,9 @@ import com.android.jack.util.TextUtils; import com.android.sched.item.Description; import com.android.sched.item.Name; import com.android.sched.item.Tag; -import com.android.sched.util.file.Directory; +import com.android.sched.vfs.OutputVDir; +import com.android.sched.vfs.OutputVFile; +import com.android.sched.vfs.VPath; import java.io.BufferedReader; import java.io.File; @@ -72,8 +74,8 @@ public final class CompilerState { @Nonnull private final File compilerStateFile; - public CompilerState(@Nonnull Directory directory) { - compilerStateFile = new File(directory.getFile(), COMPILER_STATE_FILENAME); + public CompilerState(@Nonnull File incrementalFolder) { + compilerStateFile = new File(incrementalFolder, COMPILER_STATE_FILENAME); } @Nonnull @@ -125,11 +127,12 @@ public final class CompilerState { return compilerStateFile.exists(); } - public void write(@Nonnull Directory directory) throws JackIOException { - File compilerStateFile = new File(directory.getFile(), COMPILER_STATE_FILENAME); + public void write(@Nonnull OutputVDir outputVDir) throws JackIOException { PrintStream ps = null; try { + OutputVFile compilerStateFile = + outputVDir.createOutputVFile(new VPath(COMPILER_STATE_FILENAME, '/')); StringBuffer sb = new StringBuffer(); writeMap(sb, javaFileToTypeNamePath); @@ -137,12 +140,14 @@ public final class CompilerState { writeMap(sb, cstFileToUsedFiles); writeMap(sb, structFileToUsedFiles); - ps = new PrintStream(compilerStateFile); + ps = new PrintStream(compilerStateFile.openWrite()); ps.print(sb.toString()); - } catch (FileNotFoundException e) { throw new JackIOException("Could not write compiler state file to output '" - + compilerStateFile.getAbsolutePath() + "'", e); + + compilerStateFile + "'", e); + } catch (IOException e) { + throw new JackIOException("Could not write compiler state file to output '" + + compilerStateFile + "'", e); } finally { if (ps != null) { ps.close(); diff --git a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java index 157863db..e13e35e6 100644 --- a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java +++ b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java @@ -31,19 +31,17 @@ import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; import com.android.jack.ir.formatter.TypeFormatter; import com.android.jack.load.JackLoadingException; import com.android.jack.util.TextUtils; -import com.android.sched.util.RunnableHooks; import com.android.sched.util.UnrecoverableException; -import com.android.sched.util.codec.DirectoryCodec; +import com.android.sched.util.codec.OutputVDirCodec; import com.android.sched.util.config.ChainedException; import com.android.sched.util.config.ConfigurationException; import com.android.sched.util.config.HasKeyId; -import com.android.sched.util.config.ThreadConfig; import com.android.sched.util.config.id.BooleanPropertyId; import com.android.sched.util.config.id.PropertyId; -import com.android.sched.util.file.Directory; import com.android.sched.util.file.FileOrDirectory.Existence; -import com.android.sched.util.file.FileOrDirectory.Permission; import com.android.sched.util.log.LoggerFactory; +import com.android.sched.vfs.Container; +import com.android.sched.vfs.OutputVDir; import com.android.sched.vfs.VPath; import java.io.File; @@ -73,10 +71,10 @@ public class JackIncremental extends CommandLine { Boolean.FALSE); @Nonnull - public static final PropertyId<Directory> COMPILER_STATE_OUTPUT_DIR = PropertyId.create( + public static final PropertyId<OutputVDir> COMPILER_STATE_OUTPUT_DIR = PropertyId.create( "jack.experimental.compilerstate.output.dir", "Compiler state output folder", - new DirectoryCodec(Existence.MUST_EXIST, Permission.READ | Permission.WRITE)) - .requiredIf(GENERATE_COMPILER_STATE.getValue().isTrue()); + new OutputVDirCodec(Existence.MAY_EXIST, Container.DIR)).requiredIf( + GENERATE_COMPILER_STATE.getValue().isTrue()); @CheckForNull private static CompilerState compilerState = null; @@ -161,19 +159,12 @@ public class JackIncremental extends CommandLine { public static void run(@Nonnull Options options) throws ConfigurationException, IllegalOptionsException, NothingToDoException, JackUserException { - RunnableHooks hooks = new RunnableHooks(); - List<String> ecjArgsSave = new ArrayList<String>(options.getEcjArguments()); - options.checkValidity(hooks); - if (!ecjArgsSave.isEmpty()) { - options.setEcjArguments(ecjArgsSave); - } - ThreadConfig.setConfig(options.getConfig()); + File incrementalFolder = options.getIncrementalFolder(); + assert incrementalFolder != null; - dexFilesFolder = new File(ThreadConfig.get( - JackIncremental.COMPILER_STATE_OUTPUT_DIR).getFile(), "dexFiles"); + dexFilesFolder = new File(incrementalFolder, "dexFiles"); - jackFilesFolder = new File(ThreadConfig.get( - JackIncremental.COMPILER_STATE_OUTPUT_DIR).getFile(), "jackFiles"); + jackFilesFolder = new File(incrementalFolder, "jackFiles"); // Add options to control incremental support options.addProperty(Options.GENERATE_ONE_DEX_PER_TYPE.getName(), "true"); @@ -184,7 +175,7 @@ public class JackIncremental extends CommandLine { assert jackFilesFolder != null; options.addProperty(Options.JACK_FILE_OUTPUT_DIR.getName(), jackFilesFolder.getAbsolutePath()); - compilerState = new CompilerState(ThreadConfig.get(JackIncremental.COMPILER_STATE_OUTPUT_DIR)); + compilerState = new CompilerState(incrementalFolder); if (isIncrementalCompilation(options)) { logger.log(Level.INFO, "Incremental compilation"); @@ -203,14 +194,12 @@ public class JackIncremental extends CommandLine { if (!filesToRecompile.isEmpty()) { logger.log(Level.INFO, "{0} Files to recompile {1}", new Object[] {Integer.valueOf(filesToRecompile.size()), filesToRecompile}); - updateOptions(options, filesToRecompile); - logger.log(Level.INFO, "Update compiler state"); getCompilerState().updateCompilerState(filesToRecompile); - logger.log(Level.INFO, "Generate {0}", options.getOutputFile()); logger.log(Level.INFO, "Ecj options {0}", options.getEcjArguments()); + Jack.run(options); } else { logger.log(Level.INFO, "No files to recompile"); @@ -441,8 +430,6 @@ public class JackIncremental extends CommandLine { private static boolean isIncrementalCompilation(@Nonnull Options options) { if (!options.getEcjArguments().isEmpty() - && ThreadConfig.get(Options.GENERATE_DEX_FILE).booleanValue() - && ThreadConfig.get(JackIncremental.GENERATE_COMPILER_STATE).booleanValue() && getCompilerState().exists()) { return true; } diff --git a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java index aec446f5..a736e419 100644 --- a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java +++ b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java @@ -57,7 +57,7 @@ public class DependenciesTest009 { ite.incrementalBuildFromFolder(); - CompilerState csm = new CompilerState(ite.getCompilerStateDirectory()); + CompilerState csm = new CompilerState(ite.getCompilerStateFolder()); csm.read(); Map<String, Set<String>> dependencies1 = csm.computeDependencies(); diff --git a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java index b344bc16..808307b4 100644 --- a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java +++ b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java @@ -21,10 +21,6 @@ import com.android.jack.TestTools; import com.android.jack.backend.jayce.JayceFileImporter; import com.android.jack.util.ExecuteFile; import com.android.jack.util.NamingTools; -import com.android.sched.util.file.Directory; -import com.android.sched.util.file.FileOrDirectory.ChangePermission; -import com.android.sched.util.file.FileOrDirectory.Existence; -import com.android.sched.util.file.FileOrDirectory.Permission; import java.io.ByteArrayOutputStream; import java.io.File; @@ -57,7 +53,7 @@ public class IncrementalTestingEnvironment extends TestTools { PrintStream outRedirectStream = null; @Nonnull - private final Directory compilerStateDir; + private final File compilerStateDir; @Nonnull private final File testingFolder; @@ -83,11 +79,11 @@ public class IncrementalTestingEnvironment extends TestTools { throw new IOException("Failed to create folder " + this.sourceFolder.getAbsolutePath()); } dexFile = new File(testingFolder, "result.dex"); - compilerStateDir = - new Directory(testingFolder.getAbsolutePath() + File.separatorChar + "compilerState", - null, Existence.MAY_EXIST, Permission.READ | Permission.WRITE, - ChangePermission.NOCHANGE); - jackFolder = new File(compilerStateDir.getFile(), "jackFiles"); + compilerStateDir = new File(testingFolder, "compileState"); + if (!compilerStateDir.exists() && !compilerStateDir.mkdir()) { + throw new IOException("Failed to create folder " + compilerStateDir.getAbsolutePath()); + } + jackFolder = new File(compilerStateDir, "jackFiles"); } public void addJavaFile(@Nonnull String packageName, @Nonnull String fileName, @@ -126,7 +122,7 @@ public class IncrementalTestingEnvironment extends TestTools { } @Nonnull - public Directory getCompilerStateDirectory() { + public File getCompilerStateFolder() { return compilerStateDir; } @@ -135,9 +131,7 @@ public class IncrementalTestingEnvironment extends TestTools { startErrRedirection(); Options options = TestTools.buildCommandLineArgs(testingFolder); - options.addProperty(JackIncremental.GENERATE_COMPILER_STATE.getName(), "true"); - options.addProperty(JackIncremental.COMPILER_STATE_OUTPUT_DIR.getName(), getCompilerStateDirectory() - .getFile().getAbsolutePath()); + options.setIncrementalFolder(getCompilerStateFolder()); compileSourceToDex(options, sourceFolder, TestTools.getClasspathAsString(TestTools.getDefaultBootclasspath()), dexFile); |