[44888] users/toby/objcports

toby at macports.org toby at macports.org
Sun Jan 4 06:16:23 PST 2009


Revision: 44888
          http://trac.macports.org/changeset/44888
Author:   toby at macports.org
Date:     2009-01-04 06:16:22 -0800 (Sun, 04 Jan 2009)
Log Message:
-----------
etc

Modified Paths:
--------------
    users/toby/objcports/MPParser.h
    users/toby/objcports/MPParser.m
    users/toby/objcports/MPPort.h
    users/toby/objcports/MPPort.m

Modified: users/toby/objcports/MPParser.h
===================================================================
--- users/toby/objcports/MPParser.h	2009-01-04 13:52:30 UTC (rev 44887)
+++ users/toby/objcports/MPParser.h	2009-01-04 14:16:22 UTC (rev 44888)
@@ -2,6 +2,7 @@
 
 @interface MPParser : NSObject
 {
+	MPPort *_port;
 	Tcl_Interp *_interp;
 
 	// set before parsing (list obtained elsewhere...)

Modified: users/toby/objcports/MPParser.m
===================================================================
--- users/toby/objcports/MPParser.m	2009-01-04 13:52:30 UTC (rev 44887)
+++ users/toby/objcports/MPParser.m	2009-01-04 14:16:22 UTC (rev 44888)
@@ -6,6 +6,8 @@
 #include "MPArrayAdditions.h"
 #include "MPStringAdditions.h"
 
+static int _target(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
+static int _option(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
 static int _unknown(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
 static char *_default(ClientData clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags);
 static void info(Tcl_Interp *interp, const char *command); // debugging
@@ -15,24 +17,29 @@
 - (id)initWithPort:(MPPort *)port
 {
 	self = [super init];
+	_port = [port retain];
 	_interp = Tcl_CreateInterp();
 	_variants = [[NSMutableDictionary alloc] initWithCapacity:0];
 	_platforms = [[NSMutableArray alloc] initWithCapacity:0];
 
 	// XXX: should probably remove even more functionality
-	//Tcl_MakeSafe(_interp);
+	Tcl_MakeSafe(_interp);
 
 	@try {
 		Tcl_Preserve(_interp);
 
-		/* Handle defaults (ask parent port instance). */
-		for (NSString *def in [port defaults]) {
+		/* Handle defaults. Ports shouldn't expect any other variables to be set,
+		 * so we can just set them as we go. */
+		for (NSString *def in [_port defaults]) {
 			Tcl_TraceVar(_interp, [def UTF8String], TCL_TRACE_READS, _default, port);
 		}
 
+		/* Handle *all* commands via the "unknown" mechanism. */
 		Tcl_CreateObjCommand(_interp, "unknown", _unknown, self, NULL);
-		if (Tcl_EvalFile(_interp, [[port portfile] UTF8String]) != TCL_OK) {
-			NSLog(@"Tcl_EvalFile(%@): %s", [port portfile], Tcl_GetStringResult(_interp));
+
+		NSString *portfile = [_port portfile];
+		if (Tcl_EvalFile(_interp, [portfile UTF8String]) != TCL_OK) {
+			NSLog(@"Tcl_EvalFile(%@): %s", portfile, Tcl_GetStringResult(_interp));
 		}
 
 		Tcl_Release(_interp);
@@ -45,7 +52,7 @@
 	@finally {
 		info(_interp, "[info globals]");
 		info(_interp, "[info commands]");
-		NSLog(@"%@", _variants);
+		//NSLog(@"%@", _variants);
 	}
 
 	return self;
@@ -56,6 +63,7 @@
 	[_variants release];
 	[_platforms release];
 	Tcl_DeleteInterp(_interp);
+	[_port release];
 	[super dealloc];
 }
 
@@ -112,7 +120,6 @@
 		[_platforms addObject:platformFull];
 		// XXX: check match, right now pretend all platforms are true
 		if (YES) {
-			NSLog(@"+%@", platformFull);
 			Tcl_Eval(_interp, [[args lastObject] UTF8String]);
 		}
 	} else if ([command isEqualToString:@"variant"]) {
@@ -139,11 +146,10 @@
 
 		// XXX: make sure it's set, like platforms just pretend
 		if (YES) {
-			NSLog(@"+%@", name);
 			Tcl_Eval(_interp, [[args lastObject] UTF8String]);
 		}
-	//} else if ([_targets containsObject:command]) {
-		// XXX: right now we just treat target-related things like options
+	} else if ([_port isTarget:command]) {
+		// XXX: store for later use...
 	} else {
 		NSString *option;
 		enum { OPTION_SET, OPTION_APPEND, OPTION_DELETE } action;
@@ -158,56 +164,76 @@
 			action = OPTION_SET;
 		}
 
-		//if ([_options containsObject:option]) {
-			// XXX: also need to ignore if overriden on command line
-			switch (action) {
-			case OPTION_SET:
-				Tcl_SetVar(_interp, [option UTF8String], [[args componentsJoinedByString:@" "] UTF8String], 0);
-				break;
-			case OPTION_APPEND: {
-				Tcl_Obj *val = Tcl_GetVar2Ex(_interp, [option UTF8String], NULL, 0);
-				int length;
-				if (val == NULL) {
-					val = Tcl_NewListObj(0, NULL);
-					Tcl_SetVar2Ex(_interp, [option UTF8String], NULL, val, 0);
-				}
-				Tcl_ListObjLength(_interp, val, &length);
-				for (NSString *arg in args) {
-					Tcl_Obj *str = Tcl_NewStringObj([arg UTF8String], -1);
-					Tcl_ListObjReplace(_interp, val, length++, 0, 1, &str);
-				}
-				break;
+		if (![[_port options] containsObject:option]) {
+			NSLog(@"? %@", option);
+		}
+
+		// XXX: also need to skip if overridden on command line
+		switch (action) {
+		case OPTION_SET:
+			Tcl_SetVar(_interp, [option UTF8String], [[args componentsJoinedByString:@" "] UTF8String], 0);
+			break;
+		case OPTION_APPEND: {
+			Tcl_Obj *val = Tcl_GetVar2Ex(_interp, [option UTF8String], NULL, 0);
+			int length;
+			if (val == NULL) {
+				val = Tcl_NewListObj(0, NULL);
+				Tcl_SetVar2Ex(_interp, [option UTF8String], NULL, val, 0);
 			}
-			case OPTION_DELETE: {
-				Tcl_Obj *val = Tcl_GetVar2Ex(_interp, [option UTF8String], NULL, 0);
-				int objc;
-				Tcl_Obj **objv;
-				for (NSString *arg in args) {
-					int i;
-					Tcl_ListObjGetElements(_interp, val, &objc, &objv);
-					for (i = 0; i < objc; i++) {
-						if ([arg isEqualToString:[NSString stringWithTclObject:objv[i]]]) {
-							Tcl_ListObjReplace(_interp, val, i, 1, 0, NULL);
-							break; // just want to delete one occurrence
-						}
+			Tcl_ListObjLength(_interp, val, &length);
+			for (NSString *arg in args) {
+				Tcl_Obj *str = Tcl_NewStringObj([arg UTF8String], -1);
+				Tcl_ListObjReplace(_interp, val, length++, 0, 1, &str);
+			}
+			break;
+		}
+		case OPTION_DELETE: {
+			Tcl_Obj *val = Tcl_GetVar2Ex(_interp, [option UTF8String], NULL, 0);
+			int objc;
+			Tcl_Obj **objv;
+			for (NSString *arg in args) {
+				int i;
+				Tcl_ListObjGetElements(_interp, val, &objc, &objv);
+				for (i = 0; i < objc; i++) {
+					if ([arg isEqualToString:[NSString stringWithTclObject:objv[i]]]) {
+						Tcl_ListObjReplace(_interp, val, i, 1, 0, NULL);
+						break; // just want to delete one occurrence
 					}
 				}
-				// XXX: unset if empty
-				break;
 			}
-			default:
-				abort();
-				break;
-			}
-		//} else {
-		//	NSLog(@"unknown option %@", option);
-		//}
+			// XXX: unset if empty
+			break;
+		}
+		default:
+			abort();
+			break;
+		}
 	}
 }
 
 @end
 
 static int
+_target(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
+{
+	NSArray *args = [[NSArray alloc] initWithTclObjects:objv count:objc];
+	NSLog(@"_target %@", args);
+	[args release];
+
+	return TCL_OK;
+}
+
+static int
+_option(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
+{
+	NSArray *args = [[NSArray alloc] initWithTclObjects:objv count:objc];
+	NSLog(@"_option %@", args);
+	[args release];
+
+	return TCL_OK;
+}
+
+static int
 _unknown(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
 {
 	assert(objc >= 2);

Modified: users/toby/objcports/MPPort.h
===================================================================
--- users/toby/objcports/MPPort.h	2009-01-04 13:52:30 UTC (rev 44887)
+++ users/toby/objcports/MPPort.h	2009-01-04 14:16:22 UTC (rev 44888)
@@ -4,15 +4,26 @@
 {
 	NSString *_portfile;
 	MPParser *_parser;
+
+	NSMutableArray *_targets;
+
+	NSMutableArray *_options;
+	NSMutableArray *_defaults;
 }
 
 - (id)initWithPortfile:(NSString *)port options:(NSDictionary *)options;
 
 - (NSString *)portfile;
 
+- (NSArray *)targets;
+- (BOOL)isTarget:(NSString *)target;
+
 - (NSArray *)defaults;
 - (NSString *)default:(NSString *)def;
 
+- (NSArray *)options;
+
+// Access to underlying parser...
 - (NSString *)option:(NSString *)option;
 - (NSArray *)variants;
 - (NSArray *)platforms;

Modified: users/toby/objcports/MPPort.m
===================================================================
--- users/toby/objcports/MPPort.m	2009-01-04 13:52:30 UTC (rev 44887)
+++ users/toby/objcports/MPPort.m	2009-01-04 14:16:22 UTC (rev 44888)
@@ -4,13 +4,49 @@
 #include "MPPort.h"
 #include "MPParser.h"
 
+ at interface MPPort (priv)
+- (void)addCommand:(NSString *)command;
+ at end
+
 @implementation MPPort
 
 - (id)initWithPortfile:(NSString *)portfile options:(NSDictionary *)options
 {
 	self = [super init];
 	_portfile = [portfile retain];
+
+	_targets = [[NSMutableArray alloc] initWithCapacity:0];
+	[_targets addObject:@"configure"];
+	[_targets addObject:@"build"];
+	[_targets addObject:@"destroot"];
+
+	_options = [[NSMutableArray alloc] initWithCapacity:0];
+	[self addCommand:@"configure"];
+	[_options addObject:@"name"];
+	[_options addObject:@"version"];
+	[_options addObject:@"categories"];
+	[_options addObject:@"maintainers"];
+	[_options addObject:@"homepage"];
+	[_options addObject:@"platforms"];
+	[_options addObject:@"use_bzip2"];
+	[_options addObject:@"use_parallel_build"];
+	[_options addObject:@"description"];
+	[_options addObject:@"long_description"];
+	[_options addObject:@"master_sites"];
+	[_options addObject:@"checksums"];
+	[_options addObject:@"depends_build"];
+	[_options addObject:@"depends_lib"];
+
+	[_options addObject:@"test.run"];
+	[_options addObject:@"test.target"];
+
+	[_options addObject:@"livecheck.check"];
+
+	_defaults = [[NSMutableArray alloc] initWithCapacity:0];
+	[_defaults addObject:@"prefix"];
+
 	_parser = [[MPParser alloc] initWithPort:self];
+
 	return self;
 }
 
@@ -18,6 +54,11 @@
 {
 	[_parser release];
 	[_portfile release];
+
+	[_targets release];
+	[_options release];
+	[_defaults release];
+
 	[super dealloc];
 }
 
@@ -26,23 +67,56 @@
 	return _portfile;
 }
 
+- (NSArray *)targets
+{
+	return _targets;
+}
+
+- (BOOL)isTarget:(NSString *)target
+{
+	if ([target hasPrefix:@"pre-"]) {
+		target = [target substringWithRange:NSMakeRange(4, [target length] - 4)];
+	} else if ([target hasPrefix:@"post-"]) {
+		target = [target substringWithRange:NSMakeRange(5, [target length] - 5)];
+	}
+
+	return [_targets containsObject:target];
+}
+
 - (NSArray *)defaults
 {
-	return [NSArray arrayWithObjects:@"prefix", @"worksrcpath", nil];
+	return _defaults;
 }
 
 - (NSString *)default:(NSString *)def
 {
 	// XXX: selector (NSInvocation?) or constant NSString...
-	NSLog(@"default: '%@'", def);
 	return def;
 }
 
+- (NSArray *)options
+{
+	return _options;
+}
+
 - (NSString *)option:(NSString *)option
 {
 	return [_parser option:option];
 }
 
+// essentially 'commands' from portutil.tcl
+- (void)addCommand:(NSString *)command
+{
+	[_options addObject:[NSString stringWithFormat:@"use_%@", command]];
+	[_options addObject:[NSString stringWithFormat:@"%@.dir", command]];
+	[_options addObject:[NSString stringWithFormat:@"%@.pre_args", command]];
+	[_options addObject:[NSString stringWithFormat:@"%@.args", command]];
+	[_options addObject:[NSString stringWithFormat:@"%@.post_args", command]];
+	[_options addObject:[NSString stringWithFormat:@"%@.env", command]];
+	[_options addObject:[NSString stringWithFormat:@"%@.type", command]];
+	[_options addObject:[NSString stringWithFormat:@"%@.cmd", command]];
+}
+
 - (NSArray *)variants
 {
 	return [_parser variants];
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20090104/7a07aca9/attachment-0001.html>


More information about the macports-changes mailing list