From 5c66d8674844292afc5745cf6a8d912048b483d4 Mon Sep 17 00:00:00 2001 From: u-235 Date: Sun, 25 Aug 2024 22:29:02 +0300 Subject: [PATCH 1/9] QMake: Add reading version from the version.h --- common.pri | 17 +++++++++++++++++ gcodefileserver/gcodefileserver.pro | 10 +++++++--- gcodeworkshop/gcodeworkshop.pro | 9 ++++++++- gcodeworkshop_top.pro | 3 +++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/common.pri b/common.pri index 789dec52..6e693ca5 100644 --- a/common.pri +++ b/common.pri @@ -156,3 +156,20 @@ defineReplace(tsFiles) { return ($$file_list) } + +defineReplace(getVersion) { + version_file = gcodeshared/include/version.h + !exists ($${PROJECT_ROOT_PATH}/$${version_file}): error(In function getVersion: File \"$${version_file}\" not found) + version_header = $$cat($${PROJECT_ROOT_PATH}/$${version_file}, lines) + + for (str, version_header) { + sub_str=$$split(str, " ") + + contains (sub_str, GCODEWORKSHOP_VERSION) { + ver_str=$$find(sub_str, '".*"') + !isEmpty(ver_str): return ($$split(ver_str, '"')) + } + } + + error(In function getVersion: GCODEWORKSHOP_VERSION not found in $${version_file}) +} diff --git a/gcodefileserver/gcodefileserver.pro b/gcodefileserver/gcodefileserver.pro index b298724e..4f68bc7f 100644 --- a/gcodefileserver/gcodefileserver.pro +++ b/gcodefileserver/gcodefileserver.pro @@ -1,16 +1,20 @@ # GCoderFileServer -VERSION = 0.1.0.0 TEMPLATE = app TARGET = gcodefileserver -include(../common.pri) - QT *= widgets serialport network MODULES *= kdiff3 qtsingleapplication GCodeShared include(../common.pri) +defined(VERSION, var) { + # Define the version as a string literal + # https://stackoverflow.com/a/2411008 + DEFINES += 'GCODEWORKSHOP_VERSION=\\"$$VERSION\\"' +} else { + VERSION = $$getVersion() +} SOURCES = \ filechecker.cpp \ diff --git a/gcodeworkshop/gcodeworkshop.pro b/gcodeworkshop/gcodeworkshop.pro index c46865cc..de889627 100644 --- a/gcodeworkshop/gcodeworkshop.pro +++ b/gcodeworkshop/gcodeworkshop.pro @@ -1,5 +1,4 @@ -VERSION = 2018.07 TEMPLATE = app TARGET = gcodeworkshop @@ -8,6 +7,14 @@ MODULES *= kdiff3 qtsingleapplication GCodeShared GCodeFileServer addons include(../common.pri) +defined(VERSION, var) { + # Define the version as a string literal + # https://stackoverflow.com/a/2411008 + DEFINES += 'GCODEWORKSHOP_VERSION=\\"$$VERSION\\"' +} else { + VERSION = $$getVersion() +} + INCLUDEPATH += include diff --git a/gcodeworkshop_top.pro b/gcodeworkshop_top.pro index a8b81f22..c2de42f1 100644 --- a/gcodeworkshop_top.pro +++ b/gcodeworkshop_top.pro @@ -53,3 +53,6 @@ win32 { INSTALLS += translate examples doc } + +!defined(VERSION, var): VERSION = $$getVersion() +message(Project version: $$VERSION) From 189a661766de8aee289c831783c14b19889db990 Mon Sep 17 00:00:00 2001 From: u-235 Date: Wed, 11 Sep 2024 20:38:42 +0300 Subject: [PATCH 2/9] Add script to build the Debian packages --- install/deb-build.sh | 237 +++++++++++++++++++++++++++++++++++++++++++ install/package.cfg | 10 ++ 2 files changed, 247 insertions(+) create mode 100755 install/deb-build.sh create mode 100644 install/package.cfg diff --git a/install/deb-build.sh b/install/deb-build.sh new file mode 100755 index 00000000..f0b5e52d --- /dev/null +++ b/install/deb-build.sh @@ -0,0 +1,237 @@ +#!/usr/bin/env bash + +set -e + +function usage() +{ + echo -e "\ +Build the application and create the package.\n\ +Usage:\n\ + $(basename "$0") [-b bld_dir] [-p pkg_dir] [-q qmake] [-s suffix] [-v version]\n\ +\n\ +Options:\n\ + -b bld_dir The directory where the application will be built.\n\ + By default it is /build\n\ + -p pkg_dir The directory where the package will be built.\n\ + By default this is /_\n\ + -q qmake The name or full path of the qmake utility. In some\n\ + distributives, qmake for Qt 6 is named qmake6.\n\ + -s suffux The suffix that will be added to the package name after the\n\ + version and before the architecture type.\n\ + Nothing is added by default.\n\ + -v version Define the package version. By default version gettings from\n\ + the version.h file.\n\ +\n\ +It is assumed that the necessary dependencies and tools are already installed\n\ +in the system.\n\ +\n\ +The created package is saved in the current working directory.\ +" 1>&2 +} + +MAKE_JOBS=$(nproc) +MODE_FORCE_CLEAN=1 +#MODE_QUIET=1 + +SCRIPT_DIR=$(realpath "$(dirname "$0")") + +# The package configuration must define the get_version function +# and the following variables: +# SOURCE_DIR +# PACKAGE_NAME +# PACKAGE_INSTALL_PREFIX +# PACKAGE_BINS +# PACKAGE_DEBIAN_DESCRIPTION +source ${SCRIPT_DIR}/package.cfg + +function echo_step() +{ + [ -v MODE_QUIET ] && return + echo -e "\n================================================================================" + echo -e "$1" + echo -e "================================================================================\n" +} + +# Returns 0 if there is no 'key' value in the 'list' array. +# param: +# key - key +# list[] - list of a keys +function is_uniquue () { + local item + + for item in "${@:2}"; do + [[ ${item} == "${1}" ]] && return 1 + done + + return 0 +} + +# Returns a list of libraries on which the binaries depend +# param: +# bins[] - list of a binaries +function get_libs () { + local app + local lib + local lib_list + + for app in "${@}"; do + for lib in $(objdump -p "${app}" | grep NEEDED | awk '{print $2}'); do + if is_uniquue "${lib}" "${lib_list[@]}"; then + lib_list+=("${lib}") + fi + done + done + + echo "${lib_list[@]}" +} + +# Returns a list of packages on which the binaries depend +# param: +# arch - architecture name +# bins[] - list of a binaries +function get_deb_packages () { + local pack + local pack_list + + for pack in $(dpkg -S $(get_libs "${@:2}") | grep "${1}" | awk -F: '{print $1}'); do + if is_uniquue "${pack}" "${pack_list[@]}"; then + pack_list+=("${pack}") + fi + done + + echo "${pack_list[@]}" +} + +# Returns a list of packages on which the binaries depend +# param: +# arch - architecture name +# bins[] - list of a binaries +function get_deb_dependies () { + local pack + local dep_list + local comma=0 + + for pack in $(get_deb_packages "${1}" "${@:2}"); do + ver=$(dpkg-query -f='${Version}' -W "${pack}:${1}") + [[ ${comma} -eq 1 ]] && dep_list+=", " + dep_list+="${pack} (>= ${ver})" + comma=1 + done + + echo "${dep_list}" +} + +QMAKE=qmake +BUILD_DIR=${SOURCE_DIR}/build +PACKAGE_VERSION=$(get_version) +PACKAGE_ARCH=$(dpkg --print-architecture) + +while getopts ":b:p:q:s:v:h" options; do + case "${options}" in + b) + BUILD_DIR=${OPTARG} + ;; + p) + PACKAGE_DIR=${OPTARG} + FORCE_PACKAGE_DIR=1 + ;; + q) + QMAKE=${OPTARG} + ;; + s) + PACKAGE_SUFFIX=_${OPTARG} + ;; + v) + PACKAGE_VERSION=${OPTARG} + FORCE_VERSION=1 + ;; + h) + usage + exit 0 + ;; + *) + echo -e "Error: unknown option '-${OPTARG}'.\n" + usage + exit 1 + ;; + esac +done + +if ! [ -v FORCE_PACKAGE_DIR ]; then + PACKAGE_DIR=${BUILD_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION} +fi +PACKAGE_FULL_NAME="${PACKAGE_NAME}-${PACKAGE_VERSION}${PACKAGE_SUFFIX}_${PACKAGE_ARCH}" + +echo_step "Try to build package with:\n\ +PACKAGE_NAME ${PACKAGE_NAME}\n\ +PACKAGE_SUFFIX ${PACKAGE_SUFFIX}\n\ +PACKAGE_VERSION ${PACKAGE_VERSION}\n\ +PACKAGE_ARCH ${PACKAGE_ARCH}\n\ +PACKAGE_FULL_NAME ${PACKAGE_FULL_NAME}\n\ +SOURCE_DIR ${SOURCE_DIR}\n\ +BUILD_DIR ${BUILD_DIR}\n\ +PACKAGE_DIR ${PACKAGE_DIR}\n\ +" + +if [ -v MODE_FORCE_CLEAN ]; then + echo_step "Clean the build tree and the package dir" + if [ -d "$BUILD_DIR" ]; then + echo "Remove $BUILD_DIR" + rm -rf "$BUILD_DIR" + fi + if [ -d "$PACKAGE_DIR" ]; then + echo "Remove $PACKAGE_DIR" + rm -rf "$PACKAGE_DIR" + fi +fi + +echo_step "Run qmake" +if [ -v FORCE_VERSION ]; then + QMAKE_OPTIONS="VERSION=$PACKAGE_VERSION " +fi +QMAKE_OPTIONS+="PREFIX=$PACKAGE_INSTALL_PREFIX $SOURCE_DIR" +OLD_PWD=$PWD +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" +$QMAKE -r $QMAKE_OPTIONS + +echo_step "Make translations" +# At the time qmake is first called, the *.qm files do not yet exist and qmake +# does not generate code to install these files. Therefore, after compiling +# the *.qm files, call qmake again to generate the installation code correctly. +make lrelease -j $MAKE_JOBS +$QMAKE $QMAKE_OPTIONS + +echo_step "Make application" +make -j $MAKE_JOBS + +echo_step "Copy application to the package directory" +mkdir -p "$PACKAGE_DIR"/DEBIAN +make install INSTALL_ROOT="$PACKAGE_DIR" +cd "$OLD_PWD" + +echo_step "Create package" +echo -n "Getting depends..." +for bin_obj in "${PACKAGE_BINS[@]}"; do + BINS+=("$PACKAGE_DIR/$PACKAGE_INSTALL_PREFIX/${bin_obj}") +done +PACKAGE_DEPENDS=$(get_deb_dependies "$PACKAGE_ARCH" ${BINS[@]}) +echo " Done" + +cat < "$PACKAGE_DIR"/DEBIAN/control +Package: $PACKAGE_NAME +Version: $PACKAGE_VERSION +Section: devel +Priority: optional +Depends: $PACKAGE_DEPENDS +Architecture: $PACKAGE_ARCH +Maintainer: Nick Egorrov +Description: $PACKAGE_DEBIAN_DESCRIPTION +Installed-Size: $(du -s "$PACKAGE_DIR" | tr -cd 0-9) +EOF + +if [ -f "${PACKAGE_FULL_NAME}.deb" ]; then + echo "Remove old portable ${PACKAGE_FULL_NAME}.deb" + rm "${PACKAGE_FULL_NAME}.deb" +fi +dpkg-deb -v --build "$PACKAGE_DIR" "${PACKAGE_FULL_NAME}.deb" diff --git a/install/package.cfg b/install/package.cfg new file mode 100644 index 00000000..53c31360 --- /dev/null +++ b/install/package.cfg @@ -0,0 +1,10 @@ + +SOURCE_DIR=$(realpath "$SCRIPT_DIR"/../) +PACKAGE_NAME=gcodeworkshop +PACKAGE_INSTALL_PREFIX=/usr +declare -a PACKAGE_BINS=("bin/gcodeworkshop" "bin/gcodefileserver") +PACKAGE_DEBIAN_DESCRIPTION="GCodeWorkShop is a text editor for CNC programmers." + +function get_version () { + cat ${SOURCE_DIR}/gcodeshared/include/version.h | grep 'define\s*GCODEWORKSHOP_VERSION' | awk -F'"' '{print $(NF-1)}' +} From 83312b1eae8479ce4c0afbcd410fe448cc1cb98d Mon Sep 17 00:00:00 2001 From: u-235 Date: Sat, 14 Sep 2024 22:03:56 +0300 Subject: [PATCH 3/9] Create the release github actions --- .github/workflows/release.yml | 130 ++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..56bbc9dc --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,130 @@ +name: release +# Based on https://github.com/ra3xdh/qucs_s/.github/workflows/deploy.yml + +on: + push: + tags: + - '*' + +env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true + +jobs: + build-debian-packages: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + os_name: ['bullseye', 'bookworm', 'trixie'] + container: + # https://hub.docker.com/_/debian + image: debian:${{matrix.os_name}} + steps: + - uses: actions/checkout@v4 + + - name: 'Install Dependencies' + shell: bash + run: | + apt-get update + # https://serverfault.com/a/992421 + DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install -y build-essential qtbase5-dev qttools5-dev-tools libqt5serialport5-dev + + - name: 'Build' + shell: bash + run: install/deb-build.sh -s debian-${{matrix.os_name}} -v ${{ github.ref_name }} + + - name: 'Upload debian packages' + uses: actions/upload-artifact@v4 + with: + name: debian-${{matrix.os_name}} + path: '*.deb' + + build-ubuntu-packages: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + os_name: ['focal', 'jammy', 'mantic', 'noble'] + container: + # https://hub.docker.com/_/ubuntu + image: ubuntu:${{matrix.os_name}} + steps: + - uses: actions/checkout@v4 + + - name: 'Install Dependencies' + shell: bash + run: | + apt-get update + DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install -y build-essential qtbase5-dev qttools5-dev-tools libqt5serialport5-dev + + - name: 'Build' + shell: bash + run: install/deb-build.sh -s ubuntu-${{matrix.os_name}} -v ${{ github.ref_name }} + + - name: 'Upload ubuntu packages' + uses: actions/upload-artifact@v4 + with: + name: ubuntu-${{matrix.os_name}} + path: '*.deb' + + create-release: + runs-on: ubuntu-latest + needs: [build-debian-packages, build-ubuntu-packages] + steps: + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + path: ~/artifacts + merge-multiple: true + + - name: Calculate SHA-256 checksums + run: | + cd ~/artifacts + echo 'SHA-256 checksums' > notes.txt + echo '-----------------' >> notes.txt + echo -e '\n```' >> notes.txt + for file in $(find . -type f \( -name "*.exe" -o -name "*.zip" -o -name "*.deb" -o -name "*.rpm" \) | sort); do + filename=$(basename "$file") + checksum=$(sha256sum "$file" | awk '{print $1}') + echo "$checksum $filename" >> notes.txt + #echo $checksum > "$filename".sha256 + done + echo -e '```\n' >> notes.txt + cd .. + tree ~/artifacts + + - name: Setup Release Information + run: | + echo "RELEASE_NAME=${{ github.ref_name }}" >> $GITHUB_ENV + echo "TAG_NAME=${{ github.ref_name }}" >> $GITHUB_ENV + echo "TAG_NAME=${{ github.ref_name }}" >> $GITHUB_ENV + + - name: Create GitHub Release + continue-on-error: false + run: | + # Find existing artifact files + hash_files=$(find ~/artifacts -name "*.sha256" -print0 | xargs -0 echo) + exe_files=$(find ~/artifacts -name "*.exe" -print0 | xargs -0 echo) + zip_files=$(find ~/artifacts -name "*.zip" -print0 | xargs -0 echo) + deb_files=$(find ~/artifacts -name "*.deb" -print0 | xargs -0 echo) + rpm_files=$(find ~/artifacts -name "*.rpm" -print0 | xargs -0 echo) + + # Check existing release and delete if it's exist + if gh release view ${{ env.TAG_NAME }} --repo $GITHUB_REPOSITORY &> /dev/null; then + gh release delete ${{ env.TAG_NAME }} --repo $GITHUB_REPOSITORY + echo "${{ env.TAG_NAME }} deleted!" + fi + + gh release create ${{ env.TAG_NAME }} \ + --repo $GITHUB_REPOSITORY \ + --draft \ + --title "${{ env.RELEASE_NAME }}" \ + --notes-file ~/artifacts/notes.txt \ + $hash_files \ + $exe_files \ + $zip_files \ + $deb_files \ + $rpm_files + + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 77f0b3e3153c32a987f4231cb4107e01d3c73c85 Mon Sep 17 00:00:00 2001 From: u-235 Date: Fri, 20 Sep 2024 22:32:16 +0300 Subject: [PATCH 4/9] Add absolute path to the lupdate and lrelease commands --- gcodeworkshop_top.pro | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/gcodeworkshop_top.pro b/gcodeworkshop_top.pro index c2de42f1..d627dec9 100644 --- a/gcodeworkshop_top.pro +++ b/gcodeworkshop_top.pro @@ -10,11 +10,20 @@ include(install/install.pri) QMAKE_EXTRA_TARGETS += lupdate lupdate.depends = lupdateGCodeWorkShop lupdateKdiff3 QMAKE_EXTRA_TARGETS += lupdateGCodeWorkShop lupdateKdiff3 -lupdateGCodeWorkShop.commands = lupdate $$PROJECT_ROOT_PATH/gcodeworkshop $$PROJECT_ROOT_PATH/gcodeshared $$PROJECT_ROOT_PATH/gcodefileserver $$PROJECT_ROOT_PATH/addons -ts $$tsFiles(gcodeworkshop) -lupdateKdiff3.commands = lupdate $$PROJECT_ROOT_PATH/3rdparty/kdiff3 -ts $$tsFiles(kdiff3) +lupdateGCodeWorkShop.commands = $$[QT_INSTALL_BINS]/lupdate \ + $$PROJECT_ROOT_PATH/gcodeworkshop \ + $$PROJECT_ROOT_PATH/gcodeshared \ + $$PROJECT_ROOT_PATH/gcodefileserver \ + $$PROJECT_ROOT_PATH/addons \ + -ts $$tsFiles(gcodeworkshop) +lupdateKdiff3.commands = $$[QT_INSTALL_BINS]/lupdate \ + $$PROJECT_ROOT_PATH/3rdparty/kdiff3 \ + -ts $$tsFiles(kdiff3) QMAKE_EXTRA_TARGETS += lrelease -lrelease.commands = lrelease $$tsFiles(gcodeworkshop) $$tsFiles(kdiff3) +lrelease.commands = $$[QT_INSTALL_BINS]/lrelease \ + $$tsFiles(gcodeworkshop) \ + $$tsFiles(kdiff3) translate.files = $$LANG_PATH/*.qm examples.files = $$PROJECT_ROOT_PATH/examples/* From ceb6465fdc2d5eb43751aaf52d1347afde9f8497 Mon Sep 17 00:00:00 2001 From: u-235 Date: Thu, 19 Sep 2024 15:16:30 +0300 Subject: [PATCH 5/9] Add script to build windows installer --- install/win-installer.nsi | 203 ++++++++++++++++++++++++++++++++++++ install/win-msys2-build.sh | 208 +++++++++++++++++++++++++++++++++++++ 2 files changed, 411 insertions(+) create mode 100644 install/win-installer.nsi create mode 100755 install/win-msys2-build.sh diff --git a/install/win-installer.nsi b/install/win-installer.nsi new file mode 100644 index 00000000..2be5e3f6 --- /dev/null +++ b/install/win-installer.nsi @@ -0,0 +1,203 @@ +; NSIS script file + + +;==============================; +; Configuration ; +;==============================; + +!ifndef APP_ARCH + !define APP_ARCH x86_64 +!endif + +!ifndef INSTALLER_FILE + !define INSTALLER_FILE GCodeWorkShop_${APP_ARCH}_Setup.exe +!endif + +; Directories + +!define APP_BIN_DIR bin +!define PKG_BIN_DIR ${APP_BIN_DIR} +!define APP_DOC_DIR doc +!define PKG_DOC_DIR ${APP_DOC_DIR} +!define APP_EXAMPLES_DIR examples +!define PKG_EXAMPLES_DIR ${APP_EXAMPLES_DIR} +!define APP_I18N_DIR lang +!define PKG_I18N_DIR ${APP_I18N_DIR} + + +;==============================; +; General ; +;==============================; + +; The icon for the installer and uninstaller. +; MUI_ICON icon_file +; MUI_UNICON icon_file + + Unicode true + Name "GCodeWorkShop" + OutFile "${INSTALLER_FILE}" + +!if ${APP_ARCH} == "x86_64" + InstallDir "$PROGRAMFILES64\GCodeWorkShop" +!else + InstallDir "$PROGRAMFILES32\GCodeWorkShop" +!endif + + InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\GCodeWorkShop" "" +; SetCompressor lzma + + +; Modern UI + + !include "MUI.nsh" + !define MUI_ABORTWARNING + + +;==============================; +; Pages ; +;==============================; + + Var STARTMENU_FOLDER + + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE LICENSE.txt + !insertmacro MUI_PAGE_DIRECTORY + + ;Start Menu Folder Page Configuration + !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKEY_LOCAL_MACHINE + !define MUI_STARTMENUPAGE_REGISTRY_KEY "SOFTWARE\GCodeWorkShop" + !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER + + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + + ; Uninstaller pages + !insertmacro MUI_UNPAGE_WELCOME + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + + +;==============================; +; Languages ; +;==============================; + + !insertmacro MUI_LANGUAGE "English" + !insertmacro MUI_LANGUAGE "Catalan" + !insertmacro MUI_LANGUAGE "Czech" + !insertmacro MUI_LANGUAGE "Dutch" + !insertmacro MUI_LANGUAGE "Finnish" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Polish" + !insertmacro MUI_LANGUAGE "Russian" + !insertmacro MUI_LANGUAGE "Spanish" + + +;==============================; +; Main section ; +;==============================; + +Section "-Install" + SetOutPath "$INSTDIR" + File LICENSE.txt + + SetOutPath "$INSTDIR\${PKG_BIN_DIR}" + File /oname=GCodeWorkShop.exe ${APP_BIN_DIR}\gcodeworkshop.exe + File /oname=GCodeFileServer.exe ${APP_BIN_DIR}\gcodefileserver.exe + + ;Store installation folder + WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\GCodeWorkShop" "" "$INSTDIR" + + ;Create uninstaller + WriteUninstaller "$INSTDIR\uninst.exe" + + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + ;Create shortcuts + CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GCodeWorkShop.lnk" "$INSTDIR\${PKG_BIN_DIR}\GCodeWorkShop.exe" + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\uninst.exe" + !insertmacro MUI_STARTMENU_WRITE_END +SectionEnd + +Section "Uninstall" + Push $R0 + !insertmacro MUI_STARTMENU_GETFOLDER Application $R0 + Delete "$SMPROGRAMS\$R0\Uninstall.lnk" + Delete "$SMPROGRAMS\$R0\GCodeWorkShop.lnk" + RMDir "$SMPROGRAMS\$R0" + Pop $R0 + + DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\GCodeWorkShop" + DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\GCodeWorkShop" + + Delete "$INSTDIR\${PKG_BIN_DIR}\GCodeWorkShop.exe" + Delete "$INSTDIR\${PKG_BIN_DIR}\GCodeFileServer.exe" + Delete "$INSTDIR\LICENSE.txt" + Delete "$INSTDIR\uninst.exe" + + RMDir "$INSTDIR\${PKG_BIN_DIR}" + RMDir "$INSTDIR" +SectionEnd + + +;==============================; +; Internationalisation ; +;==============================; + +Section "-Install i18n" + SetOutPath "$INSTDIR\${PKG_I18N_DIR}" + File "${APP_I18N_DIR}\*.qm" +SectionEnd + +Section "un.Install i18n" + RMDir /r "$INSTDIR\${PKG_I18N_DIR}" + RMDir "$INSTDIR" +SectionEnd + + +;==============================; +; Documentation ; +;==============================; + +Section "-Install doc" + SetOutPath "$INSTDIR\${PKG_DOC_DIR}" + File /r "${APP_DOC_DIR}\*.html" +SectionEnd + +Section "un.Install doc" + RMDir /r "$INSTDIR\${PKG_DOC_DIR}" + RMDir "$INSTDIR" +SectionEnd + + +;==============================; +; Examples ; +;==============================; + +Section "-Install Examples" + SetOutPath "$INSTDIR\${PKG_EXAMPLES_DIR}" + File /r "${APP_EXAMPLES_DIR}\*.nc" + File "${APP_EXAMPLES_DIR}\cnc_tips.txt" +SectionEnd + +Section "un.Install Examples" + RMDir /r "$INSTDIR\${PKG_EXAMPLES_DIR}" + RMDir "$INSTDIR" +SectionEnd + + +;==============================; +; dependencies ; +;==============================; + +Section "-Install Dependencies" + SetOutPath "$INSTDIR\${PKG_BIN_DIR}" + File ${APP_BIN_DIR}\qt.conf + File /nonfatal /r "${APP_BIN_DIR}\*.dll" +SectionEnd + +Section "un.Install Dependencies" + RMDir /r "$INSTDIR\${PKG_BIN_DIR}" + RMDir "$INSTDIR" +SectionEnd diff --git a/install/win-msys2-build.sh b/install/win-msys2-build.sh new file mode 100755 index 00000000..3de57a24 --- /dev/null +++ b/install/win-msys2-build.sh @@ -0,0 +1,208 @@ +#!/usr/bin/env bash + +set -e + +function usage() +{ + echo -e "\ +Build the application and create the installer.\n\ +Usage:\n\ + $(basename "$0") [-b bld_dir] [-p pkg_dir] [-q qmake] [-s suffix] [-v version]\n\ +\n\ +Options:\n\ + -b bld_dir The directory where the application will be built.\n\ + By default it is /build\n\ + -p pkg_dir The directory where the installer will be built.\n\ + By default this is /_\n\ + -q qmake The name or full path of the qmake utility. This can be useful\n\ + when building with static linking or when building with Qt6.\n\ + -s suffux The suffix that will be added to the installer name after the\n\ + version and before the architecture type.\n\ + Nothing is added by default.\n\ + -v version Define the installer version. By default version gettings from\n\ + the version.h file.\n\ +\n\ +It is assumed that the necessary dependencies and tools are already installed\n\ +in the system.\n\ +\n\ +The created installer is saved in the current working directory.\ +" 1>&2 +} + +MAKE_JOBS=$(nproc) +MODE_FORCE_CLEAN=1 +#MODE_QUIET=1 + +SCRIPT_DIR=$(realpath "$(dirname "$0")") + +# The package configuration must define the get_version function +# and the following variables: +# SOURCE_DIR +# PACKAGE_NAME +source "${SCRIPT_DIR}"/package.cfg + +function echo_step() +{ + [ -v MODE_QUIET ] && return + echo -e "\n================================================================================" + echo -e "$1" + echo -e "================================================================================\n" +} + +QMAKE=qmake +BUILD_DIR=${SOURCE_DIR}/build +PACKAGE_VERSION=$(get_version) + +if [ "$MSYSTEM" == MINGW32 ]; then + PACKAGE_ARCH=i686 +else + PACKAGE_ARCH=x86_64 +fi + +while getopts ":b:p:q:s:v:h" options; do + case "${options}" in + b) + BUILD_DIR=${OPTARG} + ;; + p) + PACKAGE_DIR=${OPTARG} + FORCE_PACKAGE_DIR=1 + ;; + q) + QMAKE=${OPTARG} + ;; + s) + PACKAGE_SUFFIX=_${OPTARG} + ;; + v) + PACKAGE_VERSION=${OPTARG} + FORCE_VERSION=1 + ;; + h) + usage + exit 0 + ;; + *) + echo -e "Error: unknown option '-${OPTARG}'.\n" + usage + exit 1 + ;; + esac +done + +if ! [ -v FORCE_PACKAGE_DIR ]; then + PACKAGE_DIR=${BUILD_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION} +fi +PACKAGE_BIN_DIR=${PACKAGE_DIR}/bin +PACKAGE_I18N_DIR=${PACKAGE_DIR}/lang +PACKAGE_FULL_NAME=${PACKAGE_NAME}-${PACKAGE_VERSION}${PACKAGE_SUFFIX}_${PACKAGE_ARCH} + +echo_step "Try to build package with:\n\ +PACKAGE_NAME ${PACKAGE_NAME}\n\ +PACKAGE_SUFFIX ${PACKAGE_SUFFIX}\n\ +PACKAGE_VERSION ${PACKAGE_VERSION}\n\ +PACKAGE_ARCH ${PACKAGE_ARCH}\n\ +PACKAGE_FULL_NAME ${PACKAGE_FULL_NAME}\n\ +SOURCE_DIR ${SOURCE_DIR}\n\ +BUILD_DIR ${BUILD_DIR}\n\ +PACKAGE_DIR ${PACKAGE_DIR}\n\ +" + +if [ -v MODE_FORCE_CLEAN ]; then + echo_step "Clean the build tree and the package dir" + if [ -d "$BUILD_DIR" ]; then + echo "Remove $BUILD_DIR" + rm -rf "$BUILD_DIR" + fi + if [ -d "$PACKAGE_DIR" ]; then + echo "Remove $PACKAGE_DIR" + rm -rf "$PACKAGE_DIR" + fi +fi + +echo_step "Run qmake" +QT_PLUGINS=$($QMAKE -query QT_INSTALL_PLUGINS) +QT_I18NS=$($QMAKE -query QT_INSTALL_TRANSLATIONS) +if [ -v FORCE_VERSION ]; then + QMAKE_OPTIONS="VERSION=$PACKAGE_VERSION " +fi +QMAKE_OPTIONS+="PREFIX=$PACKAGE_DIR $SOURCE_DIR" +OLD_PWD=$PWD +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" +$QMAKE -r $QMAKE_OPTIONS + +echo_step "Make translations" +# At the time qmake is first called, the *.qm files do not yet exist and qmake +# does not generate code to install these files. Therefore, after compiling +# the *.qm files, call qmake again to generate the installation code correctly. +make lrelease -j $MAKE_JOBS +$QMAKE $QMAKE_OPTIONS + +echo_step "Make application" +make -j $MAKE_JOBS + +echo_step "Copy application to the package directory" +make install +cp "$SOURCE_DIR"/LICENSE "$PACKAGE_DIR"/LICENSE.txt + +mkdir -p "$PACKAGE_BIN_DIR" +cat < "$PACKAGE_BIN_DIR"/qt.conf +; https://doc.qt.io/qt-5/qt-conf.html + +[Paths] +Translations=../lang +EOF + +if [ -f "${QT_PLUGINS}"/platforms/qwindows.dll ]; then + echo "Coping Qt plugins" + mkdir -p "$PACKAGE_BIN_DIR"/bearer + mkdir -p "$PACKAGE_BIN_DIR"/imageformats + mkdir -p "$PACKAGE_BIN_DIR"/platforms + mkdir -p "$PACKAGE_BIN_DIR"/printsupport + mkdir -p "$PACKAGE_BIN_DIR"/styles + cp "${QT_PLUGINS}"/bearer/qgenericbearer.dll "$PACKAGE_BIN_DIR"/bearer + cp "${QT_PLUGINS}"/imageformats/qgif.dll \ + "${QT_PLUGINS}"/imageformats/qico.dll \ + "${QT_PLUGINS}"/imageformats/qjpeg.dll "$PACKAGE_BIN_DIR"/imageformats + cp "${QT_PLUGINS}"/platforms/qwindows.dll "$PACKAGE_BIN_DIR"/platforms + cp "${QT_PLUGINS}"/printsupport/windowsprintersupport.dll "$PACKAGE_BIN_DIR"/printsupport + cp "${QT_PLUGINS}"/styles/qwindowsvistastyle.dll "$PACKAGE_BIN_DIR"/styles +fi + +echo "Coping Qt translations" +for lang in 'ca' 'cs' 'de' 'es' 'fi' 'nl' 'pl' 'ru'; do + [ -f "${QT_I18NS}/qt_${lang}.qm" ] && cp "${QT_I18NS}/qt_${lang}.qm" "$PACKAGE_I18N_DIR" + [ -f "${QT_I18NS}/qtbase_${lang}.qm" ] && cp "${QT_I18NS}/qtbase_${lang}.qm" "$PACKAGE_I18N_DIR" + [ -f "${QT_I18NS}/qtserialport_${lang}.qm" ] && cp "${QT_I18NS}/qtserialport_${lang}.qm" "$PACKAGE_I18N_DIR" +done + +echo "Coping DLL's" +for dll in $(ldd $(find "$PACKAGE_BIN_DIR" -type f -name "*.exe") | sort -u | grep mingw | awk '{print $1}'); do + cp "$(which "$dll")" "$PACKAGE_BIN_DIR" +done + +if command -v makensis >/dev/null 2>&1; then + echo_step "Create installer" + cp "${SCRIPT_DIR}"/win-installer.nsi "${PACKAGE_DIR}" + if [ -f "${OLD_PWD}/${PACKAGE_FULL_NAME}".exe ]; then + echo "Remove old installer ${OLD_PWD}/${PACKAGE_FULL_NAME}.exe" + rm "${OLD_PWD}/${PACKAGE_FULL_NAME}".exe + fi + makensis \ + -DAPP_ARCH="$PACKAGE_ARCH" \ + -DINSTALLER_FILE="${OLD_PWD}/${PACKAGE_FULL_NAME}".exe \ + "${PACKAGE_DIR}"/win-installer.nsi + rm "${PACKAGE_DIR}"/win-installer.nsi +fi + +if command -v zip >/dev/null 2>&1; then + echo_step "Create portable" + ZIP_NAME=${PACKAGE_FULL_NAME}.zip + if [ -f "${OLD_PWD}/$ZIP_NAME" ]; then + echo "Remove old portable ${OLD_PWD}/$ZIP_NAME" + rm "${OLD_PWD}/$ZIP_NAME" + fi + cd "${PACKAGE_DIR}/.." + zip -r "${OLD_PWD}/$ZIP_NAME" "$(basename "${PACKAGE_DIR}")" +fi From e024fd4f1dbaa470fa48c89a016ff4a5f14dee74 Mon Sep 17 00:00:00 2001 From: u-235 Date: Thu, 19 Sep 2024 19:40:54 +0300 Subject: [PATCH 6/9] Update github actions to create a windows installer --- .github/workflows/release.yml | 52 +++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 56bbc9dc..4eee77ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -67,9 +67,58 @@ jobs: name: ubuntu-${{matrix.os_name}} path: '*.deb' + build-windows-installer: + runs-on: windows-2022 + strategy: + fail-fast: false + matrix: + msystem: ['mingw64', 'mingw32'] + defaults: + run: + shell: msys2 {0} + steps: + - name: Disable autocrlf in Git + shell: pwsh + # https://github.com/msys2/setup-msys2?tab=readme-ov-file#actionscheckout-and-line-endings + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up MSYS2 environment + # The qt5-serialport package is now missing from mingw32, so we use + # a static build. The openssl package is needed for qt-static, but it is + # not in the qt5-static dependencies and so has to be installed explicitly. + uses: msys2/setup-msys2@v2 + with: + msystem: ${{matrix.msystem}} + cache: true + update: true + install: >- + make + zip + pacboy: >- + gcc:p + nsis:p + qt5-static:p + openssl:p + + - name: 'Build' + run: install/win-msys2-build.sh -s windows -v ${{ github.ref_name }} -q /${{matrix.msystem}}/qt5-static/bin/qmake.exe + + - name: 'Upload windows installers' + uses: actions/upload-artifact@v4 + with: + name: windows-${{matrix.msystem}} + path: | + *.exe + *.zip + create-release: runs-on: ubuntu-latest - needs: [build-debian-packages, build-ubuntu-packages] + needs: [build-debian-packages, build-ubuntu-packages, build-windows-installer] steps: - name: Download build artifacts uses: actions/download-artifact@v4 @@ -97,7 +146,6 @@ jobs: run: | echo "RELEASE_NAME=${{ github.ref_name }}" >> $GITHUB_ENV echo "TAG_NAME=${{ github.ref_name }}" >> $GITHUB_ENV - echo "TAG_NAME=${{ github.ref_name }}" >> $GITHUB_ENV - name: Create GitHub Release continue-on-error: false From 13ebb51b060a0e15ab1d2612be480144a52248f6 Mon Sep 17 00:00:00 2001 From: u-235 Date: Wed, 25 Sep 2024 19:55:48 +0300 Subject: [PATCH 7/9] Remove nsis support from the qmake script A build script should not create packages or installers, this makes such a script unnecessarily confusing and difficult to maintain. The NSIS script was also overly complicated by trying to collect application dependencies. --- gcodeworkshop_top.pro | 1 - install/install.pri | 4 - install/windows/nsis/app.nsi | 328 --------------------------------- install/windows/nsis/mingw.nsi | 85 --------- install/windows/nsis/qt.nsi | 89 --------- install/windows/qt.conf | 4 - install/windows/windows.pri | 21 --- 7 files changed, 532 deletions(-) delete mode 100644 install/install.pri delete mode 100644 install/windows/nsis/app.nsi delete mode 100644 install/windows/nsis/mingw.nsi delete mode 100644 install/windows/nsis/qt.nsi delete mode 100644 install/windows/qt.conf delete mode 100644 install/windows/windows.pri diff --git a/gcodeworkshop_top.pro b/gcodeworkshop_top.pro index d627dec9..7d79184a 100644 --- a/gcodeworkshop_top.pro +++ b/gcodeworkshop_top.pro @@ -5,7 +5,6 @@ SUBDIRS = 3rdparty gcodeshared addons gcodeworkshop gcodefileserver include(common.pri) -include(install/install.pri) QMAKE_EXTRA_TARGETS += lupdate lupdate.depends = lupdateGCodeWorkShop lupdateKdiff3 diff --git a/install/install.pri b/install/install.pri deleted file mode 100644 index 81d4f663..00000000 --- a/install/install.pri +++ /dev/null @@ -1,4 +0,0 @@ - -!defined(INSTALLER_DIR, var):INSTALLER_DIR = $$shadowed($${PROJECT_ROOT_PATH}) - -win32:include(windows/windows.pri) diff --git a/install/windows/nsis/app.nsi b/install/windows/nsis/app.nsi deleted file mode 100644 index 3be9abe8..00000000 --- a/install/windows/nsis/app.nsi +++ /dev/null @@ -1,328 +0,0 @@ -; NSIS script file - - -;==============================; -; Configuration ; -;==============================; - -!ifndef APP_ARCH - !define APP_ARCH x86_64 -!endif - -!ifndef INSTALLER_FILE - !define INSTALLER_FILE GCodeWorkShop_${APP_ARCH}_Setup.exe -!endif - -; Base directories - -!ifndef PROJECT_ROOT - !define PROJECT_ROOT ${__FILEDIR__}\..\..\.. -!endif - -!ifndef BUILD_ROOT - !if /FileExists "${BUILD_ROOT}\build\" - !define BUILD_ROOT ${PROJECT_ROOT}\build - !else - !define BUILD_ROOT ${PROJECT_ROOT} - !endif -!endif - -; Sources directories - -!ifndef APP_BINS - !define APP_BINS ${PROJECT_ROOT}\bin\release -!endif - -!ifndef APP_DOCS - !define APP_DOCS ${PROJECT_ROOT}\doc -!endif - -!ifndef APP_EXAMPLES - !define APP_EXAMPLES ${PROJECT_ROOT}\examples -!endif - -!ifndef APP_I18N - !define APP_I18N ${PROJECT_ROOT}\lang -!endif - -!ifndef CXX_BINS - !ifdef CXX_RUNTIME - !define CXX_BINS ${CXX_RUNTIME} - !else - !define CXX_BINS ${APP_BINS} - !endif -!endif - -!ifndef QT_BINS - !ifdef QT_HOST_BINS - !define QT_BINS ${QT_HOST_BINS} - !else - !define QT_BINS ${APP_BINS} - !endif -!endif - -!ifndef QT_DEP_BINS - !define QT_DEP_BINS ${QT_BINS} -!endif - -!ifndef QT_PLUGINS - !ifdef QT_HOST_DATA - !define QT_PLUGINS ${QT_HOST_DATA}\plugins - !else - !define QT_PLUGINS ${QT_BINS} - !endif -!endif - -!ifndef QT_I18NS - !ifdef QT_HOST_DATA - !define QT_I18NS ${QT_HOST_DATA}\translations - !else - !define QT_I18NS ${QT_BINS}\translations - !endif -!endif - -; Destination subdirectories - -!ifndef DST_BINS - !define DST_BINS bin -!endif - -!ifndef DST_DOCS - !define DST_DOCS doc -!endif - -!ifndef DST_EXAMPLES - !define DST_EXAMPLES examples -!endif - -!ifndef DST_I18NS - !define DST_I18NS lang -!endif - - -;==============================; -; General ; -;==============================; - -; The icon for the installer and uninstaller. -; MUI_ICON icon_file -; MUI_UNICON icon_file - - Unicode true - Name "GCodeWorkShop" - OutFile "${INSTALLER_FILE}" - -!if ${APP_ARCH} == "x86_64" - InstallDir "$PROGRAMFILES64\GCodeWorkShop" -!else - InstallDir "$PROGRAMFILES32\GCodeWorkShop" -!endif - - InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\GCodeWorkShop" "" -; SetCompressor lzma - - -; Modern UI - - !include "MUI.nsh" - !define MUI_ABORTWARNING - - -;==============================; -; Pages ; -;==============================; - - Var STARTMENU_FOLDER - - !insertmacro MUI_PAGE_WELCOME - !insertmacro MUI_PAGE_LICENSE "${PROJECT_ROOT}\LICENSE" - !insertmacro MUI_PAGE_DIRECTORY - - ;Start Menu Folder Page Configuration - !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKEY_LOCAL_MACHINE - !define MUI_STARTMENUPAGE_REGISTRY_KEY "SOFTWARE\GCodeWorkShop" - !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" - !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER - - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_PAGE_FINISH - - ; Uninstaller pages - !insertmacro MUI_UNPAGE_WELCOME - !insertmacro MUI_UNPAGE_CONFIRM - !insertmacro MUI_UNPAGE_INSTFILES - !insertmacro MUI_UNPAGE_FINISH - - -;==============================; -; Languages ; -;==============================; - - !insertmacro MUI_LANGUAGE "English" - !insertmacro MUI_LANGUAGE "Catalan" - !insertmacro MUI_LANGUAGE "Czech" - !insertmacro MUI_LANGUAGE "Dutch" - !insertmacro MUI_LANGUAGE "Finnish" - !insertmacro MUI_LANGUAGE "German" - !insertmacro MUI_LANGUAGE "Polish" - !insertmacro MUI_LANGUAGE "Russian" - !insertmacro MUI_LANGUAGE "Spanish" - - -;==============================; -; Main section ; -;==============================; - -Section "-Install" - SetOutPath "$INSTDIR" - File /oname=LICENSE.txt "${PROJECT_ROOT}\LICENSE" - - SetOutPath "$INSTDIR\${DST_BINS}" - File /oname=GCodeWorkShop.exe "${APP_BINS}\gcodeworkshop.exe" - File /oname=GCodeFileServer.exe "${APP_BINS}\gcodefileserver.exe" - File /oname=qt.conf "${__FILEDIR__}\..\qt.conf" - - ;Store installation folder - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\GCodeWorkShop" "" "$INSTDIR" - - ;Create uninstaller - WriteUninstaller "$INSTDIR\uninst.exe" - - !insertmacro MUI_STARTMENU_WRITE_BEGIN Application - ;Create shortcuts - CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" - CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GCodeWorkShop.lnk" "$INSTDIR\${DST_BINS}\GCodeWorkShop.exe" - CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\uninst.exe" - !insertmacro MUI_STARTMENU_WRITE_END -SectionEnd - -Section "Uninstall" - Push $R0 - !insertmacro MUI_STARTMENU_GETFOLDER Application $R0 - Delete "$SMPROGRAMS\$R0\Uninstall.lnk" - Delete "$SMPROGRAMS\$R0\GCodeWorkShop.lnk" - RMDir "$SMPROGRAMS\$R0" - Pop $R0 - - DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\GCodeWorkShop" - DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\GCodeWorkShop" - - Delete "$INSTDIR\${DST_BINS}\GCodeWorkShop.exe" - Delete "$INSTDIR\${DST_BINS}\GCodeFileServer.exe" - Delete "$INSTDIR\${DST_BINS}\qt.conf" - Delete "$INSTDIR\LICENSE.txt" - Delete "$INSTDIR\uninst.exe" - - RMDir "$INSTDIR\${DST_BINS}" - RMDir "$INSTDIR" -SectionEnd - - -;==============================; -; Internationalisation ; -;==============================; - -Section "-Install i18n" - SetOutPath "$INSTDIR\${DST_I18NS}" - - File /oname=gcodeworkshop_ca.qm "${APP_I18N}\gcodeworkshop_ca.qm" - File /oname=gcodeworkshop_cs_CZ.qm "${APP_I18N}\gcodeworkshop_cs_CZ.qm" - File /oname=gcodeworkshop_de.qm "${APP_I18N}\gcodeworkshop_de.qm" - File /oname=gcodeworkshop_es.qm "${APP_I18N}\gcodeworkshop_es.qm" - File /oname=gcodeworkshop_fi.qm "${APP_I18N}\gcodeworkshop_fi.qm" - File /oname=gcodeworkshop_nl.qm "${APP_I18N}\gcodeworkshop_nl.qm" - File /oname=gcodeworkshop_pl.qm "${APP_I18N}\gcodeworkshop_pl.qm" - File /oname=gcodeworkshop_ru.qm "${APP_I18N}\gcodeworkshop_ru.qm" - File /oname=kdiff3_ca.qm "${APP_I18N}\kdiff3_ca.qm" - File /oname=kdiff3_cs_CZ.qm "${APP_I18N}\kdiff3_cs_CZ.qm" - File /oname=kdiff3_de.qm "${APP_I18N}\kdiff3_de.qm" - File /oname=kdiff3_es.qm "${APP_I18N}\kdiff3_es.qm" - File /oname=kdiff3_fi.qm "${APP_I18N}\kdiff3_fi.qm" - File /oname=kdiff3_nl.qm "${APP_I18N}\kdiff3_nl.qm" - File /oname=kdiff3_pl.qm "${APP_I18N}\kdiff3_pl.qm" - File /oname=kdiff3_ru.qm "${APP_I18N}\kdiff3_ru.qm" -SectionEnd - -Section "un.Install i18n" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_ca.qm" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_cs_CZ.qm" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_de.qm" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_es.qm" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_fi.qm" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_nl.qm" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_pl.qm" - Delete "$INSTDIR\${DST_I18NS}\gcodeworkshop_ru.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_ca.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_cs_CZ.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_de.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_es.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_fi.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_nl.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_pl.qm" - Delete "$INSTDIR\${DST_I18NS}\kdiff3_ru.qm" - - RMDir "$INSTDIR\${DST_I18NS}" - RMDir "$INSTDIR" -SectionEnd - - -;==============================; -; Documentation ; -;==============================; - -Section "-Install doc" - SetOutPath "$INSTDIR\${DST_DOCS}" - - File /oname=SerialTransmission_Help.html "${APP_DOCS}\SerialTransmission_Help.html" -SectionEnd - -Section "un.Install doc" - Delete "$INSTDIR\${DST_DOCS}\SerialTransmission_Help.html" - - RMDir "$INSTDIR\${DST_DOCS}" - RMDir "$INSTDIR" -SectionEnd - - -;==============================; -; Examples ; -;==============================; - -Section "-Install Examples" - SetOutPath "$INSTDIR\${DST_EXAMPLES}" - - File /oname=0100.nc "${APP_EXAMPLES}\0100.nc" - File /oname=FANUC0M.nc "${APP_EXAMPLES}\FANUC0M.nc" - File /oname=FANUC0T.nc "${APP_EXAMPLES}\FANUC0T.nc" - File /oname=FLANGE.nc "${APP_EXAMPLES}\FLANGE.nc" - File /oname=HAAS.nc "${APP_EXAMPLES}\HAAS.nc" - File /oname=HK.nc "${APP_EXAMPLES}\HK.nc" - File /oname=OSP5020M.nc "${APP_EXAMPLES}\OSP5020M.nc" - File /oname=OSP7000L.nc "${APP_EXAMPLES}\OSP7000L.nc" - File /oname=PHILIPS.nc "${APP_EXAMPLES}\PHILIPS.nc" - File /oname=SINUMERIK840D.nc "${APP_EXAMPLES}\SINUMERIK840D.nc" - File /oname=SINUMERIK850.nc "${APP_EXAMPLES}\SINUMERIK850.nc" - File /oname=TOKARKA.nc "${APP_EXAMPLES}\TOKARKA.NC" - File /oname=cnc_tips.txt "${APP_EXAMPLES}\cnc_tips.txt" - File /oname=macro7.nc "${APP_EXAMPLES}\macro7.nc" -SectionEnd - -Section "un.Install Examples" - Delete "$INSTDIR\${DST_EXAMPLES}\0100.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\FANUC0M.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\FANUC0T.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\FLANGE.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\HAAS.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\HK.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\OSP5020M.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\OSP7000L.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\PHILIPS.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\SINUMERIK840D.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\SINUMERIK850.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\TOKARKA.nc" - Delete "$INSTDIR\${DST_EXAMPLES}\cnc_tips.txt" - Delete "$INSTDIR\${DST_EXAMPLES}\macro7.nc" - - RMDir "$INSTDIR\${DST_EXAMPLES}" - RMDir "$INSTDIR" -SectionEnd diff --git a/install/windows/nsis/mingw.nsi b/install/windows/nsis/mingw.nsi deleted file mode 100644 index fcbf410d..00000000 --- a/install/windows/nsis/mingw.nsi +++ /dev/null @@ -1,85 +0,0 @@ -; NSIS script file - -!include qt.nsi - - -;==============================; -; MINGW section ; -;==============================; - -Section "-Install dependies" - SetOutPath "$INSTDIR\${DST_BINS}" - - File /oname=libgcc_s_dw2-1.dll "${CXX_BINS}\libgcc_s_dw2-1.dll" - File /oname=libstdc++-6.dll "${CXX_BINS}\libstdc++-6.dll" - File /oname=libwinpthread-1.dll "${CXX_BINS}\libwinpthread-1.dll" - -!if /FileExists "${QT_DEP_BINS}\libEGL.dll" - ; MINGW from Qt - File /oname=libEGL.dll "${QT_DEP_BINS}\libEGL.dll" - File /oname=libGLESv2.dll "${QT_DEP_BINS}\libGLESv2.dll" -!else - ; MSYS2 - File /oname=libbrotlicommon.dll "${QT_DEP_BINS}\libbrotlicommon.dll" - File /oname=libbrotlidec.dll "${QT_DEP_BINS}\libbrotlidec.dll" - File /oname=libbz2-1.dll "${QT_DEP_BINS}\libbz2-1.dll" - File /oname=libdouble-conversion.dll "${QT_DEP_BINS}\libdouble-conversion.dll" - File /oname=libfreetype-6.dll "${QT_DEP_BINS}\libfreetype-6.dll" - File /oname=libglib-2.0-0.dll "${QT_DEP_BINS}\libglib-2.0-0.dll" - File /oname=libgraphite2.dll "${QT_DEP_BINS}\libgraphite2.dll" - File /oname=libharfbuzz-0.dll "${QT_DEP_BINS}\libharfbuzz-0.dll" - File /oname=libiconv-2.dll "${QT_DEP_BINS}\libiconv-2.dll" - File /oname=libicudt74.dll "${QT_DEP_BINS}\libicudt74.dll" - File /oname=libicuin74.dll "${QT_DEP_BINS}\libicuin74.dll" - File /oname=libicuio74.dll "${QT_DEP_BINS}\libicuio74.dll" - File /oname=libicutest74.dll "${QT_DEP_BINS}\libicutest74.dll" - File /oname=libicutu74.dll "${QT_DEP_BINS}\libicutu74.dll" - File /oname=libicuuc74.dll "${QT_DEP_BINS}\libicuuc74.dll" - File /oname=libintl-8.dll "${QT_DEP_BINS}\libintl-8.dll" - File /oname=libmd4c.dll "${QT_DEP_BINS}\libmd4c.dll" - File /oname=libpcre2-16-0.dll "${QT_DEP_BINS}\libpcre2-16-0.dll" - File /oname=libpcre2-8-0.dll "${QT_DEP_BINS}\libpcre2-8-0.dll" - File /oname=libpng16-16.dll "${QT_DEP_BINS}\libpng16-16.dll" - File /oname=libzstd.dll "${QT_DEP_BINS}\libzstd.dll" - File /oname=zlib1.dll "${QT_DEP_BINS}\zlib1.dll" -!endif -SectionEnd - -Section "un.Install dependies" - Delete "$INSTDIR\${DST_BINS}\libgcc_s_dw2-1.dll" - Delete "$INSTDIR\${DST_BINS}\libstdc++-6.dll" - Delete "$INSTDIR\${DST_BINS}\libwinpthread-1.dll" - -!if /FileExists "${QT_DEP_BINS}\libEGL.dll" - ; MINGW from Qt - Delete "$INSTDIR\${DST_BINS}\libEGL.dll" - Delete "$INSTDIR\${DST_BINS}\libGLESv2.dll" -!else - ; MSYS2 - Delete "$INSTDIR\${DST_BINS}\libbrotlicommon.dll" - Delete "$INSTDIR\${DST_BINS}\libbrotlidec.dll" - Delete "$INSTDIR\${DST_BINS}\libbz2-1.dll" - Delete "$INSTDIR\${DST_BINS}\libdouble-conversion.dll" - Delete "$INSTDIR\${DST_BINS}\libfreetype-6.dll" - Delete "$INSTDIR\${DST_BINS}\libglib-2.0-0.dll" - Delete "$INSTDIR\${DST_BINS}\libgraphite2.dll" - Delete "$INSTDIR\${DST_BINS}\libharfbuzz-0.dll" - Delete "$INSTDIR\${DST_BINS}\libiconv-2.dll" - Delete "$INSTDIR\${DST_BINS}\libicudt74.dll" - Delete "$INSTDIR\${DST_BINS}\libicuin74.dll" - Delete "$INSTDIR\${DST_BINS}\libicuio74.dll" - Delete "$INSTDIR\${DST_BINS}\libicutest74.dll" - Delete "$INSTDIR\${DST_BINS}\libicutu74.dll" - Delete "$INSTDIR\${DST_BINS}\libicuuc74.dll" - Delete "$INSTDIR\${DST_BINS}\libintl-8.dll" - Delete "$INSTDIR\${DST_BINS}\libmd4c.dll" - Delete "$INSTDIR\${DST_BINS}\libpcre2-16-0.dll" - Delete "$INSTDIR\${DST_BINS}\libpcre2-8-0.dll" - Delete "$INSTDIR\${DST_BINS}\libpng16-16.dll" - Delete "$INSTDIR\${DST_BINS}\libzstd.dll" - Delete "$INSTDIR\${DST_BINS}\zlib1.dll" -!endif - - RMDir "$INSTDIR\${DST_BINS}" - RMDir "$INSTDIR" -SectionEnd diff --git a/install/windows/nsis/qt.nsi b/install/windows/nsis/qt.nsi deleted file mode 100644 index 3ac6f56a..00000000 --- a/install/windows/nsis/qt.nsi +++ /dev/null @@ -1,89 +0,0 @@ -; NSIS script file - - -;==============================; -; Qt section ; -;==============================; - -Section "-Install Qt" - SetOutPath "$INSTDIR\${DST_BINS}" - - File /oname=Qt5Core.dll "${QT_BINS}\Qt5Core.dll" - File /oname=Qt5Gui.dll "${QT_BINS}\Qt5Gui.dll" - File /oname=Qt5Network.dll "${QT_BINS}\Qt5Network.dll" - File /oname=Qt5PrintSupport.dll "${QT_BINS}\Qt5PrintSupport.dll" - File /oname=Qt5SerialPort.dll "${QT_BINS}\Qt5SerialPort.dll" - File /oname=Qt5Widgets.dll "${QT_BINS}\Qt5Widgets.dll" - - CreateDirectory "$INSTDIR\${DST_BINS}\bearer" - CreateDirectory "$INSTDIR\${DST_BINS}\imageformats" - CreateDirectory "$INSTDIR\${DST_BINS}\platforms" - CreateDirectory "$INSTDIR\${DST_BINS}\printsupport" - CreateDirectory "$INSTDIR\${DST_BINS}\styles" - - ; Qt plugins - File /oname=bearer\qgenericbearer.dll "${QT_PLUGINS}\bearer\qgenericbearer.dll" - File /oname=imageformats\qgif.dll "${QT_PLUGINS}\imageformats\qgif.dll" - File /oname=imageformats\qico.dll "${QT_PLUGINS}\imageformats\qico.dll" - File /oname=imageformats\qjpeg.dll "${QT_PLUGINS}\imageformats\qjpeg.dll" - File /oname=platforms\qwindows.dll "${QT_PLUGINS}\platforms\qwindows.dll" - File /oname=printsupport\windowsprintersupport.dll "${QT_PLUGINS}\printsupport\windowsprintersupport.dll" - File /oname=styles\qwindowsvistastyle.dll "${QT_PLUGINS}\styles\qwindowsvistastyle.dll" - - CreateDirectory "$INSTDIR\${DST_BINS}\translations" - File /nonfatal /oname=translations\qt_ca.qm "${QT_I18NS}\qt_ca.qm" - File /nonfatal /oname=translations\qtbase_ca.qm "${QT_I18NS}\qtbase_ca.qm" - File /nonfatal /oname=translations\qtserialport_ca.qm "${QT_I18NS}\qtserialport_ca.qm" - File /nonfatal /oname=translations\qt_cs.qm "${QT_I18NS}\qt_cs.qm" - File /nonfatal /oname=translations\qtbase_cs.qm "${QT_I18NS}\qtbase_cs.qm" - File /nonfatal /oname=translations\qtserialport_cs.qm "${QT_I18NS}\qtserialport_cs.qm" - File /nonfatal /oname=translations\qt_de.qm "${QT_I18NS}\qt_de.qm" - File /nonfatal /oname=translations\qtbase_de.qm "${QT_I18NS}\qtbase_de.qm" - File /nonfatal /oname=translations\qtserialport_de.qm "${QT_I18NS}\qtserialport_de.qm" - File /nonfatal /oname=translations\qt_es.qm "${QT_I18NS}\qt_es.qm" - File /nonfatal /oname=translations\qtbase_es.qm "${QT_I18NS}\qtbase_es.qm" - File /nonfatal /oname=translations\qtserialport_es.qm "${QT_I18NS}\qtserialport_es.qm" - File /nonfatal /oname=translations\qt_fi.qm "${QT_I18NS}\qt_fi.qm" - File /nonfatal /oname=translations\qtbase_fi.qm "${QT_I18NS}\qtbase_fi.qm" - File /nonfatal /oname=translations\qtserialport_fi.qm "${QT_I18NS}\qtserialport_fi.qm" - File /nonfatal /oname=translations\qt_nl.qm "${QT_I18NS}\qt_nl.qm" - File /nonfatal /oname=translations\qtbase_nl.qm "${QT_I18NS}\qtbase_nl.qm" - File /nonfatal /oname=translations\qtserialport_nl.qm "${QT_I18NS}\qtserialport_nl.qm" - File /nonfatal /oname=translations\qt_pl.qm "${QT_I18NS}\qt_pl.qm" - File /nonfatal /oname=translations\qtbase_pl.qm "${QT_I18NS}\qtbase_pl.qm" - File /nonfatal /oname=translations\qtserialport_pl.qm "${QT_I18NS}\qtserialport_pl.qm" - File /nonfatal /oname=translations\qt_ru.qm "${QT_I18NS}\qt_ru.qm" - File /nonfatal /oname=translations\qtbase_ru.qm "${QT_I18NS}\qtbase_ru.qm" - File /nonfatal /oname=translations\qtserialport_ru.qm "${QT_I18NS}\qtserialport_ru.qm" -SectionEnd - -Section "un.Install Qt" - Delete "$INSTDIR\${DST_BINS}\Qt5Core.dll" - Delete "$INSTDIR\${DST_BINS}\Qt5Gui.dll" - Delete "$INSTDIR\${DST_BINS}\Qt5Network.dll" - Delete "$INSTDIR\${DST_BINS}\Qt5PrintSupport.dll" - Delete "$INSTDIR\${DST_BINS}\Qt5SerialPort.dll" - Delete "$INSTDIR\${DST_BINS}\Qt5Widgets.dll" - - ; Qt plugins - Delete "$INSTDIR\${DST_BINS}\bearer\qgenericbearer.dll" - Delete "$INSTDIR\${DST_BINS}\imageformats\qgif.dll" - Delete "$INSTDIR\${DST_BINS}\imageformats\qico.dll" - Delete "$INSTDIR\${DST_BINS}\imageformats\qjpeg.dll" - Delete "$INSTDIR\${DST_BINS}\platforms\qwindows.dll" - Delete "$INSTDIR\${DST_BINS}\printsupport\windowsprintersupport.dll" - Delete "$INSTDIR\${DST_BINS}\styles\qwindowsvistastyle.dll" - - Delete "$INSTDIR\${DST_BINS}\translations\qt_*.qm" - Delete "$INSTDIR\${DST_BINS}\translations\qtbase_*.qm" - Delete "$INSTDIR\${DST_BINS}\translations\qtserialport_*.qm" - - RMDir "$INSTDIR\${DST_BINS}\bearer" - RMDir "$INSTDIR\${DST_BINS}\imageformats" - RMDir "$INSTDIR\${DST_BINS}\platforms" - RMDir "$INSTDIR\${DST_BINS}\printsupport" - RMDir "$INSTDIR\${DST_BINS}\styles" - RMDir "$INSTDIR\${DST_BINS}\translations" - RMDir "$INSTDIR\${DST_BINS}" - RMDir "$INSTDIR" -SectionEnd diff --git a/install/windows/qt.conf b/install/windows/qt.conf deleted file mode 100644 index ff4d382a..00000000 --- a/install/windows/qt.conf +++ /dev/null @@ -1,4 +0,0 @@ -; https://doc.qt.io/qt-5/qt-conf.html - -[Paths] -Translations=translations diff --git a/install/windows/windows.pri b/install/windows/windows.pri deleted file mode 100644 index a9ddd235..00000000 --- a/install/windows/windows.pri +++ /dev/null @@ -1,21 +0,0 @@ - -APP_ARCH = $$QMAKE_HOST.arch - -CXX_RUNTIME = $$system(where $$QMAKE_CXX) -CXX_RUNTIME = $$first(CXX_RUNTIME) -CXX_RUNTIME = $$dirname(CXX_RUNTIME) - -QMAKE_EXTRA_TARGETS += nsis - -mingw:NSIS_EXTRA_FILES = "$${PWD}/nsis/mingw.nsi" - -nsis.commands = makensis \ - -DAPP_ARCH=$$APP_ARCH \ - -DINSTALLER_FILE="$${INSTALLER_DIR}/GCodeWorkShop_$${APP_ARCH}_Setup.exe" \ - -DPROJECT_ROOT="$$PROJECT_ROOT_PATH" \ - -DAPP_BINS="$$APP_BINS" \ - -DCXX_RUNTIME="$$CXX_RUNTIME" \ - -DQT_HOST_BINS="$$[QT_HOST_BINS]" \ - -DQT_HOST_DATA="$$[QT_HOST_DATA]" \ - "$${PWD}/nsis/app.nsi" \ - "$${NSIS_EXTRA_FILES}" From 86ae86f39accf1d75a0324cb9790338e82ea0869 Mon Sep 17 00:00:00 2001 From: u-235 Date: Fri, 27 Sep 2024 22:07:34 +0300 Subject: [PATCH 8/9] Update the documentations --- INSTALL.md | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 40 ++++++++--------------- 2 files changed, 109 insertions(+), 27 deletions(-) create mode 100644 INSTALL.md diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 00000000..8094f0bc --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,96 @@ +Building GCodeWorkShop +====================== + +GCodeWorkShop is written in C++ using the Qt5 framework. In general, +the following steps are needed to build it: + +- Install the C++11 compiler supported by [Qt SDK][1]. You should also + install the make utility. +- Install Qt utilities such as qmake, moc, lrelease and the resource packer. +- Install the Qt5 framework with version 5.6 or higher. +- Obtain and unzip the GCodeWorkShop source code. +- Create a build folder and navigate to it. +- Run qmake specifying the path to GCodeWorkShop sources. +- Run make to build the application. + + +Building in Debian +------------------ + +Install the following packages. + +``` +apt update +apt install build-essential qtbase5-dev qttools5-dev-tools libqt5serialport5-dev +``` + +Switch to the folder with sources. Now you can either build the application +step by step or use the script to automatically build the application and +create an installation package. + + +### Step-by-step build + +```sh +mkdir -p build +cd build +qmake -r .. +make lrelease -j $(nproc) +qmake -r .. +make -j $(nproc) +``` + + +### Automatically build and create an package + +Run script: + +```sh +install/deb-build.sh +``` + +The script creates a .deb package in the current folder and does not require +root privileges. + + +Building in windows with MSYS2 +------------------------------ + +Install the following packages. + +```sh +pacman -Syu +pacman -S make mingw-w64-x86_64-gcc mingw-w64-x86_64-nsis \ + mingw-w64-x86_64-qt5-tools mingw-w64-x86_64-qt5-translations \ + mingw-w64-x86_64-qt5-base mingw-w64-x86_64-qt5-serialport +``` + +Switch to the folder with sources. Now you can either build the application +step by step or use the script to automatically build the application and +create an installer. + + +### Step-by-step build + +```sh +mkdir -p build +cd build +qmake -r .. +make lrelease -j $(nproc) +qmake -r .. +make -j $(nproc) +``` + + +### Automatically build and create an installer + +Run script: + +```sh +install/win-msys2-build.sh +``` + +The script creates a .exe installer in the current folder. + + +[1]: https://doc.qt.io/qt-5/supported-platforms.html "Qt5 doc: supported platforms" diff --git a/README.md b/README.md index 5c203e85..0c899be4 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,11 @@ GCodeWorkShop This is a fork of [EdytorNC](https://github.com/artur3/EdytorNC), a text editor for CNC programmers. +- [Some features](#some-features) +- [Some shotcuts](#some-shotcuts) +- [Getting GCodeWorkShop](#getting-gcodeworkshop) +- [Command line options](#command-line-options) + Some features ------------ @@ -49,35 +54,16 @@ Some shotcuts `SQRT(x)` `SQR(x)` `ABS(x)` `TRUNC(x)` `PI` +Getting GCodeWorkShop +--------------------- + +On the [release page](https://github.com/GCodeProjects/GCodeWorkShop/releases/latest) +you can find binary builds for Debian, Ubuntu and Windows. For building the +application yourself, the [build instructions](INSTALL.md) may be useful. + + Command line options ------------------ - open file -> `gcodeworkshop file.nc` - diff two files -> `gcodeworkshop -diff file1.nc file2.nc` - - -Compile GCodeWorkShop -------------------- - - -### Ubuntu - -run terminal -``` -sudo apt install qt5-default qtbase5-dev-tools qt5-qmake -cd ~ -git clone https://github.com/GCodeProjects/GCodeWorkShop -cd GCodeWorkShop -qmake -r [CONFIG+=debug] [PREFIX=/usr/ | PREFIX=~/.local/bin/] -make -make lrelease -``` - - -### Windows - -- [Install Qt5](http://www.qt.io/download-open-source) -- download latest version of GCodeWorkShop [source files](https://github.com/GCodeProjects/GCodeWorkShop/archive/master.zip) -- unzip downloaded file -- open gcodeworkshop.pro in Qt Creator -- press Ctrl+R From 62e0bd9b7f9b469dd6f926f49fd5949a7783d466 Mon Sep 17 00:00:00 2001 From: u-235 Date: Fri, 27 Sep 2024 22:10:50 +0300 Subject: [PATCH 9/9] Bump version --- Doxyfile | 2 +- gcodeshared/include/version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doxyfile b/Doxyfile index 01d7011f..8af024df 100644 --- a/Doxyfile +++ b/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = GCodeWorkShop # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2024.05 +PROJECT_NUMBER = 2024.09 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/gcodeshared/include/version.h b/gcodeshared/include/version.h index 03a38a83..eb19bdff 100644 --- a/gcodeshared/include/version.h +++ b/gcodeshared/include/version.h @@ -21,7 +21,7 @@ #define VERSION_H #ifndef GCODEWORKSHOP_VERSION - #define GCODEWORKSHOP_VERSION "2024.05" + #define GCODEWORKSHOP_VERSION "2024.09" #endif #endif // VERSION_H