mirror of
https://github.com/velopack/velopack.git
synced 2025-10-25 15:19:22 +00:00
Add broken Qt sample
This commit is contained in:
73
samples/CPlusPlusQt/CMakeLists.txt
Normal file
73
samples/CPlusPlusQt/CMakeLists.txt
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.21)
|
||||||
|
|
||||||
|
project(VelopackQtSample VERSION 0.1 LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
|
||||||
|
# Disable C and C++ compiler extensions.
|
||||||
|
# C/CXX_EXTENSIONS are ON by default to allow the compilers to use extended
|
||||||
|
# variants of the C/CXX language.
|
||||||
|
# However, this could expose cross-platform bugs in user code or in the headers
|
||||||
|
# of third-party dependencies and thus it is strongly suggested to turn
|
||||||
|
# extensions off.
|
||||||
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
|
set(CMAKE_C_EXTENSIONS OFF)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
find_package(Qt6 6.2 REQUIRED COMPONENTS Quick)
|
||||||
|
|
||||||
|
|
||||||
|
qt_add_executable(appVelopackQtSample
|
||||||
|
main.cpp
|
||||||
|
constants.h
|
||||||
|
Velopack.hpp
|
||||||
|
Velopack.cpp
|
||||||
|
autoupdater.h
|
||||||
|
autoupdater.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
qt_add_qml_module(appVelopackQtSample
|
||||||
|
URI VelopackQtSample
|
||||||
|
VERSION 1.0
|
||||||
|
QML_FILES Main.qml
|
||||||
|
)
|
||||||
|
|
||||||
|
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
|
||||||
|
# If you are developing for iOS or macOS you should consider setting an
|
||||||
|
# explicit, fixed bundle identifier manually though.
|
||||||
|
set_target_properties(appVelopackQtSample PROPERTIES
|
||||||
|
# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appVelopackQtSample
|
||||||
|
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||||
|
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||||
|
MACOSX_BUNDLE TRUE
|
||||||
|
WIN32_EXECUTABLE TRUE
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(appVelopackQtSample
|
||||||
|
PRIVATE Qt6::Quick
|
||||||
|
)
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
install(TARGETS appVelopackQtSample
|
||||||
|
BUNDLE DESTINATION .
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
# Copy macOS updater/installer binary that needs to be next to our binary
|
||||||
|
install(FILES ${PROJECT_SOURCE_DIR}/platforms/macos/VfusionMac DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
elseif(WIN32)
|
||||||
|
# Copy Windows updater/installer binary that needs to be next to our binary
|
||||||
|
install(FILES ${PROJECT_SOURCE_DIR}/platforms/windows/Vfusion.exe DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
qt_generate_deploy_qml_app_script(
|
||||||
|
TARGET appVelopackQtSample
|
||||||
|
OUTPUT_SCRIPT deploy_script
|
||||||
|
)
|
||||||
|
|
||||||
|
install(SCRIPT ${deploy_script})
|
||||||
21
samples/CPlusPlusQt/LICENSE
Normal file
21
samples/CPlusPlusQt/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Bob Jelica
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
117
samples/CPlusPlusQt/Main.qml
Normal file
117
samples/CPlusPlusQt/Main.qml
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Window
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Dialogs
|
||||||
|
|
||||||
|
import VelopackQt 1.0
|
||||||
|
|
||||||
|
Window {
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
visible: true
|
||||||
|
title: qsTr("Velopack Qt c++ example")
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: AutoUpdater
|
||||||
|
// User checked for updates, but there were none, show text about it
|
||||||
|
function onNoNewUpdatesAvailable() {
|
||||||
|
noNewUpdatesTxt.visible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// There's a new version, hide the text about no new version available
|
||||||
|
function onNewVersionChanged() {
|
||||||
|
noNewUpdatesTxt.visible = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function onUpdatingFailed(errorMsg) {
|
||||||
|
errDialog.text = errorMsg
|
||||||
|
errDialog.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.topMargin: 40
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
font.bold: true
|
||||||
|
text: "Welcome to Velopack Qt C++ Sample App."
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
font.bold: true
|
||||||
|
text: "Current version: %1".arg(AutoUpdater.currentVersion).arg(AutoUpdater.updateUrl())
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
font.bold: true
|
||||||
|
font.pixelSize: 18
|
||||||
|
color: "red"
|
||||||
|
text: "New update available! v%1 ".arg(AutoUpdater.newVersion)
|
||||||
|
visible: AutoUpdater.newVersion !== ""
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: noNewUpdatesTxt
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
font.bold: true
|
||||||
|
font.pixelSize: 18
|
||||||
|
color: "crimson"
|
||||||
|
text: "No new updates right now..."
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
width: 400
|
||||||
|
height: 100
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
text: "Check for updates"
|
||||||
|
onClicked: {
|
||||||
|
AutoUpdater.checkForUpdates()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
width: 400
|
||||||
|
height: 100
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
text: "Download update"
|
||||||
|
enabled: AutoUpdater.newVersion !== ""
|
||||||
|
&& !AutoUpdater.updateReadyToInstall
|
||||||
|
onClicked: {
|
||||||
|
AutoUpdater.downloadLatestUpdate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
width: 400
|
||||||
|
height: 100
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
text: "Apply update and restart"
|
||||||
|
enabled: AutoUpdater.updateReadyToInstall
|
||||||
|
onClicked: {
|
||||||
|
AutoUpdater.applyUpdateAndRestart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: 8
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
font.bold: false
|
||||||
|
font.italic: true
|
||||||
|
font.pixelSize: 12
|
||||||
|
text: "Updates URL: %1".arg(AutoUpdater.updateUrl())
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageDialog {
|
||||||
|
id: errDialog
|
||||||
|
buttons: MessageDialog.Ok
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
1
samples/CPlusPlusQt/README.md
Normal file
1
samples/CPlusPlusQt/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# This sample is outdated and non-functional
|
||||||
141
samples/CPlusPlusQt/autoupdater.cpp
Normal file
141
samples/CPlusPlusQt/autoupdater.cpp
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#include "autoupdater.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QtDebug>
|
||||||
|
|
||||||
|
#include "constants.h"
|
||||||
|
|
||||||
|
auto kUpdateUrl = UPDATE_URL;
|
||||||
|
|
||||||
|
AutoUpdater::AutoUpdater(QObject *parent) : QObject(parent) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Init Velopack auto-updater
|
||||||
|
manager.setUrlOrPath(kUpdateUrl);
|
||||||
|
|
||||||
|
QString currentVersion =
|
||||||
|
QString::fromStdString(manager.getCurrentVersion());
|
||||||
|
|
||||||
|
qInfo() << "Current version: " << currentVersion;
|
||||||
|
setCurrentVersion(currentVersion);
|
||||||
|
} catch (const std::exception &err) {
|
||||||
|
qInfo() << "Error initating auto-updater, msg: " << err.what();
|
||||||
|
}
|
||||||
|
// Do a check on startup, if desired
|
||||||
|
// checkForUpdates();
|
||||||
|
}
|
||||||
|
|
||||||
|
AutoUpdater::~AutoUpdater(){};
|
||||||
|
|
||||||
|
void AutoUpdater::checkForUpdates() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Check for updates
|
||||||
|
updInfo = manager.checkForUpdates();
|
||||||
|
|
||||||
|
if (updInfo == nullptr) {
|
||||||
|
// no updates available
|
||||||
|
qInfo() << "No updates available, running latest version \\o/";
|
||||||
|
Q_EMIT noNewUpdatesAvailable();
|
||||||
|
} else {
|
||||||
|
setNewVersion(
|
||||||
|
QString::fromStdString(updInfo->targetFullRelease->version));
|
||||||
|
qInfo() << "Update available: " << newVersion();
|
||||||
|
}
|
||||||
|
} catch (const std::exception &err) {
|
||||||
|
qInfo() << "Error checking for new updates, msg: " << err.what();
|
||||||
|
Q_EMIT noNewUpdatesAvailable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoUpdater::downloadLatestUpdate() {
|
||||||
|
try {
|
||||||
|
if (updInfo != nullptr) {
|
||||||
|
qInfo() << __FUNCTION__ << "Downloading new version: "
|
||||||
|
<< QString::fromStdString(updInfo->targetFullRelease->version);
|
||||||
|
manager.downloadUpdates(updInfo->targetFullRelease.get());
|
||||||
|
|
||||||
|
qInfo() << __FUNCTION__ << "Downloaded version: "
|
||||||
|
<< QString::fromStdString(updInfo->targetFullRelease->version);
|
||||||
|
|
||||||
|
setUpdateReadyToInstall(true);
|
||||||
|
Q_EMIT updateDownloaded();
|
||||||
|
} else {
|
||||||
|
qInfo() << __FUNCTION__
|
||||||
|
<< "Trying to update, even though we don't have a new version! "
|
||||||
|
"This shouldn't happen...";
|
||||||
|
setUpdateReadyToInstall(false);
|
||||||
|
}
|
||||||
|
} catch (const std::exception &err) {
|
||||||
|
qWarning() << __FUNCTION__ << "Updating failed with error: " << err.what();
|
||||||
|
setUpdateReadyToInstall(false);
|
||||||
|
Q_EMIT updateDownloadFailed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AutoUpdater::updateUrl() { return QString::fromStdString(kUpdateUrl); }
|
||||||
|
|
||||||
|
void AutoUpdater::applyUpdateAndRestart() {
|
||||||
|
if (!updateReadyToInstall()) {
|
||||||
|
Q_EMIT updatingFailed("Update not ready, try restarting the sample app");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (updInfo != nullptr) {
|
||||||
|
qInfo() << __FUNCTION__ << "Downloading and installing new update: "
|
||||||
|
<< QString::fromStdString(updInfo->targetFullRelease->version);
|
||||||
|
// We should now have the package downloaded, so update and restart the
|
||||||
|
// app
|
||||||
|
manager.applyUpdatesAndRestart(updInfo->targetFullRelease.get());
|
||||||
|
} else {
|
||||||
|
qInfo() << __FUNCTION__
|
||||||
|
<< "Trying to update, even tho we don't have a new version! This "
|
||||||
|
"shouldn't happen...";
|
||||||
|
}
|
||||||
|
} catch (const std::exception &err) {
|
||||||
|
qWarning() << __FUNCTION__ << "Updating failed with error: " << err.what();
|
||||||
|
Q_EMIT updatingFailed(QString::fromStdString(err.what()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AutoUpdater::updateReadyToInstall() const {
|
||||||
|
return m_updateReadyToInstall;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoUpdater::setUpdateReadyToInstall(bool newUpdateReady) {
|
||||||
|
if (m_updateReadyToInstall == newUpdateReady)
|
||||||
|
return;
|
||||||
|
m_updateReadyToInstall = newUpdateReady;
|
||||||
|
Q_EMIT updateReadyToInstallChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AutoUpdater::currentUpdateChannel() const {
|
||||||
|
return m_currentUpdateChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoUpdater::setCurrentUpdateChannel(
|
||||||
|
const QString &newCurrentUpdateChannel) {
|
||||||
|
if (m_currentUpdateChannel == newCurrentUpdateChannel)
|
||||||
|
return;
|
||||||
|
m_currentUpdateChannel = newCurrentUpdateChannel;
|
||||||
|
Q_EMIT currentUpdateChannelChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AutoUpdater::currentVersion() const { return m_currentVersion; }
|
||||||
|
|
||||||
|
void AutoUpdater::setCurrentVersion(const QString &newCurrentVersion) {
|
||||||
|
if (m_currentVersion == newCurrentVersion)
|
||||||
|
return;
|
||||||
|
m_currentVersion = newCurrentVersion;
|
||||||
|
Q_EMIT currentVersionChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AutoUpdater::newVersion() const { return m_newVersion; }
|
||||||
|
|
||||||
|
void AutoUpdater::setNewVersion(const QString &newNewVersion) {
|
||||||
|
if (m_newVersion == newNewVersion)
|
||||||
|
return;
|
||||||
|
m_newVersion = newNewVersion;
|
||||||
|
Q_EMIT newVersionChanged();
|
||||||
|
}
|
||||||
69
samples/CPlusPlusQt/autoupdater.h
Normal file
69
samples/CPlusPlusQt/autoupdater.h
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#ifndef AUTOUPDATER_H
|
||||||
|
#define AUTOUPDATER_H
|
||||||
|
|
||||||
|
#include "Velopack.hpp"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
class AutoUpdater : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(
|
||||||
|
QString currentUpdateChannel READ currentUpdateChannel WRITE
|
||||||
|
setCurrentUpdateChannel NOTIFY currentUpdateChannelChanged FINAL)
|
||||||
|
Q_PROPERTY(QString currentVersion READ currentVersion WRITE setCurrentVersion
|
||||||
|
NOTIFY currentVersionChanged FINAL)
|
||||||
|
Q_PROPERTY(
|
||||||
|
bool updateReadyToInstall READ updateReadyToInstall WRITE
|
||||||
|
setUpdateReadyToInstall NOTIFY updateReadyToInstallChanged FINAL)
|
||||||
|
Q_PROPERTY(QString newVersion READ newVersion WRITE setNewVersion NOTIFY
|
||||||
|
newVersionChanged FINAL)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AutoUpdater(QObject *parent = nullptr);
|
||||||
|
~AutoUpdater() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static AutoUpdater &instance() {
|
||||||
|
static AutoUpdater _instance;
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
bool updateReadyToInstall() const;
|
||||||
|
void setUpdateReadyToInstall(bool newUpdateReady);
|
||||||
|
|
||||||
|
QString currentUpdateChannel() const;
|
||||||
|
void setCurrentUpdateChannel(const QString &newCurrentUpdateChannel);
|
||||||
|
|
||||||
|
QString currentVersion() const;
|
||||||
|
void setCurrentVersion(const QString &newCurrentVersion);
|
||||||
|
|
||||||
|
QString newVersion() const;
|
||||||
|
void setNewVersion(const QString &newNewVersion);
|
||||||
|
|
||||||
|
Q_INVOKABLE void applyUpdateAndRestart();
|
||||||
|
Q_INVOKABLE void checkForUpdates();
|
||||||
|
Q_INVOKABLE void downloadLatestUpdate();
|
||||||
|
Q_INVOKABLE QString updateUrl();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void noNewUpdatesAvailable();
|
||||||
|
void updateReadyToInstallChanged();
|
||||||
|
void currentUpdateChannelChanged();
|
||||||
|
void currentVersionChanged();
|
||||||
|
void newVersionChanged();
|
||||||
|
void updatingFailed(QString errorMg);
|
||||||
|
void updateDownloadFailed();
|
||||||
|
void updateDownloaded();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_currentUpdateChannel;
|
||||||
|
QString m_currentVersion;
|
||||||
|
QString m_newVersion;
|
||||||
|
bool m_updateReadyToInstall = false;
|
||||||
|
bool m_updateDownloaded = false;
|
||||||
|
Velopack::UpdateManagerSync manager{};
|
||||||
|
std::shared_ptr<Velopack::UpdateInfo> updInfo{};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // AUTOUPDATER_H
|
||||||
67
samples/CPlusPlusQt/build-osx.sh
Normal file
67
samples/CPlusPlusQt/build-osx.sh
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Find the absolute path of the script
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
# Check if version and Qt path parameters are provided
|
||||||
|
if [ "$#" -ne 2 ]; then
|
||||||
|
echo "Version number and path to Qt installation are required."
|
||||||
|
echo "Usage: ./build.sh [version] [path-to-qt]"
|
||||||
|
echo ""
|
||||||
|
echo "Example: ./build.sh 1.0.4 /Users/kalle/Qt/6.53/macos"
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
BUILD_VERSION="$1"
|
||||||
|
QT_DIR="$2"
|
||||||
|
|
||||||
|
BUILD_DIR="$SCRIPT_DIR/build"
|
||||||
|
RELEASE_DIR="$SCRIPT_DIR/releases"
|
||||||
|
PUBLISH_DIR="$SCRIPT_DIR/publish"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Compiling Velopack Qt sample..."
|
||||||
|
|
||||||
|
# Remove build directory if it exists
|
||||||
|
if [ -d "$BUILD_DIR" ]; then
|
||||||
|
rm -rf "$BUILD_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove publish directory if it exists
|
||||||
|
if [ -d "$PUBLISH_DIR" ]; then
|
||||||
|
rm -rf "$PUBLISH_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create build directory to run cmake in
|
||||||
|
mkdir "$BUILD_DIR"
|
||||||
|
|
||||||
|
# Navigate to the build directory
|
||||||
|
cd "$BUILD_DIR" || exit
|
||||||
|
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PUBLISH_DIR -DCMAKE_PREFIX_PATH=$QT_DIR ..
|
||||||
|
|
||||||
|
# Check if cmake was successful
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
# Run cmake build
|
||||||
|
cmake --build .
|
||||||
|
|
||||||
|
# Run cmake install and mute the output
|
||||||
|
echo ""
|
||||||
|
echo "Packaging Qt app..."
|
||||||
|
cmake --build . --target install > /dev/null 2>&1
|
||||||
|
else
|
||||||
|
echo "CMake configuration failed."
|
||||||
|
cd $SCRIPT_DIR
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Building Velopack Qt Sample Release v$BUILD_VERSION"
|
||||||
|
vpk pack --packId appVelopackQtSample \
|
||||||
|
--mainExe appVelopackQtSample \
|
||||||
|
--packTitle VelopackQtSample \
|
||||||
|
-v $BUILD_VERSION \
|
||||||
|
-o "$RELEASE_DIR" \
|
||||||
|
-p "$PUBLISH_DIR/appVelopackQtSample.app" \
|
||||||
|
-i "$SCRIPT_DIR/artwork/DefaultApp.icns"
|
||||||
61
samples/CPlusPlusQt/build-win.bat
Normal file
61
samples/CPlusPlusQt/build-win.bat
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal
|
||||||
|
|
||||||
|
rem Find the absolute path of the script
|
||||||
|
set "SCRIPT_DIR=%~dp0"
|
||||||
|
|
||||||
|
rem Check if version and Qt path parameters are provided
|
||||||
|
if "%~2"=="" (
|
||||||
|
echo Version number and path to Qt installation are required.
|
||||||
|
echo Usage: %~nx0 [version] [path-to-qt]
|
||||||
|
echo.
|
||||||
|
echo Example: %~nx0 1.0.4 C:\Users\kalle\Qt\6.5.3\msvc2019_64
|
||||||
|
echo.
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set BUILD_VERSION=%~1
|
||||||
|
set QT_DIR=%~2
|
||||||
|
|
||||||
|
set BUILD_DIR=%SCRIPT_DIR%build
|
||||||
|
set RELEASE_DIR=%SCRIPT_DIR%releases
|
||||||
|
set PUBLISH_DIR=%SCRIPT_DIR%publish
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Compiling Velopack Qt sample...
|
||||||
|
|
||||||
|
echo #define UPDATE_URL R"(%RELEASE_DIR%)" > constants.h
|
||||||
|
|
||||||
|
rem Remove build directory if it exists
|
||||||
|
if exist "%BUILD_DIR%" (
|
||||||
|
rmdir /s /q "%BUILD_DIR%"
|
||||||
|
)
|
||||||
|
|
||||||
|
rem Create build directory to run cmake in
|
||||||
|
echo Creating %BUILD_DIR%...
|
||||||
|
mkdir "%BUILD_DIR%"
|
||||||
|
|
||||||
|
rem Navigate to the build directory
|
||||||
|
cd /d "%BUILD_DIR%" || exit /b
|
||||||
|
|
||||||
|
cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="%PUBLISH_DIR%" -DCMAKE_PREFIX_PATH="%QT_DIR%" ..
|
||||||
|
|
||||||
|
if %errorlevel% neq 0 (
|
||||||
|
echo I couldn't run cmake. Exiting.
|
||||||
|
cd /d "%SCRIPT_DIR%"
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
ninja
|
||||||
|
ninja install
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Building Velopack Qt Sample Release v%BUILD_VERSION%
|
||||||
|
vpk pack --packId appVelopackQtSample ^
|
||||||
|
--mainExe bin\appVelopackQtSample.exe ^
|
||||||
|
--packTitle VelopackQtSample ^
|
||||||
|
-v %BUILD_VERSION% ^
|
||||||
|
-o "%RELEASE_DIR%" ^
|
||||||
|
-p "%PUBLISH_DIR%"
|
||||||
|
|
||||||
|
:end
|
||||||
1
samples/CPlusPlusQt/constants.h
Normal file
1
samples/CPlusPlusQt/constants.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#define UPDATE_URL R"(C:\Source\velopack\samples\CPlusPlusQt\releases)"
|
||||||
34
samples/CPlusPlusQt/main.cpp
Normal file
34
samples/CPlusPlusQt/main.cpp
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
|
||||||
|
#include "autoupdater.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Init Velopack hooks, MUST be as early as possible in main()
|
||||||
|
// Velopack may exit / restart our app at this statement
|
||||||
|
Velopack::startup(argv, argc);
|
||||||
|
} catch (const std::exception &err) {
|
||||||
|
qInfo() << "Error initating auto-updater, msg: " << err.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
// Init Auto Updater as a singleton
|
||||||
|
qmlRegisterSingletonInstance("VelopackQt", 1, 0, "AutoUpdater",
|
||||||
|
&AutoUpdater::instance());
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
const QUrl url(u"qrc:/VelopackQtSample/Main.qml"_qs);
|
||||||
|
QObject::connect(
|
||||||
|
&engine, &QQmlApplicationEngine::objectCreated, &app,
|
||||||
|
[url](QObject *obj, const QUrl &objUrl) {
|
||||||
|
if (!obj && url == objUrl)
|
||||||
|
QCoreApplication::exit(-1);
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
engine.load(url);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user