mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 228265
Update GdbLaunchDelegate to no longer require anything from org.eclipse.cdt.launch. Also triggers a build when necessary before launching, as the CDT does. Also introduces a LaunchMessages class which uses a resourceBundle for launch messages that has been added as org.eclipse.dd.gdb.internal.provisional.launching.LaunchMessages
This commit is contained in:
parent
bf9f5fbabd
commit
41f3028662
4 changed files with 479 additions and 114 deletions
|
@ -12,8 +12,7 @@ Require-Bundle: org.eclipse.core.runtime,
|
|||
org.eclipse.debug.core,
|
||||
org.eclipse.cdt.core,
|
||||
org.eclipse.cdt.debug.core,
|
||||
org.eclipse.cdt.debug.mi.core,
|
||||
org.eclipse.cdt.launch
|
||||
org.eclipse.cdt.debug.mi.core
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
||||
Export-Package: org.eclipse.dd.gdb.internal.provisional,
|
||||
|
|
|
@ -1,31 +1,41 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2006 QNX Software Systems and others.
|
||||
* Copyright (c) 2008 QNX Software Systems and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - Initial API and implementation
|
||||
* QNX Software Systems - Initial API and implementation
|
||||
* Windriver and Ericsson - Updated for DSF
|
||||
*******************************************************************************/
|
||||
package org.eclipse.dd.gdb.internal.provisional.launching;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.IBinaryParser;
|
||||
import org.eclipse.cdt.core.ICExtensionReference;
|
||||
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
|
||||
import org.eclipse.cdt.core.model.ICModelMarker;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||
import org.eclipse.cdt.launch.AbstractCLaunchDelegate;
|
||||
import org.eclipse.cdt.launch.internal.ui.LaunchMessages;
|
||||
import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin;
|
||||
import org.eclipse.cdt.utils.pty.PTY;
|
||||
import org.eclipse.cdt.utils.spawner.ProcessFactory;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IMarker;
|
||||
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.IPath;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.MultiStatus;
|
||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
|
||||
import org.eclipse.dd.gdb.internal.GdbPlugin;
|
||||
|
@ -40,22 +50,19 @@ import org.eclipse.debug.core.IStatusHandler;
|
|||
import org.eclipse.debug.core.model.ILaunchConfigurationDelegate2;
|
||||
import org.eclipse.debug.core.model.IPersistableSourceLocator;
|
||||
import org.eclipse.debug.core.model.ISourceLocator;
|
||||
import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
|
||||
import org.eclipse.debug.core.sourcelookup.IPersistableSourceLocator2;
|
||||
|
||||
/**
|
||||
* The launch configuration delegate for the CDI debugger session types.
|
||||
* The shared launch configuration delegate for the DSF/GDB debugger.
|
||||
* This delegate supports all configuration types (local, remote, attach, etc)
|
||||
*/
|
||||
@ThreadSafe
|
||||
public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
||||
public class GdbLaunchDelegate extends LaunchConfigurationDelegate
|
||||
implements ILaunchConfigurationDelegate2
|
||||
{
|
||||
public final static String GDB_DEBUG_MODEL_ID = "org.eclipse.dd.gdb"; //$NON-NLS-1$
|
||||
private SessionType fSessionType;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.launch.AbstractCLaunchDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
|
||||
*/
|
||||
@Override
|
||||
public void launch( ILaunchConfiguration config, String mode, ILaunch launch, IProgressMonitor monitor ) throws CoreException {
|
||||
if ( monitor == null ) {
|
||||
monitor = new NullProgressMonitor();
|
||||
|
@ -70,21 +77,9 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
if ( monitor.isCanceled() ) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
String debugMode = config.getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN );
|
||||
if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN)) {
|
||||
fSessionType = SessionType.RUN;
|
||||
} else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH)) {
|
||||
fSessionType = SessionType.ATTACH;
|
||||
} else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE)) {
|
||||
fSessionType = SessionType.CORE;
|
||||
} else if (debugMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE)) {
|
||||
fSessionType = SessionType.REMOTE;
|
||||
} else {
|
||||
fSessionType = SessionType.RUN;
|
||||
}
|
||||
|
||||
launchDebugSession( config, launch, monitor );
|
||||
try {
|
||||
launchDebugSession( config, launch, monitor );
|
||||
}
|
||||
finally {
|
||||
monitor.done();
|
||||
|
@ -95,9 +90,11 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
if ( monitor.isCanceled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
SessionType sessionType = getSessionType(config);
|
||||
final GdbLaunch launch = (GdbLaunch)l;
|
||||
|
||||
if (fSessionType == SessionType.REMOTE) {
|
||||
if (sessionType == SessionType.REMOTE) {
|
||||
monitor.subTask( "Debugging remote C/C++ application" ); //$NON-NLS-1$
|
||||
} else {
|
||||
monitor.subTask( "Debugging local C/C++ application" ); //$NON-NLS-1$
|
||||
|
@ -114,7 +111,7 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
// If we are attaching, get the process id now, so as to avoid starting the launch
|
||||
// and canceling it if the user does not put the pid properly.
|
||||
int pid = -1;
|
||||
if (fSessionType == SessionType.ATTACH) {
|
||||
if (sessionType == SessionType.ATTACH) {
|
||||
try {
|
||||
// have we already been given the pid (maybe from a JUnit test launch or something)
|
||||
pid = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_ATTACH_PROCESS_ID, -1);
|
||||
|
@ -130,8 +127,6 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
LaunchMessages.getString("LocalAttachLaunchDelegate.No_Process_ID_selected"))); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
setDefaultSourceLocator(launch, config);
|
||||
|
||||
// Create and invoke the launch sequence to create the debug control and services
|
||||
final ServicesLaunchSequence servicesLaunchSequence =
|
||||
|
@ -156,10 +151,10 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
|
||||
// Create and invoke the final launch sequence to setup GDB
|
||||
final FinalLaunchSequence finalLaunchSequence;
|
||||
if (fSessionType == SessionType.ATTACH) {
|
||||
if (sessionType == SessionType.ATTACH) {
|
||||
finalLaunchSequence = new FinalLaunchSequence(launch.getSession().getExecutor(), launch, pid);
|
||||
} else {
|
||||
finalLaunchSequence = new FinalLaunchSequence(launch.getSession().getExecutor(), launch, fSessionType);
|
||||
finalLaunchSequence = new FinalLaunchSequence(launch.getSession().getExecutor(), launch, sessionType);
|
||||
}
|
||||
launch.getSession().getExecutor().execute(finalLaunchSequence);
|
||||
try {
|
||||
|
@ -171,6 +166,23 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
}
|
||||
}
|
||||
|
||||
private SessionType getSessionType(ILaunchConfiguration config) {
|
||||
try {
|
||||
String debugMode = config.getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN );
|
||||
if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN)) {
|
||||
return SessionType.RUN;
|
||||
} else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH)) {
|
||||
return SessionType.ATTACH;
|
||||
} else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE)) {
|
||||
return SessionType.CORE;
|
||||
} else if (debugMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE)) {
|
||||
return SessionType.REMOTE;
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
return SessionType.RUN;
|
||||
}
|
||||
|
||||
// Copied from the CDT
|
||||
protected int promptForProcessID(ILaunchConfiguration config) throws CoreException {
|
||||
IStatus fPromptStatus = new Status(IStatus.INFO, "org.eclipse.debug.ui", 200, "", null); //$NON-NLS-1$//$NON-NLS-2$
|
||||
|
@ -186,92 +198,17 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.launch.AbstractCLaunchDelegate#getPluginID()
|
||||
*/
|
||||
@Override
|
||||
protected String getPluginID() {
|
||||
return LaunchUIPlugin.getUniqueIdentifier();
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a runtime exec on the given command line in the context of the
|
||||
* specified working directory, and returns the resulting process. If the
|
||||
* current runtime does not support the specification of a working
|
||||
* directory, the status handler for error code
|
||||
* <code>ERR_WORKING_DIRECTORY_NOT_SUPPORTED</code> is queried to see if
|
||||
* the exec should be re-executed without specifying a working directory.
|
||||
*
|
||||
* @param cmdLine
|
||||
* the command line
|
||||
* @param workingDirectory
|
||||
* the working directory, or <code>null</code>
|
||||
* @return the resulting process or <code>null</code> if the exec is
|
||||
* cancelled
|
||||
* @see Runtime
|
||||
*/
|
||||
protected Process exec( String[] cmdLine, String[] environ, File workingDirectory, boolean usePty ) throws CoreException {
|
||||
Process p = null;
|
||||
try {
|
||||
if ( workingDirectory == null ) {
|
||||
p = ProcessFactory.getFactory().exec( cmdLine, environ );
|
||||
}
|
||||
else {
|
||||
if ( usePty && PTY.isSupported() ) {
|
||||
p = ProcessFactory.getFactory().exec( cmdLine, environ, workingDirectory, new PTY() );
|
||||
}
|
||||
else {
|
||||
p = ProcessFactory.getFactory().exec( cmdLine, environ, workingDirectory );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( IOException e ) {
|
||||
if ( p != null ) {
|
||||
p.destroy();
|
||||
}
|
||||
abort( "Error starting process.", e, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR ); //$NON-NLS-1$
|
||||
}
|
||||
catch( NoSuchMethodError e ) {
|
||||
// attempting launches on 1.2.* - no ability to set working
|
||||
// directory
|
||||
IStatus status = new Status( IStatus.ERROR, LaunchUIPlugin.getUniqueIdentifier(), ICDTLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_NOT_SUPPORTED, LaunchMessages.getString( "LocalDsfLaunchDelegate.9" ), e ); //$NON-NLS-1$
|
||||
IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler( status );
|
||||
if ( handler != null ) {
|
||||
Object result = handler.handleStatus( status, this );
|
||||
if ( result instanceof Boolean && ((Boolean)result).booleanValue() ) {
|
||||
p = exec( cmdLine, environ, null, usePty );
|
||||
}
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.launch.AbstractCLaunchDelegate#preLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
|
||||
*/
|
||||
@Override
|
||||
public boolean preLaunchCheck( ILaunchConfiguration config, String mode, IProgressMonitor monitor ) throws CoreException {
|
||||
// no pre launch check for core file
|
||||
if ( mode.equals( ILaunchManager.DEBUG_MODE ) ) {
|
||||
if ( ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE.equals( config.getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN ) ) )
|
||||
return true;
|
||||
}
|
||||
if (mode.equals(ILaunchManager.DEBUG_MODE) && getSessionType(config) == SessionType.CORE) return true;
|
||||
|
||||
return super.preLaunchCheck( config, mode, monitor );
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// ILaunchConfigurationDelegate2
|
||||
@Override
|
||||
public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean finalLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException {
|
||||
// Need to configure the source locator before creating the launch
|
||||
|
@ -303,4 +240,228 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a core exception with an error status object built from the given
|
||||
* message, lower level exception, and error code.
|
||||
*
|
||||
* @param message
|
||||
* the status message
|
||||
* @param exception
|
||||
* lower level exception associated with the error, or
|
||||
* <code>null</code> if none
|
||||
* @param code
|
||||
* error code
|
||||
*/
|
||||
protected void abort(String message, Throwable exception, int code) throws CoreException {
|
||||
MultiStatus status = new MultiStatus(GdbPlugin.PLUGIN_ID, code, message, exception);
|
||||
status.add(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, code, exception == null ? "" : exception.getLocalizedMessage(), //$NON-NLS-1$
|
||||
exception));
|
||||
throw new CoreException(status);
|
||||
}
|
||||
|
||||
public static ICProject getCProject(ILaunchConfiguration configuration) throws CoreException {
|
||||
String projectName = getProjectName(configuration);
|
||||
if (projectName != null) {
|
||||
projectName = projectName.trim();
|
||||
if (projectName.length() > 0) {
|
||||
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
|
||||
ICProject cProject = CCorePlugin.getDefault().getCoreModel().create(project);
|
||||
if (cProject != null && cProject.exists()) {
|
||||
return cProject;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getProjectName(ILaunchConfiguration configuration) throws CoreException {
|
||||
return configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null);
|
||||
}
|
||||
|
||||
public static String getProgramName(ILaunchConfiguration configuration) throws CoreException {
|
||||
return configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, (String)null);
|
||||
}
|
||||
|
||||
public static IPath getProgramPath(ILaunchConfiguration configuration) throws CoreException {
|
||||
String path = getProgramName(configuration);
|
||||
if (path == null) {
|
||||
return null;
|
||||
}
|
||||
return new Path(path);
|
||||
}
|
||||
|
||||
protected ICProject verifyCProject(ILaunchConfiguration config) throws CoreException {
|
||||
String name = getProjectName(config);
|
||||
if (name == null) {
|
||||
abort(LaunchMessages.getString("AbstractCLaunchDelegate.C_Project_not_specified"), null, //$NON-NLS-1$
|
||||
ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROJECT);
|
||||
}
|
||||
ICProject cproject = getCProject(config);
|
||||
if (cproject == null) {
|
||||
IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
|
||||
if (!proj.exists()) {
|
||||
abort(
|
||||
LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_does_not_exist", name), null, //$NON-NLS-1$
|
||||
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
|
||||
} else if (!proj.isOpen()) {
|
||||
abort(LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_is_closed", name), null, //$NON-NLS-1$
|
||||
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
|
||||
}
|
||||
abort(LaunchMessages.getString("AbstractCLaunchDelegate.Not_a_C_CPP_project"), null, //$NON-NLS-1$
|
||||
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
|
||||
}
|
||||
return cproject;
|
||||
}
|
||||
|
||||
protected IPath verifyProgramPath(ILaunchConfiguration config) throws CoreException {
|
||||
ICProject cproject = verifyCProject(config);
|
||||
IPath programPath = getProgramPath(config);
|
||||
if (programPath == null || programPath.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (!programPath.isAbsolute()) {
|
||||
IFile wsProgramPath = cproject.getProject().getFile(programPath);
|
||||
programPath = wsProgramPath.getLocation();
|
||||
}
|
||||
if (!programPath.toFile().exists()) {
|
||||
abort(
|
||||
LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_does_not_exist"), //$NON-NLS-1$
|
||||
new FileNotFoundException(
|
||||
LaunchMessages.getFormattedString(
|
||||
"AbstractCLaunchDelegate.PROGRAM_PATH_not_found", programPath.toOSString())), //$NON-NLS-1$
|
||||
ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_EXIST);
|
||||
}
|
||||
return programPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param project
|
||||
* @param exePath
|
||||
* @return
|
||||
* @throws CoreException
|
||||
*/
|
||||
protected IBinaryObject verifyBinary(ICProject proj, IPath exePath) throws CoreException {
|
||||
ICExtensionReference[] parserRef = CCorePlugin.getDefault().getBinaryParserExtensions(proj.getProject());
|
||||
for (int i = 0; i < parserRef.length; i++) {
|
||||
try {
|
||||
IBinaryParser parser = (IBinaryParser)parserRef[i].createExtension();
|
||||
IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath);
|
||||
if (exe != null) {
|
||||
return exe;
|
||||
}
|
||||
} catch (ClassCastException e) {
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
IBinaryParser parser = CCorePlugin.getDefault().getDefaultBinaryParser();
|
||||
try {
|
||||
return (IBinaryObject)parser.getBinary(exePath);
|
||||
} catch (ClassCastException e) {
|
||||
} catch (IOException e) {
|
||||
}
|
||||
Throwable exception = new FileNotFoundException(LaunchMessages.getFormattedString(
|
||||
"AbstractCLaunchDelegate.Program_is_not_a_recongnized_executable", exePath.toOSString())); //$NON-NLS-1$
|
||||
int code = ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_BINARY;
|
||||
MultiStatus status = new MultiStatus(GdbPlugin.PLUGIN_ID, code,
|
||||
LaunchMessages.getString("AbstractCLaunchDelegate.Program_is_not_a_recongnized_executable"), exception); //$NON-NLS-1$
|
||||
status.add(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, code, exception == null ? "" : exception.getLocalizedMessage(), //$NON-NLS-1$
|
||||
exception));
|
||||
throw new CoreException(status);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively creates a set of projects referenced by the current project
|
||||
*
|
||||
* @param proj
|
||||
* The current project
|
||||
* @param referencedProjSet
|
||||
* A set of referenced projects
|
||||
* @throws CoreException
|
||||
* if an error occurs while getting referenced projects from the
|
||||
* current project
|
||||
*/
|
||||
private HashSet<IProject> getReferencedProjectSet(IProject proj, HashSet<IProject> referencedProjSet) throws CoreException {
|
||||
// The top project is a reference too and it must be added at the top to avoid cycles
|
||||
referencedProjSet.add(proj);
|
||||
|
||||
IProject[] projects = proj.getReferencedProjects();
|
||||
for (IProject refProject : projects) {
|
||||
if (refProject.exists() && !referencedProjSet.contains(refProject)) {
|
||||
getReferencedProjectSet(refProject, referencedProjSet);
|
||||
}
|
||||
}
|
||||
return referencedProjSet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the order list of projects to build before launching.
|
||||
* Used in buildForLaunch()
|
||||
*/
|
||||
@Override
|
||||
protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException {
|
||||
IProject[] orderedProjects = null;
|
||||
ArrayList<IProject> orderedProjList = null;
|
||||
|
||||
ICProject cProject = getCProject(configuration);
|
||||
if (cProject != null) {
|
||||
HashSet<IProject> projectSet = getReferencedProjectSet(cProject.getProject(), new HashSet<IProject>());
|
||||
|
||||
String[] orderedNames = ResourcesPlugin.getWorkspace().getDescription().getBuildOrder();
|
||||
if (orderedNames != null) {
|
||||
//Projects may not be in the build order but should still be built if selected
|
||||
ArrayList<IProject> unorderedProjects = new ArrayList<IProject>(projectSet.size());
|
||||
unorderedProjects.addAll(projectSet);
|
||||
orderedProjList = new ArrayList<IProject>(projectSet.size());
|
||||
|
||||
for (String projectName : orderedNames) {
|
||||
for (IProject proj : unorderedProjects) {
|
||||
if (proj.getName().equals(projectName)) {
|
||||
orderedProjList.add(proj);
|
||||
unorderedProjects.remove(proj);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add any remaining projects to the end of the list
|
||||
orderedProjList.addAll(unorderedProjects);
|
||||
|
||||
orderedProjects = orderedProjList.toArray(new IProject[orderedProjList.size()]);
|
||||
} else {
|
||||
// Try the project prerequisite order then
|
||||
IProject[] projects = projectSet.toArray(new IProject[projectSet.size()]);
|
||||
orderedProjects = ResourcesPlugin.getWorkspace().computeProjectOrder(projects).projects;
|
||||
}
|
||||
}
|
||||
return orderedProjects;
|
||||
}
|
||||
|
||||
/* Used in finalLaunchCheck() */
|
||||
@Override
|
||||
protected IProject[] getProjectsForProblemSearch(ILaunchConfiguration configuration, String mode) throws CoreException {
|
||||
return getBuildOrder(configuration, mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches for compile errors in the specified project
|
||||
* Used in finalLaunchCheck()
|
||||
* @param proj
|
||||
* The project to search
|
||||
* @return true if compile errors exist, otherwise false
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected boolean existsProblems(IProject proj) throws CoreException {
|
||||
IMarker[] markers = proj.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
|
||||
if (markers.length > 0) {
|
||||
for (IMarker marker : markers) {
|
||||
Integer severity = (Integer)marker.getAttribute(IMarker.SEVERITY);
|
||||
if (severity != null) {
|
||||
return severity.intValue() >= IMarker.SEVERITY_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 QNX Software Systems and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - initial API and implementation
|
||||
* Ericsson - Update for DSF
|
||||
*******************************************************************************/
|
||||
package org.eclipse.dd.gdb.internal.provisional.launching;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class LaunchMessages {
|
||||
|
||||
private static final String BUNDLE_NAME = "org.eclipse.dd.gdb.internal.provisional.launching.LaunchMessages";//$NON-NLS-1$
|
||||
|
||||
private static ResourceBundle RESOURCE_BUNDLE = null;
|
||||
|
||||
static {
|
||||
try {
|
||||
RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
|
||||
}
|
||||
catch (MissingResourceException x) {
|
||||
}
|
||||
}
|
||||
|
||||
private LaunchMessages() {}
|
||||
|
||||
public static String getFormattedString(String key, String arg) {
|
||||
return MessageFormat.format(getString(key), (Object[])new String[]{arg});
|
||||
}
|
||||
|
||||
public static String getFormattedString(String key, String[] args) {
|
||||
return MessageFormat.format(getString(key), (Object[])args);
|
||||
}
|
||||
|
||||
public static String getString(String key) {
|
||||
if (RESOURCE_BUNDLE == null) return '!' + key + '!';
|
||||
return RESOURCE_BUNDLE.getString(key);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
###############################################################################
|
||||
# Copyright (c) 2008 QNX Software Systems and others.
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are made available under the terms of the Eclipse Public License v1.0
|
||||
# which accompanies this distribution, and is available at
|
||||
# http://www.eclipse.org/legal/epl-v10.html
|
||||
#
|
||||
# Contributors:
|
||||
# QNX Software Systems - Initial API and implementation
|
||||
# Monta Vista - Joanne Woo - Bug 87556
|
||||
# Nokia - Ken Ryall - Bug 118894
|
||||
###############################################################################
|
||||
|
||||
AbstractCLaunchDelegate.Debugger_not_installed=CDT Debugger not installed
|
||||
AbstractCLaunchDelegate.C_Project_not_specified=C Project not specified
|
||||
AbstractCLaunchDelegate.Not_a_C_CPP_project=Project is not a C/C++ project
|
||||
AbstractCLaunchDelegate.Program_file_not_specified=Program file not specified
|
||||
AbstractCLaunchDelegate.Program_file_does_not_exist=Program file does not exist
|
||||
AbstractCLaunchDelegate.PROGRAM_PATH_not_found={0} not found
|
||||
AbstractCLaunchDelegate.Working_directory_does_not_exist=Working directory does not exist
|
||||
AbstractCLaunchDelegate.WORKINGDIRECTORY_PATH_not_found=The working directory {0} does not exist.
|
||||
AbstractCLaunchDelegate.Project_NAME_does_not_exist=Project {0} does not exist
|
||||
AbstractCLaunchDelegate.Project_NAME_is_closed=Project {0} is closed
|
||||
AbstractCLaunchDelegate.Debugger_Process=Debugger Process
|
||||
AbstractCLaunchDelegate.building_projects=Building prerequisite project list
|
||||
AbstractCLaunchDelegate.building=Building
|
||||
AbstractCLaunchDelegate.searching_for_errors=Searching for compile errors
|
||||
AbstractCLaunchDelegate.searching_for_errors_in=Searching for compile errors in
|
||||
AbstractCLaunchDelegate.20=Building prerequisite project list
|
||||
AbstractCLaunchDelegate.Program_is_not_a_recongnized_executable=Program is not a recognized executable.
|
||||
|
||||
LocalRunLaunchDelegate.Launching_Local_C_Application=Launching Local C/C++ Application
|
||||
LocalRunLaunchDelegate.Failed_setting_runtime_option_though_debugger=Failed to set program arguments, environment or working directory.
|
||||
LocalRunLaunchDelegate.Error_starting_process=Error starting process
|
||||
LocalRunLaunchDelegate.Does_not_support_working_dir=Eclipse runtime does not support working directory
|
||||
|
||||
LocalAttachLaunchDelegate.Attaching_to_Local_C_Application=Attaching to Local C/C++ Application
|
||||
LocalAttachLaunchDelegate.No_Process_ID_selected=No Process ID selected
|
||||
LocalAttachLaunchDelegate.Select_Process=Select Process
|
||||
LocalAttachLaunchDelegate.Platform_cannot_list_processes=Current platform does not support listing processes
|
||||
LocalAttachLaunchDelegate.Select_Process_to_attach_debugger_to=Select a Process to attach debugger to:
|
||||
LocalAttachLaunchDelegate.CDT_Launch_Error=CDT Launch Error
|
||||
|
||||
CoreFileLaunchDelegate.Launching_postmortem_debugger=Launching postmortem debugger
|
||||
CoreFileLaunchDelegate.No_Corefile_selected=No Corefile selected
|
||||
CoreFileLaunchDelegate.No_Shell_available_in_Launch=No Shell available in Launch
|
||||
CoreFileLaunchDelegate.Select_Corefile=Select Corefile
|
||||
CoreFileLaunchDelegate.Corefile_not_accessible=Core file is not accessible.
|
||||
CoreFileLaunchDelegate.Corefile_not_readable=Core file does not exist or is not readable.
|
||||
CoreFileLaunchDelegate.postmortem_debugging_failed=Post-mortem debugging failed
|
||||
|
||||
CApplicationLaunchShortcut.Application_Launcher=Application Launcher
|
||||
CApplicationLaunchShortcut.ChooseConfigToDebug=Choose a debug configuration to debug
|
||||
CApplicationLaunchShortcut.ChooseConfigToRun=Choose a configuration to run
|
||||
CApplicationLaunchShortcut.CLocalApplication=C Local Application
|
||||
CApplicationLaunchShortcut.ChooseLocalAppToDebug=Choose a local application to debug
|
||||
CApplicationLaunchShortcut.ChooseLocalAppToRun=Choose a local application to run
|
||||
CApplicationLaunchShortcut.Launch_failed_no_binaries=Launch failed no binaries
|
||||
CApplicationLaunchShortcut.LaunchFailed=Launch failed
|
||||
CApplicationLaunchShortcut.LaunchDebugConfigSelection=Launch Debug Configuration Selection
|
||||
CApplicationLaunchShortcut.LaunchConfigSelection=Launch Configuration Selection
|
||||
CApplicationLaunchShortcut.Invalid_launch_mode_1=Invalid launch mode
|
||||
CApplicationLaunchShortcut.Invalid_launch_mode_2=Invalid launch mode.
|
||||
CApplicationLaunchShortcut.Invalid_launch_mode_3=Invalid launch mode.
|
||||
CApplicationLaunchShortcut.ChooseLaunchConfigToDebug=Choose a launch configuration to debug
|
||||
CApplicationLaunchShortcut.ChooseLaunchConfigToRun=Choose a launch configuration to run
|
||||
CApplicationLaunchShortcut.Launch_failed_no_project_selected=Launch failed no project selected
|
||||
|
||||
AbstractCDebuggerTab.No_debugger_available=No debugger available
|
||||
AbstractCDebuggerTab.Debugger=Debugger
|
||||
AbstractCDebuggerTab.ErrorLoadingDebuggerPage=Error Loading Debugger UI Component.
|
||||
|
||||
LaunchUIPlugin.Error=Error
|
||||
|
||||
CMainTab.Project_required=Project required
|
||||
CMainTab.Enter_project_before_searching_for_program=Project must first be entered before searching for a program
|
||||
CMainTab.Program_Selection=Program Selection
|
||||
CMainTab.Enter_project_before_browsing_for_program=Project must first be entered before browsing for a program
|
||||
CMainTab.Program_selection=Program selection
|
||||
CMainTab.Selection_must_be_file=Selection must be a file
|
||||
CMainTab.Selection_must_be_binary_file=Selection must be a binary file
|
||||
CMainTab.Project_Selection=Project Selection
|
||||
CMainTab.Choose_project_to_constrain_search_for_program=Choose a &project to constrain the search for a program
|
||||
CMainTab.Project_not_specified=Project not specified
|
||||
CMainTab.Program_not_specified=Program not specified
|
||||
CMainTab.Project_must_be_opened=Project must be opened
|
||||
CMainTab.Program_does_not_exist=Program does not exist
|
||||
CMainTab.Main=Main
|
||||
CMainTab.&ProjectColon=&Project:
|
||||
CMainTab.C/C++_Application=C/C++ Application:
|
||||
CMainTab.Search...=Searc&h Project...
|
||||
CMainTab.Choose_program_to_run=Choose a &program to run:
|
||||
CMainTab.Choose_program_to_run_from_NAME=Choose a program to run from {0}:
|
||||
CMainTab.UseTerminal=Connect process input & output to a terminal.
|
||||
CMainTab.Program_is_not_a_recongnized_executable=Program is not a recognized executable.
|
||||
|
||||
CDebuggerTab.Advanced_Options_Dialog_Title=Advanced Options
|
||||
CDebuggerTab.Stop_at_main_on_startup=Stop on startup at:
|
||||
CDebuggerTab.Automatically_track_values_of=Automatically track the values of
|
||||
CDebuggerTab.Stop_on_startup_at_can_not_be_empty=The "Stop on startup at" field can not be empty.
|
||||
CDebuggerTab.Debugger_Options=Debugger Options
|
||||
CDebuggerTab.Mode_not_supported=Mode ''{0}'' is not supported by selected debugger
|
||||
CDebuggerTab.Advanced=Advanced...
|
||||
CDebuggerTab.Variables=Variables
|
||||
CDebuggerTab.Registers=Registers
|
||||
CDebuggerTab.No_debugger_available=No debugger available
|
||||
CDebuggerTab.CPU_is_not_supported=The CPU is not supported by selected debugger.
|
||||
CDebuggerTab.Platform_is_not_supported=The project platform is not supported by the selected debugger.
|
||||
|
||||
CoreFileDebuggerTab.No_debugger_available=No debugger available
|
||||
CoreFileDebuggerTab.platform_is_not_supported=The project platform is not supported by the selected debugger.
|
||||
|
||||
CEnvironmentTab.Edit_Variable=Edit Variable
|
||||
CEnvironmentTab.New_Variable=New Variable
|
||||
CEnvironmentTab.NameColon=Name:
|
||||
CEnvironmentTab.ValueColon=Value:
|
||||
CEnvironmentTab.Name=Name
|
||||
CEnvironmentTab.Value=Value
|
||||
CEnvironmentTab.New...=New...
|
||||
CEnvironmentTab.Import...=Import...
|
||||
CEnvironmentTab.Edit...=Edit...
|
||||
CEnvironmentTab.Remove=Remove
|
||||
CEnvironmentTab.Environment=Environment
|
||||
CEnvironmentTab.Existing_Environment_Variable=Existing Environment Variable
|
||||
CEnvironmentTab.Environment_variable_NAME_exists=Environment variable \" {0} \" exists.\nDo you want to overwrite?
|
||||
|
||||
CArgumentsTab.C/C++_Program_Arguments=Program arguments:
|
||||
CArgumentsTab.Arguments=Arguments
|
||||
CArgumentsTab.Variables=Variables...
|
||||
|
||||
WorkingDirectoryBlock.4=Select a &workspace relative working directory:
|
||||
WorkingDirectoryBlock.7=Select a working directory for the launch configuration:
|
||||
WorkingDirectoryBlock.0=W&orkspace...
|
||||
WorkingDirectoryBlock.Working_Directory_8=Working Directory
|
||||
WorkingDirectoryBlock.Working_directory=Working directory:
|
||||
WorkingDirectoryBlock.10=Working directory does not exist
|
||||
WorkingDirectoryBlock.Use_default=Use de&fault
|
||||
WorkingDirectoryBlock.17=Variabl&es...
|
||||
WorkingDirectoryBlock.1=File S&ystem...
|
||||
WorkingDirectoryBlock.Exception_occurred_reading_configuration___15=Exception occurred reading configuration:
|
||||
|
||||
Launch.common.Exception_occurred_reading_configuration_EXCEPTION=Exception occurred reading configuration {0}
|
||||
Launch.common.DebuggerColon=Debugger:
|
||||
Launch.common.BinariesColon=Binaries:
|
||||
Launch.common.QualifierColon=Qualifier:
|
||||
Launch.common.Browse_1=&Browse...
|
||||
Launch.common.Browse_2=B&rowse...
|
||||
Launch.common.Project_does_not_exist=Project does not exist
|
||||
LocalCDILaunchDelegate.0=Launching Local C/C++ Application
|
||||
LocalCDILaunchDelegate.1=Launching debugger session
|
||||
LocalCDILaunchDelegate.2=Debugging local C/C++ application
|
||||
LocalCDILaunchDelegate.3=Attaching to Local C/C++ Application
|
||||
LocalCDILaunchDelegate.4=No Process ID selected.
|
||||
LocalCDILaunchDelegate.5=Launching postmortem debugger session
|
||||
LocalCDILaunchDelegate.6=No core file selected
|
||||
LocalCDILaunchDelegate.7=Core file does not exist or is not readable.
|
||||
LocalCDILaunchDelegate.8=Error starting process.
|
||||
LocalCDILaunchDelegate.9=Eclipse runtime does not support working directory.
|
||||
LocalCDILaunchDelegate.10=Failed to set program arguments, environment or working directory.
|
Loading…
Add table
Reference in a new issue