package com.mobilesorcery.sdk.core.build;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IMemento;
import com.mobilesorcery.sdk.core.CoreMoSyncPlugin;
import com.mobilesorcery.sdk.core.IBuildResult;
import com.mobilesorcery.sdk.core.IBuildSession;
import com.mobilesorcery.sdk.core.IBuildState;
import com.mobilesorcery.sdk.core.IBuildVariant;
import com.mobilesorcery.sdk.core.IFileTreeDiff;
import com.mobilesorcery.sdk.core.IFilter;
import com.mobilesorcery.sdk.core.IPropertyOwner;
import com.mobilesorcery.sdk.core.Util;
import com.mobilesorcery.sdk.core.LineReader.ILineHandler;
import com.mobilesorcery.sdk.core.MoSyncBuilder;
import com.mobilesorcery.sdk.core.MoSyncProject;
import com.mobilesorcery.sdk.core.ParameterResolverException;
import com.mobilesorcery.sdk.core.PropertyUtil;
import com.mobilesorcery.sdk.internal.builder.MoSyncBuilderVisitor;
import com.mobilesorcery.sdk.internal.dependencies.DependencyManager;
public class CompileBuildStep extends AbstractBuildStep {
public static class Factory extends AbstractBuildStepFactory {
@Override
public IBuildStep create() {
return new CompileBuildStep();
}
@Override
public String getId() {
return ID;
}
@Override
public String getName() {
return "Compile";
}
}
public static final String OBJECT_FILES = CompileBuildStep.class.getName() + "obj.files";
public static final String ID = "compile";
public CompileBuildStep() {
setId(ID);
setName("Compile");
}
@Override
public int incrementalBuild(MoSyncProject mosyncProject, IBuildSession session,
IBuildVariant variant, IFileTreeDiff diff,
IBuildResult buildResult, IProgressMonitor monitor) throws CoreException, ParameterResolverException {
if (isOutputType(mosyncProject, variant, MoSyncBuilder.OUTPUT_TYPE_NATIVE_COMPILE)) {
getConsole().addMessage("Native compilation");
return CONTINUE;
}
IProject project = mosyncProject.getWrappedProject();
MoSyncBuilderVisitor compilerVisitor = new MoSyncBuilderVisitor();
compilerVisitor.setProject(project);
compilerVisitor.setVariant(variant);
compilerVisitor.setDependencyProvider(getDependencyProvider());
IPropertyOwner buildProperties = getBuildProperties();
ILineHandler lineHandler = getDefaultLineHandler();
compilerVisitor.setConsole(getConsole());
compilerVisitor.setExtraCompilerSwitches(MoSyncBuilder.getExtraCompilerSwitches(mosyncProject, variant));
Integer gccWarnings = PropertyUtil.getInteger(buildProperties, MoSyncBuilder.GCC_WARNINGS);
compilerVisitor.setGCCWarnings(gccWarnings == null ? 0 : gccWarnings.intValue());
compilerVisitor.setOutputPath(MoSyncBuilder.getOutputPath(project, variant));
compilerVisitor.setLineHandler(lineHandler);
compilerVisitor.setBuildResult(buildResult);
compilerVisitor.setDiff(diff);
compilerVisitor.setResourceFilter(getResourceFilter());
compilerVisitor.setParameterResolver(getParameterResolver());
try {
compilerVisitor.incrementalCompile(monitor, getBuildState().getDependencyManager(), buildResult.getDependencyDelta());
} catch (ParameterResolverException e) {
throw new CoreException(new Status(IStatus.ERROR, CoreMoSyncPlugin.PLUGIN_ID, e.getMessage(), e));
}
/* Update dependencies */
IResource[] allAffectedResources = compilerVisitor.getAllAffectedResources();
Set<IProject> projectDependencies = computeProjectDependencies(monitor, mosyncProject, getBuildState(), allAffectedResources);
DependencyManager<IProject> projectDependencyMgr = CoreMoSyncPlugin.getDefault().getProjectDependencyManager(ResourcesPlugin.getWorkspace());
projectDependencyMgr.setDependencies(project, projectDependencies);
// TODO: Better way to transport this stuff?
session.getProperties().put(OBJECT_FILES, compilerVisitor.getObjectFilesForProject(project));
return CONTINUE;
}
}