Mercurial > emacs
changeset 46916:aff9c7fcedb0
2002-08-15 Andrew Choi <akochoi@shaw.ca>
* mac.c (init_mac_osx_environment): New function.
* emacs.c (main) [MAC_OSX]: Call init_mac_osx_environment.
author | Andrew Choi <akochoi@shaw.ca> |
---|---|
date | Fri, 16 Aug 2002 02:30:21 +0000 |
parents | 5bae22b90bf5 |
children | 7f23d458e897 |
files | src/ChangeLog src/emacs.c src/mac.c |
diffstat | 3 files changed, 147 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Thu Aug 15 20:33:01 2002 +0000 +++ b/src/ChangeLog Fri Aug 16 02:30:21 2002 +0000 @@ -1,3 +1,9 @@ +2002-08-15 Andrew Choi <akochoi@shaw.ca> + + * mac.c (init_mac_osx_environment): New function. + + * emacs.c (main) [MAC_OSX]: Call init_mac_osx_environment. + 2002-08-14 Kim F. Storm <storm@cua.dk> * macros.c (Fstart_kbd_macro): Added NO-EXEC argument to inhibit
--- a/src/emacs.c Thu Aug 15 20:33:01 2002 +0000 +++ b/src/emacs.c Fri Aug 16 02:30:21 2002 +0000 @@ -1363,6 +1363,11 @@ init_ntproc (); /* must precede init_editfns. */ #endif +#ifdef MAC_OSX + if (initialized) + init_mac_osx_environment (); +#endif + /* egetenv is a pretty low-level facility, which may get called in many circumstances; it seems flimsy to put off initializing it until calling init_callproc. */
--- a/src/mac.c Thu Aug 15 20:33:01 2002 +0000 +++ b/src/mac.c Fri Aug 16 02:30:21 2002 +0000 @@ -26,10 +26,12 @@ #include <errno.h> #include <utime.h> #include <dirent.h> +#include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pwd.h> #include <sys/param.h> +#include <stdlib.h> #if __MWERKS__ #include <unistd.h> #endif @@ -2768,6 +2770,140 @@ else return select (n, rfds, wfds, efds, timeout); } + + +/* Set up environment variables so that Emacs can correctly find its + support files when packaged as an application bundle. Directories + placed in /usr/local/share/emacs/<emacs-version>/, /usr/local/bin, + and /usr/local/libexec/emacs/<emacs-version>/<system-configuration> + by `make install' by default can instead be placed in + .../Emacs.app/Contents/Resources/ and + .../Emacs.app/Contents/MacOS/. Each of these environment variables + is changed only if it is not already set. Presumably if the user + sets an environment variable, he will want to use files in his path + instead of ones in the application bundle. */ +void +init_mac_osx_environment () +{ + CFBundleRef bundle; + CFURLRef bundleURL; + CFStringRef cf_app_bundle_pathname; + int app_bundle_pathname_len; + char *app_bundle_pathname; + char *p, *q; + struct stat st; + + /* Fetch the pathname of the application bundle as a C string into + app_bundle_pathname. */ + + bundle = CFBundleGetMainBundle (); + if (!bundle) + return; + + bundleURL = CFBundleCopyBundleURL (bundle); + if (!bundleURL) + return; + + cf_app_bundle_pathname = CFURLCopyFileSystemPath (bundleURL, + kCFURLPOSIXPathStyle); + app_bundle_pathname_len = CFStringGetLength (cf_app_bundle_pathname); + app_bundle_pathname = (char *) alloca (app_bundle_pathname_len + 1); + + if (!CFStringGetCString (cf_app_bundle_pathname, + app_bundle_pathname, + app_bundle_pathname_len + 1, + kCFStringEncodingISOLatin1)) + { + CFRelease (cf_app_bundle_pathname); + return; + } + + CFRelease (cf_app_bundle_pathname); + + /* P should have sufficient room for the pathname of the bundle plus + the subpath in it leading to the respective directories. Q + should have three times that much room because EMACSLOADPATH can + have the value "<path to lisp dir>:<path to leim dir>:<path to + site-lisp dir>". */ + p = (char *) alloca (app_bundle_pathname_len + 50); + q = (char *) alloca (3 * app_bundle_pathname_len + 150); + if (!getenv ("EMACSLOADPATH")) + { + q[0] = '\0'; + + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/Resources/lisp"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + strcat (q, p); + + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/Resources/leim"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + { + if (q[0] != '\0') + strcat (q, ":"); + strcat (q, p); + } + + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/Resources/site-lisp"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + { + if (q[0] != '\0') + strcat (q, ":"); + strcat (q, p); + } + + if (q[0] != '\0') + setenv ("EMACSLOADPATH", q, 1); + } + + if (!getenv ("EMACSPATH")) + { + q[0] = '\0'; + + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/MacOS/bin"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + strcat (q, p); + + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/MacOS/libexec"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + { + if (q[0] != '\0') + strcat (q, ":"); + strcat (q, p); + } + + if (q[0] != '\0') + setenv ("EMACSPATH", q, 1); + } + + if (!getenv ("EMACSDATA")) + { + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/Resources/etc"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + setenv ("EMACSDATA", p, 1); + } + + if (!getenv ("EMACSDOC")) + { + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/Resources/etc"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + setenv ("EMACSDOC", p, 1); + } + + if (!getenv ("INFOPATH")) + { + strcpy (p, app_bundle_pathname); + strcat (p, "/Contents/Resources/info"); + if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) + setenv ("INFOPATH", p, 1); + } +} #endif /* MAC_OSX */ void