diff -r 7e890c2d239b Doc/library/sys.rst --- a/Doc/library/sys.rst Tue Nov 29 15:54:27 2016 +0900 +++ b/Doc/library/sys.rst Tue Nov 29 17:26:04 2016 +0900 @@ -244,6 +244,9 @@ the real path to its executable, :data:`sys.executable` will be an empty string or ``None``. + .. versionchanged:: 3.7 + Included executable suffix to path, if platform has it. + .. function:: exit([arg]) diff -r 7e890c2d239b Makefile.pre.in --- a/Makefile.pre.in Tue Nov 29 15:54:27 2016 +0900 +++ b/Makefile.pre.in Tue Nov 29 17:26:04 2016 +0900 @@ -751,6 +751,7 @@ -DEXEC_PREFIX='"$(exec_prefix)"' \ -DVERSION='"$(VERSION)"' \ -DVPATH='"$(VPATH)"' \ + -DEXE_SUFFIX='"$(EXE)"' \ -o $@ $(srcdir)/Modules/getpath.c Programs/python.o: $(srcdir)/Programs/python.c diff -r 7e890c2d239b Modules/getpath.c --- a/Modules/getpath.c Tue Nov 29 15:54:27 2016 +0900 +++ b/Modules/getpath.c Tue Nov 29 17:26:04 2016 +0900 @@ -101,8 +101,9 @@ #endif -#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) -#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined" +#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || \ + !defined(VPATH) || !defined(EXE_SUFFIX) +#error "PREFIX, EXEC_PREFIX, VERSION, VPATH, and EXE_SUFFIX must be constant defined" #endif #ifndef LANDMARK @@ -254,6 +255,42 @@ wcscpy(path, buffer); } + +/* add_exe_suffix requires that progpath be allocated at least + MAXPATHLEN + 1 bytes. +*/ +static void +add_exe_suffix(wchar_t *progpath) +{ + wchar_t *_suffix = Py_DecodeLocale(EXE_SUFFIX, NULL); + if (_suffix == NULL) { + Py_FatalError("Unable to decode suffix variables in getpath.c: " + "memory error"); + } + + /* Check for already have an executable suffix */ + size_t n = wcslen(progpath); + size_t s = wcslen(_suffix); + if (wcsncasecmp(_suffix, progpath+n-s, s) != 0) { + if (n + s > MAXPATHLEN) { + Py_FatalError("progpath overflow in getpath.c's add_exe_suffix()"); + } + /* Save original path for revert */ + wchar_t orig[MAXPATHLEN+1]; + wcsncpy(orig, progpath, MAXPATHLEN); + + wcsncpy(progpath+n, _suffix, s); + progpath[n+s] = '\0'; + + if (!isxfile(progpath)) { + /* Path that added suffix is invalid */ + wcsncpy(progpath, orig, MAXPATHLEN); + } + } + PyMem_RawFree(_suffix); +} + + /* search for a prefix value in an environment file. If found, copy it to the provided buffer, which is expected to be no more than MAXPATHLEN bytes long. @@ -563,6 +600,10 @@ PyMem_RawFree(path_buffer); if (progpath[0] != SEP && progpath[0] != '\0') absolutize(progpath); + + if (EXE_SUFFIX[0] != '\0' && progpath[0] != '\0') + add_exe_suffix(progpath); + wcsncpy(argv0_path, progpath, MAXPATHLEN); argv0_path[MAXPATHLEN] = '\0';