diff options
-rw-r--r-- | setup/GatherFilesAndCreateSetup.cmd | 158 | ||||
-rw-r--r-- | setup/WDS.nsi | 139 |
2 files changed, 241 insertions, 56 deletions
diff --git a/setup/GatherFilesAndCreateSetup.cmd b/setup/GatherFilesAndCreateSetup.cmd index eb13fda..2e8d8a6 100644 --- a/setup/GatherFilesAndCreateSetup.cmd +++ b/setup/GatherFilesAndCreateSetup.cmd @@ -4,29 +4,50 @@ :: :: Requirements: :: - NSIS must be installed in %ProgramFiles%\NSIS -:: - WDS.nsi and GetVersion.nsi must exist in the current directory +:: - WDS.nsi must exist in the current directory (which has to be writable!) :: :: This script will do this: +:: 0. Create temporary NSI scripts WDS_GetVersion.nsi and WDS_Languages.nsi :: 1. Copy required files into %install% -:: 2. Create %chkver% from GetVersion.nsi +:: 2. Create %chkver(A|U)% from WDS_GetVersion.nsi :: 3. Call the created EXE file -:: 4. Parse the output in %verfile% into %vernsi% +:: 4. Parse the output in %verfile(A|U)% into %vernsi% :: 5. Search for wdsr* subdirectories in the ..\make directory :: 6. Extract the names from the .<language>.txt files located there -:: 7. Putting all language information into WDS_Languages.nsi +:: 7. Putting all language information into WDS_LanguagesTemp.nsi :: ---------------------------------------------------------------------------- set install=.\Installer set nsis=%ProgramFiles%\NSIS\makensis.exe -set verfile=Version.txt -set vernsi=%verfile:.txt=.nsi% -set chkver=GetVersionWDS.exe -set chkfile=%install%\windirstatA.exe -set langfile=WDS_Languages.nsi +set verfileA=VersionA.txt +set verfileU=VersionU.txt +set vernsi=WDS_LangAnd%verfileA:A.txt=.nsi% +set chkverA=GetVersionWDS_A.exe +set chkverU=GetVersionWDS_U.exe +set chkfileA=%install%\windirstatA.exe +set chkfileU=%install%\windirstatU.exe +set langfile=WDS_LanguagesTemp.nsi +set langs=langs.txt +set langsexe=langs.exe +set getvernsi=WDS_GetVersion.nsi +set langsnsi=WDS_Languages.nsi +set wdsmain=WDS_Main.nsi set err=Unknown error if NOT EXIST %nsis% @( set err=Could not find NSIS compiler at "%nsis%" goto ERROR ) +:: ---------------------------------------------------------------------------- +echo Creation of temporary scripts +echo ------------------------------------------------------------------------------ +echo !define WDSMAIN_NSI > %wdsmain% +echo !define LANGANDVER ^"%vernsi%^" >> %wdsmain% +echo !define LANGTEMP ^"%langfile%^" >> %wdsmain% +type WDS.nsi >> %wdsmain% +echo !define LANGUAGES_NSI > %langsnsi% +type WDS.nsi >> %langsnsi% +echo !define GETVERSION_NSI > %getvernsi% +type WDS.nsi >> %getvernsi% +:: ---------------------------------------------------------------------------- echo Copying files to temporary directory ... echo ------------------------------------------------------------------------------ if NOT EXIST %install% @( @@ -46,51 +67,82 @@ echo *.exe (ANSI and Unicode version) copy /y /v ..\urelease\windirstat.exe "%install%\windirstatU.exe" > NUL copy /y /v ..\release\windirstat.exe "%install%\windirstatA.exe" > NUL echo. -echo Now retrieving the current version +echo Now retrieving the current (ANSI) version echo ^(from "%install%\windirstatA.exe"^) echo ------------------------------------------------------------------------------ -if NOT EXIST GetVersion.nsi @( +if NOT EXIST %getvernsi% @( set err=The NSIS script file which retrieves the version could not be found. Make sure it is in the current directory and accessible! goto ERROR ) -"%nsis%" "/DInstallerOut=%chkver%" "/DVersionOut=%verfile%" "/DVersionOfFile=%chkfile%" GetVersion.nsi > NUL +"%nsis%" "/DInstallerOut=%chkverA%" "/DVersionOut=%verfileA%" "/DVersionOfFile=%chkfileA%" %getvernsi% > NUL +"%nsis%" "/DInstallerOut=%chkverU%" "/DVersionOut=%verfileU%" "/DVersionOfFile=%chkfileU%" %getvernsi% > NUL :: Delete the old version file, if it exists -if EXIST "%verfile%" del /f /q "%verfile%" +if EXIST "%verfileA%" del /f /q "%verfileA%" +if EXIST "%verfileU%" del /f /q "%verfileU%" :: Try to call the EXE file created from the script -if EXIST "%chkver%" @( - %chkver% +if EXIST "%chkverA%" @( + %chkverA% ) else ( - set err=The program to retrieve the WDS version could not be found. Is the current directory read-only? Make sure it's not and try again. + set err=The program to retrieve the WDS ANSI version could not be found. Is the current directory read-only? Make sure it's not and try again. + goto ERROR +) +if EXIST "%chkverU%" @( + %chkverU% +) else ( + set err=The program to retrieve the WDS Unicode version could not be found. Is the current directory read-only? Make sure it's not and try again. goto ERROR ) :: Check for existance of the version file -if EXIST "%verfile%" @( - echo Successfully retrieved file version: +if EXIST "%verfileA%" @( + echo Successfully retrieved ANSI file version: +) else ( + set err=Could not retrieve the file version of "%chkfileA%", please make sure the file is at its place and accessible. + goto ERROR +) +if EXIST "%verfileU%" @( + echo Successfully retrieved Unicode file version: ) else ( - set err=Could not retrieve the file version of "%chkfile%", please make sure the file is at its place and accessible. + set err=Could not retrieve the file version of "%chkfileU%", please make sure the file is at its place and accessible. goto ERROR ) :: Delete the temporary EXE file -if EXIST "%chkver%" del /f /q "%chkver%" +if EXIST "%chkverA%" del /f /q "%chkverA%" +if EXIST "%chkverU%" del /f /q "%chkverU%" :: Split the version string and then create several defines -for /f "tokens=1,2,3,4 delims=." %%i in (%verfile%) do ( - echo Version %%i.%%j.%%k ^(Build %%l^) - echo ^!define sVersion "%%i.%%j.%%k.%%l" > %vernsi% +for /f "tokens=1,2,3,4 delims=." %%i in (%verfileA%) do ( + echo ANSI Version %%i.%%j.%%k ^(Build %%l^) + echo ^!define sVersion_Ansi "%%i.%%j.%%k.%%l" > %vernsi% + echo ^!define sVersionBuild_Ansi "%%l" >> %vernsi% + echo ^!define dVersionBuild_Ansi %%l >> %vernsi% echo ^!define sVersionS "%%i.%%j.%%k" >> %vernsi% - echo ^!define sVersionBuild "%%l" >> %vernsi% echo ^!define dVersionMajor %%i >> %vernsi% echo ^!define dVersionMinor %%j >> %vernsi% echo ^!define dVersionRev %%k >> %vernsi% - echo ^!define dVersionBuild %%l >> %vernsi% echo ^!define sVersionFile "%%i_%%j_%%k" >> %vernsi% echo ^!define sVersionFull "WinDirStat %%i.%%j.%%k" >> %vernsi% echo ^!define Installer "%install%" >> %vernsi% ) +:: The same for the unicode executable +for /f "tokens=1,2,3,4 delims=." %%i in (%verfileU%) do ( + echo Unicode Version %%i.%%j.%%k ^(Build %%l^) + echo ^!define sVersion_Unicode "%%i.%%j.%%k.%%l" >> %vernsi% + echo ^!define sVersionBuild_Unicode "%%l" >> %vernsi% + echo ^!define dVersionBuild_Unicode %%l >> %vernsi% +) :: Delete the Version.txt -if EXIST "%verfile%" del /f /q "%verfile%" +if EXIST "%verfileA%" del /f /q "%verfileA%" +if EXIST "%verfileU%" del /f /q "%verfileU%" echo. echo Going to collect information about available languages ... echo ------------------------------------------------------------------------------ +if EXIST "%langs%" del /f /q "%langs%" +:: Prepare language strings +for /f %%i in ('dir /b /A:D ..\make\wdsr*') do ( + for /f %%j in ('dir /b ..\make\%%i\.*.txt') do ( + call :GetLanguage %%i %%j "%langfile%" PrepareLanguageStrings + ) +) +:: Now the actual parsing of the languages echo ^!ifdef LANGSECTIONS > "%langfile%" for /f %%i in ('dir /b /A:D ..\make\wdsr*') do ( for /f %%j in ('dir /b ..\make\%%i\.*.txt') do ( @@ -115,12 +167,26 @@ for /f %%i in ('dir /b /A:D ..\make\wdsr*') do ( ) echo ^!endif >> "%langfile%" echo. >> "%langfile%" +echo ^!ifdef LANGCURRLANG >> "%langfile%" +for /f %%i in ('dir /b /A:D ..\make\wdsr*') do ( + for /f %%j in ('dir /b ..\make\%%i\.*.txt') do ( + call :GetLanguage %%i %%j "%langfile%" AppendCurrentLangChoice + ) +) +echo ^!endif >> "%langfile%" +echo. >> "%langfile%" +:: Cleanup language strings +if EXIST "%langs%" del /f /q "%langs%" echo. echo Now creating the installer. Please wait, this may take a while ... echo ------------------------------------------------------------------------------ -"%nsis%" WDS.nsi > NUL +"%nsis%" %wdsmain% > NUL if EXIST "%langfile%" del /f /q "%langfile%" if EXIST "%vernsi%" del /f /q "%vernsi%" +:: Cleanup temporary scripts +if EXIST "%getvernsi%" del /f /q "%getvernsi%" +if EXIST "%langsnsi%" del /f /q "%langsnsi%" +if EXIST "%wdsmain%" del /f /q "%wdsmain%" echo Finished! echo. goto :END @@ -143,22 +209,32 @@ call :%4 endlocal & set RET=%RET% goto :EOF +:PrepareLanguageStrings +setlocal +if EXIST "%install%\wdsr%langno%.dll" ( + "%nsis%" "/DInstallerOut=%langsexe%" "/DLangOut=%vernsi%" /DLCID=0x%langno% /DLANGID=%langno% %langsnsi% > NUL + %langsexe% + if EXIST "%langsexe%" del /f /q "%langsexe%" +) +endlocal +goto :EOF + :AppendLanguage setlocal if EXIST "%install%\wdsr%langno%.dll" ( echo %RET% echo ; ----------------------------------------------- >> %langfile% if EXIST "%install%\wdsh%langno%.chm" ( - echo Section "%RET% + help" %lang% >> %langfile% + echo Section "${LangEngName%langno%} (${LangNatName%langno%}/${LangShoName%langno%}) + help" %lang% >> %langfile% ) else ( - echo Section "%RET%" %lang% >> %langfile% + echo Section "${LangEngName%langno%} (${LangNatName%langno%}/${LangShoName%langno%})" %lang% >> %langfile% ) echo SectionIn 1 2 >> %langfile% rem echo SetOutPath ^$INSTDIR >> %langfile% echo File %install%\wdsr%langno%.dll >> %langfile% if EXIST "%install%\wdsh%langno%.chm" ( echo File %install%\wdsh%langno%.chm >> %langfile% - echo CreateShortCut "$SMPROGRAMS\WinDirStat\Help (%RET%).lnk" "$INSTDIR\wdsh%langno%.chm" >> %langfile% + echo CreateShortCut "$SMPROGRAMS\WinDirStat\Help (${LangEngName%langno%} - ${LangNatName%langno%}).lnk" "$INSTDIR\wdsh%langno%.chm" >> %langfile% ) else ( echo ; No helpfile available: %install%\wdsh%langno%.chm >> %langfile% ) @@ -172,9 +248,9 @@ goto :EOF setlocal if EXIST "%install%\wdsr%langno%.dll" ( if EXIST "%install%\wdsh%langno%.chm" ( - echo ^!insertmacro MUI_DESCRIPTION_TEXT ^${%lang%} "Required for %RET% user interface support (includes help file)" >> %langfile% + echo ^!insertmacro MUI_DESCRIPTION_TEXT ^${%lang%} "Required for ${LangEngName%langno%} (${LangNatName%langno%}/${LangShoName%langno%}) user interface support (includes help file)" >> %langfile% ) else ( - echo ^!insertmacro MUI_DESCRIPTION_TEXT ^${%lang%} "Required for %RET% user interface support" >> %langfile% + echo ^!insertmacro MUI_DESCRIPTION_TEXT ^${%lang%} "Required for ${LangEngName%langno%} (${LangNatName%langno%}/${LangShoName%langno%}) user interface support" >> %langfile% ) ) endlocal @@ -193,6 +269,24 @@ if EXIST "%install%\wdsr%langno%.dll" ( endlocal goto :EOF +:AppendCurrentLangChoice +setlocal +if EXIST "%install%\wdsr%langno%.dll" ( + echo Push $0 >> %langfile% + echo IntCmp $0 0x%langno% 0 Unselect%langno% Unselect%langno% >> %langfile% + echo ${SetSectionFlag} ${%lang%} ${SF_BOLD} >> %langfile% + echo ${SelectSection} ${%lang%} >> %langfile% + echo Goto EndSel%langno% >> %langfile% + echo Unselect%langno%: >> %langfile% + echo ${ClearSectionFlag} ${%lang%} ${SF_BOLD} >> %langfile% + echo ${UnselectSection} ${%lang%} >> %langfile% + echo EndSel%langno%: >> %langfile% + echo Pop $0 >> %langfile% + +) +endlocal +goto :EOF + :: ---------------------------------------------------------------------------- :: END of functions :: ---------------------------------------------------------------------------- diff --git a/setup/WDS.nsi b/setup/WDS.nsi index a2fe498..c458b4f 100644 --- a/setup/WDS.nsi +++ b/setup/WDS.nsi @@ -1,28 +1,32 @@ +; Define the following symbols to get the intended functionality +; LANGUAGES_NSI +; GETVERSION_NSI +; WDSMAIN_NSI +!ifdef WDSMAIN_NSI ;-------------------------------- -;Include Modern UI +; Include Modern UI !include "MUI.nsh" ;-------------------------------- -;General +; General - !include "Version.nsi" + !include "${LANGANDVER}" !include "Sections.nsh" - ;Name and file + ; Name and file Name "${sVersionFull}" BrandingText "http://windirstat.sourceforge.net" OutFile "windirstat${sVersionFile}_setup.exe" SetDatablockOptimize on SetCompress force SetCompressor /FINAL lzma - CRCCheck on + CRCCheck force XPStyle on LicenseForceSelection checkbox - ;Default installation folder + ; Default installation folder InstallDir "$PROGRAMFILES\WinDirStat" - - ;Get installation folder from registry if available + ; Get installation folder from registry if available InstallDirRegKey HKCU "Software\Seifert\WinDirStat" "InstDir" ;-------------------------------- @@ -35,17 +39,18 @@ !define UnselectSection "!insertmacro UnselectSection" !define RestoreSection "!insertmacro RestoreSection" !define SetSectionFlag "!insertmacro SetSectionFlag" + !define ClearSectionFlag "!insertmacro ClearSectionFlag" !define SetSectionInInstType "!insertmacro SetSectionInInstType" !define ClearSectionInInstType "!insertmacro ClearSectionInInstType" !define SectionFlagIsSet "!insertmacro SectionFlagIsSet" ;-------------------------------- -;Interface Settings +; Interface Settings !define MUI_ABORTWARNING !define MUI_COMPONENTSPAGE_SMALLDESC ;-------------------------------- -;Pages +; Pages !insertmacro MUI_PAGE_LICENSE "${Installer}\license.txt" !insertmacro MUI_PAGE_COMPONENTS @@ -69,9 +74,9 @@ !insertmacro MUI_LANGUAGE "English" ;-------------------------------- -;Version Information +; Version Information - VIProductVersion "${sVersion}" + VIProductVersion "${sVersion_Ansi}" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "WinDirStat" VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "This release contains both, Unicode and ANSI version of WinDirStat" VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "WDS Team" @@ -80,20 +85,21 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${sVersionS}" VIAddVersionKey /LANG=${LANG_ENGLISH} "InternalName" "WDS Setup" VIAddVersionKey /LANG=${LANG_ENGLISH} "OriginalFilename" "WinDirStat${sVersionFile}_setup.exe" + VIAddVersionKey /LANG=${LANG_ENGLISH} "SpecialBuild" "This setup is still a beta version!" ;-------------------------------- -;Reserve Files +; Reserve Files ;These files should be inserted before other files in the data block ;Keep these lines before any File command ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA) ;-------------------------------- -;Installer Sections +; Installer Sections InstType "Full installation" -InstType "Recommended only" -InstType "Recommended components without languages" +InstType "Recommended only (all languages)" +InstType "Recommended only (without languages)" Icon "${Installer}\icon1.ico" SubSection /e "Core components (English incl. help)" @@ -189,7 +195,7 @@ SubSectionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SubSection /e "Languages" !define LANGSECTIONS - !include "WDS_Languages.nsi" + !include "${LANGTEMP}" !undef LANGSECTIONS SubSectionEnd @@ -222,8 +228,13 @@ IsNT: ${SetSectionFlag} ${Unicode} ${SF_RO} ${SetSectionInInstType} ${Unicode} ${INSTTYPE_2} ${SetSectionInInstType} ${Unicode} ${INSTTYPE_3} -; Set default install type (recommended) - SetCurInstType 1 +; Set default install type to "recommended" + SetCurInstType 2 +; Now check current thread locale + System::Call "kernel32::GetThreadLocale() i .r0" + !define LANGCURRLANG + !include "${LANGTEMP}" + !undef LANGCURRLANG FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -258,7 +269,7 @@ Function CreateUninstallEntry WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "dwVersionMajor" "${dVersionMajor}" WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "dwVersionMinor" "${dVersionMinor}" WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "dwVersionRev" "${dVersionRev}" - WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "dwVersionBuild" "${dVersionBuild}" + WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "dwVersionBuild" "${dVersionBuild_Ansi}" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "URLInfoAbout" "http://windirstat.sourceforge.net/" WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "NoModify" "1" WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" "NoRepair" "1" @@ -272,12 +283,12 @@ FunctionEnd ; Assign descriptions to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${Ansi} "Installs the ANSI version of WinDirStat, compatible with any Windows" - !insertmacro MUI_DESCRIPTION_TEXT ${Unicode} "Installs the Unicode version of WinDirStat, compatible with Windows NT/2000/XP/2003. (Recommended!)" + !insertmacro MUI_DESCRIPTION_TEXT ${Ansi} "Installs the ANSI version of WinDirStat, compatible with any Windows version. [Version ${sVersion_Ansi}]" + !insertmacro MUI_DESCRIPTION_TEXT ${Unicode} "Installs the Unicode version of WinDirStat, compatible with Windows NT/2000/XP/2003. [Version ${sVersion_Unicode}]" !insertmacro MUI_DESCRIPTION_TEXT ${Startmenu} "Creates a program group in your startmenu." !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "Creates a shortcut on the desktop which points to the component shown in bold." !define DESCRIBING - !include "WDS_Languages.nsi" + !include "${LANGTEMP}" !undef DESCRIBING !insertmacro MUI_FUNCTION_DESCRIPTION_END @@ -296,7 +307,7 @@ Section "Uninstall" Delete "$INSTDIR\windirstat.chm" ; Delete additional languag files. Only these which had been included in the installer! !define DELLANGFILES - !include "WDS_Languages.nsi" + !include "${LANGTEMP}" !undef DELLANGFILES ; Remove the WDS install directory, if empty RMDir /r "$INSTDIR" @@ -361,4 +372,84 @@ Function un.CreateUninstallEntry DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinDirStat" FunctionEnd ; ----------------------------------------------------------------------------- +!endif ; WDSMAIN_NSI + +!ifdef LANGUAGES_NSI +OutFile "${InstallerOut}" + +Function .onInit + +; Write it to a !define for use in main script + FileOpen $R0 "$EXEDIR\${LangOut}" a + FileSeek $R0 0 END + Push $0 ;save + Call LangNameEnglish + Pop $0 + FileWrite $R0 '!define LangEngName${LANGID} "' + FileWrite $R0 '$0"$\r$\n' + Call LangNameNative + Pop $0 + FileWrite $R0 '!define LangNatName${LANGID} "' + FileWrite $R0 '$0"$\r$\n' + Call LangNameShort + Pop $0 + FileWrite $R0 '!define LangShoName${LANGID} "' + FileWrite $R0 '$0"$\r$\n' + Pop $0 ; restore + FileClose $R0 + + Abort +FunctionEnd + +Function LangNameEnglish + Push $0 ; push the old value of variable $0 + System::Alloc "${NSIS_MAX_STRLEN}" + Pop $0 ; get the return value of System::Alloc + System::Call "Kernel32::GetLocaleInfo(i,i,t,i)i(${LCID},0x00001001,.r0,${NSIS_MAX_STRLEN})i" + Exch $0 ; restore old value of variable $0 +FunctionEnd + +Function LangNameNative + Push $0 ; push the old value of variable $0 + System::Alloc "${NSIS_MAX_STRLEN}" + Pop $0 ; get the return value of System::Alloc + System::Call "Kernel32::GetLocaleInfo(i,i,t,i)i(${LCID},0x00000004,.r0,${NSIS_MAX_STRLEN})i" + Exch $0 ; restore old value of variable $0 +FunctionEnd + +Function LangNameShort + Push $0 ; push the old value of variable $0 + System::Alloc "${NSIS_MAX_STRLEN}" + Pop $0 ; get the return value of System::Alloc + System::Call "Kernel32::GetLocaleInfo(i,i,t,i)i(${LCID},0x00000003,.r0,${NSIS_MAX_STRLEN})i" + Exch $0 ; restore old value of variable $0 +FunctionEnd + +Section +SectionEnd +!endif ; LANGUAGES_NSI + +!ifdef GETVERSION_NSI +OutFile "${InstallerOut}" + +Function .onInit +; Get file version + GetDllVersion "${VersionOfFile}" $R0 $R1 + IntOp $R2 $R0 / 0x00010000 + IntOp $R3 $R0 & 0x0000FFFF + IntOp $R4 $R1 / 0x00010000 + IntOp $R5 $R1 & 0x0000FFFF + StrCpy $R1 "$R2.$R3.$R4.$R5" + +; Write it to a !define for use in main script + FileOpen $R0 "$EXEDIR\${VersionOut}" w + FileWrite $R0 '$R1' + FileClose $R0 + + Abort +FunctionEnd + +Section +SectionEnd +!endif ; GETVERSION_NSI |