;Project compiler and U3P builder
;Copyright (C) 2009 qwertymodo
;U3 Smart Technology is a trademark of U3 LLC
;The Uop3n Smart Apps Project is in no way related to or endorsed by U3 LLC
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either version 2
;of the License, or (at your option) any later version.
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
;Compiling this script will compile the U3 Package, provided that
;the correct directory structure has already been created and that
;the 7-zip standalone 7za.exe is located in the NSIS plugins folder
;******DO NOT COMPILE THIS SCRIPT FROM INSIDE YOUR INSTALLATION!!******
;To compile this script, first copy the current U3 Package from .u3p to
;a directory OUTSIDE of your U3 install path and rename it from .u3p to
;.zip then extract it. Compiling this script from inside the U3 install
;path WILL BREAK YOUR INSTALLATION!
!searchparse /file AppInfo.cfg `LauncherSourceFile="` PROGRAMSCRIPT `"`
!searchparse /file AppInfo.cfg `MainAppEXE="` APPEXE `"`
!searchparse /file AppInfo.cfg `AppName="` APPNAME `"`
!searchparse /file AppInfo.cfg `Author="` AUTHOR `"`
!searchparse /file AppInfo.cfg `Website="` WEBSITE `"`
!searchparse /file AppInfo.cfg `UUID="` UUID `"`
!searchparse /file AppInfo.cfg `FullDescription="` FULLDESCRIPTION `"`
!searchparse /file AppInfo.cfg `ShortDescription="` SHORTDESCRIPTION `"`
!searchparse /file AppInfo.cfg `AppDataUpdateMethod="` APPDATAUPDATE `"`
!searchparse /file AppInfo.cfg `DeviceExecUpdateMethod="` DEVICEEXECUPDATE `"`
!searchparse /file AppInfo.cfg `AppStartCommand="` APPSTARTCOMMAND `"`
!searchparse /file AppInfo.cfg `AppStopParams="` APPSTOPPARAMS `"`
!searchparse /file AppInfo.cfg `HostCleanupParams="` HOSTCLEANUPPARAMS `"`
!searchparse /file AppInfo.cfg `AppVersion="` APPVERSION `"`
!searchparse /file AppInfo.cfg `RequiredPlugins="` PLUGINS `"`
!macro CheckForFile DIR FILE DISPLAYNAME
!tempfile SCRIPT2
!tempfile OUTPUT2
!system 'echo SilentInstall Silent > "${SCRIPT2}"'
!system 'echo AutoCloseWindow True >> "${SCRIPT2}"'
!system 'echo RequestExecutionLevel user >> "${SCRIPT2}"'
!system 'echo OutFile ${SCRIPT2}.exe >> "${SCRIPT2}"'
!system 'echo Section "" >> "${SCRIPT2}"'
!system 'echo FileOpen $R0 "${OUTPUT2}" w >> "${SCRIPT2}"'
!system 'echo IfFileExists "${DIR}\${FILE}" 0 +2 >> "${SCRIPT2}"'
!system 'echo FileWrite $R0 `!define "${FILE}Exists"` >> "${SCRIPT2}"'
!system 'echo FileClose $R0 >> "${SCRIPT2}"'
!system 'echo SectionEnd >> "${SCRIPT2}"'
!system '"${NSISDIR}\makensis.exe" ${SCRIPT2}' = 0
!system '"${SCRIPT2}.exe"' = 0
!include ${OUTPUT2}
!delfile ${OUTPUT2}
!delfile "${SCRIPT2}"
!delfile "${SCRIPT2}.exe"
!undef SCRIPT2
!undef OUTPUT2
!ifndef "${FILE}Exists"
!error "${DISPLAYNAME} could not be found. Please install ${FILE} to ${DIR}."
!endif
!macroend
!macro CheckForRequiredPlugins
!tempfile SCRIPT
!tempfile OUTPUT
!system 'echo SilentInstall Silent >> "${SCRIPT}"'
!system 'echo AutoCloseWindow True >> "${SCRIPT}"'
!system 'echo RequestExecutionLevel user >> "${SCRIPT}"'
!system 'echo OutFile `${SCRIPT}.exe` >> "${SCRIPT}"'
!system 'echo !macro SplitString STRING >> "${SCRIPT}"'
!system 'echo Push "${STRING}" >> "${SCRIPT}"'
!system 'echo Call Split >> "${SCRIPT}"'
!system 'echo !macroend >> "${SCRIPT}"'
!system 'echo Function Split >> "${SCRIPT}"'
!system 'echo FileOpen $R0 "${OUTPUT}" w >> "${SCRIPT}"'
!system 'echo StrCmp $0 "" Done >> "${SCRIPT}"'
!system 'echo Pop $0 >> "${SCRIPT}"'
!system 'echo NewSubstring: >> "${SCRIPT}"'
!system 'echo StrCpy $2 "" >> "${SCRIPT}"'
!system 'echo StrCpy $3 "" >> "${SCRIPT}"'
!system 'echo SubstringLoop: >> "${SCRIPT}"'
!system 'echo StrCmp $0 "" Found >> "${SCRIPT}"'
!system 'echo StrCpy $9 $0 1 >> "${SCRIPT}"'
!system 'echo StrCpy $0 $0 "" 1 >> "${SCRIPT}"'
!system 'echo StrCmp $9 "," Found >> "${SCRIPT}"'
!system 'echo StrCpy $2 "$2$9" >> "${SCRIPT}"'
!system 'echo Goto SubstringLoop >> "${SCRIPT}"'
!system 'echo Found: >> "${SCRIPT}"'
!system 'echo StrCpy $9 $2 1 >> "${SCRIPT}"'
!system 'echo StrCpy $2 $2 "" 1 >> "${SCRIPT}"'
!system 'echo StrCmp $9 "|" Separated >> "${SCRIPT}"'
!system 'echo StrCpy $3 "$3$9" >> "${SCRIPT}"'
!system 'echo Goto Found >> "${SCRIPT}"'
!system 'echo Separated: >> "${SCRIPT}"'
!system 'echo FileWrite $R0 `!insertmacro CheckForFile "${NSISDIR}" "$3" "$2"` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R0 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R0 "10" >> "${SCRIPT}"'
!system 'echo StrCmp $0 "" "" NewSubstring >> "${SCRIPT}"'
!system 'echo FileWrite $R0 `!insertmacro CheckForFile "${NSISDIR}" "$3" "$2"` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R0 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R0 "10" >> "${SCRIPT}"'
!system 'echo Done: >> "${SCRIPT}"'
!system 'echo FileWrite $R0 `!insertmacro CheckForFile "${NSISDIR}" "plugins\7za.exe" "7-zip standalone executable"` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R0 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R0 "10" >> "${SCRIPT}"'
!system 'echo FileClose $R0 >> "${SCRIPT}"'
!system 'echo FunctionEnd >> "${SCRIPT}"'
!system 'echo Section "" >> "${SCRIPT}"'
!system 'echo !insertmacro SplitString "${PLUGINS}" >> "${SCRIPT}"'
!system 'echo SectionEnd >> "${SCRIPT}"'
!system '"${NSISDIR}\makensis.exe" ${SCRIPT}' = 0
!system '"${SCRIPT}.exe"' = 0
!include ${OUTPUT}
!delfile ${OUTPUT}
!delfile "${SCRIPT}"
!delfile "${SCRIPT}.exe"
!undef SCRIPT
!undef OUTPUT
!macroend
!macro GenerateManifest
;Get current version and estimate size
!define FILE "..\..\..\..\${APPEXE}"
!tempfile SCRIPT
!tempfile OUTPUT
!system 'echo SilentInstall Silent > "${SCRIPT}"'
!system 'echo AutoCloseWindow True >> "${SCRIPT}"'
!system 'echo RequestExecutionLevel user >> "${SCRIPT}"'
!system 'echo OutFile ${SCRIPT}.exe >> "${SCRIPT}"'
!system 'echo !include FileFunc.nsh >> "${SCRIPT}"'
!system 'echo !insertmacro GetSize >> "${SCRIPT}"'
!system 'echo !include TextFunc.nsh >> "${SCRIPT}"'
!system 'echo !insertmacro ConfigWrite >> "${SCRIPT}"'
!system 'echo Var U3PACKAGE >> "${SCRIPT}"'
!system 'echo Section "" >> "${SCRIPT}"'
!system 'echo FileOpen $R9 "${OUTPUT}" w >> "${SCRIPT}"'
!if "${APPVERSION}" == ""
!undef APPVERSION
!system 'echo GetDllVersion "${FILE}" $R0 $R1 >> "${SCRIPT}"'
!system 'echo IntOp $R2 $R0 / 0x00010000 >> "${SCRIPT}"'
!system 'echo IntOp $R3 $R0 ^& 0x0000FFFF >> "${SCRIPT}"'
!system 'echo IntOp $R4 $R1 / 0x00010000 >> "${SCRIPT}"'
!system 'echo IntOp $R5 $R1 ^& 0x0000FFFF >> "${SCRIPT}"'
!system 'echo StrCpy $R1 "$R2.$R3.$R4.$R5" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `!define APPVERSION "$R1"` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!else
!define PADDEDVERSION 'VERSION=$\"${APPVERSION}$\"'
!searchparse "${PADDEDVERSION}" `VERSION="` R2 `.` R3 `.` R4 `.` R5 `"`
!system 'echo StrCpy $R2 "${R2}" >> "${SCRIPT}"'
!system 'echo StrCpy $R3 "${R3}" >> "${SCRIPT}"'
!system 'echo StrCpy $R4 "${R4}" >> "${SCRIPT}"'
!system 'echo StrCpy $R5 "${R5}" >> "${SCRIPT}"'
!endif
!system 'echo StrCpy $U3PACKAGE "${APPNAME}_$R2.$R3.$R4" >> "${SCRIPT}"'
!system 'echo StrCmp $R5 0 +2 >> "${SCRIPT}"'
!system 'echo StrCpy $U3PACKAGE "$U3PACKAGE.$R5" >> "${SCRIPT}"'
!system 'echo StrCpy $U3PACKAGE "$U3PACKAGE.u3p" >> "${SCRIPT}"'
!system 'echo ${GetSize} "$EXEDIR\..\..\..\..\" "/M=$U3PACKAGE /S=0M" $0 $1 $2 >> "${SCRIPT}"'
!system 'echo ${GetSize} "$EXEDIR\..\..\..\..\Device" "/S=0M" $1 $2 $3 >> "${SCRIPT}"'
!system 'echo IntOp $0 $0 + $1 >> "${SCRIPT}"'
!system 'echo IntOp $0 $0 * 6 >> "${SCRIPT}"'
!system 'echo IntOp $0 $0 / 5 >> "${SCRIPT}"'
!system 'echo StrCmp $0 "0" 0 +2 >> "${SCRIPT}"'
!system 'echo StrCpy $0 1 >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `!define PADDEDSIZE SIZE=$\"$0$\"` >> "${SCRIPT}"'
!system 'echo SectionEnd >> "${SCRIPT}"'
!system '"${NSISDIR}\makensis.exe" ${SCRIPT}' = 0
!system '"${SCRIPT}.exe"' = 0
!include ${OUTPUT}
!searchparse "${PADDEDVERSION}" `VERSION="` APPVERSION `"`
!undef PADDEDVERSION
!searchparse ${PADDEDSIZE} `SIZE="` SIZE `"` >>
!undef PADDEDSIZE
!delfile ${OUTPUT}
!delfile "${SCRIPT}"
!delfile "${SCRIPT}.exe"
!undef SCRIPT
!undef FILE
!undef OUTPUT
!if "${APPVERSION}" == "0.0.0.0"
!error "Unable to detect app version. Please manually set AppVersion in AppInfo.cfg."
!endif
!tempfile SCRIPT
!system 'echo SilentInstall Silent > "${SCRIPT}"'
!system 'echo AutoCloseWindow True >> "${SCRIPT}"'
!system 'echo RequestExecutionLevel user >> "${SCRIPT}"'
!system 'echo OutFile "${SCRIPT}.exe" >> "${SCRIPT}"'
!system 'echo Section "" >> "${SCRIPT}"'
!system 'echo FileOpen $R9 "..\..\..\..\Manifest\manifest.u3i" w >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^appicon.ico^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^${APPNAME}^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^${FULLDESCRIPTION}^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^${SHORTDESCRIPTION}^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^${AUTHOR}^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t$\t^${SIZE}^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t$\t^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t$\t^^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t$\t^ ${APPSTOPPARAMS} ^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t$\t^ ${HOSTCLEANUPPARAMS} ^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `$\t$\t^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileWrite $R9 `^` >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "13" >> "${SCRIPT}"'
!system 'echo FileWriteByte $R9 "10" >> "${SCRIPT}"'
!system 'echo FileClose $R9 >> "${SCRIPT}"'
!system 'echo SectionEnd >> "${SCRIPT}"'
!system '"${NSISDIR}\makensis.exe" ${SCRIPT}' = 0
!system '"${SCRIPT}.exe"' = 0
!delfile "${SCRIPT}"
!delfile "${SCRIPT}.exe"
!undef SCRIPT
!macroend
;**********Execution Start Point**********
!insertmacro CheckForRequiredPlugins
!searchparse /file AppInfo.cfg `LauncherSourceFile="` PROGRAMSCRIPT `"`
!system '"${NSISDIR}\makensis.exe" ${PROGRAMSCRIPT}' = 0
!insertmacro GenerateManifest
!searchparse /file "..\..\..\..\Manifest\manifest.u3i" `` NAME ``
!searchreplace NAME "${NAME}" " " "_"
!searchparse /file "..\..\..\..\Manifest\manifest.u3i" ``
!define FILENAME "${NAME}_${VER}.u3p"
!searchreplace FILENAME "${FILENAME}" ".0.u3p" ".u3p"
;Add a useless file to the U3 Package to make sure it exists, because if it doesn't, !delfile produces an error
!system '"${NSISDIR}\plugins\7za.exe" a -tzip "..\..\..\..\${FILENAME}" ".\BuildU3P.nsi"'
!delfile "..\..\..\..\${FILENAME}"
!system '"${NSISDIR}\plugins\7za.exe" a -tzip "..\..\..\..\${FILENAME}" "..\..\..\..\Data"'
!system '"${NSISDIR}\plugins\7za.exe" a -tzip "..\..\..\..\${FILENAME}" "..\..\..\..\Device"'
!system '"${NSISDIR}\plugins\7za.exe" a -tzip "..\..\..\..\${FILENAME}" "..\..\..\..\Host"'
!system '"${NSISDIR}\plugins\7za.exe" a -tzip "..\..\..\..\${FILENAME}" "..\..\..\..\Manifest"'
;Update package size in manifest
!insertmacro GenerateManifest
!system '"${NSISDIR}\plugins\7za.exe" a -tzip "..\..\..\..\${FILENAME}" "..\..\..\..\Manifest"'
SilentInstall Silent
AutoCloseWindow True
RequestExecutionLevel user
OutFile "$%TEMP%\deleteme"
Section ""
SectionEnd