From 1042ed5f25a54495dd18079515e8b07b4c4d1bf2 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Fri, 17 Apr 2009 19:15:56 +0000 Subject: gcc cross compiler integration plugin. --- cross/org.eclipse.cdt.build.crossgcc/.classpath | 7 + cross/org.eclipse.cdt.build.crossgcc/.project | 28 +++ .../.settings/org.eclipse.jdt.core.prefs | 8 + .../META-INF/MANIFEST.MF | 13 ++ .../build.properties | 5 + cross/org.eclipse.cdt.build.crossgcc/plugin.xml | 190 +++++++++++++++++++++ .../cdt/build/crossgcc/SetCrossCommandProcess.java | 66 +++++++ .../cdt/internal/build/crossgcc/Activator.java | 50 ++++++ .../build/crossgcc/CrossCommandLineGenerator.java | 24 +++ .../crossgcc/CrossEnvironmentVariableSupplier.java | 77 +++++++++ .../templates/setCrossCommand/template.xml | 33 ++++ 11 files changed, 501 insertions(+) create mode 100755 cross/org.eclipse.cdt.build.crossgcc/.classpath create mode 100755 cross/org.eclipse.cdt.build.crossgcc/.project create mode 100755 cross/org.eclipse.cdt.build.crossgcc/.settings/org.eclipse.jdt.core.prefs create mode 100755 cross/org.eclipse.cdt.build.crossgcc/META-INF/MANIFEST.MF create mode 100755 cross/org.eclipse.cdt.build.crossgcc/build.properties create mode 100755 cross/org.eclipse.cdt.build.crossgcc/plugin.xml create mode 100755 cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/build/crossgcc/SetCrossCommandProcess.java create mode 100755 cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/Activator.java create mode 100755 cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossCommandLineGenerator.java create mode 100755 cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossEnvironmentVariableSupplier.java create mode 100755 cross/org.eclipse.cdt.build.crossgcc/templates/setCrossCommand/template.xml (limited to 'cross/org.eclipse.cdt.build.crossgcc') diff --git a/cross/org.eclipse.cdt.build.crossgcc/.classpath b/cross/org.eclipse.cdt.build.crossgcc/.classpath new file mode 100755 index 00000000000..8a8f1668cdc --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/cross/org.eclipse.cdt.build.crossgcc/.project b/cross/org.eclipse.cdt.build.crossgcc/.project new file mode 100755 index 00000000000..2655c345209 --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/.project @@ -0,0 +1,28 @@ + + + org.eclipse.cdt.build.crossgcc + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/cross/org.eclipse.cdt.build.crossgcc/.settings/org.eclipse.jdt.core.prefs b/cross/org.eclipse.cdt.build.crossgcc/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..f8e6bb76981 --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Sun Mar 22 23:47:05 PDT 2009 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/cross/org.eclipse.cdt.build.crossgcc/META-INF/MANIFEST.MF b/cross/org.eclipse.cdt.build.crossgcc/META-INF/MANIFEST.MF new file mode 100755 index 00000000000..267961a006c --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Good +Bundle-SymbolicName: org.eclipse.cdt.build.crossgcc;singleton:=true +Bundle-Version: 1.0.0 +Bundle-Activator: org.eclipse.cdt.internal.build.crossgcc.Activator +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.cdt.managedbuilder.core;bundle-version="5.0.100", + org.eclipse.cdt.managedbuilder.gnu.ui;bundle-version="5.0.100", + org.eclipse.cdt.core;bundle-version="5.1.0", + org.eclipse.core.resources;bundle-version="3.5.0" +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/cross/org.eclipse.cdt.build.crossgcc/build.properties b/cross/org.eclipse.cdt.build.crossgcc/build.properties new file mode 100755 index 00000000000..6f20375d6c7 --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.xml diff --git a/cross/org.eclipse.cdt.build.crossgcc/plugin.xml b/cross/org.eclipse.cdt.build.crossgcc/plugin.xml new file mode 100755 index 00000000000..692cfb4aded --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/plugin.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/build/crossgcc/SetCrossCommandProcess.java b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/build/crossgcc/SetCrossCommandProcess.java new file mode 100755 index 00000000000..efcec43f26e --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/build/crossgcc/SetCrossCommandProcess.java @@ -0,0 +1,66 @@ +package org.eclipse.cdt.build.crossgcc; + +import java.util.Map; + +import org.eclipse.cdt.build.core.scannerconfig.CfgInfoContext; +import org.eclipse.cdt.build.core.scannerconfig.ICfgScannerConfigBuilderInfo2Set; +import org.eclipse.cdt.build.internal.core.scannerconfig2.CfgScannerConfigProfileManager; +import org.eclipse.cdt.core.templateengine.TemplateCore; +import org.eclipse.cdt.core.templateengine.process.ProcessArgument; +import org.eclipse.cdt.core.templateengine.process.ProcessFailureException; +import org.eclipse.cdt.core.templateengine.process.ProcessRunner; +import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.IOption; +import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +public class SetCrossCommandProcess extends ProcessRunner { + + @Override + public void process(TemplateCore template, ProcessArgument[] args, + String processId, IProgressMonitor monitor) + throws ProcessFailureException { + String projectName = args[0].getSimpleValue(); + String prefix = args[1].getSimpleValue(); + String path = args[2].getSimpleValue(); + + IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); + if (!project.exists()) + return; + + IManagedBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(project); + if (buildInfo == null) + return; + + IConfiguration[] configs = buildInfo.getManagedProject().getConfigurations(); + for (IConfiguration config : configs) { + IToolChain toolchain = config.getToolChain(); + IOption option = toolchain.getOptionBySuperClassId("cdt.managedbuild.option.gnu.cross.prefix"); + ManagedBuildManager.setOption(config, toolchain, option, prefix); + option = toolchain.getOptionBySuperClassId("cdt.managedbuild.option.gnu.cross.path"); + ManagedBuildManager.setOption(config, toolchain, option, path); + + ICfgScannerConfigBuilderInfo2Set cbi = CfgScannerConfigProfileManager.getCfgScannerConfigBuildInfo(config); + Map map = cbi.getInfoMap(); + IScannerConfigBuilderInfo2 bi = map.values().iterator().next(); + String providerId = "specsFile"; + String runCommand = bi.getProviderRunCommand(providerId); + bi.setProviderRunCommand(providerId, prefix + runCommand); + try { + bi.save(); + } catch (CoreException e) { + throw new ProcessFailureException(e); + } + } + + ManagedBuildManager.saveBuildInfo(project, true); + + } + +} diff --git a/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/Activator.java b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/Activator.java new file mode 100755 index 00000000000..b5085295619 --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/Activator.java @@ -0,0 +1,50 @@ +package org.eclipse.cdt.internal.build.crossgcc; + +import org.eclipse.core.runtime.Plugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends Plugin { + + // The plug-in ID + public static final String PLUGIN_ID = "tut.cross.good"; + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossCommandLineGenerator.java b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossCommandLineGenerator.java new file mode 100755 index 00000000000..c64fd7bd986 --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossCommandLineGenerator.java @@ -0,0 +1,24 @@ +package org.eclipse.cdt.internal.build.crossgcc; + +import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo; +import org.eclipse.cdt.managedbuilder.core.IOption; +import org.eclipse.cdt.managedbuilder.core.ITool; +import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedCommandLineGenerator; + +public class CrossCommandLineGenerator extends ManagedCommandLineGenerator { + + @Override + public IManagedCommandLineInfo generateCommandLineInfo(ITool tool, + String commandName, String[] flags, String outputFlag, + String outputPrefix, String outputName, String[] inputResources, + String commandLinePattern) { + IToolChain toolchain = (IToolChain)tool.getParent(); + IOption option = toolchain.getOptionBySuperClassId("cdt.managedbuild.option.gnu.cross.prefix"); + String prefix = (String)option.getValue(); + String newCommandName = prefix + commandName; + return super.generateCommandLineInfo(tool, newCommandName, flags, outputFlag, + outputPrefix, outputName, inputResources, commandLinePattern); + } + +} diff --git a/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossEnvironmentVariableSupplier.java b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossEnvironmentVariableSupplier.java new file mode 100755 index 00000000000..5317421ae59 --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/src/org/eclipse/cdt/internal/build/crossgcc/CrossEnvironmentVariableSupplier.java @@ -0,0 +1,77 @@ +package org.eclipse.cdt.internal.build.crossgcc; + +import java.io.File; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IOption; +import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable; +import org.eclipse.cdt.managedbuilder.envvar.IConfigurationEnvironmentVariableSupplier; +import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider; +import org.eclipse.core.runtime.Platform; + +public class CrossEnvironmentVariableSupplier implements + IConfigurationEnvironmentVariableSupplier { + + @Override + public IBuildEnvironmentVariable getVariable(String variableName, + IConfiguration configuration, IEnvironmentVariableProvider provider) { + if (PathEnvironmentVariable.isVar(variableName)) + return PathEnvironmentVariable.create(configuration); + else + return null; + } + + @Override + public IBuildEnvironmentVariable[] getVariables( + IConfiguration configuration, IEnvironmentVariableProvider provider) { + IBuildEnvironmentVariable path = PathEnvironmentVariable.create(configuration); + return path != null ? new IBuildEnvironmentVariable[] { path } : new IBuildEnvironmentVariable[0]; + } + + private static class PathEnvironmentVariable implements IBuildEnvironmentVariable { + + public static String name = "PATH"; + + private File path; + + private PathEnvironmentVariable(File path) { + this.path = path; + } + + public static PathEnvironmentVariable create(IConfiguration configuration) { + IToolChain toolchain = configuration.getToolChain(); + IOption option = toolchain.getOptionBySuperClassId("cdt.managedbuild.option.gnu.cross.path"); + String path = (String)option.getValue(); + return new PathEnvironmentVariable(new File(path, "bin")); + } + + public static boolean isVar(String name) { + // Windows has case insensitive env var names + return Platform.getOS().equals(Platform.OS_WIN32) + ? name.equalsIgnoreCase(PathEnvironmentVariable.name) + : name.equals(PathEnvironmentVariable.name); + } + + @Override + public String getDelimiter() { + return Platform.getOS().equals(Platform.OS_WIN32) ? ";" : ":"; + } + + @Override + public String getName() { + return name; + } + + @Override + public int getOperation() { + return IBuildEnvironmentVariable.ENVVAR_PREPEND; + } + + @Override + public String getValue() { + return path.getAbsolutePath(); + } + + } +} diff --git a/cross/org.eclipse.cdt.build.crossgcc/templates/setCrossCommand/template.xml b/cross/org.eclipse.cdt.build.crossgcc/templates/setCrossCommand/template.xml new file mode 100755 index 00000000000..cb46bdd59b0 --- /dev/null +++ b/cross/org.eclipse.cdt.build.crossgcc/templates/setCrossCommand/template.xml @@ -0,0 +1,33 @@ + + -- cgit v1.2.3