changeset 4605:a62c4469e2aa

nsis: update to version 3.03
author John W. Eaton <jwe@octave.org>
date Mon, 26 Feb 2018 10:34:17 -0500
parents db65981db893
children 86c3c1fd16f1
files dist-files.mk src/nsis-1-fixes.patch src/nsis-2-fixes.patch src/nsis.mk
diffstat 4 files changed, 50 insertions(+), 644 deletions(-) [+]
line wrap: on
line diff
--- a/dist-files.mk	Sat Feb 24 10:27:33 2018 -0500
+++ b/dist-files.mk	Mon Feb 26 10:34:17 2018 -0500
@@ -438,6 +438,7 @@
   nettle.mk \
   npp.mk \
   nsis-1-fixes.patch \
+  nsis-2-fixes.patch \
   nsis.mk \
   ocaml-core-1-fixes.patch \
   ocaml-core-test.ml \
@@ -710,7 +711,6 @@
   wavpack-1-exec_prefix.patch \
   wavpack.mk \
   wget.mk \
-  win64-nsis.patch \
   win7appid.mk \
   winpcap-1-fixes.patch \
   winpcap.mk \
--- a/src/nsis-1-fixes.patch	Sat Feb 24 10:27:33 2018 -0500
+++ b/src/nsis-1-fixes.patch	Mon Feb 26 10:34:17 2018 -0500
@@ -1,12 +1,11 @@
-This file is part of MXE.
-See index.html for further information.
+This file is part of MXE. See LICENSE.md for licensing information.
 
 Contains ad hoc patches for cross building.
 
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Mark Brand <mabrand@mabrand.nl>
 Date: Sun, 12 Aug 2012 12:33:26 +0200
-Subject: [PATCH] explicit mingw cross prefix
+Subject: [PATCH 1/1] explicit mingw cross prefix
 
 This patch has been taken from:
 http://sourceforge.net/tracker/index.php?func=detail&aid=3305366&group_id=22049&atid=373085
@@ -15,642 +14,34 @@
 index 1111111..2222222 100755
 --- a/SCons/Tools/crossmingw.py
 +++ b/SCons/Tools/crossmingw.py
-@@ -61,6 +61,9 @@ prefixes = SCons.Util.Split("""
+@@ -65,6 +65,9 @@ prefixes = SCons.Util.Split("""
  """)
  
  def find(env):
 +    if env.has_key('MINGW_CROSS_PREFIX'):
 +        return env['MINGW_CROSS_PREFIX']
 +
-     for prefix in prefixes:
-         # First search in the SCons path and then the OS path:
-         if env.WhereIs(prefix + 'gcc') or SCons.Util.WhereIs(prefix + 'gcc'):
+     # Explicitly specified toolchain to build Windows executables
+     # takes predominance.
+     prefix = SCons.Script.ARGUMENTS.get('XGCC_W32_PREFIX', None)
 diff --git a/SConstruct b/SConstruct
 index 1111111..2222222 100755
 --- a/SConstruct
 +++ b/SConstruct
-@@ -59,6 +59,7 @@ doc = [
- 
+@@ -67,6 +67,7 @@ doctypes = [
  path = ARGUMENTS.get('PATH', '')
  toolset = ARGUMENTS.get('TOOLSET', '')
+ arch = ARGUMENTS.get('TARGET_ARCH', 'x86')
 +mingw_cross_prefix = ARGUMENTS.get('MINGW_CROSS_PREFIX', '')
  
  if toolset and path:
- 	defenv = Environment(ENV = {'PATH' : path}, TOOLS = toolset.split(',') + ['zip'])
-@@ -69,6 +70,8 @@ else:
- 		defenv = Environment(TOOLS = toolset.split(',') + ['zip'])
+ 	defenv = Environment(TARGET_ARCH = arch, ENV = {'PATH' : path}, TOOLS = toolset.split(',') + ['zip'])
+@@ -77,6 +78,8 @@ else:
+ 		defenv = Environment(TARGET_ARCH = arch, TOOLS = toolset.split(',') + ['zip'])
  if not toolset and not path:
- 	defenv = Environment()
+ 	defenv = Environment(TARGET_ARCH = arch)
 +if mingw_cross_prefix:
 +	defenv['MINGW_CROSS_PREFIX'] = mingw_cross_prefix
  
  Export('defenv')
  
-
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: freeman <free.man.uu@gmail.com>
-Date: Sun, 12 Aug 2012 12:36:39 +0200
-Subject: [PATCH] add missing header
-
-
-diff --git a/Source/util.h b/Source/util.h
-index 1111111..2222222 100755
---- a/Source/util.h
-+++ b/Source/util.h
-@@ -25,6 +25,7 @@
- #ifndef _WIN32
- #  include <iconv.h>
- #  include <stdio.h>
-+#  include <unistd.h>
- #endif
- 
- 
-
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Tony Theodore <tonyt@logyst.com>
-Date: Fri, 3 May 2013 17:28:44 +1000
-Subject: [PATCH] Enable native 64-bit build
-
-Taken from:
-http://anonscm.debian.org/gitweb/?p=collab-maint/nsis.git;a=blob;f=debian/patches/makensis_native_64bit.patch;h=2256a0e193db894dd99507ac0de66f8ae060b46b;hb=HEAD
-
-diff --git a/SCons/Config/gnu b/SCons/Config/gnu
-index 1111111..2222222 100755
---- a/SCons/Config/gnu
-+++ b/SCons/Config/gnu
-@@ -95,8 +95,6 @@ makensis_env.Append(CXXFLAGS = ['-Wno-non-virtual-dtor']) # ignore virtual dtor
- makensis_env.Append(CXXFLAGS = ['-Wall'])                 # all warnings
- 
- conf = FlagsConfigure(makensis_env)
--conf.CheckCompileFlag('-m32')                     #
--conf.CheckLinkFlag('-m32')                        #
- conf.CheckLinkFlag('$MAP_FLAG')                   # generate map file
- if not defenv['DEBUG'] and defenv['STRIP'] and defenv['STRIP_CP']:
- 	TestStrip(conf)                                 # strip
-@@ -149,8 +147,6 @@ conf.Finish()
- ### cross-platform util environment adjustments
- 
- conf = FlagsConfigure(cp_util_env)
--conf.CheckCompileFlag('-m32')
--conf.CheckLinkFlag('-m32')
- if not defenv['DEBUG'] and defenv['STRIP'] and defenv['STRIP_CP']:
- 	TestStrip(conf)                                 # strip
- conf.Finish()
-@@ -160,8 +156,6 @@ conf.Finish()
- test_env = defenv.Clone()
- test_env.Append(CPPPATH = ['#$BUILD_CONFIG'])
- conf = FlagsConfigure(test_env)
--conf.CheckCompileFlag('-m32')
--conf.CheckLinkFlag('-m32')
- conf.Finish()
- 
- ### weird GCC requirements
-diff --git a/Source/DialogTemplate.cpp b/Source/DialogTemplate.cpp
-index 1111111..2222222 100755
---- a/Source/DialogTemplate.cpp
-+++ b/Source/DialogTemplate.cpp
-@@ -74,7 +74,7 @@ void ReadVarLenArr(LPBYTE &seeker, WCHAR* &readInto, unsigned int uCodePage) {
-     if (IS_INTRESOURCE(x)) { \
-       *(WORD*)seeker = 0xFFFF; \
-       seeker += sizeof(WORD); \
--      *(WORD*)seeker = ConvertEndianness(WORD(DWORD(x))); \
-+      *(WORD*)seeker = ConvertEndianness(WORD((ULONG_PTR)(x))); \
-       seeker += sizeof(WORD); \
-     } \
-     else { \
-@@ -444,7 +444,7 @@ void CDialogTemplate::ConvertToRTL() {
-       szClass = winchar_toansi(m_vItems[i]->szClass);
- 
-     // Button
--    if (long(m_vItems[i]->szClass) == 0x80) {
-+    if ((ULONG_PTR)(m_vItems[i]->szClass) == 0x80) {
-       m_vItems[i]->dwStyle ^= BS_LEFTTEXT;
-       m_vItems[i]->dwStyle ^= BS_RIGHT;
-       m_vItems[i]->dwStyle ^= BS_LEFT;
-@@ -458,13 +458,13 @@ void CDialogTemplate::ConvertToRTL() {
-       }
-     }
-     // Edit
--    else if (long(m_vItems[i]->szClass) == 0x81) {
-+    else if ((ULONG_PTR)(m_vItems[i]->szClass) == 0x81) {
-       if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) {
-         m_vItems[i]->dwStyle ^= ES_RIGHT;
-       }
-     }
-     // Static
--    else if (long(m_vItems[i]->szClass) == 0x82) {
-+    else if ((ULONG_PTR)(m_vItems[i]->szClass) == 0x82) {
-       if ((m_vItems[i]->dwStyle & SS_TYPEMASK) == SS_LEFT || (m_vItems[i]->dwStyle & SS_TYPEMASK) == SS_LEFTNOWORDWRAP)
-       {
-         m_vItems[i]->dwStyle &= ~SS_TYPEMASK;
-@@ -571,7 +571,7 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
-   // Write all of the items
-   for (unsigned int i = 0; i < m_vItems.size(); i++) {
-     // DLGITEMTEMPLATE[EX]s must be aligned on DWORD boundary
--    if (DWORD(seeker - pbDlg) % sizeof(DWORD))
-+    if ((seeker - pbDlg) % sizeof(DWORD))
-       seeker += sizeof(WORD);
- 
-     if (m_bExtended) {
-@@ -622,7 +622,7 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
-     }
-   }
- 
--  assert((DWORD) seeker - (DWORD) pbDlg == dwSize);
-+  assert((DWORD)(seeker - pbDlg) == dwSize);
- 
-   // DONE!
-   return pbDlg;
-diff --git a/Source/Platform.h b/Source/Platform.h
-index 1111111..2222222 100755
---- a/Source/Platform.h
-+++ b/Source/Platform.h
-@@ -53,6 +53,7 @@ typedef unsigned char UCHAR;
- typedef const char *LPCCH, *PCSTR, *LPCSTR;
- typedef unsigned short WCHAR, OLECHAR, *PWCHAR, *LPWCH, *PWCH, *NWPSTR, *LPWSTR, *PWSTR, *BSTR;
- typedef const unsigned short *LPCWCH, *PCWCH, *LPCWSTR, *PCWSTR, *LPCOLESTR;
-+typedef int INT_PTR;
- typedef unsigned int UINT_PTR;
- // basic stuff
- typedef void * HANDLE;
-@@ -60,8 +61,8 @@ typedef HANDLE HWND;
- typedef HANDLE HMODULE;
- typedef unsigned long HKEY;
- // some gdi
--typedef unsigned long COLORREF;
--typedef unsigned long HBRUSH;
-+typedef DWORD COLORREF;
-+typedef UINT32 HBRUSH;
- // bool
- #  define FALSE 0
- #  define TRUE 1
-@@ -166,7 +167,7 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
- #    define MAKEINTRESOURCE MAKEINTRESOURCEA
- #  endif
- #  ifndef IMAGE_FIRST_SECTION
--#    define IMAGE_FIRST_SECTION(h) ( PIMAGE_SECTION_HEADER( (DWORD) h + \
-+#    define IMAGE_FIRST_SECTION(h) ( PIMAGE_SECTION_HEADER( (ULONG_PTR) h + \
-                                      FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) + \
-                                      FIX_ENDIAN_INT16(PIMAGE_NT_HEADERS(h)->FileHeader.SizeOfOptionalHeader) ) )
- #  endif
-@@ -174,7 +175,7 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
- #    define RGB(r,g,b) ((DWORD)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16)))
- #  endif
- #  ifndef MAKELONG
--#    define MAKELONG(a,b) ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
-+#    define MAKELONG(a,b) ((DWORD)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
- #  endif
- #endif
- #ifndef IS_INTRESOURCE
-@@ -197,8 +198,10 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
- #  define FOF_NOERRORUI 0x0400
- #endif
- 
--#ifndef ULONG_PTR
--#  define ULONG_PTR DWORD
-+// mingw32 and w64-mingw32 do not define ULONG_PTR
-+// but rather declare ULONG_PTR via typedef (see basetsd.h)
-+#if !defined(__MINGW32__) && !defined(ULONG_PTR)
-+#  define ULONG_PTR unsigned long
- #endif
- 
- #ifndef IDC_HAND
-@@ -238,7 +241,7 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
- #  undef INVALID_FILE_ATTRIBUTES
- #endif
- #ifndef INVALID_FILE_ATTRIBUTES
--#  define INVALID_FILE_ATTRIBUTES ((unsigned long) -1)
-+#  define INVALID_FILE_ATTRIBUTES ((DWORD) -1)
- #endif
- 
- // shell folders
-diff --git a/Source/Plugins.cpp b/Source/Plugins.cpp
-index 1111111..2222222 100755
---- a/Source/Plugins.cpp
-+++ b/Source/Plugins.cpp
-@@ -29,7 +29,7 @@
- #include "dirreader.h"
- 
- #ifdef _WIN32
--#  include <WinNT.h>
-+#  include <winnt.h>
- #else
- #  include <sys/stat.h>
- #endif
-@@ -136,8 +136,8 @@ void Plugins::GetExports(const string &pathToDll, bool displayInfo)
-         DWORD prd = FIX_ENDIAN_INT32(sections[i].PointerToRawData);
-         PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(&dlldata[0] + prd + ExportDirVA - va);
-         DWORD na = FIX_ENDIAN_INT32(exports->AddressOfNames);
--        unsigned long *names = (unsigned long*)((unsigned long) exports + (char *) na - ExportDirVA);
--        for (unsigned long j = 0; j < FIX_ENDIAN_INT32(exports->NumberOfNames); j++)
-+        LPDWORD names = (LPDWORD)((ULONG_PTR)exports + na - ExportDirVA);
-+        for (DWORD j = 0; j < FIX_ENDIAN_INT32(exports->NumberOfNames); j++)
-         {
-           const string name = string((char*)exports + FIX_ENDIAN_INT32(names[j]) - ExportDirVA);
-           const string signature = dllName + "::" + name;
-diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp
-index 1111111..2222222 100755
---- a/Source/ResourceEditor.cpp
-+++ b/Source/ResourceEditor.cpp
-@@ -27,20 +27,10 @@ using namespace std;
- #define ALIGN(dwToAlign, dwAlignOn) dwToAlign = (dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn
- #define RALIGN(dwToAlign, dwAlignOn) ((dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn)
- 
--#ifndef _WIN32
--static inline ULONG ConvertEndianness(ULONG u) {
--  return FIX_ENDIAN_INT32(u);
--}
--#endif
--
- static inline DWORD ConvertEndianness(DWORD d) {
-   return FIX_ENDIAN_INT32(d);
- }
- 
--static inline LONG ConvertEndianness(LONG l) {
--  return FIX_ENDIAN_INT32(l);
--}
--
- static inline WORD ConvertEndianness(WORD w) {
-   return FIX_ENDIAN_INT16(w);
- }
-@@ -52,7 +42,7 @@ PIMAGE_NT_HEADERS CResourceEditor::GetNTHeaders(BYTE* pbPE) {
-     throw runtime_error("PE file contains invalid DOS header");
- 
-   // Get NT headers
--  PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(pbPE + ConvertEndianness(dosHeader->e_lfanew));
-+  PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(pbPE + ConvertEndianness((DWORD)dosHeader->e_lfanew));
-   if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)
-     throw runtime_error("PE file missing NT signature");
- 
-@@ -684,7 +674,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
-     rdDir.NumberOfIdEntries = ConvertEndianness(rdDir.NumberOfIdEntries);
- 
-     CopyMemory(seeker, &rdDir, sizeof(IMAGE_RESOURCE_DIRECTORY));
--    crd->m_dwWrittenAt = DWORD(seeker);
-+    crd->m_ulWrittenAt = (ULONG_PTR)(seeker);
-     seeker += sizeof(IMAGE_RESOURCE_DIRECTORY);
- 
-     for (int i = 0; i < crd->CountEntries(); i++) {
-@@ -705,7 +695,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
-       rDirE.UName.NameString.NameIsString = (crd->GetEntry(i)->HasName()) ? 1 : 0;
- 
-       CopyMemory(seeker, &rDirE, sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY));
--      crd->GetEntry(i)->m_dwWrittenAt = DWORD(seeker);
-+      crd->GetEntry(i)->m_ulWrittenAt = (ULONG_PTR)(seeker);
-       seeker += sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY);
-     }
-     qDirs.pop();
-@@ -721,7 +711,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
-     rDataE.Size = ConvertEndianness(cRDataE->GetSize());
- 
-     CopyMemory(seeker, &rDataE, sizeof(IMAGE_RESOURCE_DATA_ENTRY));
--    cRDataE->m_dwWrittenAt = DWORD(seeker);
-+    cRDataE->m_ulWrittenAt = (ULONG_PTR)(seeker);
-     seeker += sizeof(IMAGE_RESOURCE_DATA_ENTRY);
- 
-     qDataEntries.pop();
-@@ -733,7 +723,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
-   while (!qStrings.empty()) {
-     CResourceDirectoryEntry* cRDirE = qStrings.front();
- 
--    PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_dwWrittenAt)->UName.NameString.NameOffset = ConvertEndianness(DWORD(seeker) - DWORD(pbRsrcSec));
-+    PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_ulWrittenAt)->UName.NameString.NameOffset = ConvertEndianness((DWORD) (seeker - pbRsrcSec));
- 
-     WCHAR* szName = cRDirE->GetName();
-     WORD iLen = winchar_strlen(szName) + 1;
-@@ -754,7 +744,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
-   while (!qDataEntries2.empty()) {
-     CResourceDataEntry* cRDataE = qDataEntries2.front();
-     CopyMemory(seeker, cRDataE->GetData(), cRDataE->GetSize());
--    PIMAGE_RESOURCE_DATA_ENTRY(cRDataE->m_dwWrittenAt)->OffsetToData = ConvertEndianness(seeker - pbRsrcSec + m_dwResourceSectionVA);
-+    PIMAGE_RESOURCE_DATA_ENTRY(cRDataE->m_ulWrittenAt)->OffsetToData = ConvertEndianness((DWORD)(seeker - pbRsrcSec) + m_dwResourceSectionVA);
- 
-     seeker += RALIGN(cRDataE->GetSize(), 8);
- 
-@@ -764,21 +754,21 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
-   /*
-    * Set all of the directory entries offsets.
-    */
--  SetOffsets(m_cResDir, DWORD(pbRsrcSec));
-+  SetOffsets(m_cResDir, (ULONG_PTR)(pbRsrcSec));
- }
- 
- // Sets the offsets in directory entries
--void CResourceEditor::SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt) {
-+void CResourceEditor::SetOffsets(CResourceDirectory* resDir, ULONG_PTR newResDirAt) {
-   for (int i = 0; i < resDir->CountEntries(); i++) {
--    PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY rde = PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt);
-+    PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY rde = PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_ulWrittenAt);
-     if (resDir->GetEntry(i)->IsDataDirectory()) {
-       rde->UOffset.DirectoryOffset.DataIsDirectory = 1;
--      rde->UOffset.DirectoryOffset.OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_dwWrittenAt - newResDirAt;
-+      rde->UOffset.DirectoryOffset.OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_ulWrittenAt - newResDirAt;
-       rde->UOffset.OffsetToData = ConvertEndianness(rde->UOffset.OffsetToData);
-       SetOffsets(resDir->GetEntry(i)->GetSubDirectory(), newResDirAt);
-     }
-     else {
--      rde->UOffset.OffsetToData = ConvertEndianness(resDir->GetEntry(i)->GetDataEntry()->m_dwWrittenAt - newResDirAt);
-+      rde->UOffset.OffsetToData = ConvertEndianness((DWORD)(resDir->GetEntry(i)->GetDataEntry()->m_ulWrittenAt - newResDirAt));
-     }
-   }
- }
-@@ -887,7 +877,7 @@ int CResourceDirectory::CountEntries() {
- // Returns -1 if can not be found
- int CResourceDirectory::Find(WCHAR* szName) {
-   if (IS_INTRESOURCE(szName))
--    return Find((WORD) (DWORD) szName);
-+    return Find((WORD) (ULONG_PTR) szName);
-   else
-     if (szName[0] == '#')
-       return Find(WORD(winchar_stoi(szName + 1)));
-@@ -965,7 +955,7 @@ CResourceDirectoryEntry::CResourceDirectoryEntry(WCHAR* szName, CResourceDirecto
-   if (IS_INTRESOURCE(szName)) {
-     m_bHasName = false;
-     m_szName = 0;
--    m_wId = (WORD) (DWORD) szName;
-+    m_wId = (WORD) (ULONG_PTR) szName;
-   }
-   else {
-     m_bHasName = true;
-@@ -979,7 +969,7 @@ CResourceDirectoryEntry::CResourceDirectoryEntry(WCHAR* szName, CResourceDataEnt
-   if (IS_INTRESOURCE(szName)) {
-     m_bHasName = false;
-     m_szName = 0;
--    m_wId = (WORD) (DWORD) szName;
-+    m_wId = (WORD) (ULONG_PTR) szName;
-   }
-   else {
-     m_bHasName = true;
-diff --git a/Source/ResourceEditor.h b/Source/ResourceEditor.h
-index 1111111..2222222 100755
---- a/Source/ResourceEditor.h
-+++ b/Source/ResourceEditor.h
-@@ -27,7 +27,7 @@
- 
- #include "Platform.h"
- #ifdef _WIN32
--#  include <WinNT.h>
-+#  include <winnt.h>
- #else
- // all definitions for non Win32 platforms were taken from MinGW's free Win32 library
- #  define IMAGE_DIRECTORY_ENTRY_RESOURCE  2
-@@ -156,7 +156,7 @@ private:
-   CResourceDirectory* ScanDirectory(PRESOURCE_DIRECTORY rdRoot, PRESOURCE_DIRECTORY rdToScan);
- 
-   void WriteRsrcSec(BYTE* pbRsrcSec);
--  void SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt);
-+  void SetOffsets(CResourceDirectory* resDir, ULONG_PTR newResDirAt);
- 
-   DWORD AdjustVA(DWORD dwVirtualAddress, DWORD dwAdjustment);
-   DWORD AlignVA(DWORD dwVirtualAddress);
-@@ -180,7 +180,7 @@ public:
- 
-   void Destroy();
- 
--  DWORD m_dwWrittenAt;
-+  ULONG_PTR m_ulWrittenAt;
- 
- private:
-   IMAGE_RESOURCE_DIRECTORY m_rdDir;
-@@ -204,7 +204,7 @@ public:
- 
-   CResourceDataEntry* GetDataEntry();
- 
--  DWORD m_dwWrittenAt;
-+  ULONG_PTR m_ulWrittenAt;
- 
- private:
-   bool m_bHasName;
-@@ -232,7 +232,7 @@ public:
-   DWORD GetCodePage();
-   DWORD GetOffset();
- 
--  DWORD m_dwWrittenAt;
-+  ULONG_PTR m_ulWrittenAt;
- 
- private:
-   BYTE* m_pbData;
-diff --git a/Source/ResourceVersionInfo.cpp b/Source/ResourceVersionInfo.cpp
-index 1111111..2222222 100755
---- a/Source/ResourceVersionInfo.cpp
-+++ b/Source/ResourceVersionInfo.cpp
-@@ -146,7 +146,7 @@ int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType)
-     p += sizeof(WORD);
-     szKey = (WCHAR*)p;
-     p += (winchar_strlen(szKey) + 1) * sizeof (WCHAR);
--    while ( ((long)p % 4) != 0 )
-+    while ( ((ULONG_PTR)p % 4) != 0 )
-         p++;
-     return p - baseP;    
- }
-diff --git a/Source/fileform.cpp b/Source/fileform.cpp
-index 1111111..2222222 100755
---- a/Source/fileform.cpp
-+++ b/Source/fileform.cpp
-@@ -149,7 +149,7 @@ void ctlcolors_writer::write(const ctlcolors *data)
-   m_sink->write_int(data->text);
-   m_sink->write_int(data->bkc);
-   m_sink->write_int(data->lbStyle);
--  m_sink->write_int((int) data->bkb);
-+  m_sink->write_int((INT_PTR) data->bkb);
-   m_sink->write_int(data->bkmode);
-   m_sink->write_int(data->flags);
- }
-diff --git a/Source/mmap.cpp b/Source/mmap.cpp
-index 1111111..2222222 100755
---- a/Source/mmap.cpp
-+++ b/Source/mmap.cpp
-@@ -322,7 +322,7 @@ void MMapFile::release(void *pView, int size)
-   if (!pView)
-     return;
- 
--  unsigned int alignment = ((unsigned int)pView) % m_iAllocationGranularity;
-+  unsigned int alignment = ((ULONG_PTR)pView) % m_iAllocationGranularity;
-   pView = (char *)pView - alignment;
-   size += alignment;
- #ifdef _WIN32
-diff --git a/Source/script.cpp b/Source/script.cpp
-index 1111111..2222222 100755
---- a/Source/script.cpp
-+++ b/Source/script.cpp
-@@ -2129,7 +2129,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
-         int k=line.gettoken_enum(1,rootkeys[0]);
-         if (k == -1) k=line.gettoken_enum(1,rootkeys[1]);
-         if (k == -1) PRINTHELP()
--        build_header.install_reg_rootkey=(int)rootkey_tab[k];
-+        build_header.install_reg_rootkey=(INT_PTR)rootkey_tab[k];
-         if (!build_header.install_reg_rootkey) PRINTHELP() // SHCTX is invalid here
-         build_header.install_reg_key_ptr = add_string(line.gettoken_str(2),0);
-         if (line.gettoken_str(2)[0] == '\\')
-@@ -5184,7 +5184,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
-         int k=line.gettoken_enum(2,rootkeys[0]);
-         if (k == -1) k=line.gettoken_enum(2,rootkeys[1]);
-         if (ent.offsets[0] == -1 || k == -1) PRINTHELP()
--        ent.offsets[1]=(int)rootkey_tab[k];
-+        ent.offsets[1]=(INT_PTR)rootkey_tab[k];
-         ent.offsets[2]=add_string(line.gettoken_str(3));
-         ent.offsets[3]=add_string(line.gettoken_str(4));
-         if (which_token == TOK_READREGDWORD) ent.offsets[4]=1;
-@@ -5216,7 +5216,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
-         if (k == -1) k=line.gettoken_enum(a,rootkeys[1]);
-         if (k == -1) PRINTHELP()
-         ent.which=EW_DELREG;
--        ent.offsets[1]=(int)rootkey_tab[k];
-+        ent.offsets[1]=(INT_PTR)rootkey_tab[k];
-         ent.offsets[2]=add_string(line.gettoken_str(a+1));
-         ent.offsets[3]=(which_token==TOK_DELETEREGKEY)?0:add_string(line.gettoken_str(a+2));
-         if (line.gettoken_str(a+1)[0] == '\\')
-@@ -5236,7 +5236,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
-         if (k == -1) k=line.gettoken_enum(1,rootkeys[1]);
-         if (k == -1) PRINTHELP()
-         ent.which=EW_WRITEREG;
--        ent.offsets[0]=(int)rootkey_tab[k];
-+        ent.offsets[0]=(INT_PTR)rootkey_tab[k];
-         ent.offsets[1]=add_string(line.gettoken_str(2));
-         if (line.gettoken_str(2)[0] == '\\')
-           warning_fl("%s: registry path name begins with \'\\\', may cause problems",line.gettoken_str(0));
-@@ -5305,7 +5305,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
-         int k=line.gettoken_enum(2,rootkeys[0]);
-         if (k == -1) k=line.gettoken_enum(2,rootkeys[1]);
-         if (ent.offsets[0] == -1 || k == -1) PRINTHELP()
--        ent.offsets[1]=(int)rootkey_tab[k];
-+        ent.offsets[1]=(INT_PTR)rootkey_tab[k];
-         ent.offsets[2]=add_string(line.gettoken_str(3));
-         ent.offsets[3]=add_string(line.gettoken_str(4));
-         ent.offsets[4]=which_token == TOK_ENUMREGKEY;
-diff --git a/Source/util.cpp b/Source/util.cpp
-index 1111111..2222222 100755
---- a/Source/util.cpp
-+++ b/Source/util.cpp
-@@ -77,9 +77,9 @@ int update_bitmap(CResourceEditor* re, WORD id, const char* filename, int width/
-   }
- 
-   if (width != 0) {
--    LONG biWidth;
-+    INT32 biWidth;
-     fseek(f, 18, SEEK_SET); // Seek to the width member of the header
--    fread(&biWidth, sizeof(LONG), 1, f);
-+    fread(&biWidth, sizeof(INT32), 1, f);
-     FIX_ENDIAN_INT32_INPLACE(biWidth);
-     if (width != biWidth) {
-       fclose(f);
-@@ -88,9 +88,9 @@ int update_bitmap(CResourceEditor* re, WORD id, const char* filename, int width/
-   }
- 
-   if (height != 0) {
--    LONG biHeight;
-+    INT32 biHeight;
-     fseek(f, 22, SEEK_SET); // Seek to the height member of the header
--    fread(&biHeight, sizeof(LONG), 1, f);
-+    fread(&biHeight, sizeof(INT32), 1, f);
-     FIX_ENDIAN_INT32_INPLACE(biHeight);
-     // Bitmap height can be negative too...
-     if (height != abs(biHeight)) {
-@@ -689,8 +689,8 @@ static BOOL GetVxdVersion( LPCSTR szFile, LPDWORD lpdwLen, LPVOID lpData )
-   }
- 
-   // Find the beginning of the NT header at offset e_lfanew.
--  pNtExeHdr = (PIMAGE_NT_HEADERS) ( (DWORD) pView
--       + (DWORD) pDosExeHdr->e_lfanew );
-+  pNtExeHdr = (PIMAGE_NT_HEADERS) ( (ULONG_PTR) pView
-+       + pDosExeHdr->e_lfanew );
- 
-   // Check to make sure the file is a VxD.
-   if ( (DWORD) pNtExeHdr->Signature != IMAGE_VXD_SIGNATURE ) 
-@@ -728,8 +728,8 @@ static BOOL GetVxdVersion( LPCSTR szFile, LPDWORD lpdwLen, LPVOID lpData )
-   }
- 
-   // e32_winresoff contains the offset of the resource in the VxD.
--  pVerRes = (VXD_VERSION_RESOURCE *) ( (DWORD) pView
--       + (DWORD) pLEHdr->e32_winresoff );
-+  pVerRes = (VXD_VERSION_RESOURCE *) ( (ULONG_PTR) pView
-+       + pLEHdr->e32_winresoff );
-   dwSize = pVerRes->dwResSize;
-   pRawRes = &(pVerRes->bVerData);
- 
-@@ -780,7 +780,7 @@ static DWORD GetVxdVersionInfoSize( LPCSTR szFile )
- 
-     // GetVxdVersion() will fail with ERROR_INSUFFICIENT_BUFFER and
-     // the required buffer size will be returned in dwResult.
--    if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) 
-+    if ( dwError == ERROR_INSUFFICIENT_BUFFER ) 
-     {
-       SetLastError( 0 );
-       return dwResult;
-
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Tony Theodore <tonyt@logyst.com>
-Date: Thu, 9 May 2013 13:08:59 +1000
-Subject: [PATCH] i686-w64-mingw32 fixes
-
-
-diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp
-index 1111111..2222222 100755
---- a/Contrib/InstallOptions/InstallerOptions.cpp
-+++ b/Contrib/InstallOptions/InstallerOptions.cpp
-@@ -13,6 +13,7 @@
- #include <cderr.h>
- #include "resource.h"
- #include "shellapi.h"
-+#include <algorithm>
- 
- #include <nsis/pluginapi.h> // nsis plugin
- 
-@@ -759,7 +760,7 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-       DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_VCENTER | DT_WORDBREAK | DT_CALCRECT);
- 
-       // Make some more room so the focus rect won't cut letters off
--      rc.right = min(rc.right + 2, lpdis->rcItem.right);
-+      rc.right = std::min(rc.right + 2, lpdis->rcItem.right);
- 
-       // Move rect to right if in RTL mode
-       if (bRTL)
-diff --git a/Contrib/Makensisw/afxres.h b/Contrib/Makensisw/afxres.h
-index 1111111..2222222 100755
---- a/Contrib/Makensisw/afxres.h
-+++ b/Contrib/Makensisw/afxres.h
-@@ -1,4 +1,4 @@
--#define _WIN32_IE 0x0400
-+#define _WIN32_IE 0x0501
- #include <windows.h>
- 
- #ifndef IDC_STATIC
-diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h
-index 1111111..2222222 100755
---- a/Contrib/Makensisw/makensisw.h
-+++ b/Contrib/Makensisw/makensisw.h
-@@ -22,7 +22,7 @@
- #ifndef MAKENSIS_H
- #define MAKENSIS_H
- 
--#define _WIN32_IE 0x0400
-+#define _WIN32_IE 0x0501
- #include <windows.h>
- #include <commctrl.h>
- #include "utils.h"
-diff --git a/Source/SConscript b/Source/SConscript
-index 1111111..2222222 100755
---- a/Source/SConscript
-+++ b/Source/SConscript
-@@ -71,7 +71,7 @@ AddAvailableLibs(env, libs)
- 
- ##### Defines
- 
--env.Append(CPPDEFINES = ['_WIN32_IE=0x0500'])
-+env.Append(CPPDEFINES = ['_WIN32_IE=0x0501'])
- 
- ##### Set PCH
- 
-diff --git a/Source/exehead/SConscript b/Source/exehead/SConscript
-index 1111111..2222222 100755
---- a/Source/exehead/SConscript
-+++ b/Source/exehead/SConscript
-@@ -53,7 +53,7 @@ Import('env compression solid_compression')
- 
- env.Append(CPPDEFINES = ['EXEHEAD'])
- env.Append(CPPDEFINES = ['WIN32_LEAN_AND_MEAN'])
--env.Append(CPPDEFINES = ['_WIN32_IE=0x0500'])
-+env.Append(CPPDEFINES = ['_WIN32_IE=0x0501'])
- 
- ### Some other settings
- 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nsis-2-fixes.patch	Mon Feb 26 10:34:17 2018 -0500
@@ -0,0 +1,24 @@
+diff -uNr a/SCons/Config/gnu b/SCons/Config/gnu
+--- a/SCons/Config/gnu	2017-10-06 15:30:20.000000000 -0400
++++ b/SCons/Config/gnu	2018-02-26 09:36:48.769368160 -0500
+@@ -45,11 +45,6 @@
+ defenv['MSVCRT_FLAG'] = ''
+ defenv['STDCALL'] = '"__attribute__((__stdcall__))"'
+ 
+-# Don't allow mingw to link with LIBGCC*.DLL and LIBSTDC++-*.DLL 
+-if defenv['PLATFORM'] == 'win32':
+-	defenv.Append(LINKFLAGS = ['-static-libgcc'])
+-	defenv.Append(LINKFLAGS = ['-static-libstdc++'])
+-
+ ### defines
+ 
+ defenv.Append(CPPDEFINES = [('NSISCALL', '$STDCALL')])
+@@ -140,8 +135,6 @@
+ plugin_env.Append(LINKFLAGS = ['-mwindows'])        # build windows executables
+ plugin_env.Append(LINKFLAGS = ['$ALIGN_FLAG'])      # 512 bytes align
+ plugin_env.Append(LINKFLAGS = ['$MAP_FLAG'])        # generate map file
+-plugin_env.Append(LINKFLAGS = ['-static-libgcc'])   # remove libgcc*.dll dependency
+-plugin_env.Append(LINKFLAGS = ['-static-libstdc++']) # remove libstdc++*.dll dependency
+ 
+ plugin_uenv = plugin_env.Clone()
+ plugin_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE'])
--- a/src/nsis.mk	Sat Feb 24 10:27:33 2018 -0500
+++ b/src/nsis.mk	Mon Feb 26 10:34:17 2018 -0500
@@ -3,42 +3,33 @@
 
 PKG             := nsis
 $(PKG)_IGNORE   :=
-$(PKG)_VERSION  := 2.50
-$(PKG)_CHECKSUM := 3748b81b83fb3d717da0db4178c228ac6e2a0543
+$(PKG)_VERSION  := 3.03
+$(PKG)_CHECKSUM := 101a9dd2dc06e8239d30741e0d723b633e091a2f
 $(PKG)_SUBDIR   := nsis-$($(PKG)_VERSION)-src
 $(PKG)_FILE     := nsis-$($(PKG)_VERSION)-src.tar.bz2
-$(PKG)_URL      := http://$(SOURCEFORGE_MIRROR)/project/nsis/NSIS 2/$($(PKG)_VERSION)/$($(PKG)_FILE)
+$(PKG)_URL      := https://$(SOURCEFORGE_MIRROR)/project/nsis/NSIS 3/$($(PKG)_VERSION)/$($(PKG)_FILE)
 $(PKG)_DEPS     :=
 
 define $(PKG)_UPDATE
-    $(WGET) -q -O- 'https://sourceforge.net/p/nsis/code/HEAD/tree/NSIS/tags/' | \
-    grep 'title="v' | \
-    $(SED) -n 's,.*href="v\([0-9]\)\([^"]*\)".*,\1.\2,p' | \
+    $(WGET) -q -O- 'https://nsis.sourceforge.io/Download' | \
+    $(SED) -n 's,.*nsis-\([0-9.]\+\)-src.tar.*,\1,p' | \
     tail -1
 endef
+
 ifeq ($(ENABLE_WINDOWS_64),yes)
+    $(PKG)_PREBUILD = \
+        $(SED) -i 's/pei-i386/pei-x86-64/' '$(1)/SCons/Config/linker_script'
+endif
+
 define $(PKG)_BUILD
-    cd '$(1)' && patch -p1 < $(TOP_DIR)/src/win64-nsis.patch
-
+    $($(PKG)_PREBUILD)
     cd '$(1)' && scons VERBOSE=1 \
         PATH='$(PATH)' \
         MINGW_CROSS_PREFIX='$(MXE_TOOL_PREFIX)' \
         PREFIX='$(BUILD_TOOLS_PREFIX)' \
-        APPEND_LIBPATH='$(HOST_PREFIX)/lib32' \
+        SKIPPLUGINS='System' \
         SKIPUTILS='MakeLangId,Makensisw,NSIS Menu,zip2exe' \
+        NSIS_MAX_STRLEN=8192 \
         install
     $(INSTALL) -m755 '$(BUILD_TOOLS_PREFIX)/bin/makensis' '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)makensis'
 endef
-else
-define $(PKG)_BUILD
-    cd '$(1)' && scons VERBOSE=1 \
-        PATH='$(PATH)' \
-        MINGW_CROSS_PREFIX='$(MXE_TOOL_PREFIX)' \
-        PREFIX='$(BUILD_TOOLS_PREFIX)' \
-        `[ -d /usr/local/include ] && echo APPEND_CPPPATH=/usr/local/include` \
-        `[ -d /usr/local/lib ]     && echo APPEND_LIBPATH=/usr/local/lib` \
-        SKIPUTILS='MakeLangId,Makensisw,NSIS Menu,zip2exe' \
-        install
-    $(INSTALL) -m755 '$(BUILD_TOOLS_PREFIX)/bin/makensis' '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)makensis'
-endef
-endif