Do not have the launcher executables depend on the CRT

This commit is contained in:
Kovid Goyal 2015-12-11 00:23:48 +05:30
parent f8560f79fc
commit 897a1a137e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 23 additions and 28 deletions

View File

@ -606,16 +606,16 @@ class Win32Freeze(Command, WixMixIn):
subsys = 'WINDOWS' if typ == 'gui' else 'CONSOLE' subsys = 'WINDOWS' if typ == 'gui' else 'CONSOLE'
for mod, bname, func in zip(modules[typ], basenames[typ], for mod, bname, func in zip(modules[typ], basenames[typ],
functions[typ]): functions[typ]):
xflags = list(cflags) + ['/MT'] cflags = '/c /EHsc /MT /W3 /O1 /nologo /D_UNICODE /DUNICODE /GS-'.split()
if typ == 'gui': if typ == 'gui':
xflags += ['/DGUI_APP='] cflags += ['/DGUI_APP=']
xflags += ['/DMODULE="%s"'%mod, '/DBASENAME="%s"'%bname, cflags += ['/DMODULE="%s"'%mod, '/DBASENAME="%s"'%bname,
'/DFUNCTION="%s"'%func] '/DFUNCTION="%s"'%func]
dest = self.j(self.obj_dir, bname+'.obj') dest = self.j(self.obj_dir, bname+'.obj')
if self.newer(dest, [src]): if self.newer(dest, [src, __file__]):
self.info('Compiling', bname) self.info('Compiling', bname)
cmd = [msvc.cc] + xflags + dflags + ['/Tc'+src, '/Fo'+dest] cmd = [msvc.cc] + cflags + dflags + ['/Tc'+src, '/Fo'+dest]
self.run_builder(cmd) self.run_builder(cmd)
exe = self.j(self.base, bname+'.exe') exe = self.j(self.base, bname+'.exe')
lib = dll.replace('.dll', '.lib') lib = dll.replace('.dll', '.lib')
@ -625,10 +625,11 @@ class Win32Freeze(Command, WixMixIn):
mf = dest + '.manifest' mf = dest + '.manifest'
with open(mf, 'wb') as f: with open(mf, 'wb') as f:
f.write(EXE_MANIFEST) f.write(EXE_MANIFEST)
cmd = [msvc.linker] + ['/MACHINE:'+machine, '/LTCG', cmd = [msvc.linker] + ['/MACHINE:'+machine, '/NODEFAULTLIB', '/ENTRY:start_here',
'/LIBPATH:'+self.obj_dir, '/SUBSYSTEM:'+subsys, '/LIBPATH:'+self.obj_dir, '/SUBSYSTEM:'+subsys,
'/LIBPATH:%s/libs'%self.python_base, '/RELEASE', '/LIBPATH:%s/libs'%self.python_base, '/RELEASE',
'/MANIFEST:EMBED', '/MANIFESTINPUT:' + mf, '/MANIFEST:EMBED', '/MANIFESTINPUT:' + mf,
'user32.lib', 'kernel32.lib',
'/OUT:'+exe] + u32 + dlflags + [self.embed_resources(exe), '/OUT:'+exe] + u32 + dlflags + [self.embed_resources(exe),
dest, lib] dest, lib]
self.run_builder(cmd) self.run_builder(cmd)

View File

@ -7,7 +7,7 @@
#include<windows.h> #include<windows.h>
#include<strsafe.h> #include<strsafe.h>
size_t mystrlen(const wchar_t *buf) { static size_t mystrlen(const wchar_t *buf) {
size_t ans = 0; size_t ans = 0;
if (FAILED(StringCbLengthW(buf, 500, &ans))) return 0; if (FAILED(StringCbLengthW(buf, 500, &ans))) return 0;
return ans; return ans;
@ -23,15 +23,13 @@ static int show_error(const wchar_t *preamble, const wchar_t *msg, const int cod
} }
MessageBeep(MB_ICONERROR); MessageBeep(MB_ICONERROR);
if (FAILED(StringCbPrintfW(buf, LocalSize(buf), L"%s\r\n %s (Error Code: %d)\r\n", preamble, msg, code))) wsprintf(buf, L"%s\r\n %s (Error Code: %d)\r\n", preamble, msg, code);
MessageBox(NULL, preamble, NULL, MB_OK|MB_ICONERROR);
else
MessageBox(NULL, buf, NULL, MB_OK|MB_ICONERROR); MessageBox(NULL, buf, NULL, MB_OK|MB_ICONERROR);
LocalFree(buf); LocalFree(buf);
return code; return code;
} }
int show_last_error(wchar_t *preamble) { static int show_last_error(wchar_t *preamble) {
wchar_t *msg = NULL; wchar_t *msg = NULL;
DWORD dw = GetLastError(); DWORD dw = GetLastError();
int ret; int ret;
@ -55,11 +53,12 @@ int show_last_error(wchar_t *preamble) {
typedef int (__cdecl *ENTRYPROC)(const char*, const char*, const char*, int); typedef int (__cdecl *ENTRYPROC)(const char*, const char*, const char*, int);
static ENTRYPROC load_launcher_dll() { static ENTRYPROC load_launcher_dll() {
wchar_t buf[MAX_PATH] = {0}; wchar_t buf[MAX_PATH]; // Cannot use a zero initializer for the array as it generates an implicit call to memset()
wchar_t drive[4] = L"\0\0\0"; wchar_t drive[4] = L"\0\0\0";
DWORD sz; int i = 0;
HMODULE dll; DWORD sz = 0;
ENTRYPROC entrypoint; HMODULE dll = 0;
ENTRYPROC entrypoint = 0;
if ((sz = GetModuleFileNameW(NULL, buf, MAX_PATH)) >= MAX_PATH - 30) if ((sz = GetModuleFileNameW(NULL, buf, MAX_PATH)) >= MAX_PATH - 30)
ExitProcess(show_error(L"Installation directory path too long", L"", 1)); ExitProcess(show_error(L"Installation directory path too long", L"", 1));
@ -84,19 +83,14 @@ static ENTRYPROC load_launcher_dll() {
return entrypoint; return entrypoint;
} }
int __stdcall start_here() {
int ret = 0;
#ifdef GUI_APP #ifdef GUI_APP
// This should really be returning the value set in the WM_QUIT message, but I cannot be bothered figuring out how to get that.
int WINAPI
wWinMain(HINSTANCE Inst, HINSTANCE PrevInst, wchar_t *CmdLine, int CmdShow) {
load_launcher_dll()(BASENAME, MODULE, FUNCTION, 1); load_launcher_dll()(BASENAME, MODULE, FUNCTION, 1);
return 0; // This should really be returning the value set in the WM_QUIT message, but I cannot be bothered figuring out how to get that.
}
#else #else
ret = load_launcher_dll()(BASENAME, MODULE, FUNCTION, 0);
int wmain(int argc, wchar_t *argv) {
return load_launcher_dll()(BASENAME, MODULE, FUNCTION, 0);
}
#endif #endif
ExitProcess(ret);
return ret;
}