ci\cd
This commit is contained in:
1 parent
29b53ce75a
commit
8a3d0596ef
9 files changed
+658
-5
No files matched your search
@@ -0,0 +1,278 @@
|
|||||||
|
# Сборка BiLauncher под Windows, Linux и macOS и публикация в Gitea Releases.
|
||||||
|
#
|
||||||
|
# push тега vX.Y.Z (или vX.Y.Z-rc1 → pre-release):
|
||||||
|
# create-release создаёт черновик релиза → три сборки прикладывают к нему файлы →
|
||||||
|
# publish добавляет SHA256SUMS.txt и снимает флаг черновика. Если какая-то сборка
|
||||||
|
# упала, релиз остаётся черновиком и пользователям не виден.
|
||||||
|
# Ручной запуск (workflow_dispatch): те же сборки, но результат — артефакты прогона,
|
||||||
|
# релиз не создаётся.
|
||||||
|
#
|
||||||
|
# Пути к Qt на раннерах задаются в их config.yaml (runner.envs): QT_ROOT — kit Qt,
|
||||||
|
# QT_TOOLS — папка Tools из Qt Online Installer (там CMake и Ninja).
|
||||||
|
# Секрет RELEASE_TOKEN — PAT с правом repository: write.
|
||||||
|
|
||||||
|
name: release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags: ["v*"]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-release:
|
||||||
|
runs-on: linux
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.meta.outputs.version }}
|
||||||
|
tag: ${{ steps.meta.outputs.tag }}
|
||||||
|
release_id: ${{ steps.release.outputs.id }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- id: meta
|
||||||
|
name: Версия из CMakeLists.txt и сверка с тегом
|
||||||
|
run: |
|
||||||
|
version=$(sed -nE 's/^project\(BiLauncher VERSION ([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' CMakeLists.txt)
|
||||||
|
[ -n "$version" ] || { echo "Не нашёл project(BiLauncher VERSION ...)"; exit 1; }
|
||||||
|
tag=""
|
||||||
|
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
|
||||||
|
tag="${GITHUB_REF_NAME}"
|
||||||
|
base="${tag#v}"; base="${base%%-*}"
|
||||||
|
if [ "$base" != "$version" ]; then
|
||||||
|
echo "Тег $tag не совпадает с версией $version в CMakeLists.txt"; exit 1
|
||||||
|
fi
|
||||||
|
version="${tag#v}"
|
||||||
|
fi
|
||||||
|
echo "version=$version" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tag=$tag" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Версия: $version, тег: ${tag:-нет}"
|
||||||
|
|
||||||
|
- id: release
|
||||||
|
name: Черновик релиза
|
||||||
|
if: steps.meta.outputs.tag != ''
|
||||||
|
env:
|
||||||
|
TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
TAG: ${{ steps.meta.outputs.tag }}
|
||||||
|
run: |
|
||||||
|
# Описание релиза — раздел CHANGELOG.md для этой версии
|
||||||
|
base="${TAG#v}"; base="${base%%-*}"
|
||||||
|
notes=$(awk -v v="$base" '
|
||||||
|
/^## \[/ { if (on) exit; if (index($0, "[" v "]")) { on=1; next } }
|
||||||
|
on' CHANGELOG.md)
|
||||||
|
prerelease=false; case "$TAG" in *-*) prerelease=true;; esac
|
||||||
|
body=$(python3 -c 'import json,sys; print(json.dumps({"tag_name":sys.argv[1],"name":"BiLauncher "+sys.argv[1],"body":sys.argv[2],"draft":True,"prerelease":sys.argv[3]=="true"}))' \
|
||||||
|
"$TAG" "$notes" "$prerelease")
|
||||||
|
id=$(curl -fsS -X POST "$API/releases" \
|
||||||
|
-H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
|
||||||
|
-d "$body" | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
|
||||||
|
echo "id=$id" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Создан черновик релиза $TAG (id $id)"
|
||||||
|
|
||||||
|
build-linux:
|
||||||
|
needs: create-release
|
||||||
|
runs-on: linux
|
||||||
|
env:
|
||||||
|
VERSION: ${{ needs.create-release.outputs.version }}
|
||||||
|
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
|
||||||
|
outputs:
|
||||||
|
sums: ${{ steps.pack.outputs.sums }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Сборка
|
||||||
|
run: |
|
||||||
|
export PATH="$QT_TOOLS/CMake/bin:$QT_TOOLS/Ninja:$PATH"
|
||||||
|
rm -rf build AppDir dist
|
||||||
|
# LIBDIR=lib: zlibreference.cpp ищет libz рядом, в ../lib/BiLauncher,
|
||||||
|
# а на Ubuntu по умолчанию был бы lib/x86_64-linux-gnu.
|
||||||
|
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_PREFIX_PATH="$QT_ROOT" \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=lib
|
||||||
|
# На ВМ 6 ГБ памяти: без ограничения 42 параллельных компилятора уходят в OOM.
|
||||||
|
cmake --build build -j 8
|
||||||
|
cmake --install build --prefix "$PWD/AppDir/usr"
|
||||||
|
|
||||||
|
- id: pack
|
||||||
|
name: AppImage и tar.gz
|
||||||
|
run: |
|
||||||
|
mkdir -p dist
|
||||||
|
cp AppDir/usr/share/applications/bilauncher.desktop AppDir/
|
||||||
|
cp AppDir/usr/share/icons/hicolor/256x256/apps/bilauncher.png AppDir/
|
||||||
|
ln -sf usr/bin/BiLauncher AppDir/AppRun
|
||||||
|
ARCH=x86_64 appimagetool --no-appstream AppDir "dist/BiLauncher-$VERSION-x86_64.AppImage"
|
||||||
|
cp -a AppDir/usr "BiLauncher-$VERSION"
|
||||||
|
tar -czf "dist/BiLauncher-$VERSION-linux-x86_64.tar.gz" "BiLauncher-$VERSION"
|
||||||
|
rm -rf "BiLauncher-$VERSION"
|
||||||
|
ls -lh dist
|
||||||
|
echo "sums=$(cd dist && sha256sum * | base64 -w0)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Загрузка в релиз
|
||||||
|
if: env.RELEASE_ID != ''
|
||||||
|
env:
|
||||||
|
TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
run: |
|
||||||
|
for f in dist/*; do
|
||||||
|
curl -fsS -X POST -H "Authorization: token $TOKEN" \
|
||||||
|
-F "attachment=@$f" "$API/releases/$RELEASE_ID/assets?name=$(basename "$f")" > /dev/null
|
||||||
|
echo "Загружен $(basename "$f")"
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Артефакты прогона
|
||||||
|
if: env.RELEASE_ID == ''
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: linux
|
||||||
|
path: dist/
|
||||||
|
|
||||||
|
build-windows:
|
||||||
|
needs: create-release
|
||||||
|
runs-on: windows
|
||||||
|
env:
|
||||||
|
VERSION: ${{ needs.create-release.outputs.version }}
|
||||||
|
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
|
||||||
|
outputs:
|
||||||
|
sums: ${{ steps.build.outputs.sums }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- id: build
|
||||||
|
name: Сборка, установщик и portable-архив
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
# Короткие пути: дерево WebEngine легко вылезает за MAX_PATH.
|
||||||
|
$build = "C:\r\bl-build"; $stage = "C:\r\bl-stage"; $dist = "$PWD\dist"
|
||||||
|
Remove-Item -Recurse -Force $build, $stage, $dist -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$vs = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * `
|
||||||
|
-requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
|
||||||
|
Import-Module "$vs\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
|
||||||
|
Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments "-arch=x64 -host_arch=x64"
|
||||||
|
$env:PATH = "$env:QT_TOOLS\CMake_64\bin;$env:QT_TOOLS\Ninja;$env:PATH"
|
||||||
|
|
||||||
|
cmake -S . -B $build -G Ninja -DCMAKE_BUILD_TYPE=Release "-DCMAKE_PREFIX_PATH=$env:QT_ROOT"
|
||||||
|
if ($LASTEXITCODE) { throw "cmake configure" }
|
||||||
|
cmake --build $build
|
||||||
|
if ($LASTEXITCODE) { throw "cmake build" }
|
||||||
|
cmake --install $build --prefix $stage
|
||||||
|
if ($LASTEXITCODE) { throw "cmake install" }
|
||||||
|
|
||||||
|
New-Item -ItemType Directory -Force $dist | Out-Null
|
||||||
|
& "$env:ISCC_DIR\ISCC.exe" /Q "/DAppVersion=$env:VERSION" "/DSourceDir=$stage" "/DOutputDir=$dist" packaging\windows\BiLauncher.iss
|
||||||
|
if ($LASTEXITCODE) { throw "iscc" }
|
||||||
|
|
||||||
|
# Portable: то же дерево, что ставит установщик, без vc_redist
|
||||||
|
# (в portable-варианте среда выполнения MSVC должна уже стоять в системе).
|
||||||
|
Remove-Item "$stage\bin\vc_redist.x64.exe" -ErrorAction SilentlyContinue
|
||||||
|
$portable = "C:\r\BiLauncher-$env:VERSION"
|
||||||
|
Remove-Item -Recurse -Force $portable -ErrorAction SilentlyContinue
|
||||||
|
Move-Item $stage $portable
|
||||||
|
tar.exe -a -c -f "$dist\BiLauncher-$env:VERSION-win64-portable.zip" -C C:\r "BiLauncher-$env:VERSION"
|
||||||
|
if ($LASTEXITCODE) { throw "zip" }
|
||||||
|
Remove-Item -Recurse -Force $portable
|
||||||
|
|
||||||
|
Get-ChildItem $dist | Format-Table Name, Length
|
||||||
|
$sums = Get-ChildItem $dist | ForEach-Object {
|
||||||
|
"{0} {1}" -f (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower(), $_.Name }
|
||||||
|
$b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(($sums -join "`n") + "`n"))
|
||||||
|
# Не Out-File: PowerShell 5.1 пишет UTF-8 с BOM, и имя первой переменной ломается.
|
||||||
|
[IO.File]::AppendAllText($env:GITHUB_OUTPUT, "sums=$b64`n")
|
||||||
|
|
||||||
|
- name: Загрузка в релиз
|
||||||
|
if: env.RELEASE_ID != ''
|
||||||
|
shell: powershell
|
||||||
|
env:
|
||||||
|
TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
run: |
|
||||||
|
foreach ($f in Get-ChildItem dist) {
|
||||||
|
curl.exe -fsS -X POST -H "Authorization: token $env:TOKEN" `
|
||||||
|
-F "attachment=@$($f.FullName)" "$env:API/releases/$env:RELEASE_ID/assets?name=$($f.Name)" | Out-Null
|
||||||
|
if ($LASTEXITCODE) { throw "Не удалось загрузить $($f.Name)" }
|
||||||
|
"Загружен $($f.Name)"
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Артефакты прогона
|
||||||
|
if: env.RELEASE_ID == ''
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: windows
|
||||||
|
path: dist/
|
||||||
|
|
||||||
|
build-macos:
|
||||||
|
needs: create-release
|
||||||
|
runs-on: macos
|
||||||
|
env:
|
||||||
|
VERSION: ${{ needs.create-release.outputs.version }}
|
||||||
|
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
|
||||||
|
outputs:
|
||||||
|
sums: ${{ steps.pack.outputs.sums }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Сборка (universal, arm64 + x86_64)
|
||||||
|
run: |
|
||||||
|
export PATH="$QT_TOOLS/CMake/CMake.app/Contents/bin:$QT_TOOLS/Ninja:$PATH"
|
||||||
|
rm -rf build stage dist dmgroot
|
||||||
|
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_PREFIX_PATH="$QT_ROOT" \
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
|
||||||
|
cmake --build build
|
||||||
|
cmake --install build --prefix "$PWD/stage"
|
||||||
|
|
||||||
|
- id: pack
|
||||||
|
name: Ad-hoc подпись и DMG
|
||||||
|
run: |
|
||||||
|
# Без Developer ID: ad-hoc подпись нужна, чтобы приложение вообще
|
||||||
|
# запускалось на Apple Silicon; Gatekeeper всё равно спросит подтверждение.
|
||||||
|
codesign --force --deep --sign - stage/BiLauncher.app
|
||||||
|
codesign --verify --deep --strict stage/BiLauncher.app
|
||||||
|
mkdir -p dmgroot dist
|
||||||
|
cp -R stage/BiLauncher.app dmgroot/
|
||||||
|
ln -s /Applications dmgroot/Applications
|
||||||
|
hdiutil create -volname "BiLauncher" -srcfolder dmgroot -ov -format UDZO \
|
||||||
|
"dist/BiLauncher-$VERSION-macOS-universal.dmg"
|
||||||
|
rm -rf dmgroot
|
||||||
|
ls -lh dist
|
||||||
|
echo "sums=$(cd dist && shasum -a 256 * | base64 | tr -d '\n')" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Загрузка в релиз
|
||||||
|
if: env.RELEASE_ID != ''
|
||||||
|
env:
|
||||||
|
TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
run: |
|
||||||
|
for f in dist/*; do
|
||||||
|
curl -fsS -X POST -H "Authorization: token $TOKEN" \
|
||||||
|
-F "attachment=@$f" "$API/releases/$RELEASE_ID/assets?name=$(basename "$f")" > /dev/null
|
||||||
|
echo "Загружен $(basename "$f")"
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Артефакты прогона
|
||||||
|
if: env.RELEASE_ID == ''
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: macos
|
||||||
|
path: dist/
|
||||||
|
|
||||||
|
publish:
|
||||||
|
needs: [create-release, build-linux, build-windows, build-macos]
|
||||||
|
if: needs.create-release.outputs.release_id != ''
|
||||||
|
runs-on: linux
|
||||||
|
env:
|
||||||
|
RELEASE_ID: ${{ needs.create-release.outputs.release_id }}
|
||||||
|
TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
steps:
|
||||||
|
- name: SHA256SUMS.txt и публикация
|
||||||
|
run: |
|
||||||
|
{
|
||||||
|
echo "${{ needs.build-windows.outputs.sums }}" | base64 -d
|
||||||
|
echo "${{ needs.build-linux.outputs.sums }}" | base64 -d
|
||||||
|
echo "${{ needs.build-macos.outputs.sums }}" | base64 -d
|
||||||
|
} | tr -d '\r' | sed '/^$/d' > SHA256SUMS.txt
|
||||||
|
cat SHA256SUMS.txt
|
||||||
|
curl -fsS -X POST -H "Authorization: token $TOKEN" \
|
||||||
|
-F "attachment=@SHA256SUMS.txt" "$API/releases/$RELEASE_ID/assets?name=SHA256SUMS.txt" > /dev/null
|
||||||
|
curl -fsS -X PATCH -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
|
||||||
|
-d '{"draft": false}' "$API/releases/$RELEASE_ID" > /dev/null
|
||||||
|
echo "Релиз опубликован"
|
||||||
+5
-4
@@ -70,8 +70,12 @@ qt_add_resources(BiLauncher "appicon"
|
|||||||
icons/icon_512x512@2x.png
|
icons/icon_512x512@2x.png
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# OUTPUT_DIRECTORY: по умолчанию модуль с URI BiLauncher кладёт qmldir в
|
||||||
|
# ${CMAKE_BINARY_DIR}/BiLauncher — на Linux это имя занято самим исполняемым
|
||||||
|
# файлом (у него нет расширения), и линковка падает с «Is a directory».
|
||||||
qt_add_qml_module(BiLauncher
|
qt_add_qml_module(BiLauncher
|
||||||
URI BiLauncher
|
URI BiLauncher
|
||||||
|
OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/qml/BiLauncher"
|
||||||
SOURCES
|
SOURCES
|
||||||
localization.h
|
localization.h
|
||||||
localization.cpp
|
localization.cpp
|
||||||
@@ -127,12 +131,9 @@ qt_add_qml_module(BiLauncher
|
|||||||
${LAUNCHER_MSA_QML_FILES}
|
${LAUNCHER_MSA_QML_FILES}
|
||||||
RESOURCES images/Folder/Folder_Active.svg images/Folder/Folder_Idle.svg images/Folder/Folder_Pressed.svg images/Options/Options_active.svg images/Options/Options_Idle.svg images/Options/Options_Pressed.svg images/Play_Button/Play_Active.svg images/Play_Button/Play_Idle.svg images/Play_Button/Play_pressed.svg images/Profile_Box/Asset_23.jpg images/Profile_Box/Asset_23.svg images/Profile_Box/Asset_24.jpg images/Profile_Box/Asset_24.svg images/Profile_Box/Kishka_Profile_Active.svg images/Profile_Box/Kishka_Profile_Idle.svg images/Profile_Box/Kishka_Profile_open.svg images/Scroll/Scroll_Lever.svg images/Scroll/Scroll_palka.svg images/Version_box/Kishka_Profile_Open.svg images/Version_box/Kishka_Ver_Active.svg images/Version_box/Kishka_Ver_idle.svg images/Trash.svg images/Pencil.svg images/GovuztTW8AAHqBf.jpeg images/photo_2025-12-16_15-04-17.jpg images/photo_2025-12-21_02-30-09.jpg i18n/translations.json
|
RESOURCES images/Folder/Folder_Active.svg images/Folder/Folder_Idle.svg images/Folder/Folder_Pressed.svg images/Options/Options_active.svg images/Options/Options_Idle.svg images/Options/Options_Pressed.svg images/Play_Button/Play_Active.svg images/Play_Button/Play_Idle.svg images/Play_Button/Play_pressed.svg images/Profile_Box/Asset_23.jpg images/Profile_Box/Asset_23.svg images/Profile_Box/Asset_24.jpg images/Profile_Box/Asset_24.svg images/Profile_Box/Kishka_Profile_Active.svg images/Profile_Box/Kishka_Profile_Idle.svg images/Profile_Box/Kishka_Profile_open.svg images/Scroll/Scroll_Lever.svg images/Scroll/Scroll_palka.svg images/Version_box/Kishka_Profile_Open.svg images/Version_box/Kishka_Ver_Active.svg images/Version_box/Kishka_Ver_idle.svg images/Trash.svg images/Pencil.svg images/GovuztTW8AAHqBf.jpeg images/photo_2025-12-16_15-04-17.jpg images/photo_2025-12-21_02-30-09.jpg i18n/translations.json
|
||||||
RESOURCES images/launcherBackground.png
|
RESOURCES images/launcherBackground.png
|
||||||
RESOURCES images/launcherBackground2.mp4 images/launcherBackground2static.jpg
|
RESOURCES images/launcherBackground2static.jpg
|
||||||
RESOURCES CHANGELOG.md
|
RESOURCES CHANGELOG.md
|
||||||
RESOURCES LICENSE
|
RESOURCES LICENSE
|
||||||
RESOURCES icons/icon.rc
|
|
||||||
RESOURCES icons/icon.rc.in
|
|
||||||
RESOURCES icons/icon.rc
|
|
||||||
RESOURCES README.md
|
RESOURCES README.md
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Executable
+105
@@ -0,0 +1,105 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Подготовка Linux-раннера Gitea Actions для сборки BiLauncher (Ubuntu 22.04).
|
||||||
|
#
|
||||||
|
# Qt (~/Qt/6.11.1/gcc_64 с WebEngine), CMake и Ninja (~/Qt/Tools) ставятся заранее
|
||||||
|
# через Qt Online Installer — скрипт их не трогает, а докачивает только то, чего Qt
|
||||||
|
# не даёт: компилятор, системные библиотеки для сборки и деплоя, Node.js (для
|
||||||
|
# actions/checkout), appimagetool и сам gitea-runner. Повторный запуск безопасен.
|
||||||
|
#
|
||||||
|
# Запуск от пользователя, которому принадлежит Qt (нужен sudo без пароля):
|
||||||
|
# ./setup-runner-linux.sh [токен регистрации]
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
TOKEN="${1:-}"
|
||||||
|
INSTANCE="${INSTANCE:-https://projects-live.galeonworx.com}"
|
||||||
|
RUNNER_NAME="${RUNNER_NAME:-linux-vm}"
|
||||||
|
RUNNER_VERSION="${RUNNER_VERSION:-4.1.0}"
|
||||||
|
QT_ROOT="${QT_ROOT:-$HOME/Qt/6.11.1/gcc_64}"
|
||||||
|
QT_TOOLS="${QT_TOOLS:-$HOME/Qt/Tools}"
|
||||||
|
RDIR="$HOME/act_runner"
|
||||||
|
|
||||||
|
[ -d "$QT_ROOT/lib/cmake/Qt6WebEngineQuick" ] || { echo "Нет Qt с WebEngine в $QT_ROOT" >&2; exit 1; }
|
||||||
|
|
||||||
|
# --- Компилятор и библиотеки ---------------------------------------------------
|
||||||
|
# libgl1-mesa-dev — заголовки OpenGL для Qt6::Gui; xcb-* и прочие — то, что
|
||||||
|
# Linux-деплой Qt и плагин xcb ищут при упаковке и запуске; libfuse2 — для
|
||||||
|
# запуска самого appimagetool (он тоже AppImage).
|
||||||
|
sudo apt-get update -q
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -q \
|
||||||
|
build-essential patchelf file curl git xz-utils \
|
||||||
|
libgl1-mesa-dev libfuse2 libfontconfig1 libdbus-1-3 \
|
||||||
|
libxkbcommon-x11-0 libxcb-cursor0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \
|
||||||
|
libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 libxcb-xkb1 \
|
||||||
|
libnss3 libxcomposite1 libxdamage1 libxrandr2 libxtst6 libxkbfile1 libxshmfence1 libasound2
|
||||||
|
|
||||||
|
# --- Node.js LTS ---------------------------------------------------------------
|
||||||
|
if ! command -v node >/dev/null; then
|
||||||
|
NODE_VER=$(curl -fsSL https://nodejs.org/dist/index.json \
|
||||||
|
| python3 -c 'import json,sys; print(next(r["version"] for r in json.load(sys.stdin) if r["lts"]))')
|
||||||
|
curl -fsSL "https://nodejs.org/dist/$NODE_VER/node-$NODE_VER-linux-x64.tar.xz" -o /tmp/node.tar.xz
|
||||||
|
sudo rm -rf /opt/node && sudo mkdir -p /opt/node
|
||||||
|
sudo tar -xJf /tmp/node.tar.xz -C /opt/node --strip-components=1
|
||||||
|
sudo ln -sf /opt/node/bin/node /opt/node/bin/npm /opt/node/bin/npx /usr/local/bin/
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- appimagetool ----------------------------------------------------------------
|
||||||
|
if ! command -v appimagetool >/dev/null; then
|
||||||
|
sudo curl -fsSL -o /usr/local/bin/appimagetool \
|
||||||
|
https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
|
||||||
|
sudo chmod +x /usr/local/bin/appimagetool
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- gitea-runner ------------------------------------------------------------------
|
||||||
|
mkdir -p "$RDIR/work"
|
||||||
|
if [ ! -x "$RDIR/gitea-runner" ]; then
|
||||||
|
curl -fsSL -o "$RDIR/gitea-runner" \
|
||||||
|
"https://gitea.com/gitea/runner/releases/download/v$RUNNER_VERSION/gitea-runner-$RUNNER_VERSION-linux-amd64"
|
||||||
|
chmod +x "$RDIR/gitea-runner"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > "$RDIR/config.yaml" <<EOF
|
||||||
|
log:
|
||||||
|
level: info
|
||||||
|
runner:
|
||||||
|
file: $RDIR/.runner
|
||||||
|
capacity: 1
|
||||||
|
timeout: 3h
|
||||||
|
fetch_timeout: 5s
|
||||||
|
fetch_interval: 2s
|
||||||
|
envs:
|
||||||
|
QT_ROOT: $QT_ROOT
|
||||||
|
QT_TOOLS: $QT_TOOLS
|
||||||
|
labels:
|
||||||
|
- "linux:host"
|
||||||
|
cache:
|
||||||
|
enabled: false
|
||||||
|
host:
|
||||||
|
workdir_parent: $RDIR/work
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if [ -n "$TOKEN" ] && [ ! -f "$RDIR/.runner" ]; then
|
||||||
|
(cd "$RDIR" && ./gitea-runner register --no-interactive --instance "$INSTANCE" \
|
||||||
|
--token "$TOKEN" --name "$RUNNER_NAME" --labels "linux:host" --config config.yaml)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- systemd: раннер работает от владельца Qt, а не от root ------------------------
|
||||||
|
sudo tee /etc/systemd/system/gitea-runner.service >/dev/null <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Gitea Actions runner (BiLauncher)
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=$USER
|
||||||
|
WorkingDirectory=$RDIR
|
||||||
|
Environment=PATH=/usr/local/bin:/usr/bin:/bin
|
||||||
|
ExecStart=$RDIR/gitea-runner daemon --config $RDIR/config.yaml
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable --now gitea-runner
|
||||||
|
echo "Готово: $(systemctl is-active gitea-runner)"
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
# Подготовка Windows-раннера Gitea Actions для сборки BiLauncher.
|
||||||
|
#
|
||||||
|
# Qt (C:\Qt\6.11.1\msvc2022_64 с WebEngine), CMake и Ninja (C:\Qt\Tools) ставятся
|
||||||
|
# заранее через Qt Online Installer — скрипт их не трогает, а докачивает только то,
|
||||||
|
# чего Qt не даёт: компилятор MSVC, git, Node.js (для actions/checkout), Inno Setup
|
||||||
|
# и сам gitea-runner. Повторный запуск безопасен: уже установленное пропускается.
|
||||||
|
#
|
||||||
|
# Запуск (PowerShell от администратора):
|
||||||
|
# powershell -ExecutionPolicy Bypass -File setup-runner-windows.ps1 [-Token <токен регистрации>]
|
||||||
|
|
||||||
|
param(
|
||||||
|
[string]$Token = "",
|
||||||
|
[string]$Instance = "https://projects-live.galeonworx.com",
|
||||||
|
[string]$RunnerName = "win-vm",
|
||||||
|
[string]$RunnerVersion = "4.1.0",
|
||||||
|
[string]$QtRoot = "C:\Qt\6.11.1\msvc2022_64",
|
||||||
|
[string]$QtTools = "C:\Qt\Tools"
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$ProgressPreference = "SilentlyContinue" # иначе Invoke-WebRequest падает без консоли (по SSH)
|
||||||
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
|
|
||||||
|
$dl = "C:\ci-downloads"
|
||||||
|
New-Item -ItemType Directory -Force -Path $dl | Out-Null
|
||||||
|
|
||||||
|
function Fetch($url, $name) {
|
||||||
|
$out = Join-Path $dl $name
|
||||||
|
if (-not (Test-Path $out)) {
|
||||||
|
Write-Host "Скачиваю $url"
|
||||||
|
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $out
|
||||||
|
}
|
||||||
|
return $out
|
||||||
|
}
|
||||||
|
|
||||||
|
function Run($exe, $argList) {
|
||||||
|
$p = Start-Process -FilePath $exe -ArgumentList $argList -Wait -PassThru -NoNewWindow
|
||||||
|
# 3010 — «успешно, нужна перезагрузка» у установщиков MSI и VS
|
||||||
|
if ($p.ExitCode -ne 0 -and $p.ExitCode -ne 3010) { throw "$exe завершился с кодом $($p.ExitCode)" }
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Visual Studio 2022 Build Tools (MSVC x64 + Windows SDK) -----------------
|
||||||
|
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||||
|
$haveMsvc = (Test-Path $vswhere) -and
|
||||||
|
(& $vswhere -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath)
|
||||||
|
if (-not $haveMsvc) {
|
||||||
|
$vs = Fetch "https://aka.ms/vs/17/release/vs_BuildTools.exe" "vs_BuildTools.exe"
|
||||||
|
Write-Host "Ставлю VS 2022 Build Tools (20–40 минут)…"
|
||||||
|
Run $vs @("--quiet", "--wait", "--norestart", "--nocache",
|
||||||
|
"--add", "Microsoft.VisualStudio.Workload.VCTools", "--includeRecommended")
|
||||||
|
} else { Write-Host "MSVC уже установлен" }
|
||||||
|
|
||||||
|
# --- Git for Windows -----------------------------------------------------------
|
||||||
|
if (-not (Test-Path "C:\Program Files\Git\cmd\git.exe")) {
|
||||||
|
$rel = Invoke-RestMethod "https://api.github.com/repos/git-for-windows/git/releases/latest"
|
||||||
|
$asset = $rel.assets | Where-Object { $_.name -match '^Git-.*-64-bit\.exe$' } | Select-Object -First 1
|
||||||
|
$git = Fetch $asset.browser_download_url $asset.name
|
||||||
|
Run $git @("/VERYSILENT", "/NORESTART", "/NOCANCEL", "/SP-", "/COMPONENTS=gitlfs")
|
||||||
|
} else { Write-Host "Git уже установлен" }
|
||||||
|
|
||||||
|
# --- Node.js LTS (нужен JS-экшенам вроде actions/checkout) ---------------------
|
||||||
|
if (-not (Test-Path "C:\Program Files\nodejs\node.exe")) {
|
||||||
|
# Скобки вокруг Invoke-RestMethod обязательны: PowerShell 5.1 иначе отдаёт
|
||||||
|
# JSON-массив в конвейер одним объектом, и фильтр видит все версии сразу.
|
||||||
|
$lts = ((Invoke-RestMethod "https://nodejs.org/dist/index.json") | Where-Object { $_.lts } | Select-Object -First 1).version
|
||||||
|
$msi = Fetch "https://nodejs.org/dist/$lts/node-$lts-x64.msi" "node-$lts-x64.msi"
|
||||||
|
Run "msiexec.exe" @("/i", "`"$msi`"", "/qn", "/norestart")
|
||||||
|
} else { Write-Host "Node.js уже установлен" }
|
||||||
|
|
||||||
|
# --- Inno Setup ----------------------------------------------------------------
|
||||||
|
$iscc = Get-ChildItem "C:\Program Files*\Inno Setup*\ISCC.exe" -ErrorAction SilentlyContinue | Select-Object -First 1
|
||||||
|
if (-not $iscc) {
|
||||||
|
# jrsoftware.org/download.php без браузера отдаёт HTML — берём файл из релизов на GitHub
|
||||||
|
$rel = Invoke-RestMethod "https://api.github.com/repos/jrsoftware/issrc/releases/latest"
|
||||||
|
$asset = $rel.assets | Where-Object { $_.name -match '^innosetup-[\d.]+(-x64)?\.exe$' } |
|
||||||
|
Sort-Object { $_.name -notmatch '-x64' } | Select-Object -First 1
|
||||||
|
$is = Fetch $asset.browser_download_url $asset.name
|
||||||
|
Run $is @("/VERYSILENT", "/SUPPRESSMSGBOXES", "/NORESTART", "/ALLUSERS")
|
||||||
|
$iscc = Get-ChildItem "C:\Program Files*\Inno Setup*\ISCC.exe" | Select-Object -First 1
|
||||||
|
} else { Write-Host "Inno Setup уже установлен" }
|
||||||
|
|
||||||
|
# --- Длинные пути: дерево WebEngine легко вылезает за 260 символов --------------
|
||||||
|
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1
|
||||||
|
& "C:\Program Files\Git\cmd\git.exe" config --system core.longpaths true
|
||||||
|
|
||||||
|
# --- gitea-runner ----------------------------------------------------------------
|
||||||
|
$rdir = "C:\act_runner"
|
||||||
|
New-Item -ItemType Directory -Force -Path $rdir, "C:\r" | Out-Null
|
||||||
|
$exe = Join-Path $rdir "gitea-runner.exe"
|
||||||
|
if (-not (Test-Path $exe)) {
|
||||||
|
$src = Fetch "https://gitea.com/gitea/runner/releases/download/v$RunnerVersion/gitea-runner-$RunnerVersion-windows-amd64.exe" "gitea-runner-$RunnerVersion.exe"
|
||||||
|
Copy-Item $src $exe
|
||||||
|
}
|
||||||
|
|
||||||
|
# Конфиг: host-режим, рабочая папка с коротким путём, пути к Qt через env.
|
||||||
|
$isccDir = Split-Path $iscc.FullName
|
||||||
|
$cfg = @"
|
||||||
|
log:
|
||||||
|
level: info
|
||||||
|
runner:
|
||||||
|
file: $($rdir -replace '\\','/')/.runner
|
||||||
|
capacity: 1
|
||||||
|
timeout: 3h
|
||||||
|
fetch_timeout: 5s
|
||||||
|
fetch_interval: 2s
|
||||||
|
envs:
|
||||||
|
QT_ROOT: '$QtRoot'
|
||||||
|
QT_TOOLS: '$QtTools'
|
||||||
|
ISCC_DIR: '$isccDir'
|
||||||
|
labels:
|
||||||
|
- "windows:host"
|
||||||
|
cache:
|
||||||
|
enabled: false
|
||||||
|
host:
|
||||||
|
workdir_parent: C:/r
|
||||||
|
"@
|
||||||
|
Set-Content -Path (Join-Path $rdir "config.yaml") -Value $cfg -Encoding UTF8
|
||||||
|
|
||||||
|
if ($Token -and -not (Test-Path (Join-Path $rdir ".runner"))) {
|
||||||
|
Push-Location $rdir
|
||||||
|
& $exe register --no-interactive --instance $Instance --token $Token `
|
||||||
|
--name $RunnerName --labels "windows:host" --config config.yaml
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw "Регистрация раннера не удалась" }
|
||||||
|
Pop-Location
|
||||||
|
}
|
||||||
|
|
||||||
|
# Обёртка запуска: PATH дополняется git и node — задача планировщика может
|
||||||
|
# стартовать раньше, чем сессия получит обновлённый системный PATH.
|
||||||
|
$cmd = @"
|
||||||
|
@echo off
|
||||||
|
set PATH=C:\Program Files\Git\cmd;C:\Program Files\Git\usr\bin;C:\Program Files\nodejs;%PATH%
|
||||||
|
cd /d $rdir
|
||||||
|
gitea-runner.exe daemon --config config.yaml >> runner.log 2>&1
|
||||||
|
"@
|
||||||
|
Set-Content -Path (Join-Path $rdir "run-runner.cmd") -Value $cmd -Encoding ASCII
|
||||||
|
|
||||||
|
# Автозапуск при входе galeon: так задаче не нужен пароль учётной записи.
|
||||||
|
# Чтобы раннер поднимался и без входа, пересоздайте задачу с /sc onstart /rp *.
|
||||||
|
schtasks /create /f /tn "Gitea Runner" /sc onlogon /ru $env:USERNAME /it /rl highest `
|
||||||
|
/tr "powershell.exe -WindowStyle Hidden -NoProfile -Command $rdir\run-runner.cmd" | Out-Null
|
||||||
|
if (-not (Get-Process gitea-runner -ErrorAction SilentlyContinue)) { schtasks /run /tn "Gitea Runner" | Out-Null }
|
||||||
|
|
||||||
|
Write-Host "Готово. MSVC, git, node, Inno Setup и gitea-runner на месте."
|
||||||
Vendored
BIN
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
IDI_ICON1 ICON "icon.ico"
|
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
BiLauncher — сторонние компоненты и их лицензии
|
||||||
|
================================================
|
||||||
|
|
||||||
|
Сам BiLauncher распространяется по Apache License 2.0 (см. файл LICENSE).
|
||||||
|
В дистрибутив входят следующие сторонние компоненты.
|
||||||
|
|
||||||
|
|
||||||
|
1. Qt 6.11 (The Qt Company Ltd.)
|
||||||
|
--------------------------------
|
||||||
|
Модули: Qt Core, Gui, Network, Qml, Quick, Quick Controls 2, Svg, WebEngine,
|
||||||
|
WebChannel, Positioning и их плагины.
|
||||||
|
|
||||||
|
Используются по лицензии GNU Lesser General Public License v3 (LGPLv3).
|
||||||
|
Библиотеки Qt подключены динамически и лежат в дистрибутиве отдельными файлами:
|
||||||
|
пользователь вправе заменить их своей сборкой Qt той же версии.
|
||||||
|
|
||||||
|
Текст LGPLv3: https://www.gnu.org/licenses/lgpl-3.0.html
|
||||||
|
Исходный код Qt: https://download.qt.io/official_releases/qt/6.11/
|
||||||
|
https://code.qt.io/cgit/qt/
|
||||||
|
Сведения о лицензиях: https://doc.qt.io/qt-6/licensing.html
|
||||||
|
|
||||||
|
|
||||||
|
2. Qt WebEngine / Chromium
|
||||||
|
--------------------------
|
||||||
|
Qt WebEngine основан на проекте Chromium и включает множество сторонних
|
||||||
|
библиотек под лицензиями BSD, MIT, LGPL, MPL и другими. Полный перечень:
|
||||||
|
|
||||||
|
https://doc.qt.io/qt-6/qtwebengine-licensing.html
|
||||||
|
|
||||||
|
Исходный код Qt WebEngine: https://code.qt.io/cgit/qt/qtwebengine.git/
|
||||||
|
|
||||||
|
|
||||||
|
3. zlib 1.3.1 (только сборка для Linux)
|
||||||
|
---------------------------------------
|
||||||
|
Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
Jean-loup Gailly Mark Adler
|
||||||
|
jloup@gzip.org madler@alumni.caltech.edu
|
||||||
|
|
||||||
|
|
||||||
|
4. Inno Setup (только установщик для Windows)
|
||||||
|
---------------------------------------------
|
||||||
|
Установщик для Windows собран с помощью Inno Setup.
|
||||||
|
Copyright (C) 1997-2026 Jordan Russell, Martijn Laan. https://jrsoftware.org/
|
||||||
|
Лицензия: https://jrsoftware.org/files/is/license.txt
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
; Установщик BiLauncher для Windows (Inno Setup 6).
|
||||||
|
;
|
||||||
|
; Собирается в CI после `cmake --install`:
|
||||||
|
; iscc /DAppVersion=1.0.0 /DSourceDir=C:\...\stage /DOutputDir=C:\...\dist packaging\windows\BiLauncher.iss
|
||||||
|
; SourceDir — префикс установки: bin\ с BiLauncher.exe и развёрнутым windeployqt Qt,
|
||||||
|
; share\doc\BiLauncher\ с лицензиями.
|
||||||
|
|
||||||
|
#ifndef AppVersion
|
||||||
|
#error Передайте версию: /DAppVersion=X.Y.Z
|
||||||
|
#endif
|
||||||
|
#ifndef SourceDir
|
||||||
|
#error Передайте префикс установки: /DSourceDir=...
|
||||||
|
#endif
|
||||||
|
#ifndef OutputDir
|
||||||
|
#define OutputDir "."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
[Setup]
|
||||||
|
; AppId не менять между версиями — по нему обновление находит прежнюю установку.
|
||||||
|
AppId={{6E0B5C1D-8F2A-4C7E-9B3D-2A1F4E5C7B90}
|
||||||
|
AppName=BiLauncher
|
||||||
|
AppVersion={#AppVersion}
|
||||||
|
AppVerName=BiLauncher {#AppVersion}
|
||||||
|
AppPublisher=GaleonDev
|
||||||
|
AppPublisherURL=https://projects-live.galeonworx.com/galeon/BiLauncher
|
||||||
|
AppSupportURL=https://projects-live.galeonworx.com/galeon/BiLauncher/issues
|
||||||
|
VersionInfoVersion={#AppVersion}
|
||||||
|
DefaultDirName={autopf}\BiLauncher
|
||||||
|
DefaultGroupName=BiLauncher
|
||||||
|
DisableProgramGroupPage=yes
|
||||||
|
LicenseFile={#SourceDir}\share\doc\BiLauncher\LICENSE
|
||||||
|
OutputDir={#OutputDir}
|
||||||
|
OutputBaseFilename=BiLauncher-{#AppVersion}-win64-setup
|
||||||
|
SetupIconFile=..\..\icons\icon.ico
|
||||||
|
UninstallDisplayIcon={app}\bin\BiLauncher.exe
|
||||||
|
Compression=lzma2/ultra64
|
||||||
|
SolidCompression=yes
|
||||||
|
LZMANumBlockThreads=4
|
||||||
|
ArchitecturesAllowed=x64compatible
|
||||||
|
ArchitecturesInstallIn64BitMode=x64compatible
|
||||||
|
PrivilegesRequiredOverridesAllowed=dialog
|
||||||
|
WizardStyle=modern
|
||||||
|
|
||||||
|
[Languages]
|
||||||
|
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
|
||||||
|
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||||
|
|
||||||
|
[Tasks]
|
||||||
|
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
|
||||||
|
|
||||||
|
[Files]
|
||||||
|
Source: "{#SourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: "vc_redist.x64.exe"
|
||||||
|
#ifexist SourceDir + "\bin\vc_redist.x64.exe"
|
||||||
|
Source: "{#SourceDir}\bin\vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
|
||||||
|
#endif
|
||||||
|
|
||||||
|
[Icons]
|
||||||
|
Name: "{autoprograms}\BiLauncher"; Filename: "{app}\bin\BiLauncher.exe"
|
||||||
|
Name: "{autodesktop}\BiLauncher"; Filename: "{app}\bin\BiLauncher.exe"; Tasks: desktopicon
|
||||||
|
|
||||||
|
[Run]
|
||||||
|
#ifexist SourceDir + "\bin\vc_redist.x64.exe"
|
||||||
|
Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Установка Microsoft Visual C++ Runtime..."; Flags: waituntilterminated
|
||||||
|
#endif
|
||||||
|
Filename: "{app}\bin\BiLauncher.exe"; Description: "{cm:LaunchProgram,BiLauncher}"; Flags: nowait postinstall skipifsilent
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "zlibreference.h"
|
#include "zlibreference.h"
|
||||||
#include "localization.h"
|
#include "localization.h"
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QProcessEnvironment>
|
#include <QProcessEnvironment>
|
||||||
|
|||||||
Reference in new issue
Block a user