Initial support for external debugging based on Stefan Urbanek's code.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/apps/projectcenter/trunk@17463 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Philippe C.D. Robert 2003-08-10 12:38:35 +00:00
parent 41c72d7a22
commit 78ecb14e67
7 changed files with 143 additions and 4 deletions

View file

@ -1,4 +1,10 @@
2003-08-09 Philippe C.D. Robert <probert@siggraph.org>
* Support for an external debugger: PCLib/PCDefines.h,
PCAppController.m, PCPrefController.m, PCPrefController+UInterface.m,
PCPrefController.h, PCLib/PCProjectDebugger.m
2003-08-03 Philippe C.D. Robert <probert@siggraph.org>
* Fixed typo: PCLib/PCProject+ComponentHandling.m, PCMenuController.m

View file

@ -61,6 +61,7 @@
[defaults setObject:@"/usr/bin/gcc" forKey:Compiler];
[defaults setObject:@"YES" forKey:ExternalEditor];
[defaults setObject:@"YES" forKey:ExternalDebugger];
[defaults setObject:[NSString stringWithFormat:@"%@/ProjectCenterBuildDir",NSTemporaryDirectory()] forKey:RootBuildDirectory];

View file

@ -29,6 +29,7 @@
#define SuccessSound @"SuccessSound"
#define FailureSound @"FailureSound"
#define ExternalEditor @"ExternalEditor"
#define ExternalDebugger @"ExternalDebugger"
#define TabBehaviour @"TabBehaviour"
#define SeparateBuilder @"SeparateBuilder"
#define SeparateLauncher @"SeparateLauncher"

View file

@ -42,6 +42,15 @@ enum {
DEBUG_DEBUG_TARGET = 2
};
@protocol Terminal
- (BOOL)terminalRunProgram:(NSString *)path
withArguments:(NSArray *)args
inDirectory:(NSString *)directory
properties:(NSDictionary *)properties;
@end
@implementation PCProjectDebugger
- (id)initWithProject:(PCProject *)aProject
@ -129,9 +138,96 @@ enum {
- (void)debug:(id)sender
{
NSRunAlertPanel(@"Attention!",
@"Integrated debugging is not yet available...",
@"OK",nil,nil);
if ([[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]
objectForKey:ExternalDebugger] isEqualToString: @"YES"])
{
NSString *dp = [currentProject projectName];
NSString *fp = nil;
NSString *pn = nil;
NSString *gdbPath;
NSArray *args;
NSTask *task;
NSDistantObject <Terminal>*terminal;
/* Get the Terminal application */
terminal = (NSDistantObject<Terminal> *)[NSConnection rootProxyForConnectionWithRegisteredName:@"Terminal" host:nil];
/* Prepare tasks */
switch( debugTarget )
{
case DEBUG_DEFAULT_TARGET:
pn = [dp stringByAppendingPathExtension:@"app"];
break;
case DEBUG_DEBUG_TARGET:
pn = [dp stringByAppendingPathExtension:@"debug"];
break;
default:
[NSException raise:@"PCInternalDevException"
format:@"Unknown build target!"];
break;
}
if( terminal == nil )
{
NSRunAlertPanel(@"Attention!", @"Terminal.app is not running! Please\nlaunch it before debugging %@", @"Abort",nil,nil,pn);
[debugButton setState:NSOffState];
return;
}
fp = [[NSFileManager defaultManager] currentDirectoryPath];
dp = [fp stringByAppendingPathComponent:dp];
fp = [dp stringByAppendingPathComponent:pn];
task = [[NSTask alloc] init];
[task setLaunchPath:fp];
fp = [task validatedLaunchPath];
RELEASE(task);
if( fp == nil )
{
NSRunAlertPanel(@"Attention!", @"No executable found in %@!", @"Abort",nil,nil,dp);
[debugButton setState:NSOffState];
return;
}
task = [[NSTask alloc] init];
dp = [[NSUserDefaults standardUserDefaults] objectForKey:PDebugger];
if(dp == nil)
{
dp = [NSString stringWithString:@"/usr/bin/gdb"];
}
if([[NSFileManager defaultManager] isExecutableFileAtPath:dp] == NO)
{
NSRunAlertPanel(@"Attention!", @"Invalid debugger specified: %@!", @"Abort",nil,nil,dp);
RELEASE(task);
[debugButton setState:NSOffState];
return;
}
[task setLaunchPath:dp];
gdbPath = [task validatedLaunchPath];
RELEASE(task);
args = [NSArray arrayWithObjects:
gdbPath,
@"--args",
AUTORELEASE(fp),
nil];
[terminal terminalRunProgram: AUTORELEASE(gdbPath)
withArguments: args
inDirectory: nil
properties: nil];
}
else
{
NSRunAlertPanel(@"Attention!",
@"Integrated debugging is not yet available...",
@"OK",nil,nil);
}
[debugButton setState:NSOffState];
}
- (void)run:(id)sender

View file

@ -410,7 +410,7 @@
RELEASE(separateEditor);
// Some buttons
v = [[NSBox alloc] initWithFrame: NSMakeRect(5,121,254,77)];
v = [[NSBox alloc] initWithFrame: NSMakeRect(5,100,254,98)];
[v setTitle: @"Misc"];
[prefInterfaceView addSubview: v];
RELEASE(v);
@ -438,6 +438,18 @@
[v addSubview: useExternalEditor];
[useExternalEditor sizeToFit];
RELEASE(useExternalEditor);
useExternalDebugger=[[NSButton alloc] initWithFrame:NSMakeRect(48,49,204,21)];
[useExternalDebugger setTitle: @"Use external Debugger"];
[useExternalDebugger setButtonType: NSSwitchButton];
[useExternalDebugger setBordered: NO];
[useExternalDebugger setRefusesFirstResponder: YES];
[useExternalDebugger setTarget: self];
[useExternalDebugger setAction: @selector(setUseExternalDebugger:)];
[useExternalDebugger setContinuous: NO];
[v addSubview: useExternalDebugger];
[useExternalDebugger sizeToFit];
RELEASE(useExternalDebugger);
}
@end

View file

@ -52,6 +52,7 @@
id saveOnQuit;
id useExternalEditor;
id useExternalDebugger;
id promptWhenQuit;
id promptOnClean;
@ -83,6 +84,7 @@
- (void)setSaveOnQuit:(id)sender;
- (void)setUseExternalEditor:(id)sender;
- (void)setUseExternalDebugger:(id)sender;
- (void)setEditor:(id)sender;
- (void)setCompiler:(id)sender;

View file

@ -163,6 +163,9 @@ NSString *SavePeriodDidChangeNotification = @"SavePeriodDidChangeNotification";
[useExternalEditor setState:
([[preferencesDict objectForKey: ExternalEditor]
isEqualToString:@"YES"]) ? NSOnState : NSOffState];
[useExternalDebugger setState:
([[preferencesDict objectForKey: ExternalDebugger]
isEqualToString:@"YES"]) ? NSOnState : NSOffState];
if (![prefWindow isVisible])
@ -328,6 +331,24 @@ NSString *SavePeriodDidChangeNotification = @"SavePeriodDidChangeNotification";
forKey:ExternalEditor];
}
- (void)setUseExternalDebugger:(id)sender
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
switch ([[sender selectedCell] state]) {
case 0:
[def setObject:@"NO" forKey:ExternalDebugger];
break;
case 1:
[def setObject:@"YES" forKey:ExternalDebugger];
break;
}
[def synchronize];
[preferencesDict setObject:[def objectForKey:ExternalDebugger]
forKey:ExternalDebugger];
}
- (void)setEditor:(id)sender
{
NSString *path = [editorField stringValue];