}
public static void mxmlc(String[] args)
{
Transcoder[] transcoders = null;
Benchmark benchmark = null;
try
{
CompilerAPI.useAS3();
// setup the path resolver
CompilerAPI.usePathResolver();
// set up for localizing messages
LocalizationManager l10n = new LocalizationManager();
l10n.addLocalizer( new XLRLocalizer() );
l10n.addLocalizer( new ResourceBundleLocalizer() );
ThreadLocalToolkit.setLocalizationManager(l10n);
// setup the console logger. the configuration parser needs a logger.
CompilerAPI.useConsoleLogger();
// process configuration
ConfigurationBuffer cfgbuf = new ConfigurationBuffer(CommandLineConfiguration.class, Configuration.getAliases());
// Do not set this. The file-specs should be included in the configuration buffer
// checksum so changes to the class list can be detected during incremental builds.
//cfgbuf.setDefaultVar(FILE_SPECS);
DefaultsConfigurator.loadDefaults( cfgbuf );
CommandLineConfiguration configuration = (CommandLineConfiguration) processConfiguration(
l10n, "mxmlc", args, cfgbuf, CommandLineConfiguration.class, FILE_SPECS);
// well, setup the logger again now that we know configuration.getWarnings()???
CompilerAPI.useConsoleLogger(true, true, configuration.getWarnings(), true);
CompilerAPI.setupHeadless(configuration);
if (configuration.benchmark())
{
benchmark = CompilerAPI.runBenchmark();
benchmark.startTime(Benchmark.PRECOMPILE);
}
else
{
CompilerAPI.disableBenchmark();
}
// make sure targetFile abstract pathname is an absolute path...
VirtualFile targetFile = CompilerAPI.getVirtualFile(configuration.getTargetFile());
WebTierAPI.checkSupportedTargetMimeType(targetFile);
// mxmlc only wants to take one file.
List<String> fileList = configuration.getFileList();
if (fileList == null || fileList.size() != 1)
{
throw new ConfigurationException.OnlyOneSource( "filespec", null, -1);
}
List<VirtualFile> virtualFileList = CompilerAPI.getVirtualFileList(fileList);
CompilerConfiguration compilerConfig = configuration.getCompilerConfiguration();
NameMappings mappings = CompilerAPI.getNameMappings(configuration);
// create a FileSpec... can reuse based on targetFile, debug settings, etc...
FileSpec fileSpec = new FileSpec(Collections.<VirtualFile>emptyList(), WebTierAPI.getFileSpecMimeTypes());
// create a SourcePath...
VirtualFile[] asClasspath = compilerConfig.getSourcePath();
SourceList sourceList = new SourceList(virtualFileList,
asClasspath,
targetFile,
WebTierAPI.getSourcePathMimeTypes());
SourcePath sourcePath = new SourcePath(asClasspath,
targetFile,
WebTierAPI.getSourcePathMimeTypes(),
compilerConfig.allowSourcePathOverlap());
ResourceContainer resources = new ResourceContainer();
ResourceBundlePath bundlePath = new ResourceBundlePath(configuration.getCompilerConfiguration(), targetFile);
ArrayList<Source> sources = new ArrayList<Source>();
List<CompilationUnit> units = new ArrayList<CompilationUnit>();
if (benchmark != null)
{
benchmark.benchmark(l10n.getLocalizedTextString(new InitialSetup()));
}
// load SWCs
CompilerSwcContext swcContext = new CompilerSwcContext();
SwcCache cache = new SwcCache();
// lazy read should only be set by mxmlc/compc
cache.setLazyRead(true);
swcContext.load( compilerConfig.getLibraryPath(),
Configuration.getAllExcludedLibraries(compilerConfig, configuration),
compilerConfig.getThemeFiles(),
compilerConfig.getIncludeLibraries(),
mappings,
I18nUtils.getTranslationFormat(compilerConfig),
cache );
configuration.addExterns( swcContext.getExterns() );
configuration.addIncludes( swcContext.getIncludes() );
configuration.getCompilerConfiguration().addThemeCssFiles( swcContext.getThemeStyleSheets() );
// Figure out the name of the output file.
File outputFile = getOutputFile(configuration, targetFile);
// Checksums to figure out if incremental compile can be done.
String incrementalFileName = null;
SwcChecksums swcChecksums = null;
// Should we attempt to build incrementally using the incremental file?
boolean recompile = true;
// If incremental compilation is enabled and the output file exists,
// use the persisted store to figure out if a compile/link is necessary.
// link without a compile is not supported without changes to the
// persistantStore since units for Sources of type isSwcScriptOwner()
// aren't stored/restored properly. units contains null entries for those
// type of Source. To force a rebuild, with -incremental specified, delete the
// incremental file.
if (configuration.getCompilerConfiguration().getIncremental())
{
swcChecksums = new SwcChecksums(swcContext, cfgbuf, configuration);
// If incremental compilation is enabled, read the cached
// compilation units... Do not include the checksum in the file name so that
// cache files don't pile up as the configuration changes. There needs
// to be a 1-to-1 mapping between the swc file and the cache file.
incrementalFileName = outputFile.getPath() + ".cache";
// If the output file doesn't exist don't bother loading the
// cache since a recompile is needed.
if (outputFile.exists())
{
RandomAccessFile incrementalFile = null;
try
{
incrementalFile = new RandomAccessFile(incrementalFileName, "r");
// For loadCompilationUnits, loadedChecksums[1] must match
// the cached value else IOException is thrown.
int[] loadedChecksums = swcChecksums.copy();
CompilerAPI.loadCompilationUnits(configuration, fileSpec, sourceList, sourcePath, resources, bundlePath, null, /* sources */
null, /*units */
loadedChecksums, swcChecksums.getSwcDefSignatureChecksums(), swcChecksums.getSwcFileChecksums(), null, /* archiveFiles */
incrementalFile, incrementalFileName, null /* font manager */);
if (!(swcChecksums.isRecompilationNeeded(loadedChecksums) && !swcChecksums.isRelinkNeeded(loadedChecksums)))
{
recompile = false;
}
}
catch (FileNotFoundException ex)
{
// the incremental file doesn't exist
ThreadLocalToolkit.logDebug(ex.getLocalizedMessage());
}
catch (IOException ex)
{
// error loading the incremental file - most likely checksum
// mismatch or format mismatch
ThreadLocalToolkit.logInfo(ex.getLocalizedMessage());
}
finally
{
if (incrementalFile != null)
{
try
{
incrementalFile.close();
}
catch (IOException ex)
{
}
// If the load failed, or recompilation is needed, reset
// all the variables to their original state.
if (recompile)
{
fileSpec = new FileSpec(Collections.<VirtualFile>emptyList(), WebTierAPI.getFileSpecMimeTypes());
sourceList = new SourceList(virtualFileList,
asClasspath,
targetFile,
WebTierAPI.getSourcePathMimeTypes());
sourcePath = new SourcePath(asClasspath,
targetFile,
WebTierAPI.getSourcePathMimeTypes(),
compilerConfig.allowSourcePathOverlap());
resources = new ResourceContainer();
bundlePath = new ResourceBundlePath(configuration.getCompilerConfiguration(), targetFile);
}
}
}
}
}
VirtualFile projector = configuration.getProjector();
boolean createProjector = (projector != null && projector.getName().endsWith("avmplus.exe"));
// Validate CompilationUnits in FileSpec and SourcePath. If
// count > 0 something changed.
int count = CompilerAPI.validateCompilationUnits(
fileSpec, sourceList, sourcePath, bundlePath, resources,
swcContext,
null /* perCompileData */,
configuration);
recompile = recompile || (count > 0);
if (recompile)
{
// Get standard bundle of compilers, transcoders.
transcoders = WebTierAPI.getTranscoders( configuration );
SubCompiler[] compilers = WebTierAPI.getCompilers(compilerConfig, mappings, transcoders);
if (benchmark != null)
{
benchmark.stopTime(Benchmark.PRECOMPILE, false);
}
units = CompilerAPI.compile(fileSpec, sourceList,
null, /* classes */
sourcePath, resources, bundlePath, swcContext,
mappings, configuration, compilers,
createProjector ? null : new PreLink(),
configuration.getLicensesConfiguration().getLicenseMap(),
sources);
if (benchmark != null)
{
benchmark.startTime(Benchmark.POSTCOMPILE);
}
OutputStream swfOut = new BufferedOutputStream(new FileOutputStream(outputFile));
PostLink postLink = null;
if (configuration.optimize() && !configuration.debug())
{
postLink = new PostLink(configuration);
}
// link
if (createProjector)
{
ConsoleApplication app = LinkerAPI.linkConsole(units, postLink, configuration);
createProjector(configuration, projector, app, swfOut);
}
else
{
Movie movie = LinkerAPI.link(units, postLink, configuration);
if (projector != null)
{
createProjector(configuration, projector, movie, swfOut);
}
else
{
CompilerAPI.encode(configuration, movie, swfOut);
}
}
swfOut.flush();
swfOut.close();
// If incremental compilation is enabled, save the compilation units.
if (configuration.getCompilerConfiguration().getIncremental())
{
// Make sure the checksums are all current.
swcChecksums.saveChecksums(units);
RandomAccessFile incrementalFile = null;
try
{
incrementalFile = new RandomAccessFile(incrementalFileName, "rw");
// In case we're reusing the file, clear it.
incrementalFile.setLength(0);
CompilerAPI.persistCompilationUnits(
configuration, fileSpec, sourceList, sourcePath,
resources, bundlePath,
sources, /* sources */
units, /* units */
swcChecksums.getChecksums(),
swcChecksums.getSwcDefSignatureChecksums(),
swcChecksums.getSwcFileChecksums(),
null, /* archiveFiles */
"", incrementalFile);
}
catch (IOException ex)
{
ThreadLocalToolkit.logInfo(ex.getLocalizedMessage());
// Get rid of the cache file since the write failed.
new File(incrementalFileName).deleteOnExit();
}
finally
{
if (incrementalFile != null)
{
try
{
incrementalFile.close();
}
catch (IOException ex)
{
}
}
}
}
ThreadLocalToolkit.log(new OutputMessage(FileUtil.getCanonicalPath(outputFile),
Long.toString(outputFile.length())));
}
else
{
if (benchmark != null)
{
benchmark.stopTime(Benchmark.PRECOMPILE, false);
benchmark.startTime(Benchmark.POSTCOMPILE);
}
// swf is already up-to-date so no need to compile/link or rewrite file
ThreadLocalToolkit.log(new NoUpdateMessage(FileUtil.getCanonicalPath(outputFile)));
}
Set<IMxmlcExtension> extensions = ExtensionManager.getMxmlcExtensions( configuration.getCompilerConfiguration().getExtensionsConfiguration().getExtensionMappings() );
for ( IMxmlcExtension extension : extensions )
{
if(ThreadLocalToolkit.errorCount() == 0) {
extension.run( args );
}
}
}
catch (ConfigurationException ex)
{
ThreadLocalToolkit.logInfo( getStartMessage( "mxmlc" ) );
processConfigurationException(ex, "mxmlc");
}
catch (CompilerException ex)
{
assert ThreadLocalToolkit.errorCount() > 0;
}
catch (LinkerException ex)
{
assert ThreadLocalToolkit.errorCount() > 0;
}
catch (SwcException ex)
{
assert ThreadLocalToolkit.errorCount() > 0;
}
catch (Throwable t) // IOException, Throwable
{
ThreadLocalToolkit.logError(t.getLocalizedMessage());
if (Trace.error)
{
t.printStackTrace();
}
}
finally
{
if (benchmark != null)
{
if ((ThreadLocalToolkit.errorCount() == 0) &&
benchmark.hasStarted(Benchmark.POSTCOMPILE))
{
benchmark.stopTime(Benchmark.POSTCOMPILE, false);
}
benchmark.totalTime();
benchmark.peakMemoryUsage(true);
}
if (transcoders != null)
{
for (Transcoder element : transcoders)