[48437] users/toby/objcports

toby at macports.org toby at macports.org
Sat Mar 21 19:22:24 PDT 2009


Revision: 48437
          http://trac.macports.org/changeset/48437
Author:   toby at macports.org
Date:     2009-03-21 19:22:19 -0700 (Sat, 21 Mar 2009)
Log Message:
-----------
rework option handling (mostly store in the MPPort instance, Tcl now knows only what's necessary)

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

Modified: users/toby/objcports/MPParser.m
===================================================================
--- users/toby/objcports/MPParser.m	2009-03-22 00:27:31 UTC (rev 48436)
+++ users/toby/objcports/MPParser.m	2009-03-22 02:22:19 UTC (rev 48437)
@@ -8,7 +8,7 @@
 
 static int _nslog(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 char *_variable(ClientData clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags);
 static void info(Tcl_Interp *interp, const char *command); // debugging
 
 @implementation MPParser
@@ -27,10 +27,8 @@
 	@try {
 		Tcl_Preserve(_interp);
 
-		/* 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);
+		for (NSString *var in [_port variables]) {
+			Tcl_TraceVar(_interp, [var UTF8String], TCL_TRACE_READS, _variable, port);
 		}
 
 		Tcl_CreateObjCommand(_interp, "nslog", _nslog, NULL, NULL);
@@ -154,63 +152,13 @@
 	} else if ([_port isTarget:command]) {
 		// XXX: store for later use...
 	} else {
-		NSString *option;
-		enum { OPTION_SET, OPTION_APPEND, OPTION_DELETE } action;
 		if ([command hasSuffix:@"-append"]) {
-			option = [command substringWithRange:NSMakeRange(0, [command length] - 7)];
-			action = OPTION_APPEND;
+			[_port option:[command substringWithRange:NSMakeRange(0, [command length] - 7)] append:args];
 		} else if ([command hasSuffix:@"-delete"]) {
-			option = [command substringWithRange:NSMakeRange(0, [command length] - 7)];
-			action = OPTION_DELETE;
+			[_port option:[command substringWithRange:NSMakeRange(0, [command length] - 7)] delete:args];
 		} else {
-			option = command;
-			action = OPTION_SET;
+			[_port option:command set:args];
 		}
-
-		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);
-			}
-			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;
-		}
 	}
 }
 
@@ -239,11 +187,9 @@
 }
 
 static char *
-_default(ClientData clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags)
+_variable(ClientData clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags)
 {
-	assert(flags == TCL_TRACE_READS);
-	/* Default values may contain references to other Tcl variables (or tcl command calls?), so perform the substitution. */
-	Tcl_SetVar2Ex(interp, name1, name2, Tcl_SubstObj(interp, Tcl_NewStringObj([[(id)clientData default:[NSString stringWithUTF8String:name1]] UTF8String], -1), TCL_SUBST_ALL), 0);
+	Tcl_SetVar2Ex(interp, name1, name2, Tcl_SubstObj(interp, Tcl_NewStringObj([[(id)clientData variable:[NSString stringWithUTF8String:name1]] UTF8String], -1), TCL_SUBST_ALL), 0);
 	return NULL;
 }
 

Modified: users/toby/objcports/MPPort.h
===================================================================
--- users/toby/objcports/MPPort.h	2009-03-22 00:27:31 UTC (rev 48436)
+++ users/toby/objcports/MPPort.h	2009-03-22 02:22:19 UTC (rev 48437)
@@ -9,8 +9,10 @@
 
 	NSMutableArray *_targets;
 
-	NSMutableArray *_options;
-	NSMutableDictionary *_defaults;
+	NSMutableArray *_commands;
+
+	NSMutableDictionary *_options;
+	NSMutableDictionary *_constants;
 }
 
 - (id)initWithPortfile:(NSString *)port options:(NSDictionary *)options;
@@ -19,16 +21,16 @@
 
 - (NSArray *)procs;
 
-- (NSArray *)targets;
 - (BOOL)isTarget:(NSString *)target;
 
-- (NSArray *)defaults;
-- (NSString *)default:(NSString *)def;
+- (NSArray *)variables;
+- (NSString *)variable:(NSString *)name;
 
-- (NSArray *)options;
+- (void)option:(NSString *)option set:(NSArray *)value;
+- (void)option:(NSString *)option append:(NSArray *)value;
+- (void)option:(NSString *)option delete:(NSArray *)value;
 
 // Access to underlying parser...
-- (NSString *)option:(NSString *)option;
 - (NSArray *)variants;
 - (NSArray *)platforms;
 

Modified: users/toby/objcports/MPPort.m
===================================================================
--- users/toby/objcports/MPPort.m	2009-03-22 00:27:31 UTC (rev 48436)
+++ users/toby/objcports/MPPort.m	2009-03-22 02:22:19 UTC (rev 48437)
@@ -4,10 +4,6 @@
 #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
@@ -27,169 +23,125 @@
 	[_targets addObject:@"build"];
 	[_targets addObject:@"destroot"];
 
-	[self addCommand:@"cvs"]; // portfetch.tcl
-	[self addCommand:@"svn"]; // portfetch.tcl
-	[self addCommand:@"extract"]; // portextract.tcl
-	[self addCommand:@"patch"]; // portpatch.tcl
-	[self addCommand:@"configure"]; // portconfigure.tcl
-	[self addCommand:@"autoreconf"]; // portconfigure.tcl
-	[self addCommand:@"automake"]; // portconfigure.tcl
-	[self addCommand:@"autoconf"]; // portconfigure.tcl
-	[self addCommand:@"xmkmf"]; // portconfigure.tcl
-	[self addCommand:@"build"]; // portbuild.tcl
-	[self addCommand:@"parallel_build"]; // portbuild.tcl
-	[self addCommand:@"test"]; // porttest.tcl
-	[self addCommand:@"destroot"]; // portdestroot.tcl
+	_commands = [[NSMutableArray alloc] initWithCapacity:0];
+	[_commands addObject:@"cvs"]; // portfetch.tcl
+	[_commands addObject:@"svn"]; // portfetch.tcl
+	[_commands addObject:@"extract"]; // portextract.tcl
+	[_commands addObject:@"patch"]; // portpatch.tcl
+	[_commands addObject:@"configure"]; // portconfigure.tcl
+	[_commands addObject:@"autoreconf"]; // portconfigure.tcl
+	[_commands addObject:@"automake"]; // portconfigure.tcl
+	[_commands addObject:@"autoconf"]; // portconfigure.tcl
+	[_commands addObject:@"xmkmf"]; // portconfigure.tcl
+	[_commands addObject:@"build"]; // portbuild.tcl
+	[_commands addObject:@"parallel_build"]; // portbuild.tcl
+	[_commands addObject:@"test"]; // porttest.tcl
+	[_commands addObject:@"destroot"]; // portdestroot.tcl
 
-	_options = [[NSMutableArray alloc] initWithCapacity:0];
-	[_options addObject:@"prefix"]; // portmain.tcl
-	[_options addObject:@"name"]; // portmain.tcl
-	[_options addObject:@"version"]; // portmain.tcl
-	[_options addObject:@"revision"]; // portmain.tcl
-	[_options addObject:@"epoch"]; // portmain.tcl
-	[_options addObject:@"categories"]; // portmain.tcl
-	[_options addObject:@"maintainers"]; // portmain.tcl
-	[_options addObject:@"long_description"]; // portmain.tcl
-	[_options addObject:@"description"]; // portmain.tcl
-	[_options addObject:@"homepage"]; // portmain.tcl
-	[_options addObject:@"worksrcdir"]; // portmain.tcl
-	[_options addObject:@"filesdir"]; // portmain.tcl
-	[_options addObject:@"distname"]; // portmain.tcl
-	[_options addObject:@"portdbpath"]; // portmain.tcl
-	[_options addObject:@"libpath"]; // portmain.tcl
-	[_options addObject:@"distpath"]; // portmain.tcl
-	[_options addObject:@"sources_conf"]; // portmain.tcl
-	[_options addObject:@"os.platform"]; // portmain.tcl
-	[_options addObject:@"os.version"]; // portmain.tcl
-	[_options addObject:@"os.major"]; // portmain.tcl
-	[_options addObject:@"os.arch"]; // portmain.tcl
-	[_options addObject:@"os.endian"]; // portmain.tcl
-	[_options addObject:@"platforms"]; // portmain.tcl
-	[_options addObject:@"default_variants"]; // portmain.tcl
-	[_options addObject:@"install.user"]; // portmain.tcl
-	[_options addObject:@"install.group"]; // portmain.tcl
-	[_options addObject:@"macosx_deployment_target"]; // portmain.tcl
-	[_options addObject:@"universal_variant"]; // portmain.tcl
-	[_options addObject:@"os.universal_supported"]; // portmain.tcl
-	
-	[_options addObject:@"master_sites"]; // portfetch.tcl
-	[_options addObject:@"patch_sites"]; // portfetch.tcl
-	[_options addObject:@"extract.suffix"]; // portfetch.tcl
-	[_options addObject:@"distfiles"]; // portfetch.tcl
-	[_options addObject:@"patchfiles"]; // portfetch.tcl
-	[_options addObject:@"use_zip"]; // portfetch.tcl
-	[_options addObject:@"use_bzip2"]; // portfetch.tcl
-	[_options addObject:@"use_lzma"]; // portfetch.tcl
-	[_options addObject:@"use_dmg"]; // portfetch.tcl
-	[_options addObject:@"dist_subdir"]; // portfetch.tcl
-	[_options addObject:@"fetch.type"]; // portfetch.tcl
-	[_options addObject:@"fetch.user"]; // portfetch.tcl
-	[_options addObject:@"fetch.password"]; // portfetch.tcl
-	[_options addObject:@"fetch.use_epsv"]; // portfetch.tcl
-	[_options addObject:@"fetch.ignore_sslcert"]; // portfetch.tcl
-	[_options addObject:@"master_sites.mirror_subdir"]; // portfetch.tcl
-	[_options addObject:@"patch_sites.mirror_subdir"]; // portfetch.tcl
-	[_options addObject:@"portname"]; // portfetch.tcl
-	[_options addObject:@"cvs.module"]; // portfetch.tcl
-	[_options addObject:@"cvs.root"]; // portfetch.tcl
-	[_options addObject:@"cvs.password"]; // portfetch.tcl
-	[_options addObject:@"cvs.date"]; // portfetch.tcl
-	[_options addObject:@"cvs.tag"]; // portfetch.tcl
-	[_options addObject:@"cvs.method"]; // portfetch.tcl
-	[_options addObject:@"svn.url"]; // portfetch.tcl
-	[_options addObject:@"svn.tag"]; // portfetch.tcl
-	[_options addObject:@"svn.method"]; // portfetch.tcl
-	[_options addObject:@"git.url"]; // portfetch.tcl
-	[_options addObject:@"git.branch"]; // portfetch.tcl
-	[_options addObject:@"hg.url"]; // portfetch.tcl
-	[_options addObject:@"hg.tag"]; // portfetch.tcl
-	[_options addObject:@"build.target"]; // portbuild.tcl
-	[_options addObject:@"build.nice"]; // portbuild.tcl
-	[_options addObject:@"build.jobs"]; // portbuild.tcl
-	[_options addObject:@"use_parallel_build"];
-	[_options addObject:@"checksums"];
-	[_options addObject:@"patchfiles"];
-	[_options addObject:@"depends_run"];
-	[_options addObject:@"depends_build"];
-	[_options addObject:@"depends_lib"];
-	[_options addObject:@"universal_variant"];
-	[_options addObject:@"build.target"];
-	[_options addObject:@"destroot.destdir"];
-	[_options addObject:@"livecheck.check"];
-	[_options addObject:@"livecheck.url"];
-	[_options addObject:@"livecheck.regex"];
-	[_options addObject:@"livecheck.distname"];
-	[_options addObject:@"test.run"]; // porttest.tcl
-	[_options addObject:@"test.target"]; // porttest.tcl
+	_options = [[NSMutableDictionary alloc] initWithCapacity:0];
 
-	// *some* overlap with options
-	_defaults = [[NSMutableDictionary alloc] initWithCapacity:0];
-	[_defaults setObject:@"XXX" forKey:@"distpath"]; // portmain.tcl
-	[_defaults setObject:@"XXX" forKey:@"workpath"]; // portmain.tcl
-	[_defaults setObject:@"XXX" forKey:@"worksymlink"]; // portmain.tcl
-	[_defaults setObject:@"/opt/local" forKey:@"prefix"]; // portmain.tcl
-	[_defaults setObject:@"/usr/X11R6" forKey:@"x11prefix"]; // portmain.tcl
-	[_defaults setObject:@"/Applications/MacPorts" forKey:@"applications_dir"]; // portmain.tcl
-	[_defaults setObject:@"${prefix}/Library/Frameworks" forKey:@"frameworks_dir"]; // portmain.tcl
-	[_defaults setObject:@"destroot" forKey:@"destdir"]; // portmain.tcl
-	[_defaults setObject:@"${workpath}/${destdir}" forKey:@"destpath"]; // portmain.tcl
-	[_defaults setObject:@"${destpath}" forKey:@"destroot"]; // portmain.tcl
-	[_defaults setObject:@"files" forKey:@"filesdir"]; // portmain.tcl
-	[_defaults setObject:@"0" forKey:@"revision"]; // portmain.tcl
-	[_defaults setObject:@"0" forKey:@"epoch"]; // portmain.tcl
-	[_defaults setObject:@"${portname}-${portversion}" forKey:@"distname"]; // portmain.tcl
-	[_defaults setObject:@"${distname}" forKey:@"worksrcdir"]; // portmain.tcl
-	[_defaults setObject:@"[file join ${portpath} ${filesdir}]" forKey:@"filespath"]; // portmain.tcl
-	[_defaults setObject:@"[file join ${workpath} ${worksrcdir}]" forKey:@"worksrcpath"]; // portmain.tcl
+	// essentially 'commands' from portutil.tcl
+	for (NSString *command in _commands) {
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"use_%@", command]];
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"%@.dir", command]];
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"%@.pre_args", command]];
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"%@.args", command]];
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"%@.post_args", command]];
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"%@.env", command]];
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"%@.type", command]];
+		[_options setObject:@"" forKey:[NSString stringWithFormat:@"%@.cmd", command]];
+	}
 
-	[_defaults setObject:@"XXX" forKey:@"os.arch"]; // portmain.tcl
+	[_options setObject:@"/opt/local" forKey:@"prefix"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"name"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"version"]; // portmain.tcl
+	[_options setObject:@"0" forKey:@"revision"]; // portmain.tcl
+	[_options setObject:@"0" forKey:@"epoch"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"categories"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"maintainers"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"long_description"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"description"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"homepage"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"worksrcdir"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"filesdir"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"distname"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"portdbpath"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"libpath"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"distpath"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"sources_conf"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"os.platform"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"os.version"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"os.major"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"os.arch"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"os.endian"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"platforms"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"default_variants"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"install.user"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"install.group"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"macosx_deployment_target"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"universal_variant"]; // portmain.tcl
+	[_options setObject:@"" forKey:@"os.universal_supported"]; // portmain.tcl
+	
+	[_options setObject:@"" forKey:@"master_sites"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"patch_sites"]; // portfetch.tcl
+	[_options setObject:@".tar.gz" forKey:@"extract.suffix"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"distfiles"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"patchfiles"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"use_zip"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"use_bzip2"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"use_lzma"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"use_dmg"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"dist_subdir"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"fetch.type"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"fetch.user"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"fetch.password"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"fetch.use_epsv"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"fetch.ignore_sslcert"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"master_sites.mirror_subdir"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"patch_sites.mirror_subdir"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"portname"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"cvs.module"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"cvs.root"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"cvs.password"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"cvs.date"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"cvs.tag"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"cvs.method"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"svn.url"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"svn.tag"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"svn.method"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"git.url"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"git.branch"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"hg.url"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"hg.tag"]; // portfetch.tcl
+	[_options setObject:@"" forKey:@"build.target"]; // portbuild.tcl
+	[_options setObject:@"" forKey:@"build.nice"]; // portbuild.tcl
+	[_options setObject:@"" forKey:@"build.jobs"]; // portbuild.tcl
+	[_options setObject:@"" forKey:@"use_parallel_build"];
+	[_options setObject:@"" forKey:@"checksums"];
+	[_options setObject:@"" forKey:@"patchfiles"];
+	[_options setObject:@"" forKey:@"depends_run"];
+	[_options setObject:@"" forKey:@"depends_build"];
+	[_options setObject:@"" forKey:@"depends_lib"];
+	[_options setObject:@"" forKey:@"universal_variant"];
+	[_options setObject:@"" forKey:@"build.target"];
+	[_options setObject:@"" forKey:@"destroot.destdir"];
+	[_options setObject:@"" forKey:@"livecheck.check"];
+	[_options setObject:@"" forKey:@"livecheck.url"];
+	[_options setObject:@"" forKey:@"livecheck.regex"];
+	[_options setObject:@"" forKey:@"livecheck.distname"];
+	[_options setObject:@"" forKey:@"test.run"]; // porttest.tcl
+	[_options setObject:@"test" forKey:@"test.target"]; // porttest.tcl
 
-	[_defaults setObject:@"" forKey:@"configure.cflags"];
-	[_defaults setObject:@"" forKey:@"configure.ldflags"];
+	_constants = [[NSMutableDictionary alloc] initWithCapacity:0];
+	[_constants setObject:@"XXX" forKey:@"worksrcpath"]; // portmain.tcl
 
-	[_defaults setObject:@".tar.gz" forKey:@"extract.suffix"]; // portfetch.tcl
-	[_defaults setObject:@"standard" forKey:@"fetch.type"]; // portfetch.tcl
-	[_defaults setObject:@"XXX" forKey:@"svn.cmd"]; // portfetch.tcl
-	[_defaults setObject:@"${workpath}" forKey:@"svn.dir"]; // portfetch.tcl
-	[_defaults setObject:@"export" forKey:@"svn.method"]; // portfetch.tcl
-	[_defaults setObject:@"" forKey:@"svn.tag"]; // portfetch.tcl
-	[_defaults setObject:@"" forKey:@"svn.env"]; // portfetch.tcl
-	[_defaults setObject:@"--non-interactive" forKey:@"svn.pre_args"]; // portfetch.tcl
-	[_defaults setObject:@"" forKey:@"svn.args"]; // portfetch.tcl
-	[_defaults setObject:@"${svn.url}" forKey:@"svn.post_args"]; // portfetch.tcl
-	[_defaults setObject:@"${workpath}" forKey:@"git.dir"]; // portfetch.tcl
-	[_defaults setObject:@"" forKey:@"git.branch"]; // portfetch.tcl
-	[_defaults setObject:@"${workpath}" forKey:@"hg.dir"]; // portfetch.tcl
-	[_defaults setObject:@"tip" forKey:@"hg.tag"]; // portfetch.tcl
-	[_defaults setObject:@"[suffix ${distname}" forKey:@"distfiles"]; // portfetch.tcl
-	[_defaults setObject:@"${portname}" forKey:@"dist_subdir"]; // portfetch.tcl
-	[_defaults setObject:@"" forKey:@"fetch.user"]; // portfetch.tcl
-	[_defaults setObject:@"" forKey:@"fetch.password"]; // portfetch.tcl
-	[_defaults setObject:@"yes" forKey:@"fetch.use_epsv"]; // portfetch.tcl
-	[_defaults setObject:@"no" forKey:@"fetch.ignore_sslcert"]; // portfetch.tcl
-	[_defaults setObject:@"no" forKey:@"fetch.remote_time"]; // portfetch.tcl
-	[_defaults setObject:@"macports" forKey:@"fallback_mirror_site"]; // portfetch.tcl
-	[_defaults setObject:@"macports_distfiles" forKey:@"global_mirror_site"]; // portfetch.tcl
-	[_defaults setObject:@"mirror_sites.tcl" forKey:@"mirror_sites.listfile"]; // portfetch.tcl
-	[_defaults setObject:@"port1.0/fetch" forKey:@"mirror_sites.listpath"]; // portfetch.tcl
-
-	[_defaults setObject:@"${workpath}/${worksrcdir}" forKey:@"build.dir"]; // portbuild.tcl
-	[_defaults setObject:@"XXX" forKey:@"build.cmd"]; // portbuild.tcl
-	[_defaults setObject:@"XXX" forKey:@"build.nice"]; // portbuild.tcl
-	[_defaults setObject:@"XXX" forKey:@"build.jobs"]; // portbuild.tcl
-	[_defaults setObject:@"${build.target}" forKey:@"build.pre_args"]; // portbuild.tcl
-	[_defaults setObject:@"all" forKey:@"build.target"]; // portbuild.tcl
-
-	[_defaults setObject:@"${build.dir}" forKey:@"test.dir"]; // porttest.tcl
-	[_defaults setObject:@"${build.cmd}" forKey:@"test.cmd"]; // porttest.tcl
-	[_defaults setObject:@"${test.target}" forKey:@"test.pre_args"]; // porttest.tcl
-	[_defaults setObject:@"test" forKey:@"test.target"]; // porttest.tcl
-
 	// XXX: option_proc setup?
 	// options_export?
 
 	_parser = [[MPParser alloc] initWithPort:self];
 
+	//NSLog(@"%@", _options);
+
 	return self;
 }
 
@@ -200,8 +152,9 @@
 
 	[_procs release];
 	[_targets release];
+	[_commands release];
 	[_options release];
-	[_defaults release];
+	[_constants release];
 
 	[super dealloc];
 }
@@ -216,11 +169,6 @@
 	return _procs;
 }
 
-- (NSArray *)targets
-{
-	return _targets;
-}
-
 - (BOOL)isTarget:(NSString *)target
 {
 	if ([target hasPrefix:@"pre-"]) {
@@ -232,38 +180,51 @@
 	return [_targets containsObject:target];
 }
 
-- (NSArray *)defaults
+- (NSArray *)variables
 {
-	return [_defaults allKeys];
+	return [[_options allKeys] arrayByAddingObjectsFromArray:[_constants allKeys]];
 }
 
-- (NSString *)default:(NSString *)def
+- (NSString *)variable:(NSString *)name
 {
-	// XXX: selector (NSInvocation?) or constant NSString...
-	return [_defaults objectForKey:def];
+	NSString *ret;
+	ret = [_options objectForKey:name];
+	if (ret == nil) {
+		ret = [_constants objectForKey:name];
+	}
+	return ret;
 }
 
-- (NSArray *)options
+- (void)option:(NSString *)option set:(NSArray *)value
 {
-	return _options;
+	if (![[_options allKeys] containsObject:option]) {
+		NSLog(@"? %@", option);
+		return;
+	}
+	[_options setObject:[value componentsJoinedByString:@" "] forKey:option];
 }
 
-- (NSString *)option:(NSString *)option
+- (void)option:(NSString *)option append:(NSArray *)value
 {
-	return [_parser option:option];
+	if (![[_options allKeys] containsObject:option]) {
+		NSLog(@"? %@", option);
+		return;
+	}
+	[_options setObject:[NSString stringWithFormat:@"%@ %@", [_options objectForKey:option], [value componentsJoinedByString:@" "]] forKey:option];
 }
 
-// essentially 'commands' from portutil.tcl
-- (void)addCommand:(NSString *)command
+- (void)option:(NSString *)option delete:(NSArray *)value
 {
-	[_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]];
+	if (![[_options allKeys] containsObject:option]) {
+		NSLog(@"? %@", option);
+		return;
+	}
+	NSMutableArray *tmp = [[[_options objectForKey:option] componentsSeparatedByString:@" "] mutableCopy];
+	for (NSString *v in value) {
+		[tmp removeObject:v];
+	}
+	[_options setObject:[tmp componentsJoinedByString:@" "] forKey:option];
+	[tmp release];
 }
 
 - (NSArray *)variants

Modified: users/toby/objcports/port.m
===================================================================
--- users/toby/objcports/port.m	2009-03-22 00:27:31 UTC (rev 48436)
+++ users/toby/objcports/port.m	2009-03-22 02:22:19 UTC (rev 48437)
@@ -12,16 +12,16 @@
 		exit(1);
 
 	MPPort *port = [[MPPort alloc] initWithPortfile:[NSString stringWithUTF8String:argv[1]] options:nil];
-	NSLog(@"%@ @%@ (%@)", [port option:@"name"], [port option:@"version"], [port option:@"categories"]);
+	NSLog(@"%@ @%@ (%@)", [port variable:@"name"], [port variable:@"version"], [port variable:@"categories"]);
 	NSLog(@"Variants:             %@", [[port variants] componentsJoinedByString:@", "]);
 	NSLog(@"PlatformVariants:     %@", [[port platforms] componentsJoinedByString:@", "]);
-	NSLog(@"Brief Description:    %@", [port option:@"description"]);
-	NSLog(@"Description:          %@", [port option:@"long_description"]);
-	NSLog(@"Homepage:             %@", [port option:@"homepage"]);
-	NSLog(@"Build Dependencies:   %@", [port option:@"depends_build"]);
-	NSLog(@"Library Dependencies: %@", [port option:@"depends_lib"]);
-	NSLog(@"Platforms:            %@", [port option:@"platforms"]);
-	NSLog(@"Maintainers:          %@", [port option:@"maintainers"]);
+	NSLog(@"Brief Description:    %@", [port variable:@"description"]);
+	NSLog(@"Description:          %@", [port variable:@"long_description"]);
+	NSLog(@"Homepage:             %@", [port variable:@"homepage"]);
+	NSLog(@"Build Dependencies:   %@", [port variable:@"depends_build"]);
+	NSLog(@"Library Dependencies: %@", [port variable:@"depends_lib"]);
+	NSLog(@"Platforms:            %@", [port variable:@"platforms"]);
+	NSLog(@"Maintainers:          %@", [port variable:@"maintainers"]);
 
 	[port release];
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20090321/1ecf7658/attachment-0001.html>


More information about the macports-changes mailing list