diff options
Diffstat (limited to 'jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java')
-rw-r--r-- | jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java | 249 |
1 files changed, 209 insertions, 40 deletions
diff --git a/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java index 32040f1..f35e053 100644 --- a/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java +++ b/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java @@ -16,13 +16,22 @@ package com.android.jack.test.toolchain; +import com.google.common.base.Joiner; +import com.google.common.io.Files; + +import com.android.jack.library.FileType; +import com.android.jack.library.JackLibrary; +import com.android.jack.test.TestsProperties; import com.android.jack.test.util.ExecFileException; import com.android.jack.test.util.ExecuteFile; import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import javax.annotation.Nonnull; @@ -32,13 +41,16 @@ import javax.annotation.Nonnull; public class LegacyJillToolchain extends JillBasedToolchain { @Nonnull + private File refCompilerPrebuilt; + @Nonnull private File jarjarPrebuilt; @Nonnull private File proguardPrebuilt; - public LegacyJillToolchain(@Nonnull File jillPrebuilt, @Nonnull File jackPrebuilt, - @Nonnull File jarjarPrebuilt, @Nonnull File proguardPrebuilt) { + public LegacyJillToolchain(@Nonnull File refCompilerPrebuilt, @Nonnull File jillPrebuilt, + @Nonnull File jackPrebuilt, @Nonnull File jarjarPrebuilt, @Nonnull File proguardPrebuilt) { super(jillPrebuilt, jackPrebuilt); + this.refCompilerPrebuilt = refCompilerPrebuilt; this.jarjarPrebuilt = jarjarPrebuilt; this.proguardPrebuilt = proguardPrebuilt; } @@ -48,29 +60,21 @@ public class LegacyJillToolchain extends JillBasedToolchain { throws Exception { try { - File jarFile = AbstractTestTools.createTempFile("legacyLib", ".jar"); - File jarFileJarjar = AbstractTestTools.createTempFile("legacyLibJarjar", ".jar"); - File jarFileProguard = AbstractTestTools.createTempFile("legacyLibProguard", ".jar"); - - srcToLib(jarFile, true /* zipFiles = */, sources); - - if (jarjarRules != null) { - processWithJarJar(jarjarRules, jarFile, jarFileJarjar); - } else { - jarFileJarjar = jarFile; + File jarFile = AbstractTestTools.createTempFile("legacyLib", ".jar"); + File classesDir = AbstractTestTools.createTempDir(); + List<String> staticLibsAsCp = new ArrayList<String>(staticLibs.size()); + for (File staticLib : staticLibs) { + staticLibsAsCp.add(staticLib.getAbsolutePath()); } + String staticLibsAsCpAsString = Joiner.on(File.pathSeparatorChar).join(staticLibsAsCp); - if (proguardFlags.size() > 0) { - processWithProguard(getClasspathAsString(), proguardFlags, jarFileJarjar, - jarFileProguard); - } else { - jarFileProguard = jarFileJarjar; + if (sources.length > 0) { + compileWithExternalRefCompiler(sources, + getClasspathAsString() + File.pathSeparatorChar + staticLibsAsCpAsString, classesDir); } + AbstractTestTools.createjar(jarFile, classesDir); - File jillLib = AbstractTestTools.createTempFile("jillLib", ".jar"); - executeJill(jarFileProguard, jillLib, true); - - libToExe(jillLib, out, zipFile); + libToExe(jarFile, out, zipFile); } catch (IOException e) { throw new RuntimeException("Legacy toolchain exited with an error", e); @@ -81,10 +85,6 @@ public class LegacyJillToolchain extends JillBasedToolchain { public void srcToLib(@Nonnull File out, boolean zipFiles, @Nonnull File... sources) throws Exception { - if (withDebugInfos) { - // TODO(jmhenaff): warning log? - } - try { File classesDir; if (zipFiles) { @@ -93,16 +93,61 @@ public class LegacyJillToolchain extends JillBasedToolchain { classesDir = out; } - compileWithExternalRefCompiler(sources, getClasspathAsString(), classesDir); - if (staticLibs.size() > 0) { for (File staticLib : staticLibs) { - AbstractTestTools.unzip(staticLib, classesDir); + if (staticLib.isDirectory()) { + AbstractTestTools.copyDirectory(staticLib, classesDir); + } else { + assert staticLib.isFile(); + AbstractTestTools.unzip(staticLib, classesDir); + } + } + } + + if (sources.length > 0) { + compileWithExternalRefCompiler(sources, + getClasspathAsString() + File.pathSeparatorChar + + classesDir.getPath(), classesDir); + } + + File resDestDir; + if (resImport.size() > 0) { + resDestDir = new File(classesDir, FileType.RSC.getPrefix()); + if (!resDestDir.exists() && !resDestDir.mkdir()) { + throw new AssertionError("Could not create rsc dir"); + } + + for (File res : resImport) { + AbstractTestTools.copyDirectory(res, resDestDir); } } + + File tmpJarsDir = AbstractTestTools.createTempDir(); + File jarFile = new File(tmpJarsDir, "legacyLib.jar"); + File jarFileJarjar = new File(tmpJarsDir, "legacyLibJarjar.jar"); + File jarFileProguard = new File(tmpJarsDir, "legacyLibProguard.jar"); + + AbstractTestTools.createjar(jarFile, classesDir); + + if (jarjarRules != null) { + processWithJarJar(jarjarRules, jarFile, jarFileJarjar); + } else { + jarFileJarjar = jarFile; + } + + if (proguardFlags.size() > 0) { + processWithProguard(getClasspathAsString(), proguardFlags, jarFileJarjar, + jarFileProguard); + } else { + jarFileProguard = jarFileJarjar; + } + if (zipFiles) { - AbstractTestTools.createjar(out, classesDir); + Files.copy(jarFileProguard, out); + } else { + AbstractTestTools.unzip(jarFileProguard, out); } + } catch (IOException e) { throw new RuntimeException("Legacy toolchain exited with an error", e); } @@ -110,13 +155,132 @@ public class LegacyJillToolchain extends JillBasedToolchain { @Override public void libToLib(@Nonnull File[] in, @Nonnull File out, boolean zipFiles) throws Exception { - throw new AssertionError("Not Yet Implemented"); + List<String> args = new ArrayList<String>(); + libToCommon(args, convertClasspahtWithJillAsString(), in); + + if (zipFiles) { + args.add("--output-jack"); + } else { + args.add("--output-jack-dir"); + } + args.add(out.getAbsolutePath()); + + ExecuteFile exec = new ExecuteFile(args.toArray(new String[args.size()])); + exec.setErr(outRedirectStream); + exec.setOut(errRedirectStream); + exec.setVerbose(isVerbose); + + if (exec.run() != 0) { + throw new RuntimeException("Jack compiler exited with an error"); + } + + } + + @Override + protected void libToImportStaticLibs(@Nonnull List<String> args, @Nonnull File[] in) + throws Exception { + + for (int i = 0; i < in.length; i++) { + File tmpDir = AbstractTestTools.createTempDir(); + File jilledLib = new File(tmpDir, "jilledLib_" + i + ".jack"); + executeJillWithResources(in[i], jilledLib, /* zipFiles = */ true); + args.add("--import"); + args.add(jilledLib.getAbsolutePath()); + } + + for (int i = 0; i < staticLibs.size(); i++) { + File jilledLib = AbstractTestTools.createTempFile("jilledLib", ".jack"); + executeJillWithResources(staticLibs.get(i), jilledLib, /* zipFiles = */ true); + args.add("--import"); + args.add(jilledLib.getAbsolutePath()); + } + } + + private void executeJillWithResources(@Nonnull File in, @Nonnull File out, boolean zipFiles) + throws IOException { + + File tmpOut = AbstractTestTools.createTempFile("out", ".jack"); + executeJill(in, tmpOut); + + File rscDir; + if (in.isDirectory()) { + rscDir = new File(in, FileType.RSC.getPrefix()); + } else { + // Assume it's a library archive + File tmpUnzippedLib = AbstractTestTools.createTempDir(); + AbstractTestTools.unzip(in, tmpUnzippedLib); + rscDir = new File(tmpUnzippedLib, FileType.RSC.getPrefix()); + } + + if (rscDir.exists()) { + + File tmpUnzippedOutLib = AbstractTestTools.createTempDir(); + AbstractTestTools.unzip(tmpOut, tmpUnzippedOutLib); + + File destRscDir = new File(tmpUnzippedOutLib, FileType.RSC.getPrefix()); + if (!destRscDir.mkdir()) { + throw new AssertionError("Could not create directory: '" + destRscDir.getPath() + "'"); + } + + AbstractTestTools.copyDirectory(rscDir, destRscDir); + + File jackProperties; + jackProperties = new File(tmpUnzippedOutLib, JackLibrary.LIBRARY_PROPERTIES); + + Properties prop = new Properties(); + FileReader fr = new FileReader(jackProperties); + prop.load(fr); + fr.close(); + prop.setProperty("rsc", "true"); + FileWriter fw = new FileWriter(jackProperties); + prop.store(fw, "Edited by legacy-jill toolchain"); + fw.close(); + + AbstractTestTools.zip(tmpUnzippedOutLib, out); + } else { + Files.copy(tmpOut, out); + } } @Override + public void libToExe(@Nonnull File[] in, @Nonnull File out, boolean zipFile) throws Exception { + List<String> args = new ArrayList<String>(); + libToCommon(args, convertClasspahtWithJillAsString(), in); + + if (zipFile) { + args.add("--output-dex-zip"); + } else { + args.add("--output-dex"); + } + args.add(out.getAbsolutePath()); + + ExecuteFile exec = new ExecuteFile(args.toArray(new String[args.size()])); + exec.setErr(outRedirectStream); + exec.setOut(errRedirectStream); + exec.setVerbose(isVerbose); + + if (exec.run() != 0) { + throw new RuntimeException("Jack compiler exited with an error"); + } + } + @Nonnull - public JackBasedToolchain addResource(@Nonnull File resource) { - throw new AssertionError("Not applicable"); + private String convertClasspahtWithJillAsString() throws IOException { + File[] result = new File[classpath.size()]; + for (int i = 0; i < classpath.size(); i++) { + result[i] = AbstractTestTools.createTempFile(classpath.get(i).getName(), ".jack"); + executeJill(classpath.get(i), result[i]); + } + return AbstractTestTools.getClasspathAsString(result); + } + + @Override + @Nonnull + public File[] getDefaultBootClasspath() { + return new File[] { + new File(TestsProperties.getJackRootDir(), "jack-tests/prebuilts/core-stubs-mini.jar"), + new File(TestsProperties.getJackRootDir(), "jack-tests/libs/junit4.jar") + }; } @Override @@ -125,21 +289,22 @@ public class LegacyJillToolchain extends JillBasedToolchain { return ".jar"; } + @Override + @Nonnull + public String getLibraryElementsExtension() { + return ".class"; + } + private void compileWithExternalRefCompiler(@Nonnull File[] sources, @Nonnull String classpath, @Nonnull File out) { List<String> arguments = new ArrayList<String>(); - String refCompilerPath = System.getenv("REF_JAVA_COMPILER"); + arguments.add(refCompilerPrebuilt.getPath()); - if (refCompilerPath == null) { - throw new RuntimeException("REF_JAVA_COMPILER environment variable not set"); + if (isVerbose) { + arguments.add("-verbose"); } - arguments.add(refCompilerPath.trim()); - - arguments.add("-verbose"); - arguments.add(String.valueOf(isVerbose)); - addSourceLevel(sourceLevel, arguments); if (annotationProcessorClass != null) { @@ -157,6 +322,10 @@ public class LegacyJillToolchain extends JillBasedToolchain { AbstractTestTools.addFile(arguments, false, sources); + if (withDebugInfos) { + arguments.add("-g"); + } + arguments.add("-d"); arguments.add(out.getAbsolutePath()); |