X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/510005210ac9f4d813c4a2cc99b2c3c11e57c055..eada086196ccb005ded188ac2e58d41f3682a125:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index c4b4caad9b..7ff5c43dbe 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1,6 +1,6 @@ /* Fully extensible Emacs, running on Unix, intended for GNU. -Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2011 +Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2012 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -45,6 +45,7 @@ along with GNU Emacs. If not, see . */ #include "commands.h" #include "intervals.h" +#include "character.h" #include "buffer.h" #include "window.h" @@ -65,6 +66,12 @@ along with GNU Emacs. If not, see . */ #include "nsterm.h" #endif +#if (defined PROFILING \ + && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__)) +# include +extern void moncontrol (int mode); +#endif + #ifdef HAVE_X_WINDOWS #include "xterm.h" #endif @@ -86,40 +93,8 @@ along with GNU Emacs. If not, see . */ #define O_RDWR 2 #endif -#ifdef HAVE_SETPGID -#if !defined (USG) -#undef setpgrp -#define setpgrp setpgid -#endif -#endif - static const char emacs_version[] = VERSION; -static const char emacs_copyright[] = "Copyright (C) 2011 Free Software Foundation, Inc."; - -/* Make these values available in GDB, which doesn't see macros. */ - -#ifdef USE_LSB_TAG -int gdb_use_lsb EXTERNALLY_VISIBLE = 1; -#else -int gdb_use_lsb EXTERNALLY_VISIBLE = 0; -#endif -#ifndef USE_LISP_UNION_TYPE -int gdb_use_union EXTERNALLY_VISIBLE = 0; -#else -int gdb_use_union EXTERNALLY_VISIBLE = 1; -#endif -EMACS_INT gdb_valbits EXTERNALLY_VISIBLE = VALBITS; -EMACS_INT gdb_gctypebits EXTERNALLY_VISIBLE = GCTYPEBITS; -#if defined (DATA_SEG_BITS) && ! defined (USE_LSB_TAG) -EMACS_INT gdb_data_seg_bits EXTERNALLY_VISIBLE = DATA_SEG_BITS; -#else -EMACS_INT gdb_data_seg_bits EXTERNALLY_VISIBLE = 0; -#endif -EMACS_INT PVEC_FLAG EXTERNALLY_VISIBLE = PSEUDOVECTOR_FLAG; -EMACS_INT gdb_array_mark_flag EXTERNALLY_VISIBLE = ARRAY_MARK_FLAG; -/* GDB might say "No enum type named pvec_type" if we don't have at - least one symbol with that type, and then xbacktrace could fail. */ -enum pvec_type gdb_pvec_type EXTERNALLY_VISIBLE = PVEC_TYPE_MASK; +static const char emacs_copyright[] = "Copyright (C) 2012 Free Software Foundation, Inc."; /* Empty lisp strings. To avoid having to build any others. */ Lisp_Object empty_unibyte_string, empty_multibyte_string; @@ -129,6 +104,10 @@ Lisp_Object empty_unibyte_string, empty_multibyte_string; on subsequent starts. */ int initialized; +#ifdef DARWIN_OS +extern void unexec_init_emacs_zone (void); +#endif + #ifdef DOUG_LEA_MALLOC /* Preserves a pointer to the memory allocated that copies that static data inside glibc's malloc. */ @@ -146,6 +125,8 @@ Lisp_Object Qfile_name_handler_alist; Lisp_Object Qrisky_local_variable; +Lisp_Object Qkill_emacs; + /* If non-zero, Emacs should not attempt to use a window-specific code, but instead should use the virtual terminal under which it was started. */ int inhibit_window_system; @@ -154,7 +135,7 @@ int inhibit_window_system; data on the first attempt to change it inside asynchronous code. */ int running_asynch_code; -#if defined(HAVE_X_WINDOWS) || defined(HAVE_NS) +#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS) /* If non-zero, -d was specified, meaning we're using some window system. */ int display_arg; #endif @@ -163,11 +144,15 @@ int display_arg; Tells GC how to save a copy of the stack. */ char *stack_bottom; +#if defined (DOUG_LEA_MALLOC) || defined (GNU_LINUX) /* The address where the heap starts (from the first sbrk (0) call). */ static void *my_heap_start; +#endif +#ifdef GNU_LINUX /* The gap between BSS end and heap start as far as we can tell. */ -static unsigned long heap_bss_diff; +static uprintmax_t heap_bss_diff; +#endif /* Nonzero means running Emacs without interactive terminal. */ int noninteractive; @@ -294,11 +279,6 @@ static int fatal_error_code; /* Nonzero if handling a fatal error already. */ int fatal_error_in_progress; -/* If non-null, call this function from fatal_error_signal before - committing suicide. */ - -static void (*fatal_error_signal_hook) (void); - #ifdef FORWARD_SIGNAL_TO_MAIN_THREAD /* When compiled with GTK and running under Gnome, multiple threads may be created. Keep track of our main @@ -307,6 +287,12 @@ static void (*fatal_error_signal_hook) (void); pthread_t main_thread; #endif +#ifdef HAVE_NS +/* NS autrelease pool, for memory management. */ +static void *ns_pool; +#endif + + /* Handle bus errors, invalid instruction, etc. */ #ifndef FLOAT_CATCH_SIGILL @@ -340,9 +326,6 @@ fatal_error_signal (int sig) sigunblock (sigmask (fatal_error_code)); #endif - if (fatal_error_signal_hook) - fatal_error_signal_hook (); - kill (getpid (), fatal_error_code); } @@ -350,8 +333,7 @@ fatal_error_signal (int sig) /* Handler for SIGDANGER. */ void -memory_warning_signal (sig) - int sig; +memory_warning_signal (int sig) { signal (sig, memory_warning_signal); SIGNAL_THREAD_CHECK (sig); @@ -386,7 +368,7 @@ init_cmdargs (int argc, char **argv, int skip_args) { register int i; Lisp_Object name, dir, handler; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object raw_name; initial_argv = argv; @@ -432,6 +414,16 @@ init_cmdargs (int argc, char **argv, int skip_args) if (!NILP (Vinvocation_directory)) { dir = Vinvocation_directory; +#ifdef WINDOWSNT + /* If we are running from the build directory, set DIR to the + src subdirectory of the Emacs tree, like on Posix + platforms. */ + if (SBYTES (dir) > sizeof ("/i386/") - 1 + && 0 == strcmp (SSDATA (dir) + SBYTES (dir) - sizeof ("/i386/") + 1, + "/i386/")) + dir = Fexpand_file_name (build_string ("../.."), dir); +#else /* !WINDOWSNT */ +#endif name = Fexpand_file_name (Vinvocation_name, dir); while (1) { @@ -554,7 +546,7 @@ static char dump_tz[] = "UtC0"; /* Define a dummy function F. Declare F too, to pacify gcc -Wmissing-prototypes. */ #define DEFINE_DUMMY_FUNCTION(f) \ - void f (void) EXTERNALLY_VISIBLE; void f (void) {} + void f (void) ATTRIBUTE_CONST EXTERNALLY_VISIBLE; void f (void) {} #ifndef GCC_CTORS_IN_LIBC DEFINE_DUMMY_FUNCTION (__do_global_ctors) @@ -642,10 +634,6 @@ argmatch (char **argv, int argc, const char *sstr, const char *lstr, static void malloc_initialize_hook (void) { -#ifndef USE_CRT_DLL - extern char **environ; -#endif - if (initialized) { if (!malloc_using_checking) @@ -713,6 +701,7 @@ main (int argc, char **argv) setenv ("G_SLICE", "always-malloc", 1); #endif +#ifdef GNU_LINUX if (!initialized) { extern char my_endbss[]; @@ -723,6 +712,7 @@ main (int argc, char **argv) heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static); } +#endif #ifdef RUN_TIME_REMAP if (initialized) @@ -795,7 +785,7 @@ main (int argc, char **argv) { static char heapexec[] = "EMACS_HEAP_EXEC=true"; /* Set this so we only do this once. */ - putenv(heapexec); + putenv (heapexec); /* A flag to turn off address randomization which is introduced in linux kernel shipped with fedora core 4 */ @@ -835,7 +825,7 @@ main (int argc, char **argv) stack allocation routine for new process that the allocation fails if stack limit is not on page boundary. So, round up the new limit to page boundary. */ - newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize(); + newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize (); #endif if (newlim > rlim.rlim_max) { @@ -936,7 +926,7 @@ main (int argc, char **argv) } /* Command line option --no-windows is deprecated and thus not mentioned - in the manual and usage informations. */ + in the manual and usage information. */ if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args) || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args)) inhibit_window_system = 1; @@ -1061,15 +1051,17 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem if (!dname_arg || !strchr (dname_arg, '\n')) { /* In orig, child: now exec w/special daemon name. */ char fdStr[80]; + int fdStrlen = + snprintf (fdStr, sizeof fdStr, + "--daemon=\n%d,%d\n%s", daemon_pipe[0], + daemon_pipe[1], dname_arg ? dname_arg : ""); - if (dname_arg && strlen (dname_arg) > 70) + if (! (0 <= fdStrlen && fdStrlen < sizeof fdStr)) { fprintf (stderr, "daemon: child name too long\n"); exit (1); } - sprintf (fdStr, "--daemon=\n%d,%d\n%s", daemon_pipe[0], - daemon_pipe[1], dname_arg ? dname_arg : ""); argv[skip_args] = fdStr; execv (argv[0], argv); @@ -1082,7 +1074,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem || strlen (dname_arg) < 1 || strlen (dname_arg) > 70) { fprintf (stderr, "emacs daemon: daemon name absent or too long\n"); - exit(1); + exit (1); } dname_arg2[0] = '\0'; sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]), @@ -1100,7 +1092,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC); #ifdef HAVE_SETSID - setsid(); + setsid (); #endif #else /* DOS_NT */ fprintf (stderr, "This platform does not support the -daemon flag.\n"); @@ -1113,7 +1105,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #if defined (USG5) && defined (INTERRUPT_INPUT) setpgrp (); #endif -#if defined (HAVE_GTK_AND_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) +#if defined (HAVE_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) { extern void malloc_enable_thread (void); @@ -1235,7 +1227,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_alloc_once (); init_obarray (); init_eval_once (); - init_character_once (); init_charset_once (); init_coding_once (); init_syntax_once (); /* Create standard syntax table. */ @@ -1288,9 +1279,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_eval (); init_data (); -#ifdef CLASH_DETECTION - init_filelock (); -#endif init_atimer (); running_asynch_code = 0; @@ -1301,7 +1289,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem = argmatch (argv, argc, "-nsl", "--no-site-lisp", 11, NULL, &skip_args); #ifdef HAVE_NS - ns_alloc_autorelease_pool(); + ns_pool = ns_alloc_autorelease_pool (); if (!noninteractive) { #ifdef NS_IMPL_COCOA @@ -1309,12 +1297,12 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem { /* FIXME: Do the right thing if getenv returns NULL, or if chdir fails. */ - if (!strncmp(argv[skip_args], "-psn", 4)) + if (!strncmp (argv[skip_args], "-psn", 4)) { skip_args += 1; chdir (getenv ("HOME")); } - else if (skip_args+1 < argc && !strncmp(argv[skip_args+1], "-psn", 4)) + else if (skip_args+1 < argc && !strncmp (argv[skip_args+1], "-psn", 4)) { skip_args += 2; chdir (getenv ("HOME")); @@ -1351,24 +1339,17 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* If we have the form --display=NAME, convert it into -d name. This requires inserting a new element into argv. */ - if (displayname != 0 && skip_args - count_before == 1) + if (displayname && count_before < skip_args) { - char **new = (char **) xmalloc (sizeof (char *) * (argc + 2)); - int j; - - for (j = 0; j < count_before + 1; j++) - new[j] = argv[j]; - new[count_before + 1] = (char *) "-d"; - new[count_before + 2] = displayname; - for (j = count_before + 2; j count_before - && argv[count_before + 1][1] == '-') - argv[count_before + 1] = (char *) "-d"; if (! no_site_lisp) { @@ -1394,7 +1375,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #endif /* argmatch must not be used after here, - except when bulding temacs + except when building temacs because the -d argument has not been skipped in skip_args. */ #ifdef MSDOS @@ -1414,13 +1395,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_ntproc (); /* must precede init_editfns. */ #endif -#ifdef HAVE_NS -#ifndef CANNOT_DUMP - if (initialized) -#endif - ns_init_paths (); -#endif - /* Initialize and GC-protect Vinitial_environment and Vprocess_environment before set_initial_environment fills them in. */ @@ -1458,6 +1432,10 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */ init_lread (); +#ifdef WINDOWSNT + /* Check to see if Emacs has been installed correctly. */ + check_windows_init_file (); +#endif /* Intern the names of all standard functions and variables; define standard keys. */ @@ -1546,9 +1524,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #ifdef MSDOS syms_of_xmenu (); - syms_of_dosfns(); - syms_of_msdos(); - syms_of_win16select(); + syms_of_dosfns (); + syms_of_msdos (); + syms_of_win16select (); #endif /* MSDOS */ #ifdef HAVE_NS @@ -1583,6 +1561,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* Initialization that must be done even if the global variable initialized is non zero. */ #ifdef HAVE_NTGUI + globals_of_w32font (); globals_of_w32fns (); globals_of_w32menu (); globals_of_w32select (); @@ -1591,22 +1570,17 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_charset (); - init_editfns (); /* init_process uses Voperating_system_release. */ - init_process (); /* init_display uses add_keyboard_wait_descriptor. */ + init_editfns (); /* init_process_emacs uses Voperating_system_release. */ + init_process_emacs (); /* init_display uses add_keyboard_wait_descriptor. */ init_keyboard (); /* This too must precede init_sys_modes. */ if (!noninteractive) init_display (); /* Determine terminal type. Calls init_sys_modes. */ - init_fns (); init_xdisp (); #ifdef HAVE_WINDOW_SYSTEM init_fringe (); - init_image (); #endif /* HAVE_WINDOW_SYSTEM */ init_macros (); init_floatfns (); -#ifdef HAVE_SOUND - init_sound (); -#endif init_window (); init_font (); @@ -1647,36 +1621,18 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem GNU/Linux and MinGW. It might work on some other systems too. Give it a try and tell us if it works on your system. To compile for profiling, use the configure option --enable-profiling. */ -#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined(__MINGW32__) +#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined (__MINGW32__) #ifdef PROFILING if (initialized) { - extern void _mcleanup (); #ifdef __MINGW32__ extern unsigned char etext asm ("etext"); #else extern char etext; #endif -#ifdef HAVE___EXECUTABLE_START - /* This symbol is defined by GNU ld to the start of the text - segment. */ - extern char __executable_start[]; -#else - extern void safe_bcopy (); -#endif atexit (_mcleanup); -#ifdef HAVE___EXECUTABLE_START - monstartup (__executable_start, &etext); -#else - /* This uses safe_bcopy because that function comes first in the - Emacs executable. It might be better to use something that - gives the start of the text segment, but start_of_text is not - defined on all systems now. */ - /* FIXME: Does not work on architectures with function - descriptors. */ - monstartup (safe_bcopy, &etext); -#endif + monstartup ((uintptr_t) __executable_start, (uintptr_t) &etext); } else moncontrol (0); @@ -1825,14 +1781,14 @@ static const struct standard_args standard_args[] = static void sort_args (int argc, char **argv) { - char **new = (char **) xmalloc (sizeof (char *) * argc); + char **new = xmalloc (argc * sizeof *new); /* For each element of argv, the corresponding element of options is: 0 for an option that takes no arguments, 1 for an option that takes one argument, etc. -1 for an ordinary non-option argument. */ - int *options = (int *) xmalloc (sizeof (int) * argc); - int *priority = (int *) xmalloc (sizeof (int) * argc); + int *options = xnmalloc (argc, sizeof *options); + int *priority = xnmalloc (argc, sizeof *priority); int to = 1; int incoming_used = 1; int from; @@ -1985,6 +1941,7 @@ all of which are called before Emacs is actually killed. */) { struct gcpro gcpro1; Lisp_Object hook; + int exit_code; GCPRO1 (arg); @@ -2003,13 +1960,25 @@ all of which are called before Emacs is actually killed. */) shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil); +#ifdef HAVE_NS + ns_release_autorelease_pool (ns_pool); +#endif + /* If we have an auto-save list file, kill it because we are exiting Emacs deliberately (not crashing). Do it after shut_down_emacs, which does an auto-save. */ if (STRINGP (Vauto_save_list_file_name)) unlink (SSDATA (Vauto_save_list_file_name)); - exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS); + if (INTEGERP (arg)) + exit_code = (XINT (arg) < 0 + ? XINT (arg) | INT_MIN + : XINT (arg) & INT_MAX); + else if (noninteractive && (fflush (stdout) || ferror (stdout))) + exit_code = EXIT_FAILURE; + else + exit_code = EXIT_SUCCESS; + exit (exit_code); } @@ -2097,6 +2066,10 @@ shut_down_emacs (int sig, int no_x, Lisp_Object stuff) #ifdef HAVE_NS ns_term_shutdown (sig); #endif + +#ifdef HAVE_LIBXML2 + xml_cleanup_parser (); +#endif } @@ -2115,7 +2088,7 @@ You must run Emacs in batch mode in order to dump it. */) { Lisp_Object tem; Lisp_Object symbol; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); check_pure_size (); @@ -2131,7 +2104,7 @@ You must run Emacs in batch mode in order to dump it. */) { fprintf (stderr, "**************************************************\n"); fprintf (stderr, "Warning: Your system has a gap between BSS and the\n"); - fprintf (stderr, "heap (%lu bytes). This usually means that exec-shield\n", + fprintf (stderr, "heap (%"pMu" bytes). This usually means that exec-shield\n", heap_bss_diff); fprintf (stderr, "or something similar is in effect. The dump may\n"); fprintf (stderr, "fail because of this. See the section about\n"); @@ -2178,7 +2151,7 @@ You must run Emacs in batch mode in order to dump it. */) memory_warnings (my_edata, malloc_warning); } #endif /* not WINDOWSNT */ -#if defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT +#if defined (HAVE_PTHREAD) && !defined SYNC_INPUT /* Pthread may call malloc before main, and then we will get an endless loop, because pthread_self (see alloc.c) calls malloc the first time it is called on some systems. */ @@ -2251,15 +2224,18 @@ synchronize_system_messages_locale (void) } #endif /* HAVE_SETLOCALE */ -#ifndef SEPCHAR -#define SEPCHAR ':' -#endif Lisp_Object decode_env_path (const char *evarname, const char *defalt) { const char *path, *p; Lisp_Object lpath, element, tem; +#ifdef WINDOWSNT + int defaulted = 0; + const char *emacs_dir = egetenv ("emacs_dir"); + static const char *emacs_dir_env = "%emacs_dir%/"; + const size_t emacs_dir_len = strlen (emacs_dir_env); +#endif /* It's okay to use getenv here, because this function is only used to initialize variables when Emacs starts up, and isn't called @@ -2269,7 +2245,12 @@ decode_env_path (const char *evarname, const char *defalt) else path = 0; if (!path) - path = defalt; + { + path = defalt; +#ifdef WINDOWSNT + defaulted = 1; +#endif + } #ifdef DOS_NT /* Ensure values from the environment use the proper directory separator. */ if (path) @@ -2288,6 +2269,16 @@ decode_env_path (const char *evarname, const char *defalt) p = path + strlen (path); element = (p - path ? make_string (path, p - path) : build_string (".")); +#ifdef WINDOWSNT + /* Relative file names in the default path are interpreted as + being relative to $emacs_dir. */ + if (emacs_dir && defaulted + && strncmp (path, emacs_dir_env, emacs_dir_len) == 0) + element = Fexpand_file_name (Fsubstring (element, + make_number (emacs_dir_len), + Qnil), + build_string (emacs_dir)); +#endif /* Add /: to the front of the name if it would otherwise be treated as magic. */ @@ -2375,10 +2366,9 @@ from the parent process and its tty file descriptors. */) void syms_of_emacs (void) { - Qfile_name_handler_alist = intern_c_string ("file-name-handler-alist"); - staticpro (&Qfile_name_handler_alist); - Qrisky_local_variable = intern_c_string ("risky-local-variable"); - staticpro (&Qrisky_local_variable); + DEFSYM (Qfile_name_handler_alist, "file-name-handler-alist"); + DEFSYM (Qrisky_local_variable, "risky-local-variable"); + DEFSYM (Qkill_emacs, "kill-emacs"); #ifndef CANNOT_DUMP defsubr (&Sdump_emacs); @@ -2408,7 +2398,7 @@ Special values: Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix, hpux, irix, usg-unix-v) indicates some sort of Unix system. */); Vsystem_type = intern_c_string (SYSTEM_TYPE); - /* The above values are from SYSTEM_TYPE in include files under src/s. */ + /* See configure.ac (and config.nt) for the possible SYSTEM_TYPEs. */ DEFVAR_LISP ("system-configuration", Vsystem_configuration, doc: /* Value is string indicating configuration Emacs was built for. @@ -2424,7 +2414,7 @@ Emacs is running. */); doc: /* Non-nil means Emacs is running without interactive terminal. */); DEFVAR_LISP ("kill-emacs-hook", Vkill_emacs_hook, - doc: /* Hook to be run when `kill-emacs' is called. + doc: /* Hook run when `kill-emacs' is called. Since `kill-emacs' may be invoked when the terminal is disconnected (or in other similar situations), functions placed on this hook should not expect to be able to interact with the user. To ask for confirmation, @@ -2452,9 +2442,11 @@ The value is nil if that directory's name is not known. */); DEFVAR_LISP ("installation-directory", Vinstallation_directory, doc: /* A directory within which to look for the `lib-src' and `etc' directories. -This is non-nil when we can't find those directories in their standard -installed locations, but we can find them near where the Emacs executable -was found. */); +In an installed Emacs, this is normally nil. It is non-nil if +both `lib-src' (on MS-DOS, `info') and `etc' directories are found +within the variable `invocation-directory' or its parent. For example, +this is the case when running an uninstalled Emacs executable from its +build directory. */); Vinstallation_directory = Qnil; DEFVAR_LISP ("system-messages-locale", Vsystem_messages_locale,