2017-10-20 00:36:33 +00:00
'use strict' ;
2018-01-10 14:36:12 +00:00
const pkg = require ( './package.json' ) ;
const child _process = require ( 'child_process' ) ;
const fs = require ( 'fs' ) ;
const path = require ( 'path' ) ;
const zip = require ( 'gulp-zip' ) ;
const del = require ( 'del' ) ;
const NwBuilder = require ( 'nw-builder' ) ;
const makensis = require ( 'makensis' ) ;
const deb = require ( 'gulp-debian' ) ;
const gulp = require ( 'gulp' ) ;
const concat = require ( 'gulp-concat' ) ;
const install = require ( "gulp-install" ) ;
const rename = require ( 'gulp-rename' ) ;
const os = require ( 'os' ) ;
const DIST _DIR = './dist/' ;
const APPS _DIR = './apps/' ;
const DEBUG _DIR = './debug/' ;
const RELEASE _DIR = './release/' ;
2017-10-20 00:36:33 +00:00
2018-01-09 00:44:13 +00:00
var nwBuilderOptions = {
version : '0.27.4' ,
files : './dist/**/*' ,
2018-01-21 16:09:36 +00:00
macIcns : './src/images/bf_icon.icns' ,
2018-01-09 00:44:13 +00:00
macPlist : { 'CFBundleDisplayName' : 'Betaflight Configurator' } ,
2018-01-21 16:09:36 +00:00
winIco : './src/images/bf_icon.ico'
2018-01-09 00:44:13 +00:00
} ;
2018-01-10 14:36:12 +00:00
//-----------------
//Pre tasks operations
//-----------------
const SELECTED _PLATFORMS = getInputPlatforms ( ) ;
//-----------------
//Tasks
//-----------------
gulp . task ( 'clean' , gulp . parallel ( clean _dist , clean _apps , clean _debug , clean _release ) ) ;
gulp . task ( 'clean-dist' , clean _dist ) ;
gulp . task ( 'clean-apps' , clean _apps ) ;
gulp . task ( 'clean-debug' , clean _debug ) ;
gulp . task ( 'clean-release' , clean _release ) ;
gulp . task ( 'clean-cache' , clean _cache ) ;
2018-01-24 23:37:07 +00:00
var distBuild = gulp . series ( clean _dist , dist _src , dist _locale , dist _libraries , dist _resources ) ;
2018-01-10 14:36:12 +00:00
gulp . task ( 'dist' , distBuild ) ;
var appsBuild = gulp . series ( gulp . parallel ( clean _apps , distBuild ) , apps , gulp . parallel ( listPostBuildTasks ( APPS _DIR ) ) ) ;
gulp . task ( 'apps' , appsBuild ) ;
var debugBuild = gulp . series ( gulp . parallel ( clean _debug , distBuild ) , debug , gulp . parallel ( listPostBuildTasks ( DEBUG _DIR ) ) , start _debug )
gulp . task ( 'debug' , debugBuild ) ;
var releaseBuild = gulp . series ( gulp . parallel ( clean _release , appsBuild ) , gulp . parallel ( listReleaseTasks ( ) ) ) ;
gulp . task ( 'release' , releaseBuild ) ;
gulp . task ( 'default' , debugBuild ) ;
2018-01-09 00:44:13 +00:00
2017-11-22 20:19:34 +00:00
// -----------------
// Helper functions
// -----------------
// Get platform from commandline args
// #
2017-12-18 20:09:20 +00:00
// # gulp <task> [<platform>]+ Run only for platform(s) (with <platform> one of --linux64, --linux32, --osx64, --win32, --win64, or --chromeos)
2017-11-22 20:19:34 +00:00
// #
2018-01-10 14:36:12 +00:00
function getInputPlatforms ( ) {
2018-01-08 10:37:32 +00:00
var supportedPlatforms = [ 'linux64' , 'linux32' , 'osx64' , 'win32' , 'win64' , 'chromeos' ] ;
2017-11-22 20:19:34 +00:00
var platforms = [ ] ;
2017-11-24 03:40:02 +00:00
var regEx = /--(\w+)/ ;
for ( var i = 3 ; i < process . argv . length ; i ++ ) {
var arg = process . argv [ i ] . match ( regEx ) [ 1 ] ;
if ( supportedPlatforms . indexOf ( arg ) > - 1 ) {
platforms . push ( arg ) ;
} else {
console . log ( 'Unknown platform: ' + arg ) ;
process . exit ( ) ;
2017-11-22 20:19:34 +00:00
}
}
2017-11-24 03:40:02 +00:00
if ( platforms . length === 0 ) {
2017-12-07 15:00:13 +00:00
var defaultPlatform = getDefaultPlatform ( ) ;
if ( supportedPlatforms . indexOf ( defaultPlatform ) > - 1 ) {
platforms . push ( defaultPlatform ) ;
} else {
2018-01-08 10:37:32 +00:00
console . error ( ` Your current platform ( ${ os . platform ( ) } ) is not a supported build platform. Please specify platform to build for on the command line. ` ) ;
2017-12-07 15:00:13 +00:00
process . exit ( ) ;
2017-11-24 03:40:02 +00:00
}
}
2018-01-08 10:37:32 +00:00
if ( platforms . length > 0 ) {
console . log ( 'Building for platform(s): ' + platforms + '.' ) ;
} else {
console . error ( 'No suitables platforms found.' ) ;
process . exit ( ) ;
}
2017-11-24 03:40:02 +00:00
return platforms ;
2017-11-22 20:19:34 +00:00
}
2017-12-07 15:00:13 +00:00
// Gets the default platform to be used
function getDefaultPlatform ( ) {
var defaultPlatform ;
2017-12-03 20:18:03 +00:00
switch ( os . platform ( ) ) {
case 'darwin' :
2017-12-07 15:00:13 +00:00
defaultPlatform = 'osx64' ;
2017-12-03 20:18:03 +00:00
break ;
2017-12-07 15:00:13 +00:00
case 'linux' :
defaultPlatform = 'linux64' ;
2017-12-03 20:18:03 +00:00
break ;
2017-12-07 15:00:13 +00:00
case 'win32' :
defaultPlatform = 'win32' ;
break ;
default :
defaultPlatform = '' ;
break ;
}
return defaultPlatform ;
}
2018-01-10 14:36:12 +00:00
function getPlatforms ( ) {
return SELECTED _PLATFORMS . slice ( ) ;
}
2018-01-08 10:37:32 +00:00
function removeItem ( platforms , item ) {
var index = platforms . indexOf ( item ) ;
if ( index >= 0 ) {
platforms . splice ( index , 1 ) ;
}
}
2017-12-07 15:00:13 +00:00
function getRunDebugAppCommand ( arch ) {
switch ( arch ) {
case 'osx64' :
2018-01-10 14:36:12 +00:00
return 'open ' + path . join ( DEBUG _DIR , pkg . name , arch , pkg . name + '.app' ) ;
2017-12-07 15:00:13 +00:00
break ;
case 'linux64' :
2017-12-10 20:25:16 +00:00
case 'linux32' :
2018-01-10 14:36:12 +00:00
return path . join ( DEBUG _DIR , pkg . name , arch , pkg . name ) ;
2017-12-10 20:25:16 +00:00
break ;
2017-12-03 20:18:03 +00:00
case 'win32' :
2017-12-07 15:00:13 +00:00
case 'win64' :
2018-01-10 14:36:12 +00:00
return path . join ( DEBUG _DIR , pkg . name , arch , pkg . name + '.exe' ) ;
2017-12-03 20:18:03 +00:00
break ;
default :
2017-12-04 10:03:35 +00:00
return '' ;
2017-12-03 20:18:03 +00:00
break ;
}
}
2018-01-10 14:36:12 +00:00
function getReleaseFilename ( platform , ext ) {
return 'betaflight-configurator_' + pkg . version + '_' + platform + '.' + ext ;
2017-10-20 00:36:33 +00:00
}
2018-01-10 14:36:12 +00:00
function clean _dist ( ) {
return del ( [ DIST _DIR + '**' ] , { force : true } ) ;
} ;
2017-11-22 20:19:34 +00:00
2018-01-10 14:36:12 +00:00
function clean _apps ( ) {
return del ( [ APPS _DIR + '**' ] , { force : true } ) ;
} ;
2017-11-22 20:19:34 +00:00
2018-01-10 14:36:12 +00:00
function clean _debug ( ) {
return del ( [ DEBUG _DIR + '**' ] , { force : true } ) ;
} ;
2017-11-22 20:19:34 +00:00
2018-01-10 14:36:12 +00:00
function clean _release ( ) {
return del ( [ RELEASE _DIR + '**' ] , { force : true } ) ;
} ;
2017-10-20 00:36:33 +00:00
2018-01-10 14:36:12 +00:00
function clean _cache ( ) {
2017-12-08 12:48:55 +00:00
return del ( [ './cache/**' ] , { force : true } ) ;
2018-01-10 14:36:12 +00:00
} ;
2017-12-08 12:48:55 +00:00
2017-10-20 00:36:33 +00:00
// Real work for dist task. Done in another task to call it via
// run-sequence.
2018-01-24 23:37:07 +00:00
function dist _src ( ) {
2017-10-20 00:36:33 +00:00
var distSources = [
2018-01-29 14:40:04 +00:00
'./src/**/*' ,
'!./src/css/dropdown-lists/LICENSE' ,
'!./src/css/font-awesome/css/font-awesome.css' ,
'!./src/css/opensans_webfontkit/*.{txt,html}' ,
'!./src/support/**'
2017-10-20 00:36:33 +00:00
] ;
2018-01-24 23:37:07 +00:00
2018-01-21 16:09:36 +00:00
return gulp . src ( distSources , { base : 'src' } )
. pipe ( gulp . src ( 'manifest.json' , { passthrougth : true } ) )
. pipe ( gulp . src ( 'package.json' , { passthrougth : true } ) )
2018-01-24 23:37:07 +00:00
. pipe ( gulp . src ( 'changelog.html' , { passthrougth : true } ) )
2018-01-25 23:52:10 +00:00
. pipe ( gulp . dest ( DIST _DIR ) )
. pipe ( install ( {
npm : '--production --ignore-scripts'
} ) ) ;
2018-01-10 14:36:12 +00:00
} ;
2017-10-20 00:36:33 +00:00
2018-01-24 23:37:07 +00:00
function dist _locale ( ) {
return gulp . src ( './locales/**/*' , { base : 'locales' } )
. pipe ( gulp . dest ( DIST _DIR + '_locales' ) ) ;
}
function dist _libraries ( ) {
return gulp . src ( './libraries/**/*' , { base : '.' } )
. pipe ( gulp . dest ( DIST _DIR + 'js' ) ) ;
}
function dist _resources ( ) {
return gulp . src ( './resources/**/*' , { base : '.' } )
. pipe ( gulp . dest ( DIST _DIR ) ) ;
}
2017-11-22 20:19:34 +00:00
// Create runable app directories in ./apps
2018-01-10 14:36:12 +00:00
function apps ( done ) {
2017-11-24 03:40:02 +00:00
var platforms = getPlatforms ( ) ;
2018-01-08 10:37:32 +00:00
removeItem ( platforms , 'chromeos' ) ;
2018-01-10 14:36:12 +00:00
buildNWApps ( platforms , 'normal' , APPS _DIR , done ) ;
} ;
2017-11-11 14:00:18 +00:00
2018-01-10 14:36:12 +00:00
function listPostBuildTasks ( folder , done ) {
2018-01-05 17:58:27 +00:00
var platforms = getPlatforms ( ) ;
2018-01-10 14:36:12 +00:00
var postBuildTasks = [ ] ;
2018-01-05 17:58:27 +00:00
if ( platforms . indexOf ( 'linux32' ) != - 1 ) {
2018-01-10 14:36:12 +00:00
postBuildTasks . push ( function post _build _linux32 ( done ) { return post _build ( 'linux32' , folder , done ) } ) ;
2018-01-05 17:58:27 +00:00
}
if ( platforms . indexOf ( 'linux64' ) != - 1 ) {
2018-01-10 14:36:12 +00:00
postBuildTasks . push ( function post _build _linux64 ( done ) { return post _build ( 'linux64' , folder , done ) } ) ;
}
// We need to return at least one task, if not gulp will throw an error
if ( postBuildTasks . length == 0 ) {
postBuildTasks . push ( function post _build _none ( done ) { done ( ) } ) ;
}
return postBuildTasks ;
}
function post _build ( arch , folder , done ) {
if ( ( arch == 'linux32' ) || ( arch == 'linux64' ) ) {
2018-01-05 17:58:27 +00:00
// Copy Ubuntu launcher scripts to destination dir
2018-01-10 14:36:12 +00:00
var launcherDir = path . join ( folder , pkg . name , arch ) ;
console . log ( 'Copy Ubuntu launcher scripts to ' + launcherDir ) ;
return gulp . src ( 'assets/linux/**' )
. pipe ( gulp . dest ( launcherDir ) ) ;
2018-01-05 17:58:27 +00:00
}
2018-01-10 14:36:12 +00:00
return done ( ) ;
}
2017-11-11 14:00:18 +00:00
// Create debug app directories in ./debug
2018-01-10 14:36:12 +00:00
function debug ( done ) {
2017-11-24 03:40:02 +00:00
var platforms = getPlatforms ( ) ;
2018-01-08 10:37:32 +00:00
removeItem ( platforms , 'chromeos' ) ;
2018-01-10 14:36:12 +00:00
buildNWApps ( platforms , 'sdk' , DEBUG _DIR , done ) ;
}
function buildNWApps ( platforms , flavor , dir , done ) {
2017-11-22 20:19:34 +00:00
2018-01-08 10:37:32 +00:00
if ( platforms . length > 0 ) {
2018-01-09 00:44:13 +00:00
var builder = new NwBuilder ( Object . assign ( {
2018-01-10 14:36:12 +00:00
buildDir : dir ,
2018-01-08 10:37:32 +00:00
platforms : platforms ,
2018-01-10 14:36:12 +00:00
flavor : flavor
2018-01-09 00:44:13 +00:00
} , nwBuilderOptions ) ) ;
2018-01-08 10:37:32 +00:00
builder . on ( 'log' , console . log ) ;
builder . build ( function ( err ) {
if ( err ) {
console . log ( 'Error building NW apps: ' + err ) ;
2018-01-10 14:36:12 +00:00
clean _debug ( ) ;
process . exit ( 1 ) ;
2018-01-08 10:37:32 +00:00
}
done ( ) ;
} ) ;
} else {
2018-01-10 14:36:12 +00:00
console . log ( 'No platform suitable for NW Build' )
2017-10-20 00:36:33 +00:00
done ( ) ;
2018-01-08 10:37:32 +00:00
}
2018-01-10 14:36:12 +00:00
}
function start _debug ( done ) {
var platforms = getPlatforms ( ) ;
var exec = require ( 'child_process' ) . exec ;
if ( platforms . length === 1 ) {
var run = getRunDebugAppCommand ( platforms [ 0 ] ) ;
console . log ( 'Starting debug app (' + run + ')...' ) ;
exec ( run ) ;
} else {
console . log ( 'More than one platform specified, not starting debug app' ) ;
}
done ( ) ;
}
2017-10-20 00:36:33 +00:00
2017-12-29 13:57:45 +00:00
// Create installer package for windows platforms
2018-01-10 14:36:12 +00:00
function release _win ( arch , done ) {
2017-12-29 13:57:45 +00:00
2018-01-17 15:38:41 +00:00
// The makensis does not generate the folder correctly, manually
createDirIfNotExists ( RELEASE _DIR ) ;
2018-01-10 14:36:12 +00:00
2017-12-29 13:57:45 +00:00
// Parameters passed to the installer script
const options = {
verbose : 2 ,
define : {
'VERSION' : pkg . version ,
'PLATFORM' : arch ,
2018-01-10 14:36:12 +00:00
'DEST_FOLDER' : RELEASE _DIR
2017-12-29 13:57:45 +00:00
}
}
2018-01-10 14:36:12 +00:00
2017-12-29 13:57:45 +00:00
var output = makensis . compileSync ( './assets/windows/installer.nsi' , options ) ;
2018-01-10 14:36:12 +00:00
if ( output . status !== 0 ) {
2017-12-29 13:57:45 +00:00
console . error ( 'Installer for platform ' + arch + ' finished with error ' + output . status + ': ' + output . stderr ) ;
}
2018-01-10 14:36:12 +00:00
done ( ) ;
2017-12-29 13:57:45 +00:00
}
// Create distribution package (zip) for windows and linux platforms
2018-01-10 14:36:12 +00:00
function release _zip ( arch ) {
var src = path . join ( APPS _DIR , pkg . name , arch , '**' ) ;
var output = getReleaseFilename ( arch , 'zip' ) ;
var base = path . join ( APPS _DIR , pkg . name , arch ) ;
return compressFiles ( src , base , output , 'Betaflight Configurator' ) ;
}
// Create distribution package for chromeos platform
function release _chromeos ( ) {
var src = path . join ( DIST _DIR , '**' ) ;
var output = getReleaseFilename ( 'chromeos' , 'zip' ) ;
var base = DIST _DIR ;
return compressFiles ( src , base , output , '.' ) ;
}
// Compress files from srcPath, using basePath, to outputFile in the RELEASE_DIR
function compressFiles ( srcPath , basePath , outputFile , zipFolder ) {
return gulp . src ( srcPath , { base : basePath } )
. pipe ( rename ( function ( actualPath ) { actualPath . dirname = path . join ( zipFolder , actualPath . dirname ) } ) )
. pipe ( zip ( outputFile ) )
. pipe ( gulp . dest ( RELEASE _DIR ) ) ;
2018-01-05 17:58:27 +00:00
}
function release _deb ( arch ) {
var debArch ;
2018-01-10 14:36:12 +00:00
2018-01-05 17:58:27 +00:00
switch ( arch ) {
case 'linux32' :
debArch = 'i386' ;
break ;
case 'linux64' :
debArch = 'amd64' ;
break ;
default :
console . error ( "Deb package error, arch: " + arch ) ;
process . exit ( 1 ) ;
break ;
}
2018-01-10 14:36:12 +00:00
return gulp . src ( [ path . join ( APPS _DIR , pkg . name , arch , '*' ) ] )
2018-01-05 17:58:27 +00:00
. pipe ( deb ( {
package : pkg . name ,
version : pkg . version ,
section : 'base' ,
priority : 'optional' ,
architecture : debArch ,
maintainer : pkg . author ,
description : pkg . description ,
2018-01-25 14:15:58 +00:00
postinst : [ 'xdg-desktop-menu install /opt/betaflight/betaflight-configurator/betaflight-configurator.desktop' ] ,
prerm : [ 'xdg-desktop-menu uninstall betaflight-configurator.desktop' ] ,
2018-01-05 17:58:27 +00:00
depends : 'libgconf-2-4' ,
changelog : [ ] ,
_target : 'opt/betaflight/betaflight-configurator' ,
2018-01-10 14:36:12 +00:00
_out : RELEASE _DIR ,
2018-01-17 14:30:44 +00:00
_copyright : 'assets/linux/copyright' ,
2018-01-05 17:58:27 +00:00
_clean : true
} ) ) ;
2017-12-10 20:25:16 +00:00
}
2017-11-22 20:19:34 +00:00
// Create distribution package for macOS platform
function release _osx64 ( ) {
var appdmg = require ( 'gulp-appdmg' ) ;
2017-10-20 00:36:33 +00:00
2018-01-17 15:38:41 +00:00
// The appdmg does not generate the folder correctly, manually
createDirIfNotExists ( RELEASE _DIR ) ;
// The src pipe is not used
return gulp . src ( [ '.' ] )
2017-11-22 20:19:34 +00:00
. pipe ( appdmg ( {
2018-01-10 14:36:12 +00:00
target : path . join ( RELEASE _DIR , getReleaseFilename ( 'macOS' , 'dmg' ) ) ,
basepath : path . join ( APPS _DIR , pkg . name , 'osx64' ) ,
2017-11-22 20:19:34 +00:00
specification : {
2017-11-25 12:53:28 +00:00
title : 'Betaflight Configurator' ,
contents : [
2017-11-22 20:19:34 +00:00
{ 'x' : 448 , 'y' : 342 , 'type' : 'link' , 'path' : '/Applications' } ,
{ 'x' : 192 , 'y' : 344 , 'type' : 'file' , 'path' : pkg . name + '.app' , 'name' : 'Betaflight Configurator.app' }
2017-11-25 12:53:28 +00:00
] ,
2018-01-21 16:09:36 +00:00
background : path . join ( _ _dirname , 'assets/osx/dmg-background.png' ) ,
2017-11-25 12:53:28 +00:00
format : 'UDZO' ,
window : {
size : {
width : 638 ,
height : 479
}
}
2017-11-25 07:47:32 +00:00
} ,
2017-11-22 20:19:34 +00:00
} )
) ;
}
2018-01-17 15:38:41 +00:00
// Create the dir directory, with write permissions
function createDirIfNotExists ( dir ) {
fs . mkdir ( dir , '0775' , function ( err ) {
if ( err ) {
if ( err . code !== 'EEXIST' ) {
throw err ;
}
}
} ) ;
}
2018-01-10 14:36:12 +00:00
// Create a list of the gulp tasks to execute for release
function listReleaseTasks ( done ) {
2017-11-21 10:40:39 +00:00
2018-01-08 10:37:32 +00:00
var platforms = getPlatforms ( ) ;
2017-11-24 03:40:02 +00:00
2018-01-10 14:36:12 +00:00
var releaseTasks = [ ] ;
2017-12-04 10:03:35 +00:00
if ( platforms . indexOf ( 'chromeos' ) !== - 1 ) {
2018-01-10 14:36:12 +00:00
releaseTasks . push ( release _chromeos ) ;
2017-12-04 10:03:35 +00:00
}
2017-11-24 03:40:02 +00:00
if ( platforms . indexOf ( 'linux64' ) !== - 1 ) {
2018-01-10 14:36:12 +00:00
releaseTasks . push ( function release _linux64 _zip ( ) { return release _zip ( 'linux64' ) } ) ;
releaseTasks . push ( function release _linux64 _deb ( ) { return release _deb ( 'linux64' ) } ) ;
2017-11-25 03:38:26 +00:00
}
2017-12-10 20:25:16 +00:00
if ( platforms . indexOf ( 'linux32' ) !== - 1 ) {
2018-01-10 14:36:12 +00:00
releaseTasks . push ( function release _linux32 _zip ( ) { return release _zip ( 'linux32' ) } ) ;
releaseTasks . push ( function release _linux32 _deb ( ) { return release _deb ( 'linux32' ) } ) ;
2017-12-10 20:25:16 +00:00
}
2018-01-10 14:36:12 +00:00
2017-11-25 03:38:26 +00:00
if ( platforms . indexOf ( 'osx64' ) !== - 1 ) {
2018-01-10 14:36:12 +00:00
releaseTasks . push ( release _osx64 ) ;
2017-11-25 03:38:26 +00:00
}
if ( platforms . indexOf ( 'win32' ) !== - 1 ) {
2018-01-10 14:36:12 +00:00
releaseTasks . push ( function release _win32 ( done ) { return release _win ( 'win32' , done ) } ) ;
2017-12-07 15:00:13 +00:00
}
if ( platforms . indexOf ( 'win64' ) !== - 1 ) {
2018-01-10 14:36:12 +00:00
releaseTasks . push ( function release _win64 ( done ) { return release _win ( 'win64' , done ) } ) ;
2017-11-22 20:19:34 +00:00
}
2017-10-20 00:36:33 +00:00
2018-01-10 14:36:12 +00:00
return releaseTasks ;
}