From 108a43512d013b6e849757a5e2bc4773283468a7 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Thu, 9 Feb 2017 14:30:39 -0400 Subject: [PATCH] chore: add support for Windows builds in Makefile (#1079) This commits introduces the following Windows rules: - `electron-installer-zip` - `electron-installer-nsis` Other changes: - Remove `scripts/build/windows.bat` - Update `docs/RUNNING-LOCALLY.md` to point to Makefile - Update `docs/PUBLISHING.md` to point to Makefile - Remove `7z` from `docs/RUNNING-LOCALLY.md` pre-requisites Signed-off-by: Juan Cruz Viotti --- Makefile | 29 +++ docs/PUBLISHING.md | 3 +- docs/RUNNING-LOCALLY.md | 20 +- .../build/electron-installer-nsis-win32.sh | 68 +++++ scripts/build/electron-installer-zip-win32.sh | 52 ++++ scripts/build/windows.bat | 233 ------------------ 6 files changed, 154 insertions(+), 251 deletions(-) create mode 100644 scripts/build/electron-installer-nsis-win32.sh create mode 100644 scripts/build/electron-installer-zip-win32.sh delete mode 100644 scripts/build/windows.bat diff --git a/Makefile b/Makefile index 0c7b11ae..fc5abf75 100644 --- a/Makefile +++ b/Makefile @@ -305,6 +305,24 @@ $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME_LOWERCASE)-electron_$(APPLICATION_V ./scripts/build/electron-installer-debian-linux.sh -p $< -r "$(TARGET_ARCH)" -o $| \ -c scripts/build/debian/config.json +$(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).zip: \ + $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH) \ + | $(BUILD_OUTPUT_DIRECTORY) + ./scripts/build/electron-installer-zip-win32.sh -a $< -o $@ + +$(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).exe: \ + $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH) \ + | $(BUILD_OUTPUT_DIRECTORY) $(BUILD_TEMPORARY_DIRECTORY) + ./scripts/build/electron-installer-nsis-win32.sh -n $(APPLICATION_NAME) -a $< -t $(BUILD_TEMPORARY_DIRECTORY) -o $@ +ifdef CODE_SIGN_CERTIFICATE +ifdef CODE_SIGN_CERTIFICATE_PASSWORD + ./scripts/build/electron-sign-exe.sh -f $@ \ + -d "$(APPLICATION_NAME) - $(APPLICATION_VERSION)" + -c $(CODE_SIGN_CERTIFICATE) \ + -p $(CODE_SIGN_CERTIFICATE_PASSWORD) +endif +endif + # --------------------------------------------------------------------- # Phony targets # --------------------------------------------------------------------- @@ -342,6 +360,17 @@ PUBLISH_BINTRAY_DEBIAN += \ $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME_LOWERCASE)-electron_$(APPLICATION_VERSION_DEBIAN)_$(TARGET_ARCH_DEBIAN).deb endif +ifeq ($(TARGET_PLATFORM),win32) +electron-installer-zip: $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip +electron-installer-nsis: $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).exe +TARGETS += \ + electron-installer-zip \ + electron-installer-nsis +PUBLISH_AWS_S3 += \ + $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip \ + $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-win32-$(TARGET_ARCH).exe +endif + ifdef PUBLISH_AWS_S3 publish-aws-s3: $(PUBLISH_AWS_S3) $(foreach publishable,$^,$(call execute-command,./scripts/publish/aws-s3.sh \ diff --git a/docs/PUBLISHING.md b/docs/PUBLISHING.md index 7f46dda9..32f379cd 100644 --- a/docs/PUBLISHING.md +++ b/docs/PUBLISHING.md @@ -57,7 +57,8 @@ The resulting installers will be saved to `release/out`. Run the following command: ```sh -> .\scripts\build\windows.bat all +make electron-installer-zip +make electron-installer-nsis ``` The resulting installers will be saved to `etcher-release/installers`. diff --git a/docs/RUNNING-LOCALLY.md b/docs/RUNNING-LOCALLY.md index 0df05bb3..68010b3d 100644 --- a/docs/RUNNING-LOCALLY.md +++ b/docs/RUNNING-LOCALLY.md @@ -23,7 +23,6 @@ Prerequisites - [Rimraf](https://github.com/isaacs/rimraf) - [NSIS v2.51](http://nsis.sourceforge.net/Main_Page) (v3.x won't work) - [Visual Studio Community 2015](https://www.microsoft.com/en-us/download/details.aspx?id=48146) (free) (other editions, like Professional and Enterprise, should work too) -- [7z](http://www.7-zip.org) (command line version) - [MinGW](http://www.mingw.org) The following MinGW packages are required: @@ -58,27 +57,14 @@ than simply running `npm install` given that we need to do extra configuration to make sure native dependencies are correctly compiled for Electron, otherwise the application might not run successfully. -### OS X +If you're on Windows, **run the command from the _Developer Command Prompt for +VS2015_**, to ensure all Visual Studio command utilities are available in the +`%PATH%`. ```sh make electron-develop ``` -### GNU/Linux - -```sh -make electron-develop -``` - -### Windows - -**Run the following command from the _Developer Command Prompt for VS2015_**, -to ensure all Visual Studio command utilities are available in the `%PATH%`: - -```sh -.\scripts\build\windows.bat install -``` - Running the application ----------------------- diff --git a/scripts/build/electron-installer-nsis-win32.sh b/scripts/build/electron-installer-nsis-win32.sh new file mode 100644 index 00000000..26292e75 --- /dev/null +++ b/scripts/build/electron-installer-nsis-win32.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 +set -x + +./scripts/build/check-dependency.sh zip + +function usage() { + echo "Usage: $0" + echo "" + echo "Options" + echo "" + echo " -n " + echo " -a " + echo " -t " + echo " -o " + exit 1 +} + +ARGV_APPLICATION_NAME="" +ARGV_APPLICATION="" +ARGV_TEMPORARY_DIRECTORY="" +ARGV_OUTPUT="" + +while getopts ":n:a:t:o:" option; do + case $option in + n) ARGV_APPLICATION_NAME="$OPTARG" ;; + a) ARGV_APPLICATION="$OPTARG" ;; + t) ARGV_TEMPORARY_DIRECTORY="$OPTARG" ;; + o) ARGV_OUTPUT="$OPTARG" ;; + *) usage ;; + esac +done + +if [ -z "$ARGV_APPLICATION_NAME" ] || + [ -z "$ARGV_APPLICATION" ] || + [ -z "$ARGV_TEMPORARY_DIRECTORY" ] || + [ -z "$ARGV_OUTPUT" ]; then + usage +fi + +if [ ! -d "$PWD/node_modules" ]; then + echo "Looks like you forgot to install the dependencies first!" 1>&2 + exit 1 +fi + +./node_modules/.bin/electron-builder "$ARGV_APPLICATION" \ + --platform=win \ + --out="$ARGV_TEMPORARY_DIRECTORY" + +mv "$ARGV_TEMPORARY_DIRECTORY/$ARGV_APPLICATION_NAME Setup.exe" "$ARGV_OUTPUT" diff --git a/scripts/build/electron-installer-zip-win32.sh b/scripts/build/electron-installer-zip-win32.sh new file mode 100644 index 00000000..60fadbda --- /dev/null +++ b/scripts/build/electron-installer-zip-win32.sh @@ -0,0 +1,52 @@ +#!/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 + +./scripts/build/check-dependency.sh zip + +function usage() { + echo "Usage: $0" + echo "" + echo "Options" + echo "" + echo " -a " + echo " -o " + exit 1 +} + +ARGV_APPLICATION="" +ARGV_OUTPUT="" + +while getopts ":a:o:" option; do + case $option in + a) ARGV_APPLICATION="$OPTARG" ;; + o) ARGV_OUTPUT="$OPTARG" ;; + *) usage ;; + esac +done + +if [ -z "$ARGV_APPLICATION" ] || [ -z "$ARGV_OUTPUT" ]; then + usage +fi + +CWD=$(pwd) +pushd "$ARGV_APPLICATION" +zip -r -9 "$CWD/$ARGV_OUTPUT" * +popd diff --git a/scripts/build/windows.bat b/scripts/build/windows.bat deleted file mode 100644 index cc345c36..00000000 --- a/scripts/build/windows.bat +++ /dev/null @@ -1,233 +0,0 @@ -@echo off - -:::: -:: 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 command=%1 -set arch=%2 -set output_build_directory=etcher-release -set output_directory=%output_build_directory%\installers -set certificate_file=certificate.p12 -set certificate_pass=1234 - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: Validate arguments -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -if "%arch%"=="" ( - echo Usage: %0 [command] [arch] 1>&2 - exit /b 1 -) - -if "%command%"=="" ( - echo Usage: %0 [command] [arch] 1>&2 - exit /b 1 -) - -:: Batch conditionals don't support logical operators. -:: Simulate "and" with nested conditions. - -if not "%arch%"=="x86" ( - if not "%arch%"=="x64" ( - echo Unknown architecture: %arch% 1>&2 - exit /b 1 - ) -) - -if not "%command%"=="install" ( - if not "%command%"=="package" ( - if not "%command%"=="all" ( - echo Unknown command: %command% 1>&2 - exit /b 1 - ) - ) -) - -:: Check that rimraf is installed. -:: We make use of this command line tool to clear -:: saved dependencies since doing so with `del` -:: might return errors due to long paths. -where rimraf >nul 2>nul -if %ERRORLEVEL% neq 0 ( - echo Dependency missing: rimraf 1>&2 - exit /b 1 -) - -:: Check that makensis is installed. -where makensis >nul 2>nul -if %ERRORLEVEL% neq 0 ( - echo Dependency missing: nsis 1>&2 - exit /b 1 -) - -:: Check that upx is installed. -where upx >nul 2>nul -if %ERRORLEVEL% neq 0 ( - echo Dependency missing: upx 1>&2 - exit /b 1 -) - -:: Check that asar is installed. -where asar >nul 2>nul -if %ERRORLEVEL% neq 0 ( - echo Dependency missing: asar 1>&2 - exit /b 1 -) - -:: Check that python is installed. -where python >nul 2>nul -if %ERRORLEVEL% neq 0 ( - echo Dependency missing: python 1>&2 - exit /b 1 -) - -:: Check that 7z is installed. -where 7z >nul 2>nul -if %ERRORLEVEL% neq 0 ( - echo Dependency missing: 7z 1>&2 - exit /b 1 -) - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: Global variables -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -set electron_packager=.\node_modules\.bin\electron-packager.cmd -set electron_builder=.\node_modules\.bin\electron-builder.cmd -set company_name="Resinio Ltd" - -if "%arch%"=="x86" ( - set electron_arch=ia32 -) - -if "%arch%"=="x64" ( - set electron_arch=x64 -) - -for /f %%i in (' "node -e ""console.log(require('./package.json').devDependencies['electron-prebuilt'])""" ') do ( - set electron_version=%%i -) - -for /f %%i in (' "node -e ""console.log(require('./package.json').displayName)""" ') do ( - set application_name=%%i -) - -for /f "delims=" %%i in (' "node -e ""console.log(require('./package.json').description)""" ') do ( - set application_description=%%i -) - -for /f %%i in (' "node -e ""console.log(require('./package.json').copyright)""" ') do ( - set application_copyright=%%i -) - -for /f %%i in (' "node -e ""console.log(require('./package.json').version)""" ') do ( - set etcher_version=%%i -) - -for /f %%i in (' "node -v" ') do ( - set node_version=%%i -) - -set package_name=Etcher-%etcher_version%-win32-%arch% - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: Install dependencies -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -if not "%command%"=="package" ( - call bash.exe scripts\build\dependencies-npm.sh^ - -r %arch%^ - -v %electron_version%^ - -t electron^ - -s win32 - call bash.exe scripts\build\dependencies-bower.sh -) - -if "%command%"=="install" ( - exit /b 0 -) - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: Package application -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -for /f %%i in (' "node .\scripts\packageignore.js" ') do ( - set electron_ignore="%%i" -) - -call %electron_packager% . %application_name%^ - --platform=win32^ - --arch=%electron_arch%^ - --version=%electron_version%^ - --ignore=%electron_ignore%^ - --icon="assets/icon.ico"^ - --app-copyright=%application_copyright%^ - --app-version=%etcher_version%^ - --build-version=%etcher_version%^ - --version-string.CompanyName=%company_name%^ - --version-string.FileDescription=%application_name%^ - --version-string.OriginalFilename=%package_name%^ - --version-string.ProductName="%application_name% -- %application_description%"^ - --version-string.InternalName=%application_name%^ - --overwrite^ - --out=%output_build_directory% - -set package_output=%output_build_directory%\%package_name% - -if not "%arch%"=="%electron_arch%" ( - move %output_build_directory%\Etcher-win32-%electron_arch% %output_build_directory%\Etcher-win32-%arch% -) - -move %output_build_directory%\Etcher-win32-%arch% %package_output% - -call bash.exe scripts\build\electron-create-asar.sh^ - -d %package_output%\resources\app^ - -o %package_output%\resources\app.asar - -call rimraf %package_output%\resources\app - -call bash.exe scripts\build\electron-sign-exe-win32.sh^ - -c %certificate_file%^ - -p %certificate_pass%^ - -f %package_output%\Etcher.exe^ - -d "%application_name% - %etcher_version%" - -upx -9 %package_output%\*.dll - -cd %package_output%^ - && 7z a -tzip ..\installers\%package_name%.zip *^ - && cd ..\.. - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: Generate installer -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -set installer_tmp_output=%output_build_directory%\win32-%arch%-tmp-installer -set installer_output=%output_directory%\%package_name%.exe - -call %electron_builder% %package_output%^ - --platform=win^ - --out=%installer_tmp_output% - -mkdir "%output_directory%" -move "%installer_tmp_output%\%application_name% Setup.exe" "%installer_output%" -rd /s /q "%installer_tmp_output%" - -call bash.exe scripts\build\electron-sign-exe-win32.sh^ - -c %certificate_file%^ - -p %certificate_pass%^ - -f %installer_output%^ - -d "%application_name% - %etcher_version%"