[MacRuby-devel] [PATCH] Fix for #10, better support for framework load paths

Laurent Sansonetti lsansonetti at apple.com
Mon Mar 3 12:07:51 PST 2008


I merged a slightly modified version of this patch into trunk.

Also, I changed Kernel#framework(path) to Kernel#framework(path,  
search_network=false), to avoid network lookups by default, which can  
significantly slow down lookups on network-less machines.

Laurent

On Feb 28, 2008, at 2:36 PM, Benjamin Stiglitz wrote:

> From: Benjamin Stiglitz <stig at apple.com>
>
> ---
> objc.m |   38 +++++++++++++++++++++-----------------
> 1 files changed, 21 insertions(+), 17 deletions(-)
>
> diff --git a/objc.m b/objc.m
> index 328bfa2..6af0dcc 100644
> --- a/objc.m
> +++ b/objc.m
> @@ -1869,8 +1869,7 @@ rb_require_framework(VALUE recv, VALUE  
> framework)
>     }
>     else {
> 	/* framework name is given */
> -	char path[PATH_MAX];
> -	static char *home = NULL;
> +	const char *path;
>
> #define TRY_LOAD_PATH() 			\
>     do { 					\
> @@ -1881,23 +1880,28 @@ rb_require_framework(VALUE recv, VALUE  
> framework)
>     } 						\
>     while(0)
>
> -	if (home == NULL)
> -	    home = getenv("HOME");
> -	if (home != NULL) {
> -	    snprintf(path, sizeof path, "%s/%s.framework", home, cstr);
> -	    TRY_LOAD_PATH();
> +	NSString *frameworkName = [[[NSFileManager defaultManager]  
> stringWithFileSystemRepresentation:cstr length:strlen(cstr)]  
> stringByAppendingPathExtension:@"framework"];
> +
> +	NSFileManager *fileManager = [NSFileManager defaultManager];
> +	NSArray *libraryDirs =  
> NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,  
> NSAllDomainsMask, YES);
> +	NSUInteger dirIndex, dirCount = [libraryDirs count];
> +	for (dirIndex = 0; dirIndex < dirCount; ++dirIndex) {
> +	    NSString *libraryDir = [libraryDirs objectAtIndex:dirIndex];
> +	    path = [[[libraryDir  
> stringByAppendingPathComponent:@"Frameworks"]  
> stringByAppendingPathComponent:frameworkName]  
> fileSystemRepresentation];
> +	    TRY_LOAD_PATH();
> +	    path = [[[libraryDir  
> stringByAppendingPathComponent:@"PrivateFrameworks"]  
> stringByAppendingPathComponent:frameworkName]  
> fileSystemRepresentation];
> +	    TRY_LOAD_PATH();
> 	}
>
> -	snprintf(path, sizeof path,
> -		 "/System/Library/Frameworks/%s.framework", cstr);
> -	TRY_LOAD_PATH();
> -
> -	snprintf(path, sizeof path, "/Library/Frameworks/%s.framework",  
> cstr);
> -	TRY_LOAD_PATH();
> -	
> -	snprintf(path, sizeof path,
> -		 "/System/Library/PrivateFrameworks/%s.framework", cstr);
> -	TRY_LOAD_PATH();
> +	NSArray *developerDirs =  
> NSSearchPathForDirectoriesInDomains(NSDeveloperDirectory,  
> NSAllDomainsMask, YES);
> +	dirCount = [developerDirs count];
> +	for (dirIndex = 0; dirIndex < dirCount; ++dirIndex) {
> +	    NSString *libraryDir = [[developerDirs objectAtIndex:dirIndex]  
> stringByAppendingPathComponent:@"Library"];
> +	    path = [[[libraryDir  
> stringByAppendingPathComponent:@"Frameworks"]  
> stringByAppendingPathComponent:frameworkName]  
> fileSystemRepresentation];
> +	    TRY_LOAD_PATH();
> +	    path = [[[libraryDir  
> stringByAppendingPathComponent:@"PrivateFrameworks"]  
> stringByAppendingPathComponent:frameworkName]  
> fileSystemRepresentation];
> +	    TRY_LOAD_PATH();
> +	}
>
> #undef TRY_LOAD_PATH
>
> -- 
> 1.5.4.2
>
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel



More information about the MacRuby-devel mailing list