2012-06-20 43 views
14

Actualmente tengo dos instaladores WIX para un producto que mantengo. Uno para sistemas operativos de 32 bits y otro para sistemas operativos de 64 bits. En lugar de mantener dos instaladores separados, quiero combinarlos en un instalador NSIS que pueda "determinar" el "bitness" del SO y luego copiar los binarios apropiados en el directorio del programa. ¿Alguien ha tenido alguna experiencia con esto y podría proporcionar un script de muestra de trabajo que NSIS puede usar para crear el instalador?Utilice un instalador de NSIS para instalar binarios de 32 bits en sistemas operativos de 32 bits y binarios de 64 bits en sistemas operativos de 64 bits.

Respuesta

11

x64.nsh tiene algunas macros de ayuda y se puede instalar en $programfiles32 o $programfiles64

Editar:

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

hice vistazo a esto y que me permite determinar el valor de bits del sistema operativo, pero sigo con el problema donde tengo que decirle al instalador qué ficheros instalar. Actualmente tengo una "sección" que contiene esto: 'SetOutPath $ {PROGRAMINSTALL} Archivo/r build \\ *' Así que no estoy seguro de que el módulo x64 ayudaría en esta situación ... –

+0

Además, yo ' m no instalo binarios de 32 bits en un sistema de 64 bits ... Estoy instalando archivos de 64 bits en sistemas operativos de 64 bits y archivos de 32 bits en sistemas operativos de 32 bits ... –

+0

@JulianEasterling esto no dice el sistema que archivos para instalar. Si coloca archivos de 64 bits en los archivos 'build \ 64' y 32-bit en' build \ 32'. Si también necesita cambiar el directorio de instalación según la arquitectura, puede poner 'SetOutPath' dentro de If/Else – icc97

4

Creo que lo he descubierto ... No he probado esto todavía, pero debería funcionar ...

La respuesta es crear dos "secciones" para cada conjunto de archivos. SEC0000 para 32 bits y SEC0001 para archivos de 64 bits. Entonces,

!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 

creo que será necesaria la misma lógica en la función un.onInit demasiado por lo que el desinstalador sabe qué archivos para eliminar ...

+1

Use las macros de ayuda en sections.nsh para seleccionar/deseleccionar secciones ... – Anders

4

Para un simple instalador universal, usando 3.0a0, me encontré con un poco de experimentación que los siguientes trabajó para mí:

!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 

sólo tenía que recordar poner la función después de las secciones de referencia. Cada una de mis secciones simplemente hacía referencia a un .exe con el mismo nombre en sus respectivos directorios de 32 bits/y 64 bits, por lo que mi desinstalador no requería ningún tratamiento especial. No lo he probado en un sistema de 32 bits, pero funcionó para un sistema de 64 bits.

Ejemplo:

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

para esto necesitará' ! incluya "Sections.nsh" 'en su secuencia de comandos ya que' SF_SELECTED' seleccionado es parte de 'Sections.nsh' – icc97

Cuestiones relacionadas