2012-06-20 12 views
14

Attualmente ho due programmi di installazione WIX per un prodotto che gestisco. Uno per i sistemi operativi a 32 bit e uno per i sistemi operativi a 64 bit. Invece di mantenere due programmi di installazione separati, desidero combinarli in un unico programma di installazione di NSIS in grado di "determinare" il "testimone" del sistema operativo e quindi copiare i binari appropriati nella directory del programma. Qualcuno ha avuto esperienza con questo e potrebbe fornire uno script di esempio che NSIS può utilizzare per creare l'installer?Utilizzare un programma di installazione NSIS per installare binari a 32 bit su sistema operativo a 32 bit e file binari a 64 bit su sistema operativo a 64 bit possibile?

risposta

11

x64.nsh ha alcune macro di supporto ed è possibile installare in $programfiles32 o $programfiles64

Edit:

Function .onInit 
StrCpy $instdir $programfiles32\MyApp 
${If} ${RunningX64} 
    StrCpy $instdir $programfiles64\MyApp 
${EndIf} 
FunctionEnd 

... 

Section 
Setoutpath $instdir 
${If} ${RunningX64} 
    File /r build\64\* 
${Else} 
    File /r build\32\* 
${EndIf} 
SectionEnd 
+0

ho fatto un'occhiata a questo e mi permetterà di determinare il numero di bit del sistema operativo, ma ho ancora incontrato il problema in cui ho bisogno di dire il programma di installazione quali file da installare. Attualmente ho una "sezione" che contiene questo: 'SetOutPath $ {PROGRAMINSTALL} File/r build \\ *' Quindi non sono sicuro che il modulo x64 sarebbe d'aiuto in questa situazione ... –

+0

Inoltre, I ' m non installando file binari a 32 bit su un sistema a 64 bit ... Sto installando file a 64 bit su sistemi operativi a 64 bit e file a 32 bit su sistemi operativi a 32 bit ... –

+0

@JulianEasterling questo lo dice il sistema che i file da installare. Se metti file a 64-bit in 'build \ 64' e file a 32-bit in' build \ 32'. Se è anche necessario modificare la directory di installazione in base all'architettura, è possibile inserire 'SetOutPath' all'interno di If/Else – icc97

4

credo che ho capito ... non ho ancora testato questo, ma dovrebbe funzionare ...

La risposta è creare due "sezioni" per ciascun set di file. SEC0000 per 32 bit e SEC0001 per file a 64 bit. Poi,

!include x64.nsh 

Function .onInit 
    #Determine the bitness of the OS and enable the correct section 
    ${if} ${RunningX64} 
    SectionSetFlags ${SEC0001} 17 
    SectionSetFlags ${SEC0000} 16 
    ${else} 
    SectionSetFlags ${SEC0001} 16 
    SectionSetFlags ${SEC0000} 17 
    ${endif} 
FunctionEnd 

credo che la stessa logica sarà necessaria nella funzione un.onInit troppo così il programma di disinstallazione sa quali file per rimuovere ...

+1

Utilizzare le macro helper in sections.nsh per selezionare/deselezionare le sezioni ... – Anders

4

Per una semplice installazione universale usando 3.0a0, ho trovato con un po 'di sperimentazione che le seguenti ha lavorato per me:

!include x64.nsh 
Function .onInit 
    #Determine the bitness of the OS and enable the correct section 
    ${If} ${RunningX64} 
    SectionSetFlags ${SEC0000} ${SECTION_OFF} 
    SectionSetFlags ${SEC0001} ${SF_SELECTED} 
    ${Else} 
    SectionSetFlags ${SEC0001} ${SECTION_OFF} 
    SectionSetFlags ${SEC0000} ${SF_SELECTED} 
    ${EndIf} 
FunctionEnd 

ho dovuto ricordarsi di mettere la funzione dopo che le sezioni di riferimento. Ciascuna delle mie sezioni faceva semplicemente riferimento a uno stesso nome .exe nelle rispettive directory a 32 bit/e 64 bit, quindi il mio programma di disinstallazione non richiedeva alcun trattamento speciale. Non l'ho testato su un sistema a 32 bit, ma ha funzionato per un sistema a 64 bit.

Esempio:

section "64-bit" SEC0001 
    messageBox MB_OK "64-BIT!" 
    File "C:\foo\64-bit\some-utility.exe" 
sectionEND 
+0

per questo è necessario' ! include "Sections.nsh" 'nel tuo script poichè' SF_SELECTED' selezionato fa parte di 'Sections.nsh' – icc97