diff options
author | Eli Zaretskii <eliz@gnu.org> | 2019-06-24 20:06:34 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2019-06-24 20:06:34 +0300 |
commit | 9f5f5ae6386fe1ea9f31bd760d7ffd293d274502 (patch) | |
tree | ca27cef4db5fd9e02be339e8a8765b5c8dfe9342 | |
parent | 38502cd44d58a92f378b0e6915a5360f32f6f1ab (diff) | |
download | emacs-9f5f5ae6386fe1ea9f31bd760d7ffd293d274502.tar.gz emacs-9f5f5ae6386fe1ea9f31bd760d7ffd293d274502.tar.bz2 emacs-9f5f5ae6386fe1ea9f31bd760d7ffd293d274502.zip |
Fix MS-Windows build as followup to pdumper executable lookup
* src/w32.c (w32_my_exename): New function.
* src/w32.h (w32_my_exename): Add prototype.
* src/emacs.c (load_pdump_find_executable) [WINDOWSNT]: Find
the actual file name of the program without looking along
PATH, by calling w32_my_exename.
* nt/mingw-cfg.site (ac_cv_func_canonicalize_file_name)
(ac_cv_func_realpath, gl_cv_func_realpath_works): Disable
testing.
* nt/gnulib-cfg.mk (OMIT_GNULIB_MODULE_canonicalize-lgpl): Set
to true.
-rw-r--r-- | nt/gnulib-cfg.mk | 1 | ||||
-rw-r--r-- | nt/mingw-cfg.site | 4 | ||||
-rw-r--r-- | src/emacs.c | 26 | ||||
-rw-r--r-- | src/w32.c | 15 | ||||
-rw-r--r-- | src/w32.h | 1 |
5 files changed, 46 insertions, 1 deletions
diff --git a/nt/gnulib-cfg.mk b/nt/gnulib-cfg.mk index 09cd5822578..91f30ec7149 100644 --- a/nt/gnulib-cfg.mk +++ b/nt/gnulib-cfg.mk @@ -62,3 +62,4 @@ OMIT_GNULIB_MODULE_sys_stat = true OMIT_GNULIB_MODULE_sys_time = true OMIT_GNULIB_MODULE_sys_types = true OMIT_GNULIB_MODULE_unistd = true +OMIT_GNULIB_MODULE_canonicalize-lgpl = true diff --git a/nt/mingw-cfg.site b/nt/mingw-cfg.site index e15d14cc392..dfdca3926f9 100644 --- a/nt/mingw-cfg.site +++ b/nt/mingw-cfg.site @@ -86,6 +86,10 @@ gl_cv_func_readlink_works=yes gl_cv_func_symlink_works=yes ac_cv_func_readlinkat=yes ac_cv_func_faccessat=yes +# Avoid compiling Gnulib's canonicalize-lgpl.c, which fails +ac_cv_func_canonicalize_file_name=yes +ac_cv_func_realpath="not-needed" +gl_cv_func_realpath_works="no-but-not-needed-so-yes" # Implemented in w32.c ac_cv_func_fcntl=yes gl_cv_func_fcntl_f_dupfd_cloexec=yes diff --git a/src/emacs.c b/src/emacs.c index a26eacbe786..1ddd10b8051 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -715,6 +715,24 @@ static enum pdumper_load_result load_pdump_find_executable (const char* argv0, char **exename) { enum pdumper_load_result result; +#ifdef WINDOWSNT + result = PDUMPER_LOAD_ERROR; + *exename = NULL; + char *prog_fname = w32_my_exename (); + if (prog_fname) + { + result = PDUMPER_LOAD_OOM; + /* Use xstrdup, so as to call our private implementation of + malloc, since the caller calls our free. */ + char *ret = xstrdup (prog_fname); + if (ret) + { + *exename = ret; + result = PDUMPER_LOAD_SUCCESS; + } + } + return result; +#else /* !WINDOWSNT */ char *candidate = NULL; /* If the executable name contains a slash, we have some kind of @@ -784,6 +802,7 @@ load_pdump_find_executable (const char* argv0, char **exename) out: free (candidate); return result; +#endif /* !WINDOWSNT */ } static enum pdumper_load_result @@ -848,10 +867,15 @@ load_pdump (int argc, char **argv) the dump in the hardcoded location. */ if (exename) { +#ifdef WINDOWSNT + real_exename = exename; + exename = NULL; +#else real_exename = realpath (exename, NULL); if (!real_exename) fatal ("could not resolve realpath of \"%s\": %s", exename, strerror (errno)); +#endif size_t real_exename_length = strlen (real_exename); if (strip_suffix) { @@ -920,7 +944,7 @@ load_pdump (int argc, char **argv) + strlen (suffix) + 1); #ifdef DOS_NT - argv0_len = strlen (argv0_base); + size_t argv0_len = strlen (argv0_base); if (argv0_len >= 4 && c_strcasecmp (argv0_base + argv0_len - 4, ".exe") == 0) sprintf (dump_file, "%s%c%.*s%s", path_exec, DIRECTORY_SEP, diff --git a/src/w32.c b/src/w32.c index 833ff4c7e4a..b2d1ffcf82b 100644 --- a/src/w32.c +++ b/src/w32.c @@ -9988,6 +9988,21 @@ w32_relocate (const char *epath_dir) return epath_dir; } +/* Return the full absolute name of the running executable. + + Note: this function is called early during startup, when Unicode + file name are not yet supported. */ +char * +w32_my_exename (void) +{ + static char exename[MAX_PATH]; + if (!GetModuleFileNameA (NULL, exename, MAX_PATH)) + return NULL; + /* FIXME: Resolve possible symlinks in the last component of + exename, i.e. if the executable itself is a symlink. */ + return exename; +} + /* globals_of_w32 is used to initialize those global variables that must always be initialized on startup even when the global variable diff --git a/src/w32.h b/src/w32.h index 3790583bfc8..3ef78ecdee2 100644 --- a/src/w32.h +++ b/src/w32.h @@ -185,6 +185,7 @@ extern MultiByteToWideChar_Proc pMultiByteToWideChar; extern WideCharToMultiByte_Proc pWideCharToMultiByte; extern DWORD multiByteToWideCharFlags; +extern char *w32_my_exename (void); extern const char *w32_relocate (const char *); extern void init_environment (char **); |