log.info("Done.");
log("Done.");
	public final void execute() throws BuildException {		final long lmJar = jarFile.lastModified();		final long lmKernel = kernelFile.lastModified();		final long lmDest = destFile.lastModified();		final long lmPIL = getPluginListFile().lastModified();		final PluginList piList;		final long lmPI;		try {			piList = getPluginList();			lmPI = piList.lastModified();		} catch (PluginException ex) {			throw new BuildException(ex);		} catch (IOException ex) {			throw new BuildException(ex);		}		if ((lmJar < lmDest) && (lmKernel < lmDest) && (lmPIL < lmDest) && (lmPI < lmDest)) {			// No need to do anything, skip			return;		}		try {			System.getProperties().setProperty(BUILDTIME_PROPERTY, "1");			// Load the plugin descriptors			final PluginRegistry piRegistry;			piRegistry = new PluginRegistryModel(piList.getDescriptorUrlList());			testPluginPrerequisites(piRegistry);			/* Now create the processor */			final VmProcessor proc = createProcessor();			final VmArchitecture arch = proc.getArchitecture();			log("Building for " + proc.getCPUID());						clsMgr = new VmClassLoader(classesURL, proc.getArchitecture());			final NativeStream os = createNativeStream();			final Object clInitCaller = new Label("$$clInitCaller");			VmType systemClasses[] = VmType.initializeForBootImage(clsMgr);			for (int i = 0; i < systemClasses.length; i++) {				clsMgr.addLoadedClass(systemClasses[i].getName(), systemClasses[i]);			}			// First copy the native kernel file			copyKernel(os);			os.setObjectRef(bootHeapStart);			// Setup a call to our first java method			initImageHeader(os, clInitCaller, piRegistry);			// Create the initial stack			createInitialStack(os, initialStack, initialStackPtr);			/* Now load the classes */			loadClass(VmMethodCode.class);			loadClass(Unsafe.class);			loadClass(VmClassLoader.class);			loadClass(VmType[].class);			/* Now emit the processor */			os.getObjectRef(proc);			/* Let the compilers load its native symbol offsets */			final NativeCodeCompiler[] cmps = arch.getCompilers();			for (int i = 0; i < cmps.length; i++) {				final NativeCodeCompiler cmp = cmps[i];				cmp.initialize(clsMgr);				os.getObjectRef(cmp);			}			for (Iterator i = BootClasses.values().iterator(); i.hasNext();) {				BootClassInfo bci = (BootClassInfo) i.next();				if (!bci.isPackage()) {					clsMgr.loadClass(bci.getName(), true);				}			}			// Load the jarfile as byte-array			copyJarFile(os);			// Now emit all object images to the actual image			emitObjects(os, arch, clsMgr);			/* Set the bootclasses */			VmType bootClasses[] = clsMgr.prepareAfterBootstrap();			os.getObjectRef(bootClasses);			emitObjects(os, arch, clsMgr);			// Disallow the loading of new classes			clsMgr.setFailOnNewLoad(true);			// Turn auto-compilation on			clsMgr.setCompileRequired();			// Emit the remaining objects			emitObjects(os, arch, null);			/* Write static initializer code */			emitStaticInitializerCalls(os, bootClasses, clInitCaller);			// This is the end of the image			X86Stream.ObjectInfo dummyObjectAtEnd = os.startObject(loadClass(VmMethodCode.class));			pageAlign(os);			dummyObjectAtEnd.markEnd();			os.setObjectRef(imageEnd);			os.setObjectRef(bootHeapEnd);			/* Link all native symbols */			linkNativeSymbols(os);			// Patch multiboot header			patchHeader(os);			// Store the image			storeImage(os);			// Generate the listfile			printLabels(os, bootClasses);			for (int i = 0; i < cmps.length; i++) {				cmps[i].dumpStatistics();			}			log.info("Done.");		} catch (Throwable ex) {			ex.printStackTrace();			throw new BuildException(ex);		}	}