diff --git a/scripts/build/darwin.sh b/scripts/build/darwin.sh index a0568727..c6d1f99c 100755 --- a/scripts/build/darwin.sh +++ b/scripts/build/darwin.sh @@ -66,22 +66,36 @@ if [ "$COMMAND" == "develop-electron" ]; then fi if [ "$COMMAND" == "installer-dmg" ]; then + ./scripts/unix/create-electron-app.sh \ + -s . \ + -f "lib,build,assets" \ + -o "etcher-release/app" + ./scripts/unix/dependencies.sh -p \ -r x64 \ -v "$ELECTRON_VERSION" \ + -x "etcher-release/app" \ -t electron - ./scripts/darwin/package.sh \ - -n $APPLICATION_NAME \ + ./scripts/unix/create-asar.sh \ + -d "etcher-release/app" \ + -o "etcher-release/app.asar" + + ./scripts/unix/download-electron.sh \ -r x64 \ + -v "$ELECTRON_VERSION" \ + -s darwin \ + -o etcher-release/$APPLICATION_NAME-darwin-x64 + + ./scripts/darwin/configure-electron.sh \ + -d etcher-release/$APPLICATION_NAME-darwin-x64 \ + -n $APPLICATION_NAME \ -v $APPLICATION_VERSION \ -b io.resin.etcher \ -c "$APPLICATION_COPYRIGHT" \ -t public.app-category.developer-tools \ - -f "package.json,lib,node_modules,bower_components,build,assets" \ - -i assets/icon.icns \ - -e $ELECTRON_VERSION \ - -o etcher-release/$APPLICATION_NAME-darwin-x64 + -a "etcher-release/app.asar" \ + -i assets/icon.icns ./scripts/darwin/installer-dmg.sh \ -n $APPLICATION_NAME \ @@ -96,22 +110,36 @@ if [ "$COMMAND" == "installer-dmg" ]; then fi if [ "$COMMAND" == "installer-zip" ]; then + ./scripts/unix/create-electron-app.sh \ + -s . \ + -f "lib,build,assets" \ + -o "etcher-release/app" + ./scripts/unix/dependencies.sh -p \ -r x64 \ -v "$ELECTRON_VERSION" \ + -x "etcher-release/app" \ -t electron - ./scripts/darwin/package.sh \ - -n $APPLICATION_NAME \ + ./scripts/unix/create-asar.sh \ + -d "etcher-release/app" \ + -o "etcher-release/app.asar" + + ./scripts/unix/download-electron.sh \ -r x64 \ + -v "$ELECTRON_VERSION" \ + -s darwin \ + -o etcher-release/$APPLICATION_NAME-darwin-x64 + + ./scripts/darwin/configure-electron.sh \ + -d etcher-release/$APPLICATION_NAME-darwin-x64 \ + -n $APPLICATION_NAME \ -v $APPLICATION_VERSION \ -b io.resin.etcher \ -c "$APPLICATION_COPYRIGHT" \ -t public.app-category.developer-tools \ - -f "package.json,lib,node_modules,bower_components,build,assets" \ - -i assets/icon.icns \ - -e $ELECTRON_VERSION \ - -o etcher-release/$APPLICATION_NAME-darwin-x64 + -a "etcher-release/app.asar" \ + -i assets/icon.icns ./scripts/darwin/sign.sh \ -a etcher-release/$APPLICATION_NAME-darwin-x64/$APPLICATION_NAME.app \ diff --git a/scripts/build/linux.sh b/scripts/build/linux.sh index 6c450aae..70e83968 100755 --- a/scripts/build/linux.sh +++ b/scripts/build/linux.sh @@ -86,19 +86,33 @@ if [ "$COMMAND" == "installer-cli" ]; then fi if [ "$COMMAND" == "installer-debian" ]; then + ./scripts/unix/create-electron-app.sh \ + -s . \ + -f "lib,build,assets" \ + -o "etcher-release/app" + ./scripts/unix/dependencies.sh -p \ -r "$ARCH" \ -v "$ELECTRON_VERSION" \ + -x "etcher-release/app" \ -t electron - ./scripts/linux/package.sh \ - -n "$APPLICATION_NAME" \ + ./scripts/unix/create-asar.sh \ + -d "etcher-release/app" \ + -o "etcher-release/app.asar" + + ./scripts/unix/download-electron.sh \ -r "$ARCH" \ + -v "$ELECTRON_VERSION" \ + -s linux \ + -o "etcher-release/$APPLICATION_NAME-linux-$ARCH" + + ./scripts/linux/configure-electron.sh \ + -d etcher-release/$APPLICATION_NAME-linux-$ARCH \ + -n "$APPLICATION_NAME" \ -v "$APPLICATION_VERSION" \ -l LICENSE \ - -f "package.json,lib,node_modules,bower_components,build,assets" \ - -e "$ELECTRON_VERSION" \ - -o etcher-release/$APPLICATION_NAME-linux-$ARCH + -a "etcher-release/app.asar" ./scripts/linux/installer-deb.sh \ -p etcher-release/$APPLICATION_NAME-linux-$ARCH \ @@ -112,19 +126,33 @@ fi if [ "$COMMAND" == "installer-appimage" ]; then check_dep zip + ./scripts/unix/create-electron-app.sh \ + -s . \ + -f "lib,build,assets" \ + -o "etcher-release/app" + ./scripts/unix/dependencies.sh -p \ -r "$ARCH" \ -v "$ELECTRON_VERSION" \ + -x "etcher-release/app" \ -t electron - ./scripts/linux/package.sh \ - -n "$APPLICATION_NAME" \ + ./scripts/unix/create-asar.sh \ + -d "etcher-release/app" \ + -o "etcher-release/app.asar" + + ./scripts/unix/download-electron.sh \ -r "$ARCH" \ + -v "$ELECTRON_VERSION" \ + -s linux \ + -o "etcher-release/$APPLICATION_NAME-linux-$ARCH" + + ./scripts/linux/configure-electron.sh \ + -d etcher-release/$APPLICATION_NAME-linux-$ARCH \ + -n "$APPLICATION_NAME" \ -v "$APPLICATION_VERSION" \ -l LICENSE \ - -f "package.json,lib,node_modules,bower_components,build,assets" \ - -e "$ELECTRON_VERSION" \ - -o etcher-release/$APPLICATION_NAME-linux-$ARCH + -a "etcher-release/app.asar" ./scripts/linux/installer-appimage.sh \ -n "$APPLICATION_NAME" \ diff --git a/scripts/darwin/package.sh b/scripts/darwin/configure-electron.sh similarity index 80% rename from scripts/darwin/package.sh rename to scripts/darwin/configure-electron.sh index 64a6f289..5c8c9586 100755 --- a/scripts/darwin/package.sh +++ b/scripts/darwin/configure-electron.sh @@ -39,73 +39,59 @@ function usage() { echo "" echo "Options" echo "" + echo " -d " echo " -n " - echo " -r " echo " -v " echo " -b " echo " -c " echo " -t " - echo " -f " + echo " -a " echo " -i " - echo " -e " - echo " -o " exit 0 } +ARGV_ELECTRON_DIRECTORY="" ARGV_APPLICATION_NAME="" -ARGV_ARCHITECTURE="" ARGV_VERSION="" ARGV_BUNDLE_ID="" ARGV_COPYRIGHT="" ARGV_CATEGORY="" -ARGV_FILES="" +ARGV_ASAR="" ARGV_ICON="" -ARGV_ELECTRON_VERSION="" -ARGV_OUTPUT="" -while getopts ":n:r:v:b:c:t:f:i:e:o:" option; do +while getopts ":d:n:v:b:c:t:a:i:" option; do case $option in + d) ARGV_ELECTRON_DIRECTORY="$OPTARG" ;; n) ARGV_APPLICATION_NAME="$OPTARG" ;; - r) ARGV_ARCHITECTURE="$OPTARG" ;; v) ARGV_VERSION="$OPTARG" ;; b) ARGV_BUNDLE_ID="$OPTARG" ;; c) ARGV_COPYRIGHT="$OPTARG" ;; t) ARGV_CATEGORY="$OPTARG" ;; - f) ARGV_FILES="$OPTARG" ;; + a) ARGV_ASAR="$OPTARG" ;; i) ARGV_ICON="$OPTARG" ;; - e) ARGV_ELECTRON_VERSION="$OPTARG" ;; - o) ARGV_OUTPUT="$OPTARG" ;; *) usage ;; esac done -if [ -z "$ARGV_APPLICATION_NAME" ] \ - || [ -z "$ARGV_ARCHITECTURE" ] \ +if [ -z "$ARGV_ELECTRON_DIRECTORY" ] \ + || [ -z "$ARGV_APPLICATION_NAME" ] \ || [ -z "$ARGV_VERSION" ] \ || [ -z "$ARGV_BUNDLE_ID" ] \ || [ -z "$ARGV_COPYRIGHT" ] \ || [ -z "$ARGV_CATEGORY" ] \ - || [ -z "$ARGV_FILES" ] \ - || [ -z "$ARGV_ICON" ] \ - || [ -z "$ARGV_ELECTRON_VERSION" ] \ - || [ -z "$ARGV_OUTPUT" ] + || [ -z "$ARGV_ASAR" ] \ + || [ -z "$ARGV_ICON" ] then usage fi -./scripts/unix/download-electron.sh \ - -r "$ARGV_ARCHITECTURE" \ - -v "$ARGV_ELECTRON_VERSION" \ - -s darwin \ - -o "$ARGV_OUTPUT" - -APPLICATION_OUTPUT="$ARGV_OUTPUT/$ARGV_APPLICATION_NAME.app" -mv "$ARGV_OUTPUT/Electron.app" "$APPLICATION_OUTPUT" +APPLICATION_OUTPUT="$ARGV_ELECTRON_DIRECTORY/$ARGV_APPLICATION_NAME.app" +mv "$ARGV_ELECTRON_DIRECTORY/Electron.app" "$APPLICATION_OUTPUT" rm "$APPLICATION_OUTPUT/Contents/Resources/default_app.asar" # Don't include these for now -rm -f "$ARGV_OUTPUT"/LICENSE* -rm -f "$ARGV_OUTPUT/version" +rm -f "$ARGV_ELECTRON_DIRECTORY"/LICENSE* +rm -f "$ARGV_ELECTRON_DIRECTORY/version" function plist_set() { local plist_file=$1 @@ -153,6 +139,8 @@ for id in EH NP; do "$APPLICATION_OUTPUT/Contents/Frameworks/$ARGV_APPLICATION_NAME Helper $id.app" done -./scripts/unix/create-asar.sh \ - -f "$ARGV_FILES" \ - -o "$APPLICATION_OUTPUT/Contents/Resources/app.asar" +cp "$ARGV_ASAR" "$APPLICATION_OUTPUT/Contents/Resources/app.asar" + +if [ -d "$ARGV_ASAR.unpacked" ]; then + cp -rf "$ARGV_ASAR.unpacked" "$APPLICATION_OUTPUT/Contents/Resources/app.asar.unpacked" +fi diff --git a/scripts/linux/package.sh b/scripts/linux/configure-electron.sh similarity index 56% rename from scripts/linux/package.sh rename to scripts/linux/configure-electron.sh index aa695339..c34c96df 100755 --- a/scripts/linux/package.sh +++ b/scripts/linux/configure-electron.sh @@ -37,59 +37,47 @@ function usage() { echo "" echo "Options" echo "" + echo " -d " echo " -n " - echo " -r " echo " -v " echo " -l " - echo " -f " - echo " -e " - echo " -o " + echo " -a " exit 0 } +ARGV_ELECTRON_DIRECTORY="" ARGV_APPLICATION_NAME="" -ARGV_ARCHITECTURE="" ARGV_VERSION="" ARGV_LICENSE="" -ARGV_FILES="" -ARGV_ELECTRON_VERSION="" -ARGV_OUTPUT="" +ARGV_ASAR="" -while getopts ":n:r:v:l:f:e:o:" option; do +while getopts ":d:n:v:l:a:" option; do case $option in + d) ARGV_ELECTRON_DIRECTORY="$OPTARG" ;; n) ARGV_APPLICATION_NAME="$OPTARG" ;; - r) ARGV_ARCHITECTURE="$OPTARG" ;; v) ARGV_VERSION="$OPTARG" ;; l) ARGV_LICENSE="$OPTARG" ;; - f) ARGV_FILES="$OPTARG" ;; - e) ARGV_ELECTRON_VERSION="$OPTARG" ;; - o) ARGV_OUTPUT="$OPTARG" ;; + a) ARGV_ASAR="$OPTARG" ;; *) usage ;; esac done -if [ -z "$ARGV_APPLICATION_NAME" ] \ - || [ -z "$ARGV_ARCHITECTURE" ] \ +if [ -z "$ARGV_ELECTRON_DIRECTORY" ] \ + || [ -z "$ARGV_APPLICATION_NAME" ] \ || [ -z "$ARGV_VERSION" ] \ || [ -z "$ARGV_LICENSE" ] \ - || [ -z "$ARGV_FILES" ] \ - || [ -z "$ARGV_ELECTRON_VERSION" ] \ - || [ -z "$ARGV_OUTPUT" ] + || [ -z "$ARGV_ASAR" ] then usage fi -./scripts/unix/download-electron.sh \ - -r "$ARGV_ARCHITECTURE" \ - -v "$ARGV_ELECTRON_VERSION" \ - -s linux \ - -o "$ARGV_OUTPUT" +mv $ARGV_ELECTRON_DIRECTORY/electron $ARGV_ELECTRON_DIRECTORY/$(echo "$ARGV_APPLICATION_NAME" | tr '[:upper:]' '[:lower:]') +cp $ARGV_LICENSE $ARGV_ELECTRON_DIRECTORY/LICENSE +echo "$ARGV_VERSION" > $ARGV_ELECTRON_DIRECTORY/version +rm $ARGV_ELECTRON_DIRECTORY/resources/default_app.asar -mv $ARGV_OUTPUT/electron $ARGV_OUTPUT/$(echo "$ARGV_APPLICATION_NAME" | tr '[:upper:]' '[:lower:]') -cp $ARGV_LICENSE $ARGV_OUTPUT/LICENSE -echo "$ARGV_VERSION" > $ARGV_OUTPUT/version -rm $ARGV_OUTPUT/resources/default_app.asar +cp "$ARGV_ASAR" "$ARGV_ELECTRON_DIRECTORY/resources/app.asar" -./scripts/unix/create-asar.sh \ - -f "$ARGV_FILES" \ - -o "$ARGV_OUTPUT/resources/app.asar" +if [ -d "$ARGV_ASAR.unpacked" ]; then + cp -rf "$ARGV_ASAR.unpacked" "$ARGV_ELECTRON_DIRECTORY/resources/app.asar.unpacked" +fi diff --git a/scripts/unix/create-asar.sh b/scripts/unix/create-asar.sh index 28688454..2a225c21 100755 --- a/scripts/unix/create-asar.sh +++ b/scripts/unix/create-asar.sh @@ -33,34 +33,25 @@ function usage() { echo "" echo "Options" echo "" - echo " -f " + echo " -d " echo " -o " exit 0 } -ARGV_FILES="" +ARGV_DIRECTORY="" ARGV_OUTPUT="" -while getopts ":f:o:" option; do +while getopts ":d:o:" option; do case $option in - f) ARGV_FILES=$OPTARG ;; + d) ARGV_DIRECTORY=$OPTARG ;; o) ARGV_OUTPUT=$OPTARG ;; *) usage ;; esac done -if [ -z "$ARGV_FILES" ] || [ -z "$ARGV_OUTPUT" ]; then +if [ -z "$ARGV_DIRECTORY" ] || [ -z "$ARGV_OUTPUT" ]; then usage fi -TEMPORAL_DIRECTORY="$ARGV_OUTPUT.tmp" -rm -rf "$TEMPORAL_DIRECTORY" -mkdir -p "$TEMPORAL_DIRECTORY" - -for file in $(echo "$ARGV_FILES" | sed "s/,/ /g"); do - cp -rf "$file" "$TEMPORAL_DIRECTORY" -done - mkdir -p $(dirname "$ARGV_OUTPUT") -asar pack "$TEMPORAL_DIRECTORY" "$ARGV_OUTPUT" --unpack *.node -rm -rf "$TEMPORAL_DIRECTORY" +asar pack "$ARGV_DIRECTORY" "$ARGV_OUTPUT" --unpack *.node diff --git a/scripts/unix/create-electron-app.sh b/scripts/unix/create-electron-app.sh new file mode 100755 index 00000000..eaeed0c3 --- /dev/null +++ b/scripts/unix/create-electron-app.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +### +# Copyright 2016 resin.io +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +### + +set -u +set -e + +function usage() { + echo "Usage: $0" + echo "" + echo "Options" + echo "" + echo " -s " + echo " -f " + echo " -o " + exit 0 +} + +ARGV_SOURCE_DIRECTORY="" +ARGV_FILES="" +ARGV_OUTPUT="" + +while getopts ":s:f:o:" option; do + case $option in + s) ARGV_SOURCE_DIRECTORY=$OPTARG ;; + f) ARGV_FILES=$OPTARG ;; + o) ARGV_OUTPUT=$OPTARG ;; + *) usage ;; + esac +done + +if [ -z "$ARGV_SOURCE_DIRECTORY" ] || + [ -z "$ARGV_FILES" ] || \ + [ -z "$ARGV_OUTPUT" ]; then + usage +fi + +mkdir -p "$ARGV_OUTPUT" + +function copy_file_if_it_exists() { + local file=$1 + + if [ -f "$ARGV_SOURCE_DIRECTORY/$file" ]; then + cp "$ARGV_SOURCE_DIRECTORY/$file" "$ARGV_OUTPUT" + fi +} + +copy_file_if_it_exists "package.json" +copy_file_if_it_exists "npm-shrinkwrap.json" +copy_file_if_it_exists "bower.json" + +for file in $(echo "$ARGV_FILES" | sed "s/,/ /g"); do + cp -rf "$file" "$ARGV_OUTPUT" +done diff --git a/scripts/unix/dependencies.sh b/scripts/unix/dependencies.sh index 51b761f9..5c16b30b 100755 --- a/scripts/unix/dependencies.sh +++ b/scripts/unix/dependencies.sh @@ -38,6 +38,7 @@ function usage() { echo " -r " echo " -v " echo " -t " + echo " -x " echo " -f force install" echo " -p production install" exit 0 @@ -46,14 +47,16 @@ function usage() { ARGV_ARCHITECTURE="" ARGV_TARGET_VERSION="" ARGV_TARGET_PLATFORM="" +ARGV_PREFIX="" ARGV_FORCE=false ARGV_PRODUCTION=false -while getopts ":r:v:t:fp" option; do +while getopts ":r:v:t:x:fp" option; do case $option in r) ARGV_ARCHITECTURE=$OPTARG ;; v) ARGV_TARGET_VERSION=$OPTARG ;; t) ARGV_TARGET_PLATFORM=$OPTARG ;; + x) ARGV_PREFIX=$OPTARG ;; f) ARGV_FORCE=true ;; p) ARGV_PRODUCTION=true ;; *) usage ;; @@ -84,8 +87,6 @@ else export npm_config_arch=$ARGV_ARCHITECTURE fi -rm -rf node_modules - NPM_INSTALL_OPTS="--build-from-source" if [ "$ARGV_FORCE" == "true" ]; then @@ -96,9 +97,25 @@ if [ "$ARGV_PRODUCTION" == "true" ]; then NPM_INSTALL_OPTS="$NPM_INSTALL_OPTS --production" fi +if [ -n "$ARGV_PREFIX" ]; then + NPM_INSTALL_OPTS="$NPM_INSTALL_OPTS --prefix=$ARGV_PREFIX" +fi + npm install $NPM_INSTALL_OPTS -if [ "$ARGV_TARGET_PLATFORM" == "electron" ]; then - rm -rf bower_components - bower install --production --allow-root +# Using `--prefix` might cause npm to create an empty `etc` directory +if [ -n "$ARGV_PREFIX" ] && [ ! "$(ls -A "$ARGV_PREFIX/etc")" ]; then + rm -rf "$ARGV_PREFIX/etc" +fi + +if [ "$ARGV_TARGET_PLATFORM" == "electron" ]; then + BOWER_INSTALL_OPTS="--production --allow-root" + + if [ -n "$ARGV_PREFIX" ]; then + pushd "$ARGV_PREFIX" + bower install $BOWER_INSTALL_OPTS + popd + fi + + bower install $BOWER_INSTALL_OPTS fi