nsis: make nsis output automatically select architecture

Make the NSIS output automatically select the output architecture to
generate the proper filename and, much more importantly, set up the
proper default install directory.

This requires Perl as well as makensis to be present in order to make
an installer, but that doesn't really seem like a too onerous of a
requirement (NSIS being the big external dependency here.)

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
H. Peter Anvin 2016-03-03 21:37:37 -08:00
parent a9a1b5c318
commit d4c67b1597
5 changed files with 592 additions and 34 deletions

5
.gitignore vendored
View file

@ -47,8 +47,10 @@ TAGS
/macros.c
/nasm
/nasm.man
/nasm.1
/ndisasm
/ndisasm.man
/nasm.1
/pptok.c
/pptok.h
/pptok.ph
@ -76,7 +78,8 @@ TAGS
/version.h
/version.mac
/version.mak
/version.nsh
/version.sed
/iflag.c
/iflaggen.h
/nsis/version.nsh
/nsis/arch.nsh

View file

@ -34,6 +34,8 @@ NROFF = @NROFF@
ASCIIDOC = @ASCIIDOC@
XMLTO = @XMLTO@
MAKENSIS = makensis
MKDIR = mkdir
RM = rm
@ -53,7 +55,7 @@ endif
.PHONY: all doc rdf install clean distclean cleaner spotless install_rdf test
.PHONY: install_doc everything install_everything strip perlreq dist tags TAGS
.PHONY: manpages
.PHONY: manpages nsis
.c.$(O):
$(CC) -c $(ALL_CFLAGS) -o $@ $<
@ -70,7 +72,6 @@ endif
.xml.1:
$(XMLTO) man --skip-validation $< 2>/dev/null
#-- Begin File Lists --#
NASM = nasm.$(O) nasmlib.$(O) ver.$(O) \
raa.$(O) saa.$(O) rbtree.$(O) \
@ -100,7 +101,7 @@ NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
disp8.$(O) iflag.$(O)
#-- End File Lists --#
all: nasm$(X) ndisasm$(X) manpages rdf
all: nasm$(X) ndisasm$(X) rdf
nasm$(X): $(NASM) $(XOBJS)
$(CC) $(LDFLAGS) -o nasm$(X) $(NASM) $(XOBJS) $(LIBS)
@ -139,8 +140,8 @@ version.sed: version version.pl
$(PERL) $(srcdir)/version.pl sed < $(srcdir)/version > version.sed
version.mak: version version.pl
$(PERL) $(srcdir)/version.pl make < $(srcdir)/version > version.mak
version.nsh: version version.pl
$(PERL) $(srcdir)/version.pl nsis < $(srcdir)/version > version.nsh
nsis/version.nsh: version version.pl
$(PERL) $(srcdir)/version.pl nsis < $(srcdir)/version > nsis/version.nsh
# This source file is generated from the standard macros file
# `standard.mac' by another Perl script. Again, it's part of the
@ -195,10 +196,19 @@ PERLREQ = macros.c insnsb.c insnsa.c insnsd.c insnsi.h insnsn.c \
regs.c regs.h regflags.c regdis.c regdis.h regvals.c \
tokhash.c tokens.h pptok.h pptok.c pptok.ph \
directiv.c directiv.h \
version.h version.mac version.mak version.nsh \
iflag.c iflaggen.h
iflag.c iflaggen.h \
version.h version.mac version.mak nsis/version.nsh
perlreq: $(PERLREQ)
# NSIS is not built except by explicit request, as it only applies to
# Windows platforms
nsis/arch.nsh: nsis/getpearch.pl nasm$(X)
$(PERL) $(srcdir)/nsis/getpearch.pl nasm$(X) > nsis/arch.nsh
# Should only be done after "make everything"
nsis: nsis/nasm.nsi nsis/arch.nsh nsis/version.nsh
$(MAKENSIS) nsis/nasm.nsi
# Generated manpages, also pregenerated for distribution
manpages: nasm.1 ndisasm.1
@ -215,7 +225,9 @@ clean:
$(RM) -f lib/*.$(O) lib/*.s lib/*.i
$(RM) -f output/*.$(O) output/*.s output/*.i
$(RM) -f nasm$(X) ndisasm$(X)
$(RM) -f nasm-*-installer-*.exe
$(RM) -f tags TAGS
$(RM) -f nsis/arch.nsh
cd rdoff && $(MAKE) clean
distclean: clean
@ -261,7 +273,7 @@ doc:
doc_install install_doc:
cd doc && $(MAKE) install
everything: all doc rdf
everything: all manpages doc rdf
install_everything: everything install install_doc install_rdf

470
nsis/MultiUser.nsh Executable file
View file

@ -0,0 +1,470 @@
/*
MultiUser.nsh
Installer configuration for multi-user Windows environments
Copyright 2008-2009 Joost Verburg
Updated 2016 by H. Peter Anvin to handle 64-bit Windows
*/
!ifndef MULTIUSER_INCLUDED
!define MULTIUSER_INCLUDED
!verbose push
!verbose 3
;Standard NSIS header files
!ifdef MULTIUSER_MUI
!include MUI2.nsh
!endif
!include nsDialogs.nsh
!include LogicLib.nsh
!include WinVer.nsh
!include FileFunc.nsh
;Variables
Var MultiUser.Privileges
Var MultiUser.InstallMode
;Command line installation mode setting
!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
!include StrFunc.nsh
!ifndef StrStr_INCLUDED
${StrStr}
!endif
!ifndef MULTIUSER_NOUNINSTALL
!ifndef UnStrStr_INCLUDED
${UnStrStr}
!endif
!endif
Var MultiUser.Parameters
Var MultiUser.Result
!endif
;Installation folder stored in registry
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
Var MultiUser.InstDir
!endif
!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
Var MultiUser.DefaultKeyValue
!endif
;Windows Vista UAC setting
!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
RequestExecutionLevel admin
!define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
RequestExecutionLevel admin
!define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
!else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest
RequestExecutionLevel highest
!define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
!else
RequestExecutionLevel user
!endif
/*
Install modes
*/
!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
;Install mode initialization - per-machine
${ifnot} ${IsNT}
${orif} $MultiUser.Privileges == "Admin"
${orif} $MultiUser.Privileges == "Power"
StrCpy $MultiUser.InstallMode AllUsers
SetShellVarContext all
!if "${UNINSTALLER_PREFIX}" != UN
;Set default installation location for installer
!ifdef MULTIUSER_INSTALLMODE_INSTDIR
StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
!endif
!endif
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
${if} $MultiUser.InstDir != ""
StrCpy $INSTDIR $MultiUser.InstDir
${endif}
!endif
!ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
!endif
${endif}
!macroend
!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
;Install mode initialization - per-user
${if} ${IsNT}
StrCpy $MultiUser.InstallMode CurrentUser
SetShellVarContext current
!if "${UNINSTALLER_PREFIX}" != UN
;Set default installation location for installer
!ifdef MULTIUSER_INSTALLMODE_INSTDIR
${if} ${AtLeastWin2000}
StrCpy $INSTDIR "$LOCALAPPDATA\bin\${MULTIUSER_INSTALLMODE_INSTDIR}"
${else}
StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
${endif}
!endif
!endif
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
${if} $MultiUser.InstDir != ""
StrCpy $INSTDIR $MultiUser.InstDir
${endif}
!endif
!ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
!endif
${endif}
!macroend
Function MultiUser.InstallMode.AllUsers
!insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""
FunctionEnd
Function MultiUser.InstallMode.CurrentUser
!insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""
FunctionEnd
!ifndef MULTIUSER_NOUNINSTALL
Function un.MultiUser.InstallMode.AllUsers
!insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un
FunctionEnd
Function un.MultiUser.InstallMode.CurrentUser
!insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un
FunctionEnd
!endif
/*
Installer/uninstaller initialization
*/
!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX
!ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT
Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}
!else
Quit
!endif
!macroend
!macro MULTIUSER_INIT_TEXTS
!ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
!define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires Administrator priviledges."
!endif
!ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
!define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges."
!endif
!ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
!define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr."
!endif
!macroend
!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
;Installer initialization - check privileges and set install mode
!insertmacro MULTIUSER_INIT_TEXTS
UserInfo::GetAccountType
Pop $MultiUser.Privileges
${if} ${IsNT}
;Check privileges
!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
${if} $MultiUser.Privileges != "Admin"
MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
!insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
${endif}
!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
${if} $MultiUser.Privileges != "Power"
${andif} $MultiUser.Privileges != "Admin"
${if} ${AtMostWinXP}
MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"
${else}
MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
${endif}
!insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
${endif}
!endif
!ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
;Default to per-machine installation if possible
${if} $MultiUser.Privileges == "Admin"
${orif} $MultiUser.Privileges == "Power"
!ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
!else
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
!endif
!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
;Set installation mode to setting from a previous installation
!ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue == ""
ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue != ""
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
${endif}
${endif}
!else
ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue == ""
ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue != ""
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
${endif}
${endif}
!endif
!endif
${else}
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
${endif}
!else
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
!endif
!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
;Check for install mode setting on command line
${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"
${if} $MultiUser.Result != ""
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
${endif}
${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"
${if} $MultiUser.Result != ""
${if} $MultiUser.Privileges == "Admin"
${orif} $MultiUser.Privileges == "Power"
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
${else}
MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"
${endif}
${endif}
!endif
${else}
;Not running Windows NT, per-user installation not supported
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
${endif}
!macroend
!macro MULTIUSER_INIT
!verbose push
!verbose 3
!insertmacro MULTIUSER_INIT_CHECKS "" ""
!verbose pop
!macroend
!ifndef MULTIUSER_NOUNINSTALL
!macro MULTIUSER_UNINIT
!verbose push
!verbose 3
!insertmacro MULTIUSER_INIT_CHECKS Un un.
!verbose pop
!macroend
!endif
/*
Modern UI 2 page
*/
!ifdef MULTIUSER_MUI
!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE
!ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE
!define MULTIUSER_INSTALLMODEPAGE_INTERFACE
Var MultiUser.InstallModePage
Var MultiUser.InstallModePage.Text
Var MultiUser.InstallModePage.AllUsers
Var MultiUser.InstallModePage.CurrentUser
Var MultiUser.InstallModePage.ReturnValue
!endif
!macroend
!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE
!insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
!insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
!insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"
!insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"
!insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"
PageEx custom
PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
Caption " "
PageExEnd
!insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
!undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
!undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
!undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
!macroend
!macro MULTIUSER_PAGE_INSTALLMODE
;Modern UI page for install mode
!verbose push
!verbose 3
!ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
!error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."
!endif
!insertmacro MUI_PAGE_INIT
!insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE
!verbose pop
!macroend
!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
;Page functions of Modern UI page
Function "${PRE}"
${ifnot} ${IsNT}
Abort
${endif}
${if} $MultiUser.Privileges != "Power"
${andif} $MultiUser.Privileges != "Admin"
Abort
${endif}
!insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
!insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)
nsDialogs::Create 1018
Pop $MultiUser.InstallModePage
${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"
Pop $MultiUser.InstallModePage.Text
${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"
Pop $MultiUser.InstallModePage.AllUsers
${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"
Pop $MultiUser.InstallModePage.CurrentUser
${if} $MultiUser.InstallMode == "AllUsers"
SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0
${else}
SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0
${endif}
!insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
nsDialogs::Show
FunctionEnd
Function "${LEAVE}"
SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue
${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
Call MultiUser.InstallMode.AllUsers
${else}
Call MultiUser.InstallMode.CurrentUser
${endif}
!insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
FunctionEnd
!macroend
!endif
!verbose pop
!endif

74
nsis/getpearch.pl Normal file
View file

@ -0,0 +1,74 @@
#!/usr/bin/perl
#
# Get the appropriate variables to make an NSIS installer file
# based on the PE architecture of a specific file
#
use strict;
my %archnames = (
0x01de => 'am33',
0x8664 => 'x64',
0x01c0 => 'arm32',
0x01c4 => 'thumb',
0xaa64 => 'arm64',
0x0ebc => 'efi',
0x014c => 'x86',
0x0200 => 'ia64',
0x9041 => 'm32r',
0x0266 => 'mips16',
0x0366 => 'mips',
0x0466 => 'mips16',
0x01f0 => 'powerpc',
0x01f1 => 'powerpc',
0x0166 => 'mips',
0x01a2 => 'sh3',
0x01a3 => 'sh3',
0x01a6 => 'sh4',
0x01a8 => 'sh5',
0x01c2 => 'arm32',
0x0169 => 'wcemipsv2'
);
my ($file) = @ARGV;
open(my $fh, '<', $file)
or die "$0: cannot open file: $file: $!\n";
read($fh, my $mz, 2);
exit 0 if ($mz ne 'MZ');
exit 0 unless (seek($fh, 0x3c, 0));
exit 0 unless (read($fh, my $pe_offset, 1) == 1);
$pe_offset = unpack("C", $pe_offset);
exit 0 unless (seek($fh, $pe_offset, 0));
read($fh, my $pe, 4);
exit 0 unless ($pe eq "PE\0\0");
exit 0 unless (read($fh, my $arch, 2) == 2);
$arch = $archnames{unpack("v", $arch)};
if (defined($arch)) {
print "!define ARCH ${arch}\n";
}
exit 0 unless (seek($fh, 14, 1));
exit 0 unless (read($fh, my $auxheaderlen, 2) == 2);
exit 0 unless (unpack("v", $auxheaderlen) >= 2);
exit 0 unless (seek($fh, 2, 1));
exit 0 unless (read($fh, my $petype, 2) == 2);
$petype = unpack("v", $petype);
if ($petype == 0x010b) {
# It is a 32-bit PE32 file
print "!define BITS 32\n";
print "!define GLOBALINSTDIR \$PROGRAMFILES\n";
} elsif ($petype == 0x020b) {
# It is a 64-bit PE32+ file
print "!define BITS 64\n";
print "!define GLOBALINSTDIR \$PROGRAMFILES64\n";
} else {
# No idea...
}
close($fh);
exit 0;

View file

@ -27,6 +27,8 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
!include "version.nsh"
!include /nonfatal "arch.nsh"
!define PRODUCT_NAME "Netwide Assembler"
!define PRODUCT_SHORT_NAME "nasm"
!define PACKAGE_NAME "${PRODUCT_NAME} ${VERSION}"
@ -37,8 +39,8 @@ SetCompressor lzma
!define MULTIUSER_EXECUTIONLEVEL Highest
!define MULTIUSER_MUI
!define MULTIUSER_INSTALLMODE_COMMANDLINE
!define MULTIUSER_INSTALLMODE_INSTDIR "${PRODUCT_SHORT_NAME}"
!include MultiUser.nsh
!define MULTIUSER_INSTALLMODE_INSTDIR "NASM"
!include "MultiUser.nsh"
!insertmacro MULTIUSER_PAGE_INSTALLMODE
!insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
@ -48,7 +50,7 @@ SetCompressor lzma
;Name and file
Name "${PACKAGE_NAME}"
OutFile "${PACKAGE_SHORT_NAME}-installer.exe"
OutFile "../${PACKAGE_SHORT_NAME}-installer-${ARCH}.exe"
;Get installation folder from registry if available
InstallDirRegKey HKCU "Software\${PRODUCT_SHORT_NAME}" ""
@ -65,8 +67,8 @@ Var CmdFailed
;--------------------------------
;Interface Settings
Caption "${PACKAGE_SHORT_NAME} installation"
Icon "nsis/nasm.ico"
UninstallIcon "nsis/nasm-un.ico"
Icon "nasm.ico"
UninstallIcon "nasm-un.ico"
!define MUI_ABORTWARNING
@ -96,10 +98,10 @@ UninstallIcon "nsis/nasm-un.ico"
Section "NASM" SecNasm
Sectionin RO
SetOutPath "$INSTDIR"
File "LICENSE"
File "nasm.exe"
File "ndisasm.exe"
File "nsis/nasm.ico"
File "../LICENSE"
File "../nasm.exe"
File "../ndisasm.exe"
File "nasm.ico"
;Store installation folder
WriteRegStr HKCU "Software\${PRODUCT_SHORT_NAME}" "" $INSTDIR
@ -135,30 +137,27 @@ skip:
SectionEnd
Section "RDOFF" SecRdoff
CreateDirectory "$INSTDIR\rdoff"
SetOutPath "$INSTDIR\rdoff"
File "rdoff/ldrdf.exe"
File "rdoff/rdf2bin.exe"
File "rdoff/rdf2com.exe"
File "rdoff/rdf2ith.exe"
File "rdoff/rdf2ihx.exe"
File "rdoff/rdf2srec.exe"
File "rdoff/rdfdump.exe"
File "rdoff/rdflib.exe"
File "rdoff/rdx.exe"
File "../rdoff/ldrdf.exe"
File "../rdoff/rdf2bin.exe"
File "../rdoff/rdf2com.exe"
File "../rdoff/rdf2ith.exe"
File "../rdoff/rdf2ihx.exe"
File "../rdoff/rdf2srec.exe"
File "../rdoff/rdfdump.exe"
File "../rdoff/rdflib.exe"
SectionEnd
Section "Manual" SecManual
SetOutPath "$INSTDIR"
File "doc/nasmdoc.pdf"
File "../doc/nasmdoc.pdf"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Manual.lnk" "$INSTDIR\nasmdoc.pdf"
SectionEnd
Section "VS8 integration" SecVS8
CreateDirectory "$INSTDIR\contrib\VSrules"
SetOutPath "$INSTDIR\contrib\VSrules"
File "contrib/VSrules/nasm.README"
File "contrib/VSrules/nasm.rules"
CreateDirectory "$INSTDIR\VSrules"
SetOutPath "$INSTDIR\VSrules"
File "../contrib/VSrules/nasm.README"
File "../contrib/VSrules/nasm.rules"
SectionEnd
;--------------------------------