From 31136124c7529093476b5eb8b6fcb66f53f2b0ea Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 6 Jan 2017 01:42:00 +0100 Subject: [PATCH] deploy-ng: fix issues with Python 3 / Windows / Unicode, add deploy-stubw --- direct/src/showutil/FreezeTool.py | 8 +++- makepanda/makepanda.py | 23 ++++++----- pandatool/src/deploy-stub/deploy-stub.c | 53 +++++++++++++++++++------ 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/direct/src/showutil/FreezeTool.py b/direct/src/showutil/FreezeTool.py index 78bc993f3a..1c07fdbda4 100644 --- a/direct/src/showutil/FreezeTool.py +++ b/direct/src/showutil/FreezeTool.py @@ -32,6 +32,7 @@ isDebugBuild = (python.lower().endswith('_d')) # must be frozen in any main.exe. startupModules = [ 'encodings.cp1252', 'encodings.latin_1', 'encodings.utf_8', + 'encodings.mbcs', 'encodings.cp850', ] if sys.version_info >= (3, 0): startupModules += ['io', 'marshal', 'importlib.machinery', 'importlib.util'] @@ -1683,7 +1684,10 @@ class PandaModuleFinder(modulefinder.ModuleFinder): Returns None if the module could not be found. """ if os.path.isfile(path): - return open(path, mode) + if sys.version_info >= (3, 0) and 'b' not in mode: + return open(path, mode, encoding='utf8') + else: + return open(path, mode) # Is there a zip file along the path? dir, dirname = os.path.split(path) @@ -1707,7 +1711,7 @@ class PandaModuleFinder(modulefinder.ModuleFinder): return None if sys.version_info >= (3, 0) and 'b' not in mode: - return TextIOWrapper(fp) + return TextIOWrapper(fp, encoding='utf8') return fp # Look at the parent directory. diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index a93e12fdf4..a960061f88 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -2661,16 +2661,16 @@ p3d_init = """"Python bindings for the Panda3D libraries" if GetTarget() == 'windows': p3d_init += """ -import os +if '__file__' in locals(): + import os -bindir = os.path.join(os.path.dirname(__file__), '..', 'bin') -if os.path.isfile(os.path.join(bindir, 'libpanda.dll')): - if not os.environ.get('PATH'): - os.environ['PATH'] = bindir - else: - os.environ['PATH'] = bindir + os.pathsep + os.environ['PATH'] - -del os, bindir + bindir = os.path.join(os.path.dirname(__file__), '..', 'bin') + if os.path.isfile(os.path.join(bindir, 'libpanda.dll')): + if not os.environ.get('PATH'): + os.environ['PATH'] = bindir + else: + os.environ['PATH'] = bindir + os.pathsep + os.environ['PATH'] + del os, bindir """ if not PkgSkip("PYTHON"): @@ -6384,6 +6384,11 @@ if PkgSkip("PYTHON") == 0: TargetAdd('deploy-stub.exe', input='frozen_dllmain.obj') TargetAdd('deploy-stub.exe', opts=['PYTHON', 'DEPLOYSTUB', 'NOICON']) + if GetTarget() == 'windows': + TargetAdd('deploy-stubw.exe', input='deploy-stub.obj') + TargetAdd('deploy-stubw.exe', input='frozen_dllmain.obj') + TargetAdd('deploy-stubw.exe', opts=['SUBSYSTEM:WINDOWS', 'PYTHON', 'DEPLOYSTUB', 'NOICON']) + # # Generate the models directory and samples directory # diff --git a/pandatool/src/deploy-stub/deploy-stub.c b/pandatool/src/deploy-stub/deploy-stub.c index 4a08b554ff..3a79fd6942 100644 --- a/pandatool/src/deploy-stub/deploy-stub.c +++ b/pandatool/src/deploy-stub/deploy-stub.c @@ -16,29 +16,37 @@ #endif #ifdef MS_WINDOWS +#define WIN32_LEAN_AND_MEAN +#include + extern void PyWinFreeze_ExeInit(void); extern void PyWinFreeze_ExeTerm(void); -extern DL_IMPORT(int) PyImport_ExtendInittab(struct _inittab *newtab); - static struct _inittab extensions[] = { {0, 0}, }; + +#if PY_MAJOR_VERSION >= 3 +#define WIN_UNICODE +#endif #endif static unsigned char *modblob = NULL; /* Main program */ -int -Py_FrozenMain(int argc, char **argv) +#ifdef WIN_UNICODE +int Py_FrozenMain(int argc, wchar_t **argv) +#else +int Py_FrozenMain(int argc, char **argv) +#endif { char *p; int n, sts = 1; int inspect = 0; int unbuffered = 0; -#if PY_MAJOR_VERSION >= 3 +#if PY_MAJOR_VERSION >= 3 && !defined(WIN_UNICODE) int i; char *oldloc; wchar_t **argv_copy = NULL; @@ -66,7 +74,7 @@ Py_FrozenMain(int argc, char **argv) setbuf(stderr, (char *)NULL); } -#if PY_MAJOR_VERSION >= 3 +#if PY_MAJOR_VERSION >= 3 && !defined(WIN_UNICODE) oldloc = setlocale(LC_ALL, NULL); setlocale(LC_ALL, ""); for (i = 0; i < argc; i++) { @@ -87,7 +95,7 @@ Py_FrozenMain(int argc, char **argv) #endif /* MS_WINDOWS */ if (argc >= 1) { -#if PY_MAJOR_VERSION >= 3 +#if PY_MAJOR_VERSION >= 3 && !defined(WIN_UNICODE) Py_SetProgramName(argv_copy[0]); #else Py_SetProgramName(argv[0]); @@ -103,7 +111,7 @@ Py_FrozenMain(int argc, char **argv) fprintf(stderr, "Python %s\n%s\n", Py_GetVersion(), Py_GetCopyright()); -#if PY_MAJOR_VERSION >= 3 +#if PY_MAJOR_VERSION >= 3 && !defined(WIN_UNICODE) PySys_SetArgv(argc, argv_copy); #else PySys_SetArgv(argc, argv); @@ -127,7 +135,7 @@ Py_FrozenMain(int argc, char **argv) #endif Py_Finalize(); -#if PY_MAJOR_VERSION >= 3 +#if PY_MAJOR_VERSION >= 3 && !defined(WIN_UNICODE) error: if (argv_copy2) { for (i = 0; i < argc; i++) { @@ -143,11 +151,22 @@ error: } -int -main(int argc, char *argv[]) { +#if defined(_WIN32) && PY_MAJOR_VERSION >= 3 +int wmain(int argc, wchar_t *argv[]) { +#else +int main(int argc, char *argv[]) { +#endif struct _frozen *_PyImport_FrozenModules; unsigned int listoff, modsoff, fsize, modsize, listsize, nummods, modidx; - FILE *runtime = fopen(argv[0], "rb"); + FILE *runtime; + +#ifdef _WIN32 + wchar_t buffer[2048]; + GetModuleFileNameW(NULL, buffer, 2048); + runtime = _wfopen(buffer, L"rb"); +#else + runtime = fopen(argv[0], "rb"); +#endif // Get offsets fseek(runtime, -12, SEEK_END); @@ -199,3 +218,13 @@ main(int argc, char *argv[]) { PyImport_FrozenModules = _PyImport_FrozenModules; return Py_FrozenMain(argc, argv); } + +#ifdef WIN_UNICODE +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, wchar_t *lpCmdLine, int nCmdShow) { + return wmain(__argc, __wargv); +} +#elif defined(_WIN32) +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpCmdLine, int nCmdShow) { + return main(__argc, __argv); +} +#endif