;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