From 2c84d92cec78907064a3c0b386f42b7dc6cd5041 Mon Sep 17 00:00:00 2001 From: Miguel Angel Mulero Martinez Date: Fri, 29 Dec 2017 14:57:45 +0100 Subject: [PATCH] Add a win32 installer It needs NSIS (http://nsis.sourceforge.net/) installed and add makensis executable to the path --- assets/windows/bf_installer_icon.ico | Bin 0 -> 9662 bytes assets/windows/bf_uninstaller_icon.ico | Bin 0 -> 9662 bytes assets/windows/installer.nsi | 91 +++++++++++++++++++++++++ gulpfile.js | 37 +++++++++- package.json | 3 +- 5 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 assets/windows/bf_installer_icon.ico create mode 100644 assets/windows/bf_uninstaller_icon.ico create mode 100644 assets/windows/installer.nsi diff --git a/assets/windows/bf_installer_icon.ico b/assets/windows/bf_installer_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e07486af043cf5e4da226e2b7a7735d934cd7373 GIT binary patch literal 9662 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 literal 0 HcmV?d00001 diff --git a/assets/windows/installer.nsi b/assets/windows/installer.nsi new file mode 100644 index 00000000..098947fd --- /dev/null +++ b/assets/windows/installer.nsi @@ -0,0 +1,91 @@ +!include "MUI2.nsh" + +# Receives variables from the command line +# ${VERSION} - Version to generate (x.y.z) +# ${PLATFORM} - Platform to generate (win32 or win64) +# ${DEST_FOLDER} - Destination folder for the installer files + +# Some definitions +!define SOURCE_FILES "..\..\apps\betaflight-configurator\${PLATFORM}\*" +!define APP_NAME "Betaflight Configurator" +!define COMPANY_NAME "The Betaflight open source project." +!define GROUP_NAME "Betaflight" +!define FOLDER_NAME "Betaflight-Configurator" +!define FILE_NAME_INSTALLER "betaflight-configurator-installer-${VERSION}-${PLATFORM}.exe" +!define FILE_NAME_UNINSTALLER "uninstall-betaflight-configurator.exe" +!define FILE_NAME_EXECUTABLE "betaflight-configurator.exe" +!define LICENSE "..\..\LICENSE" + + +Name "${APP_NAME}" +BrandingText "${COMPANY_NAME}" + +# set the icon +!define MUI_ICON ".\bf_installer_icon.ico" +!define MUI_UNICON ".\bf_uninstaller_icon.ico" + +# define the resulting installer's name: +OutFile "..\..\${DEST_FOLDER}\${FILE_NAME_INSTALLER}" + +# set the default installation directory +!if ${PLATFORM} == 'win64' + InstallDir "$PROGRAMFILES64\${GROUP_NAME}\${FOLDER_NAME}\" +!else + InstallDir "$PROGRAMFILES\${GROUP_NAME}\${FOLDER_NAME}\" +!endif + +# app dialogs +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE ${LICENSE} +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN "$INSTDIR\${FILE_NAME_EXECUTABLE}" + +!insertmacro MUI_PAGE_FINISH +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_LANGUAGE "Catalan" +!insertmacro MUI_LANGUAGE "French" +!insertmacro MUI_LANGUAGE "German" +!insertmacro MUI_LANGUAGE "Korean" +!insertmacro MUI_LANGUAGE "Spanish" + +# default section start +Section + + # delete the installed files + RMDir /r $INSTDIR + + # define the path to which the installer should install + SetOutPath $INSTDIR + + # specify the files to go in the output path + File /r ${SOURCE_FILES} + + # create the uninstaller + WriteUninstaller "$INSTDIR\${FILE_NAME_UNINSTALLER}" + + # create shortcuts in the start menu and on the desktop + CreateDirectory "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}" + CreateShortCut "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}\${APP_NAME}.lnk" "$INSTDIR\${FILE_NAME_EXECUTABLE}" + CreateShortCut "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}\${APP_NAME} (English).lnk" "$INSTDIR\${FILE_NAME_EXECUTABLE}" "--lang=en" + CreateShortCut "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}\Uninstall ${APP_NAME}.lnk" "$INSTDIR\${FILE_NAME_UNINSTALLER}" + CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${FILE_NAME_EXECUTABLE}" + +SectionEnd + +# create a section to define what the uninstaller does +Section "Uninstall" + + # delete the installed files + RMDir /r $INSTDIR + + # delete the shortcuts + Delete "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}\${APP_NAME}.lnk" + Delete "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}\${APP_NAME} (English).lnk" + Delete "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}\Uninstall ${APP_NAME}.lnk" + RMDir "$SMPROGRAMS\${GROUP_NAME}\${FOLDER_NAME}" + RMDir "$SMPROGRAMS\${GROUP_NAME}" + Delete "$DESKTOP\${APP_NAME}.lnk" + +SectionEnd \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index cdcfdf9c..73b7c20f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,6 +9,7 @@ var path = require('path'); var archiver = require('archiver'); var del = require('del'); var NwBuilder = require('nw-builder'); +var makensis = require('makensis'); var gulp = require('gulp'); var concat = require('gulp-concat'); @@ -338,7 +339,37 @@ gulp.task('debug', ['dist', 'clean-debug'], function (done) { }); }); -// Create distribution package for windows and linux platforms +// Create installer package for windows platforms +function releaseWin(arch) { + + // Create the output directory, with write permissions + fs.mkdir(releaseDir, '0775', function(err) { + if (err) { + if (err.code !== 'EEXIST') { + throw err; + } + } + }); + + // Parameters passed to the installer script + const options = { + verbose: 2, + define: { + 'VERSION': pkg.version, + 'PLATFORM': arch, + 'DEST_FOLDER': releaseDir + } + } + var output = makensis.compileSync('./assets/windows/installer.nsi', options); + + if (output.status === 0) { + console.log('Installer finished for platform: ' + arch); + } else { + console.error('Installer for platform ' + arch + ' finished with error ' + output.status + ': ' + output.stderr); + } +} + +// Create distribution package (zip) for windows and linux platforms function release(arch) { var src = path.join(appsDir, pkg.name, arch); var output = fs.createWriteStream(path.join(releaseDir, get_release_filename(arch, 'zip'))); @@ -423,11 +454,11 @@ gulp.task('release', ['apps', 'clean-release'], function () { } if (platforms.indexOf('win32') !== -1) { - release('win32'); + releaseWin('win32'); } if (platforms.indexOf('win64') !== -1) { - release('win64'); + releaseWin('win64'); } }); diff --git a/package.json b/package.json index 0ad1e25b..e41ff97f 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "os": "^0.1.1", "platform-dependent-modules": "0.0.14", "run-sequence": "^2.2.0", - "temp": "^0.8.3" + "temp": "^0.8.3", + "makensis": "^0.9.0" }, "config": { "platformDependentModules": {