Search code examples
nsis

Knowing in a Section if another Section has already been executed


I want to create a Suite installer for the various application we develop. The structure is as follows:

  • Application A
    Requires no driver installation
  • Application B
    Requires driver 1 and 2
  • Application C
    Requires driver 2 and 3

The user has the option to install any application he wants, or multiple. I know how to use Sections for this. This will work fine if the user selects only Application A, or Application A with either B or C. However, if the user selects Application B and C, I would like to avoid that driver 2 will be prompted to install twice.

Is there a way to achieve this? For instance, is it possible to know when the section for Application C is executed, that the section for Application B has already been executed, and that driver 2 does not need to be installed again?


Solution

  • There are probably many ways to handle this, one is to put the driver in a hidden section that you make sure is in the correct state:

    !include LogicLib.nsh
    !include Sections.nsh
    !include x64.nsh
    
    Page Components
    Page Directory
    Page InstFiles
    
    Section "-Driver2" SID_DRIVER2
    ${If} ${IsNativeAMD64}
        ; Install AMD64 64-bit driver/library
    ${ElseIf} ${IsNativeARM64}
        ; Install ARM64 64-bit driver/library
    ${ElseIf} ${IsNativeIA32}
        ; Install i386 32-bit driver/library
    ${Else}
        Abort "Unsupported CPU architecture!"
    ${EndIf}
    SectionEnd
    
    Section "App B" SID_APPB
    SectionEnd
    
    Section /o "App C" SID_APPC
    SectionEnd
    
    Function .onSelChange
    ${If} ${SectionIsSelected} ${SID_APPB}
    ${OrIf} ${SectionIsSelected} ${SID_APPC}
        !insertmacro SelectSection ${SID_DRIVER2}
    ${Else}
        !insertmacro UnselectSection ${SID_DRIVER2}
    ${EndIf}
    FunctionEnd
    
    Function .onInit
    Call .onSelChange ; Make sure things are configured correctly in silent installers
    FunctionEnd