diff --git a/ChangeLog b/ChangeLog index 15e3c7b..2d730b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,10 @@ +2003-08-09 Philippe C.D. Robert + + * 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 * Fixed typo: PCLib/PCProject+ComponentHandling.m, PCMenuController.m diff --git a/PCAppController.m b/PCAppController.m index 2825581..305215a 100644 --- a/PCAppController.m +++ b/PCAppController.m @@ -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]; diff --git a/PCLib/PCDefines.h b/PCLib/PCDefines.h index f8b4354..5a33056 100644 --- a/PCLib/PCDefines.h +++ b/PCLib/PCDefines.h @@ -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" diff --git a/PCLib/PCProjectDebugger.m b/PCLib/PCProjectDebugger.m index cabfe65..759d371 100644 --- a/PCLib/PCProjectDebugger.m +++ b/PCLib/PCProjectDebugger.m @@ -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; + + /* Get the Terminal application */ + terminal = (NSDistantObject *)[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 diff --git a/PCPrefController+UInterface.m b/PCPrefController+UInterface.m index bfa7761..85b7117 100644 --- a/PCPrefController+UInterface.m +++ b/PCPrefController+UInterface.m @@ -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 diff --git a/PCPrefController.h b/PCPrefController.h index e7ad3de..5f6d643 100644 --- a/PCPrefController.h +++ b/PCPrefController.h @@ -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; diff --git a/PCPrefController.m b/PCPrefController.m index fafe7e1..ede79f5 100644 --- a/PCPrefController.m +++ b/PCPrefController.m @@ -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];