[MacRuby-devel] [PATCH] Fix for #10, better support for framework load paths
Benjamin Stiglitz
ben at tanjero.com
Mon Mar 3 12:37:26 PST 2008
Great. Thanks for extracting that macro; it was pretty ugly before.
> 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