From cedf1b6b248fde731429fa11b59f5d63b2c46566 Mon Sep 17 00:00:00 2001 From: srazi Date: Fri, 17 Mar 2017 22:42:23 +0330 Subject: [PATCH] CI for Windows and macOS (#2245) --- .travis.yml | 75 +++++++- appveyor.yml | 138 ++++++++++++++ mac/macdeploy.sh | 40 ++-- mac/qt-mac-silent-install.qs | 55 ++++++ tests/autotests/autotests.pro | 11 ++ windows/installer.nsi | 331 +++++++++++++++++++--------------- 6 files changed, 472 insertions(+), 178 deletions(-) create mode 100644 appveyor.yml create mode 100644 mac/qt-mac-silent-install.qs diff --git a/.travis.yml b/.travis.yml index 789499e36..3eec6ab44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,21 +3,82 @@ dist: trusty language: cpp cache: ccache +matrix: + include: + - os: osx + osx_image: xcode8.2 + env: - QT=qt58 before_install: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start + - export QZ_VER=2.1.99 + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + export DISPLAY=:99.0; + sh -e /etc/init.d/xvfb start; + fi install: - - sudo apt-get -qq update - - sudo apt-get -qq install libssl-dev pkg-config libxcb-util0-dev - - if [[ "$QT" == "qt58" ]]; then sudo apt-add-repository -y ppa:beineri/opt-qt58-trusty; sudo apt-get update -qq; sudo apt-get install -qq qt58tools qt58script qt58webengine qt58webchannel qt58declarative qt58x11extras; fi + - export QZ_DIR=$PWD + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + sudo apt-get -qq update; + sudo apt-get -qq install libssl-dev pkg-config libxcb-util0-dev; + if [[ "$QT" == "qt58" ]]; then + sudo apt-add-repository -y ppa:beineri/opt-qt58-trusty; + sudo apt-get update -qq; + sudo apt-get install -qq qt58tools qt58script qt58webengine qt58webchannel qt58declarative qt58x11extras; + fi + fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + if [[ "$QT" == "qt58" ]]; then + QT_VER=5.8; + export QTDIR="$HOME/Qt/$QT_VER/clang_64"; + echo "Calling brew update..."; + brew update; + brew outdated openssl || brew upgrade openssl; + QT_INSTALLER_FILE_NAME=qt-opensource-mac-x64-clang-$QT_VER.0; + wget "http://download.qt.io/official_releases/qt/$QT_VER/$QT_VER.0/$QT_INSTALLER_FILE_NAME.dmg"; + hdiutil attach -noverify $QT_INSTALLER_FILE_NAME.dmg; + QT_INSTALLER=/Volumes/$QT_INSTALLER_FILE_NAME/$QT_INSTALLER_FILE_NAME.app/Contents/MacOS/$QT_INSTALLER_FILE_NAME; + echo "Silently installing Qt..."; + $QT_INSTALLER --script $QZ_DIR/mac/qt-mac-silent-install.qs; + fi + fi script: - QMAKE="qmake" - - if [[ "$QT" == "qt58" ]]; then QMAKE="/opt/qt58/bin/qmake"; fi - - $QMAKE QMAKE_CXXFLAGS+="-Wextra -Werror" + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + CXXFLAGS="-Wextra -Werror"; + if [[ "$QT" == "qt58" ]]; then QMAKE="/opt/qt58/bin/qmake"; fi + fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + MACDEPLOYQT="macdeployqt"; + CXXFLAGS="-Wextra -Werror -Wno-inconsistent-missing-override -Wno-deprecated-declarations"; + if [[ "$QT" == "qt58" ]]; then + MACDEPLOYQT=$QTDIR/bin/macdeployqt; + QMAKE=$QTDIR/bin/qmake; + fi + fi + - $QMAKE QMAKE_CXXFLAGS+="$CXXFLAGS" - make -j2 || exit 1 + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + cp -v bin/libQupZilla*.dylib tests/autotests; + fi - cd scripts && ./run_tests.sh $QMAKE + +before_deploy: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + cd $QZ_DIR; + ./mac/macdeploy.sh $MACDEPLOYQT; + mv bin/QupZilla.dmg bin/QupZilla-${QZ_VER}.dmg; + fi + +deploy: + provider: releases + api_key: + secure: "bGGHyeMXF3nrFIaJCzA5zicH3TfdcMNY6+DT+84veBoCAsBMIjp+1t//mkEBnyAYZHKV/6XDhgztwinX1yEylvOeXxQXG5J0fYj96UzZmjBY+QmgDc31XgVeKKIbEi0Ab2bkgW3qHyQJ5ao/lZwSPCt1stOnjz0WuGgrjGWoAgEoHBXzRlsGzU2LrF/bXnmjyPL/qe7AaV0neE9mD+FmeQwiBPoP+/cQCyz5veOdjuzCy4I57HLCvNH4y28z1p6qotS+V1jGRj8PgMWWQP/VXVp9glTV0+gGkOLKL91SPKvLkS76f5bgn6K3+vdDASf+ZCNajIsh1YpwiabX4tQKwnCd80Ps9PR5dXcQVPMBRy1lFr6u2ps0ZTTfiBpI6vqyvLtyv2QbrfGZfT5bWtwdqpSRPJhp6b/ieHHduuRkZ0aU3JuTpLeoob+rLlkvYQmpvmDgyTx44/q+UOOetkoSCD276sMxYxsd3DJKyeG320UcQvwU+dR8uv9NDdv9wpUi13mfGqaRdcSXXgUQWpZlzCGvQYwLozcNnFfbtyrY9BlJsH7Sf97b3313qHO1lrz92z4IhagY1eQqyTwUrtdH8VeeWNx3INdnd7/u1bSdTSLerzMOG/xds96XW/kVbB1SO8bG9IEel7kC5oTiEQfWXAvFw54P6F3eRjDCZvXGaZA=" + file: $QZ_DIR/bin/QupZilla-$QZ_VER.dmg + skip_cleanup: true + on: + tags: true + condition: "$TRAVIS_OS_NAME = osx" diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..1014da6c9 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,138 @@ +version: 2.1.99.{build}-{branch} + +cache: + - windows/dependencies + +build: + parallel: true + verbosity: detailed + +configuration: + - release +# - debug + +branches: + except: + - v1.4 + - v1.6 + - v1.8 + +environment: + global: + QZ_VER: 2.1.99 + VSVER: 14 + ARCH: x86 + QMAKESPEC: win32-msvc2015 + MAKETOOL: jom + TOOLSDIR: C:\Qt\Tools\QtCreator + + matrix: + - QTDIR: C:\Qt\5.8\msvc2015 + - ARCH: x64 + QTDIR: C:\Qt\5.8\msvc2015_64 + - PORTABLE_BUILD: "true" + QTDIR: C:\Qt\5.8\msvc2015 + +install: + - set QZ_DIR=%CD% + - set CPU=32 + - IF /I "%ARCH%" == "x64" (set CPU=64) + - set OPENSSL_DIR="C:\OpenSSL-Win%CPU%" + - set ICU_DIR_NAME=icu4c-54_1-Win%CPU%-msvc10 + - set ICU_DOWNLOAD_URL="http://download.icu-project.org/files/icu4c/54.1/%ICU_DIR_NAME%.zip" + - call "C:\Program Files (x86)\Microsoft Visual Studio "%VSVER%".0\VC\vcvarsall.bat" %ARCH% + - set PATH=%QTDIR%\bin;%TOOLSDIR%\bin;%OPENSSL_DIR%\bin;%CD%\bin;%PATH% + +build_script: + - echo "QupZilla BUILD %APPVEYOR_BUILD_VERSION%_%QMAKESPEC%_%CONFIGURATION%_%ARCH%" + - qmake -v + - qmake CONFIG+=%CONFIGURATION% INCLUDEPATH+="%OPENSSL_DIR%\include" LIBS+=-L%OPENSSL_DIR%\lib QupZilla.pro + - call %MAKETOOL% + +test_script: + - cd %QZ_DIR%\tests\autotests + - qmake CONFIG+=%CONFIGURATION% INCLUDEPATH+="%OPENSSL_DIR%\include" LIBS+=-L%OPENSSL_DIR%\lib + - call %MAKETOOL% + - call %CONFIGURATION%\autotests.exe + +after_build: + # prepare dependencies + - echo [Paths] > %QZ_DIR%\bin\qt.conf && echo Plugins="." >> %QZ_DIR%\bin\qt.conf + - copy %QZ_DIR%\COPYRIGHT %QZ_DIR%\bin\COPYRIGHT.txt + - cd %QZ_DIR%\windows + - IF NOT EXIST "dependencies" ( mkdir dependencies ) + - cd dependencies + - IF NOT EXIST "%ICU_DIR_NAME%.zip" ( appveyor DownloadFile %ICU_DOWNLOAD_URL% ) else ( echo "Use cached %ICU_DIR_NAME%.zip") + # see: https://github.com/appveyor/ci/issues/1347 + - ps: If (![System.IO.File]::Exists("$env:APPVEYOR_BUILD_FOLDER\windows\dependencies\KillProcDll&FindProcDll.zip")) { (New-Object Net.WebClient).DownloadFile("http://nsis.sourceforge.net/mediawiki/images/5/53/KillProcDll%26FindProcDll.zip", "$env:APPVEYOR_BUILD_FOLDER\windows\dependencies\KillProcDll&FindProcDll.zip") } ELse { echo "Use cached KillProcDll&FindProcDll.zip" } + - IF NOT EXIST "Registry.zip" ( + appveyor DownloadFile "http://nsis.sourceforge.net/mediawiki/images/4/47/Registry.zip" ) else (echo "Use cached Registry.zip") + - IF NOT EXIST "AppAssocReg-0.4.zip" ( + appveyor DownloadFile "http://nsis.sourceforge.net/mediawiki/images/d/d4/AppAssocReg-0.4.zip" ) else (echo "Use cached AppAssocReg-0.4.zip") + - IF NOT EXIST "master.tar.gz" ( + appveyor DownloadFile "http://chromium.googlesource.com/chromium/deps/hunspell_dictionaries/+archive/master.tar.gz" ) else (echo "Use cached master.tar.gz") + - mkdir ..\wininstall + - cd ..\wininstall + - copy ..\*.nsh .\ + - copy ..\*.ico .\ + - copy ..\*.bmp .\ + # prepare nsis plugins + - 7z x "..\dependencies\KillProcDll&FindProcDll.zip" + - 7z x ..\dependencies\Registry.zip + - 7z x ..\dependencies\AppAssocReg-0.4.zip + - copy Desktop\Plugin\*.dll .\ + - copy Plugins\Unicode\*.dll .\ + # prepare icu + - 7z x "..\dependencies\%ICU_DIR_NAME%.zip" + # prepare qtwebengine_dictionaries + - mkdir qtwebengine_dictionaries + - cd qtwebengine_dictionaries + - 7z x ..\..\dependencies\master.tar.gz + - 7z x master.tar + - mkdir doc + - move README* doc\ + - move COPYING* doc\ + - cd %QZ_DIR%\windows + # set paths + - set OPENSSL_BIN_DIR="%OPENSSL_DIR%\bin" + - set MSVC_REDIST_DIR="C:\Program Files (x86)\Microsoft Visual Studio "%VSVER%".0\VC\redist\%ARCH%\Microsoft.VC%VSVER%0.CRT" + - set ICU_BIN_DIR="%QZ_DIR%\windows\wininstall\icu\bin" + - IF /I "%ARCH%" == "x64" (set INSTALLER_VERSION="%QZ_VER% x64" && set ICU_BIN_DIR="%QZ_DIR%\windows\wininstall\icu\bin64") else (set INSTALLER_VERSION="%QZ_VER%") + - set QTWEBENGINE_DICTIONARIES_DIR="%QZ_DIR%\windows\wininstall\qtwebengine_dictionaries" + # make installer + - IF /I "%PORTABLE_BUILD%" == "true" ( + call "C:\Program Files (x86)\NSIS\makensis.exe" /X"Unicode true" /DCUSTOM=1 /DPORTABLE=1 /DVERSION="%QZ_VER% Portable" /DARCH=%ARCH% /DMSVC_VER=%VSVER%0 /DOPENSSL_BIN_DIR=%OPENSSL_BIN_DIR% /DMSVC_REDIST_DIR=%MSVC_REDIST_DIR% /DQZ_BIN_DIR=%QZ_DIR%\bin /DICU_BIN_DIR=%ICU_BIN_DIR% /DQT_DIR=%QTDIR% /DQT_BIN_DIR=%QTDIR%\bin /DQT_PLUGINS_DIR=%QTDIR%\plugins /DQTWEBENGINE_DICTIONARIES_DIR=%QTWEBENGINE_DICTIONARIES_DIR% installer.nsi + ) else ( + call "C:\Program Files (x86)\NSIS\makensis.exe" /X"Unicode true" /DCUSTOM=1 /DVERSION=%INSTALLER_VERSION% /DARCH=%ARCH% /DMSVC_VER=%VSVER%0 /DOPENSSL_BIN_DIR=%OPENSSL_BIN_DIR% /DMSVC_REDIST_DIR=%MSVC_REDIST_DIR% /DQZ_BIN_DIR=%QZ_DIR%\bin /DICU_BIN_DIR=%ICU_BIN_DIR% /DQT_DIR=%QTDIR% /DQT_BIN_DIR=%QTDIR%\bin /DQT_PLUGINS_DIR=%QTDIR%\plugins /DQTWEBENGINE_DICTIONARIES_DIR=%QTWEBENGINE_DICTIONARIES_DIR% installer.nsi + ) + +artifacts: + - path: windows\QupZilla*Installer*.exe + name: QupZilla Installer (%ARCH%) + - path: bin\*.exe + name: QupZilla Executable (%ARCH%) + - path: bin\*.dll + name: QupZilla DLL (%ARCH%) + + +deploy: + release: 'Version $(qz_ver)' + tag: $(appveyor_repo_tag_name) # don't remove or modify tag field + description: 'QupZilla $(qz_ver) Windows Installer Released' + provider: GitHub + auth_token: + secure: BumEo5ic9KIrhc8RxwsKFd/L6WwC0s5LpSef9uH+PtUKICZBZAcyqnPewKUqzEFi # your encrypted token from GitHub + artifact: /QupZilla.*Installer.*\.exe/ # QupZilla Installer + draft: false + prerelease: false + on: + appveyor_repo_tag: true # deploy on tag push only + +# notifications: + # - provider: Email + # to: + # - nowrep@gmail.com + # - s.r.alavizadeh@gmail.com + # on_build_success: false + # on_build_failure: false + # on_build_status_changed: true diff --git a/mac/macdeploy.sh b/mac/macdeploy.sh index cad37a91e..88bb84257 100755 --- a/mac/macdeploy.sh +++ b/mac/macdeploy.sh @@ -34,34 +34,22 @@ do install_name_tool -change $LIBRARY_NAME @executable_path/$LIBRARY_NAME $plugin done -# prompt and optionally copy additional Qt native plugin(s) into bundle -echo -n "Do you wish to redistribute known, missing, Qt Library plugins (y/n)? " -old_stty_cfg=$(stty -g) -stty raw -echo -answer=$( while ! head -c 1 | grep -i '[yn]'; do true; done ) -stty $old_stty_cfg -if echo "$answer" | grep -iq "^y"; then - if [ -z ${QTDIR+x} ]; then - printf '\nPlease set the environment variable for the Qt platform folder.\n\texample:\n\t$ export QTDIR="$HOME/Qt/5.8/clang_64"\n' - exit 1 - else - printf '\nCopying known, missing, Qt native library plugins to target bundle...\n' - - mkdir -p $QTPLUGINS - - FILE="$QTDIR/plugins/iconengines/libqsvgicon.dylib" - if [ -f "$FILE" ]; then - cp $FILE $QTPLUGINS/ - else - echo "$FILE: No such file" - exit 1 - fi - - fi +if [ -z ${QTDIR+x} ]; then + printf '\nPlease set the environment variable for the Qt platform folder.\n\texample:\n\t$ export QTDIR="$HOME/Qt/5.8/clang_64"\n' + exit 1 else - printf '\nChecking for prior deploy image Qt native library plugins at target bundle...\n' + printf '\nCopying known, missing, Qt native library plugins to target bundle...\n' + + mkdir -p $QTPLUGINS + + FILE="$QTDIR/plugins/iconengines/libqsvgicon.dylib" + if [ -f "$FILE" ]; then + cp $FILE $QTPLUGINS/ + else + echo "$FILE: No such file" + exit 1 + fi - rm -Rf $QTPLUGINS fi # run macdeployqt diff --git a/mac/qt-mac-silent-install.qs b/mac/qt-mac-silent-install.qs new file mode 100644 index 000000000..df14258bc --- /dev/null +++ b/mac/qt-mac-silent-install.qs @@ -0,0 +1,55 @@ +function Controller() { + installer.autoRejectMessageBoxes(); + installer.installationFinished.connect(function() { + gui.clickButton(buttons.NextButton); + }) +} + +Controller.prototype.WelcomePageCallback = function() { + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.CredentialsPageCallback = function() { + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.IntroductionPageCallback = function() { + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.TargetDirectoryPageCallback = function() { + gui.currentPageWidget().TargetDirectoryLineEdit.setText(installer.value("HomeDir") + "/Qt"); + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.ComponentSelectionPageCallback = function() { + var widget = gui.currentPageWidget(); + + widget.deselectAll(); + widget.selectComponent("qt.58.clang_64"); + widget.selectComponent("qt.58.qtwebengine"); + widget.selectComponent("qt.58.qtscript"); + + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.LicenseAgreementPageCallback = function() { + gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true); + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.StartMenuDirectoryPageCallback = function() { + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.ReadyForInstallationPageCallback = function() { + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.FinishedPageCallback = function() { + var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm + if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) { + checkBoxForm.launchQtCreatorCheckBox.checked = false; + } + gui.clickButton(buttons.FinishButton); +} diff --git a/tests/autotests/autotests.pro b/tests/autotests/autotests.pro index 6f01d81d0..972f3e3b9 100644 --- a/tests/autotests/autotests.pro +++ b/tests/autotests/autotests.pro @@ -4,6 +4,8 @@ QT += webenginewidgets network widgets printsupport sql script dbus testlib TARGET = autotests +CONFIG -= app_bundle + !unix|mac: LIBS += -L$$PWD/../../bin -lQupZilla !mac:unix: LIBS += $$PWD/../../bin/libQupZilla.so @@ -21,6 +23,15 @@ exists($$PWD/../../bin/plugins/libGnomeKeyringPasswords.so) { DEFINES += HAVE_GNOME_PASSWORDS_PLUGIN } +mac { + # homebrew openssl + BREW_OPENSSL = $$system("brew --prefix openssl") + INCLUDEPATH += $$BREW_OPENSSL/include + LIBS += -L$$BREW_OPENSSL/lib + + LIBS += -lcrypto -framework CoreServices +} + DESTDIR = OBJECTS_DIR = build MOC_DIR = build diff --git a/windows/installer.nsi b/windows/installer.nsi index d6c69ae8d..40a4e7916 100644 --- a/windows/installer.nsi +++ b/windows/installer.nsi @@ -1,6 +1,6 @@ ; QupZilla Windows Installer NSIS Script -; Copyright (C) 2010-2014 David Rosca -; 2012-2013 S. Razi Alavizadeh +; Copyright (C) 2010-2017 David Rosca +; 2012-2017 S. Razi Alavizadeh ; ; For compiling this script you need following plugins: ; FindProcDLL_plug-in, KillProcDLL_plug-in and 'AllAssociation.nsh' needs @@ -10,12 +10,32 @@ ; http://nsis.sourceforge.net/Application_Association_Registration_plug-in ; http://nsis.sourceforge.net/Registry_plug-in -RequestExecutionLevel admin +!ifndef CUSTOM + !define VERSION 2.1.2 + !define ARCH x86 + !define MSVC_VER 140 + !define OPENSSL_BIN_DIR . + !define MSVC_REDIST_DIR . + !define QZ_BIN_DIR . + !define ICU_BIN_DIR . + !define QT_DIR . + !define QT_BIN_DIR . + !define QT_PLUGINS_DIR . + !define QTWEBENGINE_DICTIONARIES_DIR qtwebengine_dictionaries + !undef PORTABLE +!endif ; WinVer.nsh was added in the same release that RequestExecutionLevel so check ; if ___WINVER__NSH___ is defined to determine if RequestExecutionLevel is ; available. !include /NONFATAL WinVer.nsh +!include x64.nsh + +!ifndef PORTABLE + RequestExecutionLevel admin +!else + RequestExecutionLevel user +!endif !addplugindir "wininstall\" @@ -24,7 +44,7 @@ RequestExecutionLevel admin SetCompressor /SOLID /FINAL lzma !define PRODUCT_NAME "QupZilla" -!define /date PRODUCT_VERSION "2.1.2" +!define /date PRODUCT_VERSION "${VERSION}" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\qupzilla.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" @@ -38,7 +58,7 @@ SetCompressor /SOLID /FINAL lzma !define MUI_UNWELCOMEFINISHPAGE_BITMAP "wininstall\welcome.bmp" !insertmacro MUI_PAGE_WELCOME -!insertmacro MUI_PAGE_LICENSE COPYRIGHT.txt +!insertmacro MUI_PAGE_LICENSE ${QZ_BIN_DIR}\COPYRIGHT.txt !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES @@ -105,75 +125,76 @@ notRunning: SetOverwrite on SetOutPath "$INSTDIR" - File "COPYRIGHT.txt" - File "qupzilla.exe" - File "qupzilla.dll" - File "libeay32.dll" - File "ssleay32.dll" - File "qt.conf" - File "concrt140.dll" - File "msvcp140.dll" - File "vccorlib140.dll" - File "vcruntime140.dll" - File "icudt54.dll" - File "icuin54.dll" - File "icuuc54.dll" - File "libEGL.dll" - File "libGLESv2.dll" - File "opengl32sw.dll" - File "D3Dcompiler_47.dll" - File "Qt5Core.dll" - File "Qt5Gui.dll" - File "Qt5Network.dll" - File "Qt5Positioning.dll" - File "Qt5PrintSupport.dll" - File "Qt5Qml.dll" - File "Qt5Quick.dll" - File "Qt5QuickWidgets.dll" - File "Qt5Sql.dll" - File "Qt5Svg.dll" - File "Qt5WinExtras.dll" - File "Qt5WebEngine.dll" - File "Qt5WebEngineCore.dll" - File "Qt5WebEngineWidgets.dll" - File "Qt5WebChannel.dll" - File "Qt5Widgets.dll" - File "QtWebEngineProcess.exe" + File "${QZ_BIN_DIR}\COPYRIGHT.txt" + File "${QZ_BIN_DIR}\qupzilla.exe" + File "${QZ_BIN_DIR}\qupzilla.dll" + File "${QZ_BIN_DIR}\qt.conf" + File "${OPENSSL_BIN_DIR}\libeay32.dll" + File "${OPENSSL_BIN_DIR}\ssleay32.dll" + File "${MSVC_REDIST_DIR}\*" + File "${ICU_BIN_DIR}\icudt54.dll" + File "${ICU_BIN_DIR}\icuin54.dll" + File "${ICU_BIN_DIR}\icuuc54.dll" + File "${QT_BIN_DIR}\libEGL.dll" + File "${QT_BIN_DIR}\libGLESv2.dll" + File "${QT_BIN_DIR}\opengl32sw.dll" + File "${QT_BIN_DIR}\D3Dcompiler_47.dll" + File "${QT_BIN_DIR}\Qt5Core.dll" + File "${QT_BIN_DIR}\Qt5Gui.dll" + File "${QT_BIN_DIR}\Qt5Network.dll" + File "${QT_BIN_DIR}\Qt5Positioning.dll" + File "${QT_BIN_DIR}\Qt5PrintSupport.dll" + File "${QT_BIN_DIR}\Qt5Qml.dll" + File "${QT_BIN_DIR}\Qt5Quick.dll" + File "${QT_BIN_DIR}\Qt5QuickWidgets.dll" + File "${QT_BIN_DIR}\Qt5Sql.dll" + File "${QT_BIN_DIR}\Qt5Svg.dll" + File "${QT_BIN_DIR}\Qt5WinExtras.dll" + File "${QT_BIN_DIR}\Qt5WebEngine.dll" + File "${QT_BIN_DIR}\Qt5WebEngineCore.dll" + File "${QT_BIN_DIR}\Qt5WebEngineWidgets.dll" + File "${QT_BIN_DIR}\Qt5WebChannel.dll" + File "${QT_BIN_DIR}\Qt5Widgets.dll" + File "${QT_BIN_DIR}\QtWebEngineProcess.exe" SetOutPath "$INSTDIR\iconengines" - File "iconengines\qsvgicon.dll" + File "${QT_PLUGINS_DIR}\iconengines\qsvgicon.dll" SetOutPath "$INSTDIR\imageformats" - File "imageformats\*.dll" + File "${QT_PLUGINS_DIR}\imageformats\*.dll" SetOutPath "$INSTDIR\platforms" - File "platforms\qwindows.dll" + File "${QT_PLUGINS_DIR}\platforms\qwindows.dll" SetOutPath "$INSTDIR\printsupport" - File "printsupport\windowsprintersupport.dll" + File "${QT_PLUGINS_DIR}\printsupport\windowsprintersupport.dll" SetOutPath "$INSTDIR\qml\QtQuick.2" - File "qml\QtQuick.2\*" + File "${QT_DIR}\qml\QtQuick.2\*" SetOutPath "$INSTDIR\qml\QtWebEngine" - File "qml\QtWebEngine\*" + File "${QT_DIR}\qml\QtWebEngine\*" SetOutPath "$INSTDIR\resources" - File "resources\*" + File "${QT_DIR}\resources\*" SetOutPath "$INSTDIR\sqldrivers" - File "sqldrivers\qsqlite.dll" + File "${QT_PLUGINS_DIR}\sqldrivers\qsqlite.dll" SetOutPath "$INSTDIR\translations\qtwebengine_locales" - File "translations\qtwebengine_locales\*" + File "${QT_DIR}\translations\qtwebengine_locales\*" SetOutPath "$INSTDIR\qtwebengine_dictionaries\doc" - File "qtwebengine_dictionaries\doc\README-en-US.txt" + ; In some packages underline '_' is used and in some other packages dash '-' is used so we use wildcard + File "${QTWEBENGINE_DICTIONARIES_DIR}\doc\README*en*US.txt" SetOutPath "$INSTDIR\qtwebengine_dictionaries" - File "qtwebengine_dictionaries\en_US.bdic" + ; in some packages *.bdic files use dash '-' instead of underline '_' followed by a version number. e.g. en-US-3-0.bdic + File "${QTWEBENGINE_DICTIONARIES_DIR}\en*US*.bdic" - call RegisterCapabilities + !ifndef PORTABLE + call RegisterCapabilities + !endif SectionEnd SectionGroup $(TITLE_SecThemes) SecThemes @@ -181,146 +202,166 @@ SectionGroup $(TITLE_SecThemes) SecThemes Section Default SecDefault SectionIn RO SetOutPath "$INSTDIR\themes\windows" - File "themes\windows\*" + File "${QZ_BIN_DIR}\themes\windows\*" SetOutPath "$INSTDIR\themes\windows\images" - File "themes\windows\images\*" + File "${QZ_BIN_DIR}\themes\windows\images\*" SectionEnd Section Chrome SecChrome SetOutPath "$INSTDIR\themes\chrome" - File "themes\chrome\*" + File "${QZ_BIN_DIR}\themes\chrome\*" SetOutPath "$INSTDIR\themes\chrome\images" - File "themes\chrome\images\*" + File "${QZ_BIN_DIR}\themes\chrome\images\*" SectionEnd Section Mac SecMac SetOutPath "$INSTDIR\themes\mac" - File "themes\mac\*" + File "${QZ_BIN_DIR}\themes\mac\*" SetOutPath "$INSTDIR\themes\mac\images" - File "themes\mac\images\*" + File "${QZ_BIN_DIR}\themes\mac\images\*" SectionEnd Section Breathe SecBreathe SetOutPath "$INSTDIR\themes\breathe" - File "themes\breathe\*" + File "${QZ_BIN_DIR}\themes\breathe\*" SetOutPath "$INSTDIR\themes\breathe\images" - File "themes\breathe\images\*" + File "${QZ_BIN_DIR}\themes\breathe\images\*" SectionEnd - - Section Old SecOld - SetOutPath "$INSTDIR\themes\default" - File "themes\default\*" - SetOutPath "$INSTDIR\themes\default\images" - File "themes\default\images\*" - SectionEnd - SectionGroupEnd Section $(TITLE_SecTranslations) SecTranslations SetOutPath "$INSTDIR\locale" - File "locale\*.qm" + File "${QZ_BIN_DIR}\locale\*.qm" SetOutPath "$INSTDIR\qtwebengine_dictionaries\doc" - File "qtwebengine_dictionaries\doc\*" + File "${QTWEBENGINE_DICTIONARIES_DIR}\doc\*" SetOutPath "$INSTDIR\qtwebengine_dictionaries" - File "qtwebengine_dictionaries\*.bdic" + File "${QTWEBENGINE_DICTIONARIES_DIR}\*.bdic" SectionEnd Section $(TITLE_SecPlugins) SecPlugins SetOutPath "$INSTDIR\plugins" - File "plugins\*.dll" + File "${QZ_BIN_DIR}\plugins\*.dll" SectionEnd -SectionGroup $(TITLE_SecSetASDefault) SecSetASDefault - Section $(TITLE_SecExtensions) SecExtensions - SetOutPath "$INSTDIR" - ${RegisterAssociation} ".htm" "$INSTDIR\qupzilla.exe" "QupZilla.HTM" $(FILE_Htm) "$INSTDIR\qupzilla.exe,1" "file" - ${RegisterAssociation} ".html" "$INSTDIR\qupzilla.exe" "QupZilla.HTML" $(FILE_Html) "$INSTDIR\qupzilla.exe,1" "file" - ${UpdateSystemIcons} - SectionEnd - - Section $(TITLE_SecProtocols) SecProtocols - ${RegisterAssociation} "http" "$INSTDIR\qupzilla.exe" "QupZilla.HTTP" "URL:HyperText Transfer Protocol" "$INSTDIR\qupzilla.exe,0" "protocol" - ${RegisterAssociation} "https" "$INSTDIR\qupzilla.exe" "QupZilla.HTTPS" "URL:HyperText Transfer Protocol with Privacy" "$INSTDIR\qupzilla.exe,0" "protocol" - ${RegisterAssociation} "ftp" "$INSTDIR\qupzilla.exe" "QupZilla.FTP" "URL:File Transfer Protocol" "$INSTDIR\qupzilla.exe,0" "protocol" - ${UpdateSystemIcons} - SectionEnd -SectionGroupEnd - -Section -StartMenu - SetOutPath "$INSTDIR" - SetShellVarContext all - CreateDirectory "$SMPROGRAMS\QupZilla" - CreateShortCut "$SMPROGRAMS\QupZilla\Uninstall.lnk" "$INSTDIR\Uninstall.exe" - CreateShortCut "$SMPROGRAMS\QupZilla\QupZilla.lnk" "$INSTDIR\qupzilla.exe" - CreateShortCut "$SMPROGRAMS\QupZilla\License.lnk" "$INSTDIR\COPYRIGHT.txt" -SectionEnd - -Section $(TITLE_SecDesktop) SecDesktop - SetOutPath "$INSTDIR" - CreateShortCut "$DESKTOP\QupZilla.lnk" "$INSTDIR\qupzilla.exe" "" -SectionEnd !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecMain} $(DESC_SecMain) !insertmacro MUI_DESCRIPTION_TEXT ${SecTranslations} $(DESC_SecTranslations) !insertmacro MUI_DESCRIPTION_TEXT ${SecPlugins} $(DESC_SecPlugins) - !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} $(DESC_SecDesktop) - !insertmacro MUI_DESCRIPTION_TEXT ${SecExtensions} $(DESC_SecExtensions) + !ifndef PORTABLE + !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} $(DESC_SecDesktop) + !insertmacro MUI_DESCRIPTION_TEXT ${SecExtensions} $(DESC_SecExtensions) + !endif !insertmacro MUI_DESCRIPTION_TEXT ${SecThemes} $(DESC_SecThemes) - !insertmacro MUI_DESCRIPTION_TEXT ${SecSetASDefault} $(DESC_SecSetASDefault) - !insertmacro MUI_DESCRIPTION_TEXT ${SecProtocols} $(DESC_SecProtocols) + !ifndef PORTABLE + !insertmacro MUI_DESCRIPTION_TEXT ${SecSetASDefault} $(DESC_SecSetASDefault) + !insertmacro MUI_DESCRIPTION_TEXT ${SecProtocols} $(DESC_SecProtocols) + !endif !insertmacro MUI_FUNCTION_DESCRIPTION_END -Section -Uninstaller - WriteUninstaller "$INSTDIR\uninstall.exe" - WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\qupzilla.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\qupzilla.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "QupZilla Team" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "HelpLink" "https://github.com/QupZilla/qupzilla/wiki" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallSource" "$EXEDIR" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "http://www.qupzilla.com" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "http://blog.qupzilla.com/" - ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 - WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0" -SectionEnd -Section Uninstall - FindProcDLL::FindProc "qupzilla.exe" - IntCmp $R0 1 0 notRunning - MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(MSG_RunningInstance)" /SD IDOK IDCANCEL AbortInstallation - KillProcDLL::KillProc "qupzilla.exe" - Sleep 100 - Goto notRunning -AbortInstallation: - Abort "$(MSG_InstallationCanceled)" +!ifndef PORTABLE + SectionGroup $(TITLE_SecSetASDefault) SecSetASDefault + Section $(TITLE_SecExtensions) SecExtensions + SetOutPath "$INSTDIR" + ${RegisterAssociation} ".htm" "$INSTDIR\qupzilla.exe" "QupZilla.HTM" $(FILE_Htm) "$INSTDIR\qupzilla.exe,1" "file" + ${RegisterAssociation} ".html" "$INSTDIR\qupzilla.exe" "QupZilla.HTML" $(FILE_Html) "$INSTDIR\qupzilla.exe,1" "file" + ${UpdateSystemIcons} + SectionEnd -notRunning: - SetShellVarContext all - Delete "$DESKTOP\QupZilla.lnk" - RMDir /r "$INSTDIR" - RMDir /r "$SMPROGRAMS\QupZilla" - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" + Section $(TITLE_SecProtocols) SecProtocols + ${RegisterAssociation} "http" "$INSTDIR\qupzilla.exe" "QupZilla.HTTP" "URL:HyperText Transfer Protocol" "$INSTDIR\qupzilla.exe,0" "protocol" + ${RegisterAssociation} "https" "$INSTDIR\qupzilla.exe" "QupZilla.HTTPS" "URL:HyperText Transfer Protocol with Privacy" "$INSTDIR\qupzilla.exe,0" "protocol" + ${RegisterAssociation} "ftp" "$INSTDIR\qupzilla.exe" "QupZilla.FTP" "URL:File Transfer Protocol" "$INSTDIR\qupzilla.exe,0" "protocol" + ${UpdateSystemIcons} + SectionEnd + SectionGroupEnd - DeleteRegKey HKLM "Software\${PRODUCT_NAME}" - DeleteRegValue HKLM "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}" + Section -StartMenu + SetOutPath "$INSTDIR" + SetShellVarContext all + CreateDirectory "$SMPROGRAMS\QupZilla" + CreateShortCut "$SMPROGRAMS\QupZilla\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + CreateShortCut "$SMPROGRAMS\QupZilla\QupZilla.lnk" "$INSTDIR\qupzilla.exe" + CreateShortCut "$SMPROGRAMS\QupZilla\License.lnk" "$INSTDIR\COPYRIGHT.txt" + SectionEnd - ${UnRegisterAssociation} ".htm" "QupZilla.HTM" "$INSTDIR\qupzilla.exe" "file" - ${UnRegisterAssociation} ".html" "QupZilla.HTML" "$INSTDIR\qupzilla.exe" "file" - ${UnRegisterAssociation} "http" "QupZilla.HTTP" "$INSTDIR\qupzilla.exe" "protocol" - ${UnRegisterAssociation} "https" "QupZilla.HTTPS" "$INSTDIR\qupzilla.exe" "protocol" - ${UnRegisterAssociation} "ftp" "QupZilla.FTP" "$INSTDIR\qupzilla.exe" "protocol" - ${UpdateSystemIcons} -SectionEnd + Section $(TITLE_SecDesktop) SecDesktop + SetOutPath "$INSTDIR" + CreateShortCut "$DESKTOP\QupZilla.lnk" "$INSTDIR\qupzilla.exe" "" + SectionEnd + + Section -Uninstaller + WriteUninstaller "$INSTDIR\uninstall.exe" + WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\qupzilla.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\qupzilla.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "QupZilla Team" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "HelpLink" "https://github.com/QupZilla/qupzilla/wiki" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallSource" "$EXEDIR" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "http://www.qupzilla.com" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "http://blog.qupzilla.com/" + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0" + SectionEnd + + Section Uninstall + FindProcDLL::FindProc "qupzilla.exe" + IntCmp $R0 1 0 notRunning + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(MSG_RunningInstance)" /SD IDOK IDCANCEL AbortInstallation + KillProcDLL::KillProc "qupzilla.exe" + Sleep 100 + Goto notRunning + AbortInstallation: + Abort "$(MSG_InstallationCanceled)" + + notRunning: + SetShellVarContext all + Delete "$DESKTOP\QupZilla.lnk" + RMDir /r "$INSTDIR" + RMDir /r "$SMPROGRAMS\QupZilla" + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" + + DeleteRegKey HKLM "Software\${PRODUCT_NAME}" + DeleteRegValue HKLM "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}" + + ${UnRegisterAssociation} ".htm" "QupZilla.HTM" "$INSTDIR\qupzilla.exe" "file" + ${UnRegisterAssociation} ".html" "QupZilla.HTML" "$INSTDIR\qupzilla.exe" "file" + ${UnRegisterAssociation} "http" "QupZilla.HTTP" "$INSTDIR\qupzilla.exe" "protocol" + ${UnRegisterAssociation} "https" "QupZilla.HTTPS" "$INSTDIR\qupzilla.exe" "protocol" + ${UnRegisterAssociation} "ftp" "QupZilla.FTP" "$INSTDIR\qupzilla.exe" "protocol" + ${UpdateSystemIcons} + SectionEnd +!endif BrandingText "${PRODUCT_NAME} ${PRODUCT_VERSION} Installer" Function .onInit + ;Prevent running installer of 64-bit QupZilla on 32-bit Windows + ${If} ${RunningX64} + ${If} ${ARCH} == "x64" + StrCpy $InstDir "$PROGRAMFILES64\${PRODUCT_NAME}\" + ${Else} + StrCpy $InstDir "$PROGRAMFILES32\${PRODUCT_NAME}\" + ${Endif} + ${Else} + ${If} ${ARCH} == "x64" + MessageBox MB_OK|MB_ICONEXCLAMATION "This installation requiers Windows x64!" + Quit + ${Else} + StrCpy $InstDir "$PROGRAMFILES\${PRODUCT_NAME}\" + ${Endif} + ${EndIf} + + !ifdef PORTABLE + StrCpy $InstDir "$DESKTOP\${PRODUCT_NAME} Portable\" + !endif + ;Prevent Multiple Instances System::Call 'kernel32::CreateMutexA(i 0, i 0, t "QupZillaInstaller-4ECB4694-2C39-4f93-9122-A986344C4E7B") i .r1 ?e' Pop $R0