diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2014-07-03 15:23:55 +0200 |
---|---|---|
committer | mikaelpeltier <mikaelpeltier@google.com> | 2014-07-28 13:28:24 +0200 |
commit | f03975dc15719d32dd4476df3d6ea7cf64d5e145 (patch) | |
tree | c0c75b66a95f35d415aab34bf22e88daef601af8 /jack | |
parent | 1b72fd1b00bb5fcecf1b6b0c2a779d8a5d2b4747 (diff) | |
download | toolchain_jack-f03975dc15719d32dd4476df3d6ea7cf64d5e145.tar.gz toolchain_jack-f03975dc15719d32dd4476df3d6ea7cf64d5e145.tar.bz2 toolchain_jack-f03975dc15719d32dd4476df3d6ea7cf64d5e145.zip |
Add options to enable incremental support
- It is required to remove an hack on configuration which does not work
since output dex file was deleted after each compilation. Problem appears
because there was two calls to checkValidity method of options.
(cherry picked from commit c07d64dcaf10d2684ed9fbb42677cd9e02aae998)
Conflicts:
jack/src/com/android/jack/experimental/incremental/JackIncremental.java
Change-Id: I0e1eff015bf739bcded429a2619bce1aad69d0b3
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); |