1
votes

Trying to build out a custom NSIS installer from scratch.

I see a File command for including files you want to be installed, but I'm having difficulty figuring out how to selectively install files. My use case is, I want to create a single installer for my .NET Core x86 application, my .NET Core x64 application, and my .NET 4.6.1 AnyCpu application.

I think I've figured out how to determine where the files should go... but on a 64-bit machine, I don't want to install the 32-bit files, and vice-versa for the for the 32-bit OS.

The File command suggests an output. How do I include the directories for all three projects into the installer, but only actually install the proper files for the system?

2

2 Answers

1
votes

There are two ways to conditionally install files. If you don't need to let the user choose you can just execute the desired File commands depending on some condition:

!include "LogicLib.nsh"
!include "x64.nsh"

Section
  SetOutPath $InstDir
  ${If} ${RunningX64}
      File "myfiles\amd64\app.exe"
  ${Else}
      File "myfiles\x86\app.exe"
  ${EndIf}
SectionEnd

If you want the user to be able to choose you can put the File commands in different sections:

!include "LogicLib.nsh"
!include "x64.nsh"
!include "Sections.nsh"

Page Components
Page Directory
Page InstFiles

Section /o "Native 32-bit" SID_x86
  SetOutPath $InstDir
  File "myfiles\x86\app.exe"
SectionEnd

Section /o "Native 64-bit" SID_AMD64
  SetOutPath $InstDir
  File "myfiles\amd64\app.exe"
SectionEnd

Section "AnyCPU" SID_AnyCPU
  SetOutPath $InstDir
  File "myfiles\anycpu\app.exe"
SectionEnd

Var CPUCurrSel

Function .onInit
  StrCpy $CPUCurrSel ${SID_AnyCPU} ; The default
  ${If} ${RunningX64}
    !insertmacro RemoveSection ${SID_x86}
  ${Else}
    !insertmacro RemoveSection ${SID_AMD64}
  ${EndIf}
FunctionEnd

Function .onSelChange
  !insertmacro StartRadioButtons $CPUCurrSel
    !insertmacro RadioButton ${SID_x86}
    !insertmacro RadioButton ${SID_AMD64}
    !insertmacro RadioButton ${SID_AnyCPU}
  !insertmacro EndRadioButtons
FunctionEnd
1
votes

NSIS offers several ways to check conditions, for example StrCmp or IntCmp, but the easiest is probably using the LogicLib library

Example:

!include "LogicLib.nsh"
!include "x64.nsh"

Section
  ${If} ${RunningX64}
      File "that_64bit_file"
  ${Else}
      File "that_32bit_file"
  ${EndIf}
SectionEnd