From cbb319513e0da14e7de2e9be121d449b6bcc8d88 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Mon, 9 Jul 2012 17:28:39 -0400 Subject: [PATCH] Stop ns builds setting the EMACSPATH environment variable Ref bugs 4309, 6401, etc * src/nsterm.m (ns_exec_path): New function, split from ns_init_paths. (ns_init_paths): Do not set EMACSPATH. * src/nsterm.h (ns_exec_path): Add it. * src/callproc.c (init_callproc_1, init_callproc) [HAVE_NS]: Use ns_exec_path. --- src/ChangeLog | 7 ++++ src/callproc.c | 17 +++++++- src/nsterm.h | 1 + src/nsterm.m | 104 +++++++++++++++++++++++++++++-------------------- 4 files changed, 84 insertions(+), 45 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index c4911968e0..5846fbab92 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,12 @@ 2012-07-09 Glenn Morris + Stop ns builds setting the EMACSPATH environment variable. + * nsterm.m (ns_exec_path): New function, split from ns_init_paths. + (ns_init_paths): Do not set EMACSPATH. + * nsterm.h (ns_exec_path): Add it. + * callproc.c (init_callproc_1, init_callproc) [HAVE_NS]: + Use ns_exec_path. + * nsterm.m, nsterm.h (ns_etc_directory): Fix type, empty return. 2012-07-09 Paul Eggert diff --git a/src/callproc.c b/src/callproc.c index 52825bc9dc..facca88777 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -1519,6 +1519,7 @@ init_callproc_1 (void) char *doc_dir = egetenv ("EMACSDOC"); #ifdef HAVE_NS const char *etc_dir = ns_etc_directory (); + const char *path_exec = ns_exec_path (); #endif Vdata_directory @@ -1540,8 +1541,13 @@ init_callproc_1 (void) /* Check the EMACSPATH environment variable, defaulting to the PATH_EXEC path from epaths.h. */ - Vexec_path = decode_env_path ("EMACSPATH", PATH_EXEC); + Vexec_path = decode_env_path ("EMACSPATH", +#ifdef HAVE_NS + path_exec ? path_exec : +#endif + PATH_EXEC); Vexec_directory = Ffile_name_as_directory (Fcar (Vexec_path)); + /* FIXME? For ns, path_exec should go at the front? */ Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path); } @@ -1576,7 +1582,14 @@ init_callproc (void) /* MSDOS uses wrapped binaries, so don't do this. */ if (NILP (Fmember (tem, Vexec_path))) { - Vexec_path = decode_env_path ("EMACSPATH", PATH_EXEC); +#ifdef HAVE_NS + const char *path_exec = ns_exec_path (); +#endif + Vexec_path = decode_env_path ("EMACSPATH", +#ifdef HAVE_NS + path_exec ? path_exec : +#endif + PATH_EXEC); Vexec_path = Fcons (tem, Vexec_path); Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path); } diff --git a/src/nsterm.h b/src/nsterm.h index 969091e334..939186d0d9 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -799,6 +799,7 @@ extern void x_free_frame_resources (struct frame *); extern void ns_run_ascript (void); extern const char *ns_etc_directory (void); +extern const char *ns_exec_path (void); extern void ns_init_paths (void); extern void syms_of_nsterm (void); extern void syms_of_nsfns (void); diff --git a/src/nsterm.m b/src/nsterm.m index 2b1b67c8b5..6ec9d69533 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -288,10 +288,9 @@ append2 (Lisp_Object list, Lisp_Object item) const char * ns_etc_directory (void) -{ /* If running as a self-contained app bundle, return as a string the filename of the etc directory, if present; else nil. */ - +{ NSBundle *bundle = [NSBundle mainBundle]; NSString *resourceDir = [bundle resourcePath]; NSString *resourcePath; @@ -306,33 +305,82 @@ ns_etc_directory (void) return NULL; } -void -ns_init_paths (void) -/* -------------------------------------------------------------------------- - Used to allow emacs to find its resources under Emacs.app - Called from emacs.c at startup. - -------------------------------------------------------------------------- */ + +const char * +ns_exec_path (void) +/* If running as a self-contained app bundle, return as a path string + the filenames of the libexec and bin directories, ie libexec:bin. + Otherwise, return nil. + Normally, Emacs does not add its own bin/ directory to the PATH. + However, a self-contained NS build has a different layout, with + bin/ and libexec/ subdirectories in the directory that contains + Emacs.app itself. + We put libexec first, because init_callproc_1 uses the first + element to initialize exec-directory. An alternative would be + for init_callproc to check for invocation-directory/libexec. +*/ { NSBundle *bundle = [NSBundle mainBundle]; - NSString *binDir = [bundle bundlePath], *resourceDir = [bundle resourcePath]; + NSString *resourceDir = [bundle resourcePath]; + NSString *binDir = [bundle bundlePath]; NSString *resourcePath, *resourcePaths; NSRange range; - BOOL onWindows = NO; /* how do I determine this? */ + BOOL onWindows = NO; /* FIXME determine this somehow */ NSString *pathSeparator = onWindows ? @";" : @":"; NSFileManager *fileManager = [NSFileManager defaultManager]; + NSArray *paths; + NSEnumerator *pathEnum; BOOL isDir; -/*NSLog (@"ns_init_paths: '%@'\n%@\n", [[NSBundle mainBundle] bundlePath], [[NSBundle mainBundle] resourcePath]); */ - /* get bindir from base */ range = [resourceDir rangeOfString: @"Contents"]; if (range.location != NSNotFound) { - binDir = [binDir stringByAppendingPathComponent: @"Contents"]; #ifdef NS_IMPL_COCOA binDir = [binDir stringByAppendingPathComponent: @"MacOS"]; +#else + binDir = [binDir stringByAppendingPathComponent: @"Contents"]; #endif } + paths = [binDir stringsByAppendingPaths: + [NSArray arrayWithObjects: @"libexec", @"bin", nil]]; + pathEnum = [paths objectEnumerator]; + resourcePaths = @""; + + while (resourcePath = [pathEnum nextObject]) + { + if ([fileManager fileExistsAtPath: resourcePath isDirectory: &isDir]) + if (isDir) + { + if ([resourcePaths length] > 0) + resourcePaths + = [resourcePaths stringByAppendingString: pathSeparator]; + resourcePaths + = [resourcePaths stringByAppendingString: resourcePath]; + } + } + if ([resourcePaths length] > 0) return [resourcePaths UTF8String]; + + return NULL; +} + + +void +ns_init_paths (void) +/* -------------------------------------------------------------------------- + Used to allow emacs to find its resources under Emacs.app + Called from emacs.c at startup. + -------------------------------------------------------------------------- */ +{ + NSBundle *bundle = [NSBundle mainBundle]; + NSString *resourceDir = [bundle resourcePath]; + NSString *resourcePath, *resourcePaths; + BOOL onWindows = NO; /* FIXME determine this somehow */ + NSString *pathSeparator = onWindows ? @";" : @":"; + NSFileManager *fileManager = [NSFileManager defaultManager]; + BOOL isDir; +/*NSLog (@"ns_init_paths: '%@'\n%@\n", [[NSBundle mainBundle] bundlePath], [[NSBundle mainBundle] resourcePath]); */ + /* the following based on Andrew Choi's init_mac_osx_environment () */ if (!getenv ("EMACSLOADPATH")) { @@ -359,36 +407,6 @@ ns_init_paths (void) setenv ("EMACSLOADPATH", [resourcePaths UTF8String], 1); /*NSLog (@"loadPath: '%@'\n", resourcePaths); */ } - - /* Normally, Emacs does not add its own bin/ directory to the PATH. - However, a self-contained NS build has a different layout, with - bin/ and libexec/ subdirectories in the directory that contains - Emacs.app itself. - We put libexec first, because init_callproc_1 uses the first - element to initialize exec-directory. An alternative would be - for init_callproc to check for invocation-directory/libexec. */ - if (!getenv ("EMACSPATH")) - { - NSArray *paths = [binDir stringsByAppendingPaths: - [NSArray arrayWithObjects: @"libexec", - @"bin", nil]]; - NSEnumerator *pathEnum = [paths objectEnumerator]; - resourcePaths = @""; - while (resourcePath = [pathEnum nextObject]) - { - if ([fileManager fileExistsAtPath: resourcePath isDirectory: &isDir]) - if (isDir) - { - if ([resourcePaths length] > 0) - resourcePaths - = [resourcePaths stringByAppendingString: pathSeparator]; - resourcePaths - = [resourcePaths stringByAppendingString: resourcePath]; - } - } - if ([resourcePaths length] > 0) - setenv ("EMACSPATH", [resourcePaths UTF8String], 1); - } } static void -- 2.20.1