diff options
Diffstat (limited to 'autotools/org.eclipse.linuxtools.cdt.autotools.core/src/org/eclipse/linuxtools/internal/cdt/autotools/core/AutotoolsConfigurationBuilder.java')
-rw-r--r-- | autotools/org.eclipse.linuxtools.cdt.autotools.core/src/org/eclipse/linuxtools/internal/cdt/autotools/core/AutotoolsConfigurationBuilder.java | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/autotools/org.eclipse.linuxtools.cdt.autotools.core/src/org/eclipse/linuxtools/internal/cdt/autotools/core/AutotoolsConfigurationBuilder.java b/autotools/org.eclipse.linuxtools.cdt.autotools.core/src/org/eclipse/linuxtools/internal/cdt/autotools/core/AutotoolsConfigurationBuilder.java new file mode 100644 index 0000000000..f034de2e8f --- /dev/null +++ b/autotools/org.eclipse.linuxtools.cdt.autotools.core/src/org/eclipse/linuxtools/internal/cdt/autotools/core/AutotoolsConfigurationBuilder.java @@ -0,0 +1,159 @@ +package org.eclipse.linuxtools.internal.cdt.autotools.core; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Map; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.resources.ACBuilder; +import org.eclipse.cdt.core.resources.IConsole; +import org.eclipse.cdt.managedbuilder.core.IBuilder; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.IMultiConfiguration; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IncrementalProjectBuilder; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.linuxtools.cdt.autotools.core.AutotoolsPlugin; +import org.eclipse.linuxtools.internal.cdt.autotools.core.configure.AutotoolsConfigurationManager; +import org.eclipse.linuxtools.internal.cdt.autotools.core.configure.IAConfiguration; + +public class AutotoolsConfigurationBuilder extends ACBuilder { + + public static final String BUILDER_NAME = "genmakebuilderV2"; //$NON-NLS-1$ + public static final String BUILDER_ID = AutotoolsPlugin.getUniqueIdentifier() + "." + BUILDER_NAME; //$NON-NLS-1$ + + private static final String BUILD_STOPPED="AutotoolsMakefileBuilder.message.stopped"; //$NON-NLS-1$ + private AutotoolsNewMakeGenerator generator; + + public AutotoolsConfigurationBuilder() { + super(); + generator = new AutotoolsNewMakeGenerator(); + } + + @SuppressWarnings("unchecked") + @Override + protected IProject[] build(int kind, Map args, IProgressMonitor monitor) + throws CoreException { + IProject project = getProject(); + + boolean bPerformBuild = true; + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + if (!shouldBuild(kind, info)) { + return new IProject[0]; + } + if (kind == IncrementalProjectBuilder.AUTO_BUILD) { + IResourceDelta delta = getDelta(getProject()); + if (delta != null) { + IResource res = delta.getResource(); + if (res != null) { + bPerformBuild = res.getProject().equals(getProject()); + } + } else { + bPerformBuild = false; + } + IConfiguration cfg = info.getDefaultConfiguration(); + if (cfg != null) { + IAConfiguration acfg = AutotoolsConfigurationManager.getInstance().findCfg(project, cfg.getName()); + if (acfg == null || acfg.isDirty()) + bPerformBuild = true; + } + } + if (bPerformBuild) { + MultiStatus result = performMakefileGeneration(project, info, monitor); + if (result.getSeverity() == IStatus.ERROR) { + // Failure to create Makefile, output error message to console. + IConsole console = CCorePlugin.getDefault().getConsole(); + console.start(project); + + OutputStream cos = console.getOutputStream(); + String errormsg = AutotoolsPlugin.getResourceString(BUILD_STOPPED); + StringBuffer buf = new StringBuffer(errormsg); + buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("(").append(result.getMessage()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ + + try { + cos.write(buf.toString().getBytes()); + cos.flush(); + cos.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + AutotoolsPlugin.log(e); + } + } + } + checkCancel(monitor); + return getProject().getReferencedProjects(); + } + + @Override + protected void clean(IProgressMonitor monitor) throws CoreException { + IProject project = getProject(); + final IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); + if (shouldBuild(CLEAN_BUILD, info)) { + IConfiguration icfg = info.getDefaultConfiguration(); + if (icfg instanceof IMultiConfiguration) { + IMultiConfiguration mcfg = (IMultiConfiguration)icfg; + IConfiguration[] cfgs = (IConfiguration[])mcfg.getItems(); + for (int i = 0; i < cfgs.length; ++i) { + IAConfiguration cfg = AutotoolsConfigurationManager.getInstance().getConfiguration(project, icfg.getName()); + cfg.setDirty(true); + } + } else { + IAConfiguration cfg = AutotoolsConfigurationManager.getInstance().getConfiguration(project, icfg.getName()); + cfg.setDirty(true); // Mark Configuration dirty so next build will do full reconfigure + } + } + } + + protected MultiStatus performMakefileGeneration(IProject project, IManagedBuildInfo info, + IProgressMonitor monitor) throws CoreException { + MultiStatus result; + + try { + generator.initialize(project, info, monitor); + result = generator.regenerateMakefiles(false); + } catch (CoreException e) { + String errMsg = AutotoolsPlugin.getResourceString("MakeGenerator.didnt.generate"); //$NON-NLS-1$ + result = new MultiStatus(AutotoolsPlugin.getUniqueIdentifier(), IStatus.ERROR, + errMsg, e); + } + + return result; + } + + /** + * Check whether the build has been canceled. + */ + public void checkCancel(IProgressMonitor monitor) { + if (monitor != null && monitor.isCanceled()) + throw new OperationCanceledException(); + } + + protected boolean shouldBuild(int kind, IManagedBuildInfo info) { + IConfiguration cfg = info.getDefaultConfiguration(); + IBuilder builder = null; + if (cfg != null) { + builder = cfg.getEditableBuilder(); + switch (kind) { + case IncrementalProjectBuilder.AUTO_BUILD : + return true; + case IncrementalProjectBuilder.INCREMENTAL_BUILD : // now treated as the same! + case IncrementalProjectBuilder.FULL_BUILD : + return builder.isFullBuildEnabled() | builder.isIncrementalBuildEnabled() ; + case IncrementalProjectBuilder.CLEAN_BUILD : + return builder.isCleanBuildEnabled(); + } + } + return true; + } + +} + |