4
1
mirror of https://github.com/QuasarApp/CQtDeployer.git synced 2025-05-05 05:59:35 +00:00

Merge pull request from QuasarApp/main

update dev brach
This commit is contained in:
Andrei Yankovich 2023-09-11 11:54:44 +03:00 committed by GitHub
commit 1e49c03c62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
242 changed files with 1624 additions and 604 deletions

@ -1,5 +1,5 @@
#
# Copyright (C) 2020-2022 QuasarApp.
# Copyright (C) 2020-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
@ -22,15 +22,16 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
if (IOS)
option(BUILD_SHARED_LIBS "This option forece build ${PROJECT_NAME} as a shared project with separated libraries as" OFF)
elseif()
else()
option(BUILD_SHARED_LIBS "This option forece build ${PROJECT_NAME} as a shared project with separated libraries as" ON)
endif()
if (NOT QT_VERSION_MAJOR)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Test QUIET)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Test QUIET)
endif()
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test QUIET)
include(submodules/QuasarAppLib/CMake/QuasarApp.cmake)
@ -39,9 +40,9 @@ updateGitVars()
string(TIMESTAMP TODAY "%Y-%m-%d")
set(CQT_DEPLOYER_VERSION_SHORT_PREFIX "1.6")
set(CQT_DEPLOYER_VERSION "${CQT_DEPLOYER_VERSION_SHORT_PREFIX}.${GIT_COMMIT_COUNT}.${GIT_COMMIT_HASH}")
set(QIFW_VERSION "4.4")
set(QIFW_VERSION "4.6") # rebuild for the 4.6.0
option(CQT_DEPLOYER_TESTS "This option disables or enables tests of the ${PROJECT_NAME} project" ON)
option(CQT_DEPLOYER_TESTS "This option disables or enables tests of the ${PROJECT_NAME} project" ${Qt${QT_VERSION_MAJOR}Test_FOUND})
option(CQT_DEPLOYER_TOOL "This option disables or enables example app of the ${PROJECT_NAME} project" ON)
if (ANDROID OR IOS OR NOT QT_VERSION_MAJOR OR QA_WASM32)

@ -120,7 +120,7 @@ See building and installation instructions on wiki [page](md/en/Build-and-Instal
***
### Check out our documentation for more information: [here](md/index.md)
### Check out our documentation for more information: [here](https://quasarapp.ddns.net:3031/docs/QuasarApp/CQtDeployer/latest/)
***

131
README.rst Normal file

@ -0,0 +1,131 @@
# CQtDeployer
[![cqtdeployer](https://snapcraft.io//cqtdeployer/badge.svg)](https://snapcraft.io/cqtdeployer)
[![cqtdeployer](https://snapcraft.io//cqtdeployer/trending.svg?name=0)](https://snapcraft.io/cqtdeployer)
# ![Logo](res/CQtDeployer_banner_web.png)
****************************
## Support the project
![image](https://user-images.githubusercontent.com/12465465/194008498-7f069b4a-b87d-42d1-82f1-af7d8cbcf220.png)
We have a cqtdeployer extended support [subscription](https://www.patreon.com/QuasarApp)
on the Patrion service.
* We'll help you solve your deployment issues personality.
* All your tasks needed to solve your issues will have top priority.
Also, if you just want to support the project, you can subscribe to the general subscription plan on patrion
If you can't use Patreon, you can send **bitcoin** to support us and our work.
If you want to get support for bitcoin payment, write to me in [telegramm](https://t.me/Endrll)
## bitcoin address
![image](https://user-images.githubusercontent.com/12465465/194010492-bae7b9e8-10a6-4e5f-9606-a5f3b4478a3e.png)
**bc1q3jnx7pleh7rxg6nm6navvuwwpd9znxvd4lye62**
## What is CQtDeployer
CQtDeployer helps you to extract all libraries your executable depends on and to create a launch script for your application.
Key differences of this program:
* Performance: this program deploys the application several times faster (up to 10 seconds)
* Flexibility: this application has flags that help you to configure the deployment for your or your project's needs
* Cross-deployment: this application supports Windows and Linux distributions. This means that you can deploy a project not only for the host platform, but also deploy a project for Windows target on Linux host and vice versa.
* Fast installers creation: Once the deployment is complete, you will receive a standalone installer for your distribution.
## Supported platforms:
* <img src="https://user-images.githubusercontent.com/12465465/67766480-929b5000-fa5f-11e9-8ae7-377d9ddb7c65.png" height="100">
* <img src="https://upload.wikimedia.org/wikipedia/commons/8/8d/Windows_darkblue_2012.svg" height="100">
## Supported processors architectures:
* x86
* x86-64
* ARM
* ARM64
## How to use
#### Example: `cqtdeployer <-bin [params]> [options]`
See the list of all options [here](md/en/Options.md)
#### Example: `cqtdeployer -bin myApp -qmlDir ~/MyAppProject/qml -qmake ~/Qt/6.3.1/gcc_64/bin/qmake clear`
## More examples
#### Deployed project structure:
``` bash
#linux
cqtdeployer -bin Guitar
#windows
cqtdeployer -bin Guitar.exe -qmake /path/to/qmake.exe
```
<p align="center"><img src="https://user-images.githubusercontent.com/12465465/81007195-7ab2e780-8e59-11ea-9793-1eeeb0025b96.png" height="400"></p>
#### Project installer after deployment with the `qif` option.
``` bash
#linux
cqtdeployer -bin Application qif
#windows
cqtdeployer -bin Application.exe -qmake /path/to/qmake.exe qif
```
<p align="center"><img src="https://user-images.githubusercontent.com/12465465/78639719-197a1180-78b7-11ea-9e82-a03dd43f4bd2.png" height="400"></p>
#### Project installer after deployment with the `qif` and `qifStyle` options.
``` bash
#linux
cqtdeployer -bin Application qif -qifStyle quasar
#windows
cqtdeployer -bin Application.exe -qmake /path/to/qmake.exe qif -qifStyle quasar
```
<p align="center"><img src="https://user-images.githubusercontent.com/12465465/78639720-1aab3e80-78b7-11ea-9604-3dcdd7c78482.png" height="400"></p>
``` bash
#linux
cqtdeployer -bin Application qif -qifStyle path/to/myStyle.css
#windows
cqtdeployer -bin Application.exe -qmake /path/to/qmake.exe qif -qifStyle path/to/myStyle.css
```
<p align="center"><img src="https://user-images.githubusercontent.com/12465465/78639716-17b04e00-78b7-11ea-9002-a8b45a43807f.png" height="400"></p>
## Build and install
See building and installation instructions on wiki [page](md/en/Build-and-Install.md)
## Projects using CQtDeployer:
- [QAmigo](https://github.com/QAmigo/QAmigo) - Qt cross-platform serial port socket assistant for visualizing data.
- [QtSecret](https://github.com/QuasarApp/Qt-Secret) - Simple encryption library supporting RSA and AES algorithms.
- [Hanoi-Towers](https://github.com/QuasarApp/Hanoi-Towers) - Hanoi Towers Game
- [distbuilder](https://github.com/BuvinJT/distbuilder) - Distribution Builder
- [Manager_v2](https://github.com/dimkatsi91/Manager_v2) - Qt Quick Controls 2 - Linux Manager Desktop Application
- [IDE65XX](https://github.com/emartisoft/IDE65XX) - IDE 65XX is one of the open source IDE options available for developers working with Kick Assembler.
- [Tanks](https://github.com/anevero/tanks) - 2D game written in C++ & Qt for Windows, Linux and Android
- [stegano](https://github.com/taskmaster9001/stegano) - Bit-level Image Manipulation Software with Qt Framework - Steganography Pet Project
- [Online_Board](https://github.com/MaxMalts/Online_Board) - This is a board that you can share with others.
***
### Check out our documentation for more information: [here](md/README.md)
***
## Thanks
* many thanks [Trail of Bits](https://github.com/trailofbits) for their library [pe-parser](https://github.com/trailofbits/pe-parse). Everything works perfectly.
***************************

13
SECURITY.md Normal file

@ -0,0 +1,13 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 1.6.x | :white_check_mark: |
| < 1.5.x | :x: |
## Reporting a Vulnerability
If you find any security issues, please send a report to quasarappdevelop@gmail.com. Or create a new [issue](https://github.com/QuasarApp/CQtDeployer/issues) on github if this is not dangerous.

@ -791,7 +791,7 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
INPUT = ./md
INPUT = ./md
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@ -1214,7 +1214,7 @@ HTML_EXTRA_FILES =
# Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_HUE = 202
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use grayscales only. A
@ -1222,7 +1222,7 @@ HTML_COLORSTYLE_HUE = 220
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_SAT = 212
# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100
@ -1233,7 +1233,7 @@ HTML_COLORSTYLE_SAT = 100
# Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_GAMMA = 80
HTML_COLORSTYLE_GAMMA = 59
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
@ -1479,7 +1479,7 @@ DISABLE_INDEX = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = YES
GENERATE_TREEVIEW = NO
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.

@ -1,6 +1,18 @@
# Change log
## CQtDeployer 1.6
## CQtDeployer v1.6.2265
### What's Changed
* Added sources into documentation by @EndrII in https://github.com/QuasarApp/CQtDeployer/pull/727
* Added article for building cqtdeployer on arm platforms by @EndrII in https://github.com/QuasarApp/CQtDeployer/pull/726
* Update zip submodule by @EndrII in https://github.com/QuasarApp/CQtDeployer/pull/730
* Added the qml files dialogs test by @EndrII in https://github.com/QuasarApp/CQtDeployer/pull/729
* Added the dynamic detection qt version and qt platform properties by @EndrII in https://github.com/QuasarApp/CQtDeployer/pull/733
* Fix warning: ``run qmake file! execve: Permission denied`` by @EndrII in https://github.com/QuasarApp/CQtDeployer/pull/732
## CQtDeployer 1.6.2227
### New features

@ -15,12 +15,12 @@ cqtdeployer -bin MyExecutable -runScript MyExecutable,path/to/my/custom/script.s
## Suported variables list:
* CQT_LIB_PATH - are releative path to libraryes of a deployed distribution.
* CQT_QML_PATH - are releative path to qml libraryes of a deployed distribution.
* CQT_PLUGIN_PATH - are releative path to qt plugins of a deployed distribution.
* CQT_BIN_PATH - are releative path to targets of a deployed distribution.
* CQT_LIB_PATH - are relative path to libraries of a deployed distribution.
* CQT_QML_PATH - are relative path to qml libraries of a deployed distribution.
* CQT_PLUGIN_PATH - are relative path to qt plugins of a deployed distribution.
* CQT_BIN_PATH - are relative path to targets of a deployed distribution.
* CQT_SYSTEM_LIB_PATH - are releative path to system libraryes of a deployed distribution.
* CQT_SYSTEM_LIB_PATH - are relative path to system libraries of a deployed distribution.
* CQT_BASE_NAME - are base name of the executable that will be launched after run this script.
* CQT_CUSTOM_SCRIPT_BLOCK - This is code from the customScript option
* CQT_RUN_COMMAND - This is command for run application. Require BASEDIR variable. Note: This variable already contains symbols for redirect input script arguments to executable.

@ -20,6 +20,7 @@
* [Default Environment Variables](EnvironmentVariables.md)
* [Disable standard shortcuts ](DisableShortcats.md)
* [Custom scripts](CustomScripts.md)
* [CQtDeployer for arm](arm.md)
## Support the project

@ -134,9 +134,10 @@ cqtdeployer -option1 value1 -option2 list, of, values flag1 flag2 flag3
| -disableRunScript [target,target2,target3] | Disables the generation of run script for selected targets|
| -disableShortCut [target,target2,target3] | Disables the generation of shortcut for selected targets |
| -runScript [target;val,val] | forces cqtdeployer swap default run script to new from the arguments of option. This option copy all content from input file and insert all code into runScript.sh or .bat. Example of use: cqtdeployer -runScript "myTargetMame;path/to/my/myCustomLaunchScript.sh,myTargetSecondMame;path/to/my/mySecondCustomLaunchScript.sh" For get more information about customScript see the documentation [page](CustomScripts.md)|
| -extraDepends [target;val,val] | Adds extra dependencies for target, if package is skiped then for all targets. Example -extraDepends libssl.so or -extraDepends myExecutable;libssl.so |
### Plugins Controll Options
| Option | Descriptiion |
|-----------------------------|-----------------------------------------------------------|
| -extraPlugin [package;val1;val2,SingeleVal]| Sets an additional path to third-party application plug-in |

63
md/en/arm.md Normal file

@ -0,0 +1,63 @@
# CQtDeployer for arm machines
At this time, cqtdeployer does not have precompiled distributions for arm platform. But it supports deploy arm applications, so the best solution for install cqtdeployer tool to arm host is building from source.
## Build
You can read a main article of building cqtdeployer from source [here](Build-and-Install.md).
## Qt installer framework.
The QIFW not available for arm platforms. So if you want to create classic installers you need to build Qt installer framework from [source](https://github.com/qtproject/installer-framework).
## Build from source
- clone project
``` bash
git clone https://github.com/QuasarApp/CQtDeployer.git
git submodule update --init --recursive
cd CQtDeployer
```
- create temp build directory
``` bash
mkdir build
cd build
```
- Install qt from package manager (for example apt on ubuntu)
``` bash
sudo apt install qt6-base-dev
```
- run cmake
``` bash
cmake .. -DBUILD_SHARED_LIBS=0 -DCQT_DEPLOYER_TESTS=0
```
- build cqtdeployer
``` bash
make -j8
```
- create cqtdeployer executable.
``` bash
make install
```
Done. Now you can add cqtdeployer into your PATH variable and use it or create symbol link to cqtdeployer executable in /bin folder.
``` bash
ln -s ./bin/CQtDeployer /bin/cqtdeployer
```

@ -1,86 +0,0 @@
# Установка CQtDeployer
Вы можете загрузить последнее подготовленные сборки [здесь](https://github.com/QuasarApp/CQtDeployer/releases).
### Установщик
- [Загрузить](https://github.com/QuasarApp/CQtDeployer/releases) CQtDeployer_X.X.X.X_Installer_Linux64.run или CQtDeployer_X.X.X.X_Installer_Win64.exe
#### Установка в консоли (CMD) без GUI
##### Linux
``` bash
wget https://github.com/QuasarApp/CQtDeployer/releases/download/1.5.3/CQtDeployer_1.5.3.0_Installer_Linux64.run
chmod +x CQtDeployer_1.5.3.0_Installer_Linux64.run
./CQtDeployer_1.5.3.0_Installer_Linux64.run install
```
##### Windows
``` bash
wget https://github.com/QuasarApp/CQtDeployer/releases/download/1.5.3/CQtDeployer_1.5.3.0_Installer_Win64.exe
CQtDeployer_1.5.3.0_Installer_Win64.exe install
```
### Deb
``` bash
wget https://github.com/QuasarApp/CQtDeployer/releases/download/1.5.3/CQtDeployer_1.5.3.0_Linux64.deb
sudo dpkg -i CQtDeployer_1.5.3.0_Linux64.deb
```
**Примечание** имя пакета и ссылки могут быть изменены, пожалуйста, проверьте страницу [Загрузки](https://github.com/QuasarApp/CQtDeployer/releases) перед установкой.
### Snap
[![Загрузите из Snap Store](https://snapcraft.io/static/images/badges/ru/snap-store-black.svg)](https://snapcraft.io/cqtdeployer)
#### Особенности snap версии
Если вы используете snap версию приложения. Включите все разрешения для cqtdeployer.
это можно сделать в snap-store
Или начиная с ubuntu 20.04 в менеджере настроек приложений ubuntu.
Если у вас нет графического интерфейса, вы можете включить все разрешения, используя следующие команды:
``` bash
sudo snap connect cqtdeployer:process-control
sudo snap connect cqtdeployer:removable-media
sudo snap connect cqtdeployer:system-backup
```
---
# Сборка из исходников
## Build для Linux
- установите qt и qt QtInstallFrameWork из [Установщик qt](https://www.qt.io/download-qt-installer?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5)
- git clone https://github.com/QuasarApp/CQtDeployer.git
- cd CQtDeployer
- git submodule update --init --recursive
- qmake -r
- Здесь нужно обязательно вызвать тот qmake, который был загружен из 1го пункта.
- Пример: ~/Qt/5.15.0/gcc_64/bin/qmake -r
- make -j$(nproc)
- make deploy
- эта команда требует установленный [cqtdeployer](https://github.com/QuasarApp/CQtDeployer/releases)
## Build для Windows (CMD)
- установите qt и qt QtInstallFrameWork из [Установщик qt](https://www.qt.io/download-qt-installer?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5)
- git clone https://github.com/QuasarApp/CQtDeployer.git
- cd CQtDeployer
- git submodule update --init --recursive
- SET PATH=C:/Qt/Tools/mingw810_64/bin;%PATH%
- Здесь важно настроить окружение qt.
- qmake.exe -r
- Здесь нужно обязательно вызвать тот qmake, который был загружен из 1го пункта.
- Пример: C:/Qt/5.15.0/mingw81_64/bin/qmake.exe -r
- migw32-make -j8
- migw32-make deploy
- эта команда требует установленный [cqtdeployer](https://github.com/QuasarApp/CQtDeployer/releases)
- ./Distro/CQtDeployerInstaller.exe

@ -9,7 +9,6 @@
* [Параметры](Options.md)
* [Руководство](Guide.md)
* [Краткое Руководство](QuickGuide.md)
* [Сборка и установка](Build-and-Install.md)
* [Файл развертывания](DeployConfigFile.md)
* [Упаковка](Packing.md)
* [Список изменений](Changelog.md)

@ -1,5 +1,5 @@
#
# Copyright (C) 2021-2022 QuasarApp.
# Copyright (C) 2021-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
@ -70,6 +70,17 @@ set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts
prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR}/../ "${LANGS}")
# sets qifw variable
set(ApplicationsDir "@HomeDir@")
set(QIFW_PLATFORM linux)
set(INSTALLER_SUFIX ".run")
if (WIN32)
set(QIFW_PLATFORM windows)
set(INSTALLER_SUFIX ".exe")
set(ApplicationsDir "@ApplicationsDir@")
endif()
configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json")
configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json")
@ -84,17 +95,6 @@ add_custom_target(${name}Templates ALL
SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/snapcraft.yaml.in"
)
# sets qifw variable
set(ApplicationsDir "@HomeDir@")
set(QIFW_PLATFORM linux)
set(INSTALLER_SUFIX .run)
if (WIN32)
set(QIFW_PLATFORM windows)
set(INSTALLER_SUFIX exe)
set(ApplicationsDir "@ApplicationsDir@")
endif()
configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/config/config.xml")

@ -1,5 +1,5 @@
#
# Copyright (C) 2018-2022 QuasarApp.
# Copyright (C) 2018-2023 QuasarApp.
# Distributed under the lgplv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
#
# Copyright (C) 2020-2022 QuasarApp.
# Copyright (C) 2020-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.

@ -21,7 +21,7 @@ function createShortCut {
echo "Encoding=UTF-8" >> $DEST_FILE
echo "Name=$DEST_NAME" >> $DEST_FILE
echo "Type=Application" >> $DEST_FILE
echo "Icon=$CQT_INSTALL_DEB_DIR/icons/${SRC_FILE%%.*}.png" >> $DEST_FILE
echo "Icon=$TARGET_DIR/icons/${DEST_NAME}.png" >> $DEST_FILE
echo "Terminal=false" >> $DEST_FILE
echo "Exec=$SRC_FILE" >> $DEST_FILE
@ -34,8 +34,6 @@ echo "Available commands:"
for app in "${APPS[@]}"
do
DEST_NAME=$app
if [ ! -e /usr/bin/"${app,,}" ]; then
ln -s "$TARGET_DIR/$app.sh" /usr/bin/"${app,,}"
echo "${app,,}"
@ -45,10 +43,10 @@ done
for app in "${APPS_SHORTCUTS[@]}"
do
DEST_NAME=$app
DEST_NAME=${app%.*}
SRC_FILE="$TARGET_DIR/$app"
DEST_FILE="/usr/share/applications/${app%.*}.desktop"
DEST_FILE="/usr/share/applications/${DEST_NAME}.desktop"
createShortCut
done

@ -252,7 +252,7 @@ bool iDistribution::collectInfo(const DistroModule& pkg,
info.Custom["[\"array\", \"of\", \"shortcut\", \"cmds\"]"] = cmdShortCutsArray;
info.Custom["$BASH_ARRAY_APPLICATIONS"] = bashArray;
info.Custom["$BASH_ARRAY_APPLICATIONS"] = bashArray;
info.Custom["$BASH_ARRAY_SHORTCUTS_APPLICATIONS"] = bashShortCutsArray;
if (info.Name.isEmpty()) {
info.Name = "Application";

@ -6,16 +6,16 @@
# ####################################################################
#
# All variables has the CQT_ prefix
# BIN_PATH - are releative path to executable files of a deployed distribution.
# LIB_PATH - are releative path to libraryes of a deployed distribution.
# QML_PATH - are releative path to qml libraryes of a deployed distribution.
# PLUGIN_PATH - are releative path to qt plugins of a deployed distribution.
# BIN_PATH - are releative path to targets of a deployed distribution.
# BIN_PATH - are relative path to executable files of a deployed distribution.
# LIB_PATH - are relative path to libraries of a deployed distribution.
# QML_PATH - are relative path to qml libraries of a deployed distribution.
# PLUGIN_PATH - are relative path to qt plugins of a deployed distribution.
# BIN_PATH - are relative path to targets of a deployed distribution.
# SYSTEM_LIB_PATH - are releative path to system libraryes of a deployed distribution.
# SYSTEM_LIB_PATH - are relative path to system v of a deployed distribution.
# BASE_NAME - are base name of the executable that will be launched after run this script.
# CUSTOM_SCRIPT_BLOCK - This is code from the customScript option
# RUN_COMMAND - This is command for run application. Requred BASE_DIR variable.
# RUN_COMMAND - This is command for run application. Required BASE_DIR variable.
#
# ####################################################################

@ -14,7 +14,7 @@
@echo off
SET BASE_DIR=%~dp0
SET PATH=%BASE_DIR%CQT_BIN_PATH;%BASE_DIR%CQT_LIB_PATH;%PATH%;CQT_SYSTEM_LIB_PATH
SET PATH=%BASE_DIR%CQT_BIN_PATH;%BASE_DIR%CQT_LIB_PATH;%PATH%;%BASE_DIR%CQT_SYSTEM_LIB_PATH
SET CQT_PKG_ROOT=%BASE_DIR%
SET CQT_RUN_FILE=%BASE_DIR%CQT_BASE_NAME.bat

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
@ -753,6 +753,10 @@ bool ConfigParser::parseDeployMode(bool checkBin) {
return false;
}
QuasarAppUtils::Params::log(
_config.qtDir.toString(),
QuasarAppUtils::Debug);
if (!initQmlInput()) {
return false;
}
@ -812,6 +816,8 @@ bool ConfigParser::configureTargets() {
const auto disableShortcuts = QuasarAppUtils::Params::getArg("disableShortCut").
split(DeployCore::getSeparator(0), splitbehavior);
const auto extraDepends = QuasarAppUtils::Params::getArg("extraDepends").
split(DeployCore::getSeparator(0), splitbehavior);
if (icons.size()) {
parseTargetPrivate(_config, icons, &TargetInfo::setIcon);
@ -831,6 +837,10 @@ bool ConfigParser::configureTargets() {
return false;
}
if (extraDepends.size()) {
parseTargetPrivate(_config, extraDepends, &TargetInfo::addDepends);
}
return true;
}
@ -1134,26 +1144,61 @@ QString ConfigParser::getPathFrmoQmakeLine(const QString &in) const {
bool ConfigParser::initQmakePrivate(const QString &qmake) {
QFileInfo info(qmake);
QString basePath = info.absolutePath();
if (!setQmake(qmake)) {
QDir dir(basePath);
QuasarAppUtils::Params::log("initialize qmake for. " + info.absoluteFilePath(),
QuasarAppUtils::Debug);
if (!dir.cdUp()) {
QuasarAppUtils::Params::log("Failed to initialize qt directories by qmake.",
QuasarAppUtils::Error);
return false;
QString basePath = info.absolutePath();
// Invoke qmake executable only when qmake paths exclude snapRootFS path.
// Because files in snapRootFS is not executable ...
if (!qmake.contains(DeployCore::snapRootFS()) && setQmake(qmake)) {
return true;
}
// try deploy qt using only read FS permisions
// check debian qt structure
if (DeployCore::isDebianQt(info.absoluteFilePath())) {
// initialize qt that was installed from apt package manager on any debian based os
QString neededPlatform = DeployCore::getPlatformLibPrefix(_config.getPlatformOfAll());
int qtVersion = DeployCore::qtVersionToString(_config.isNeededQt());
QString debianQtRoot = QString("/usr/lib/%0/qt%1").
arg(neededPlatform).arg(qtVersion);
if (DeployCore::isSnap()) {
debianQtRoot = DeployCore::snapRootFS() + debianQtRoot;
}
QuasarAppUtils::Params::log("Failed to execute the qmake process!"
" Trying to initialize Qt directories from path: " + dir.absolutePath(),
QuasarAppUtils::Warning);
if (!setQtDir(dir.absolutePath())){
if (!setQtDir(debianQtRoot)) {
QuasarAppUtils::Params::log("Failed to initialize Qt directories",
QuasarAppUtils::Error);
return false;
}
return true;
}
// initialize qt that was installed from qt installer or aqtinstall package manager
QDir dir(basePath);
if (!dir.cdUp()) {
QuasarAppUtils::Params::log("Failed to initialize qt directories by qmake.",
QuasarAppUtils::Error);
return false;
}
// For snap package of cqtdeplyer it is normal behavior
if (!DeployCore::isSnap()) {
QuasarAppUtils::Params::log("Failed to execute the qmake process!"
" Trying to initialize Qt directories from path: " + dir.absolutePath(),
QuasarAppUtils::Warning);
}
if (!setQtDir(dir.absolutePath())){
QuasarAppUtils::Params::log("Failed to initialize Qt directories",
QuasarAppUtils::Error);
return false;
}
return true;
@ -1169,11 +1214,11 @@ bool ConfigParser::initQmake() {
return true;
}
auto qmake = QuasarAppUtils::Params::getArg("qmake");
auto qmake = DeployCore::transportPathToSnapRoot(QuasarAppUtils::Params::getArg("qmake"));
QFileInfo info(qmake);
if (!info.isFile() || (info.baseName() != "qmake")) {
if (!info.isFile()) {
QString qmakeFromRPath = DeployCore::findProcess(getRPathFromTargets(), "qmake");
@ -1227,13 +1272,10 @@ bool ConfigParser::initQmake() {
bool ConfigParser::setQmake(const QString &value) {
auto qmakeInfo = QFileInfo(QDir::fromNativeSeparators(value));
auto qmakeInfo = QFileInfo(value);
if (!(qmakeInfo.fileName().compare("qmake", Qt::CaseInsensitive) ||
qmakeInfo.fileName().compare("qmake.exe", Qt::CaseInsensitive))) {
return false;
}
QuasarAppUtils::Params::log("sets qmake for. " + qmakeInfo.absoluteFilePath(),
QuasarAppUtils::Debug);
QProcess proc;
proc.setProgram(qmakeInfo.absoluteFilePath());
@ -1265,18 +1307,19 @@ bool ConfigParser::setQmake(const QString &value) {
_config.qtDir.setTranslations(getPathFrmoQmakeLine(value));
} else if (value.contains("QT_INSTALL_DATA")) {
_config.qtDir.setResources(getPathFrmoQmakeLine(value) + "/resources");
} else if (value.contains("QMAKE_XSPEC")) {
auto val = value.split(':').value(1);
if (val.contains("win32")) {
_config.qtDir.setQtPlatform(Platform::Win);
} else {
_config.qtDir.setQtPlatform(Platform::Unix);
}
}
}
_config.qtDir.setQtVersion(_config.isNeededQt());
if (_config.qtDir.getLibs().isEmpty()) {
QuasarAppUtils::Params::log("Wrong output from the qmake process. " + qmakeInfo.absoluteFilePath(),
QuasarAppUtils::Warning);
QuasarAppUtils::Params::log("Raw output:" + qmakeData,
QuasarAppUtils::Debug);
QuasarAppUtils::Params::log("Parsed Qt configuration: \n" + _config.qtDir.toString(),
QuasarAppUtils::Debug);
return false;
}
_config.envirement.addEnv(_config.qtDir.getLibs());
_config.envirement.addEnv(_config.qtDir.getBins());
@ -1288,17 +1331,31 @@ bool ConfigParser::setQtDir(const QString &value) {
QFileInfo info(value);
if (!QFile::exists(info.absoluteFilePath() + ("/bin"))) {
QuasarAppUtils::Params::log("get qt bin failed!", QuasarAppUtils::Debug);
return false;
}
_config.qtDir.setBins(info.absoluteFilePath() + ("/bin"));
QuasarAppUtils::Params::log("initialize qt dirs for. " + info.absoluteFilePath(),
QuasarAppUtils::Debug);
if (!QFile::exists(info.absoluteFilePath() + ("/lib"))) {
QuasarAppUtils::Params::log("get qt lib failed!", QuasarAppUtils::Debug);
return false;
if (DeployCore::isDebianQt(value)) {
if (QFile::exists(info.absoluteFilePath() + ("/bin"))) {
_config.qtDir.setBins(info.absoluteFilePath() + ("/bin"));
}
} else {
if (!QFile::exists(info.absoluteFilePath() + ("/bin"))) {
QuasarAppUtils::Params::log("get qt bin failed!", QuasarAppUtils::Debug);
return false;
}
_config.qtDir.setBins(info.absoluteFilePath() + ("/bin"));
}
_config.qtDir.setLibs(info.absoluteFilePath() + ("/lib"));
if (DeployCore::isDebianQt(value)) {
_config.qtDir.setLibs(info.absolutePath());
} else {
if (!QFile::exists(info.absoluteFilePath() + ("/lib"))) {
QuasarAppUtils::Params::log("get qt lib failed!", QuasarAppUtils::Debug);
return false;
}
_config.qtDir.setLibs(info.absoluteFilePath() + ("/lib"));
}
if (!QFile::exists(info.absoluteFilePath() + ("/qml"))) {
QuasarAppUtils::Params::log("get qt qml failed!", QuasarAppUtils::Debug);
@ -1312,21 +1369,25 @@ bool ConfigParser::setQtDir(const QString &value) {
_config.qtDir.setPlugins(info.absoluteFilePath() + ("/plugins"));
}
#ifdef Q_OS_UNIX
if (!QFile::exists(info.absoluteFilePath() + ("/libexec"))) {
QuasarAppUtils::Params::log("get qt libexec failed!", QuasarAppUtils::Debug);
} else {
_config.qtDir.setLibexecs(info.absoluteFilePath() + ("/libexec"));
if (_config.qtDir.getQtPlatform() & Unix) {
if (!QFile::exists(info.absoluteFilePath() + ("/libexec"))) {
QuasarAppUtils::Params::log("get qt libexec failed!", QuasarAppUtils::Debug);
} else {
_config.qtDir.setLibexecs(info.absoluteFilePath() + ("/libexec"));
}
} else if (_config.qtDir.getQtPlatform() & Win) {
_config.qtDir.setLibexecs(info.absoluteFilePath() + ("/bin"));
}
#endif
#ifdef Q_OS_WIN
_config.qtDir.setLibexecs(info.absoluteFilePath() + ("/bin"));
#endif
if (!QFile::exists(info.absoluteFilePath() + ("/translations"))) {
QuasarAppUtils::Params::log("get qt translations failed!", QuasarAppUtils::Debug);
if (DeployCore::isDebianQt(value)) {
_config.qtDir.setTranslations(QString("/usr/share/qt%0/translations").
arg(DeployCore::qtVersionToString(_config.isNeededQt())));
} else {
_config.qtDir.setTranslations(info.absoluteFilePath() + ("/translations"));
if (!QFile::exists(info.absoluteFilePath() + ("/translations"))) {
QuasarAppUtils::Params::log("get qt translations failed!", QuasarAppUtils::Debug);
} else {
_config.qtDir.setTranslations(info.absoluteFilePath() + ("/translations"));
}
}
if (!QFile::exists(info.absoluteFilePath() + ("/resources"))) {
@ -1335,15 +1396,6 @@ bool ConfigParser::setQtDir(const QString &value) {
_config.qtDir.setResources(info.absoluteFilePath() + ("/resources"));
}
#ifdef Q_OS_UNIX
_config.qtDir.setQtPlatform(Platform::Unix);
#endif
#ifdef Q_OS_WIN
_config.qtDir.setQtPlatform(Platform::Win);
#endif
_config.qtDir.setQtVersion(_config.isNeededQt());
_config.envirement.addEnv(_config.qtDir.getLibs());
_config.envirement.addEnv(_config.qtDir.getBins());
@ -1396,27 +1448,27 @@ bool ConfigParser::initExtraPath() {
return true;
}
void ConfigParser::initExtraNames() {
void ConfigParser::addExtraNamesMasks(const QStringList& listNamesMasks) {
for (const auto &i : listNamesMasks) {
if (i.size() > 1) {
_config.allowedPaths.addtExtraNamesMasks({i});
const auto deployExtraNames = [this](const QStringList& listNamesMasks){
for (const auto &i : listNamesMasks) {
if (i.size() > 1) {
_config.allowedPaths.addtExtraNamesMasks({i});
QuasarAppUtils::Params::log(i + " is added as a filename mask",
QuasarAppUtils::Debug);
} else {
QuasarAppUtils::Params::log(i + " not added in file mask because"
" the file mask must be large 2 characters",
QuasarAppUtils::Debug);
}
QuasarAppUtils::Params::log(i + " is added as a filename mask",
QuasarAppUtils::Debug);
} else {
QuasarAppUtils::Params::log(i + " not added in file mask because"
" the file mask must be large 2 characters",
QuasarAppUtils::Debug);
}
};
}
}
void ConfigParser::initExtraNames() {
auto listNamesMasks = QuasarAppUtils::Params::getArg("extraLibs").
split(DeployCore::getSeparator(0));
deployExtraNames(listNamesMasks);
addExtraNamesMasks(listNamesMasks);
/*
* Task https://github.com/QuasarApp/CQtDeployer/issues/422
@ -1425,7 +1477,7 @@ void ConfigParser::initExtraNames() {
*/
if (_config.isNeededQt()) {
auto libs = DeployCore::Qt3rdpartyLibs( _config.getPlatformOfAll());
deployExtraNames(libs);
addExtraNamesMasks(libs);
}
}

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
@ -68,7 +68,6 @@ private:
bool setTargets(const QStringList &value);
bool setTargetsRecursive(const QString &dir);
bool setTargetsInDir(const QString &dir, bool recursive = false);
void initIgnoreList();
void initIgnoreEnvList();
@ -120,6 +119,7 @@ private:
*/
bool addTarget(const TargetData &target);
void initCustomPlatform();
void addExtraNamesMasks(const QStringList &listNamesMasks);
};
#endif // CQT_H

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -219,12 +219,15 @@ LibInfo DependenciesScanner::scan(const QString &path) {
return info;
}
QSet<QString> stack;
recursiveDep(info, info._allDep , stack);
scan(info);
return info;
}
void DependenciesScanner::scan(LibInfo &lib) {
QSet<QString> stack;
recursiveDep(lib, lib._allDep , stack);
}
DependenciesScanner::~DependenciesScanner() {
}

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -48,8 +48,20 @@ public:
void setEnvironment(const QStringList &env);
/**
* @brief scan This method create a "lib info" object from path and extract all depends on from the current environment.
* @param path This is full path to the library
* @return full lib of executable info
*/
LibInfo scan(const QString& path);
bool fillLibInfo(LibInfo& info ,const QString& file) const;
/**
* @brief scan This method do same as a scan(const QString& path) but not use already created libInfo data.
* @param lib this is already prepared lib info.
*/
void scan(LibInfo& lib);
bool fillLibInfo(LibInfo& info, const QString& file) const;
~DependenciesScanner();

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -25,7 +25,8 @@ Deploy::Deploy() {
int Deploy::run() {
QuasarAppUtils::Settings::initService<QuasarAppUtils::Settings>();
QuasarAppUtils::Settings::initService();
if (!prepare()) {
return PrepareError;

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -22,13 +22,13 @@ class Packing;
* @brief The exitCodes enum contains all general erro codes of the CQtDeployer tool.
*/
enum exitCodes {
// CQtDeployer are deployed project successful. (no error)
/// CQtDeployer are deployed project successful. (no error)
Good = 0x0,
// CQtDeployer failed in the reading arguments. (fail to parse of input arguments)
/// CQtDeployer failed in the reading arguments. (fail to parse of input arguments)
PrepareError = 0x1,
// CQtDeployer failed in the deploy step. Fail to copy deployed files.
/// CQtDeployer failed in the deploy step. Fail to copy deployed files.
DeployError = 0x2,
// CQtDeployer failed in the prepare package step. Fail to create a result pacakge.
/// CQtDeployer failed in the prepare package step. Fail to create a result pacakge.
PackingError = 0x3,

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -452,14 +452,20 @@ QuasarAppUtils::OptionsDataList DeployCore::avilableOptions() {
"Sets path to icon for a targets"
}});
help.insert(group, {QuasarAppUtils::OptionData{
{"-disableRunScript"}, "{package;val,val}",
{"-disableRunScript"}, "{target;val,val}",
"Disables a generation of run script for selected targets"
}});
help.insert(group, {QuasarAppUtils::OptionData{
{"-disableShortCut"}, "{package;val,val}",
{"-disableShortCut"}, "{target;val,val}",
"Disables a generation of shortcut for selected targets"
}});
help.insert(group, {QuasarAppUtils::OptionData{
{"-extraDepends"}, "{target;val,val}",
"Adds extra dependencies for target, if target is skipped then for rest of all targets",
"Example -extraDepends libssl.so or -targetPackage packageName;myExecutable -extraDepends packageName;libssl.so"
}});
group = "Part 5 Plugins Control Options";
help.insert(group, {QuasarAppUtils::OptionData{
@ -603,6 +609,9 @@ QString DeployCore::getAppVersion() {
}
QString DeployCore::getAppVersionName() {
if (isSnap()) {
return "*** Cool Core (snap) ***";
}
return "*** Cool Core ***";
}
@ -633,11 +642,16 @@ bool DeployCore::isContainsArraySeparators(const QString &val, int lastLvl) {
return false;
}
QString DeployCore::findProcess(const QString &env, const QString& proc) {
QString DeployCore::findProcess(const QString &env, const QString& proc, bool ignoreSymLinks) {
auto list = env.split(DeployCore::getEnvSeparator());
auto findEntries = QDir::NoDotAndDotDot | QDir::Files;
if (ignoreSymLinks) {
findEntries = findEntries | QDir::NoSymLinks;
}
for (const auto& path : list) {
auto files = QDir(path).entryInfoList(QDir::NoDotAndDotDot | QDir::Files);
auto files = QDir(path).entryInfoList(findEntries);
for (const auto& bin : files) {
if (bin.baseName().compare(proc, DeployCore::getCaseSensitivity()) == 0 && bin.isExecutable()) {
@ -649,7 +663,7 @@ QString DeployCore::findProcess(const QString &env, const QString& proc) {
// working only for the snap version of cqtdeployer ...
if (isSnap()) {
for (const auto& path : list) {
auto files = QDir(transportPathToSnapRoot(path)).entryInfoList(QDir::NoDotAndDotDot | QDir::Files);
auto files = QDir(transportPathToSnapRoot(path)).entryInfoList(findEntries);
for (const auto& bin : files) {
if (bin.baseName().compare(proc, DeployCore::getCaseSensitivity()) == 0) {
@ -663,7 +677,8 @@ QString DeployCore::findProcess(const QString &env, const QString& proc) {
}
QStringList DeployCore::debugExtensions() {
return {".debug", "d.dll", ".pdb"};
// from 6.5 windows version of Qt use a "gebug" extension too.
return {".debug", ".pdb"};
}
bool DeployCore::isDebugFile(const QString &file) {
@ -728,6 +743,9 @@ MSVCVersion DeployCore::getMSVC(const QString &_qtBin) {
else if (version == "2019") {
res |= MSVC_19;
}
else if (version == "2022") {
res |= MSVC_22;
}
if (type == "32") {
res |= MSVC_x32;
@ -742,6 +760,10 @@ MSVCVersion DeployCore::getMSVC(const QString &_qtBin) {
QString DeployCore::getVCredist(const QString &_qtbinDir) {
auto msvc = getMSVC(_qtbinDir);
if (msvc == MSVCVersion::MSVC_Unknown) {
return "";
}
QDir dir = _qtbinDir;
if (!(dir.cdUp() && dir.cdUp() && dir.cdUp() && dir.cd("vcredist"))) {
@ -775,6 +797,8 @@ QString DeployCore::getMSVCName(MSVCVersion msvc) {
return "msvc2017";
} else if (msvc & MSVCVersion::MSVC_19) {
return "msvc2019";
} else if (msvc & MSVCVersion::MSVC_22) {
return "msvc2022";
}
return "";
@ -918,7 +942,7 @@ QString DeployCore::platformToString(Platform platform) {
{Platform::Win32, "win_x86"},
{Platform::Win64, "win_x86_64"},
{Platform::Win_ARM_32, "win_arm"},
{Platform::win_ARM_64, "win_arm64"},
{Platform::Win_ARM_64, "win_arm64"},
{Platform::Unix_x86_32, "linux_x86"},
{Platform::Unix_x86_64, "linux_x86_64"},
{Platform::Unix_ARM_32, "linux_ARM"},
@ -952,7 +976,7 @@ Platform DeployCore::getPlatformFromString(const QString &platformName) {
{"win_x86", Platform::Win32},
{"win_x86_64", Platform::Win64},
{"win_arm", Platform::Win_ARM_32},
{"win_arm64", Platform::win_ARM_64},
{"win_arm64", Platform::Win_ARM_64},
{"linux_x86", Platform::Unix_x86_32},
{"linux_x86_64", Platform::Unix_x86_64},
{"linux_ARM", Platform::Unix_ARM_32},
@ -1057,7 +1081,49 @@ Qt::CaseSensitivity DeployCore::getCaseSensitivity(const QString &checkedFile) {
}
return Qt::CaseSensitive;
};
}
QString DeployCore::getPlatformLibPrefix(Platform plarform) {
if (plarform & Platform::Unix_x86_64) {
return "x86_64-linux-gnu";
} else if (plarform & Platform::Unix_ARM_64) {
return "aarch64-linux-gnu";
} else if (plarform & Platform::Unix_x86_32) {
return "x86_32-linux-gnu";
} else if (plarform & Platform::Unix_ARM_32) {
return "arm-linux-gnu";
} else if (plarform & Platform::Win64) {
return "";
} else if (plarform & Platform::Win32) {
return "";
} else if (plarform & Platform::Win_ARM_64) {
return "";
} else if (plarform & Platform::Win_ARM_32) {
return "";
}
// not supported
return "";
}
int DeployCore::qtVersionToString(QtMajorVersion qtVersion) {
if (qtVersion & QtMajorVersion::Qt6) {
return 6;
} else if (qtVersion & QtMajorVersion::Qt5) {
return 5;
} else if (qtVersion & QtMajorVersion::Qt4) {
return 4;
}
return 0;
}
bool DeployCore::isDebianQt(const QString &qtRoot) {
return qtRoot.contains("/usr/lib/") || qtRoot.contains("/usr/bin");
}
QString DeployCore::systemLibsFolderName() {
return "systemLibs";

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -15,13 +15,14 @@
#include <params.h>
enum MSVCVersion: int {
MSVC_Unknown = 0x0,
MSVC_x64 = 0x01,
MSVC_x32 = 0x02,
MSVC_13 = 0x10,
MSVC_15 = 0x20,
MSVC_17 = 0x40,
MSVC_19 = 0x80,
MSVC_Unknown = 0x0000,
MSVC_x64 = 0x0001,
MSVC_x32 = 0x0002,
MSVC_13 = 0x0010,
MSVC_15 = 0x0020,
MSVC_17 = 0x0040,
MSVC_19 = 0x0080,
MSVC_22 = 0x0100,
};
/**
@ -48,7 +49,7 @@ enum Platform {
Win32 = 0x0001,
Win64 = 0x0002,
Win_ARM_32 = 0x0004,
win_ARM_64 = 0x0008,
Win_ARM_64 = 0x0008,
Win = Win32 | Win64,
// Unix
@ -277,7 +278,7 @@ public:
static bool isExecutable(const QFileInfo &file);
static bool isContainsArraySeparators(const QString& val,
int lastLvl = 2);
static QString findProcess(const QString& env, const QString& proc);
static QString findProcess(const QString& env, const QString& proc, bool ignoreSymLinks = false);
static QStringList debugExtensions();
static bool isDebugFile(const QString& file);
@ -323,6 +324,27 @@ public:
* @return Qt CaseSensitivity value
*/
static Qt::CaseSensitivity getCaseSensitivity(const QString& checkedFile = "");
/**
* @brief getPlatformLibPrefix This method return string value of the @a platform
* @param plarform This is input platform
* @return string value of the @a platfrom. If platform not supported strings implementations the return empty string.
*/
static QString getPlatformLibPrefix(Platform plarform);
/**
* @brief qtVersionToString return integer interpritation of the Qt major version
* @return integer implementation of major qt version.
* @note return 0 if the @a qtVersion is invalid
*/
static int qtVersionToString(QtMajorVersion qtVersion);
/**
* @brief isDebianQt this method return true if the @a qtRoot is debian system qt.
* @param qtRoot path to qt root dir.
* @return true if the @a qtRoot is debian system qt else false.
*/
static bool isDebianQt(const QString& qtRoot);
};
#define internalError() DeployCore::printInternalError(__FUNCTION__, __FILE__, __LINE__)

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -77,7 +77,7 @@ void DistroModule::setPublisher(const QString &publisher) {
_publisher = publisher;
}
QSet<QString> DistroModule::enabledPlugins() const {
const QSet<QString>& DistroModule::enabledPlugins() const {
return _enabled;
}
@ -89,7 +89,7 @@ void DistroModule::addEnabledPlugins(const QString &enabled) {
_enabled += enabled;
}
QSet<QString> DistroModule::disabledPlugins() const {
const QSet<QString>& DistroModule::disabledPlugins() const {
return _disabled;
}
@ -101,7 +101,7 @@ void DistroModule::addDisabledPlugins(const QString &disabled) {
_disabled += disabled;
}
QSet<QString> DistroModule::extraPlugins() const {
const QSet<QString> &DistroModule::extraPlugins() const {
return _extraPlugins;
}
@ -175,7 +175,7 @@ void DistroModule::setInstallDirDEB(const QString &newInstallDir) {
_installDirDEB = newInstallDir;
}
QSet<QString> DistroModule::translation() const {
const QSet<QString> &DistroModule::translation() const {
return _tr;
}
@ -187,7 +187,7 @@ void DistroModule::addTranslation(const QString &tr) {
_tr += tr;
}
QSet<QString> DistroModule::extraData() const {
const QSet<QString> &DistroModule::extraData() const {
return _extraData;
}

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -42,15 +42,15 @@ public:
QString publisher() const;
void setPublisher(const QString &publisher);
QSet<QString> enabledPlugins() const;
const QSet<QString> &enabledPlugins() const;
void setEnabledPlugins(const QSet<QString> &enabled);
void addEnabledPlugins(const QString &enabled);
QSet<QString> disabledPlugins() const;
const QSet<QString> &disabledPlugins() const;
void setDisabledPlugins(const QSet<QString> &disabled);
void addDisabledPlugins(const QString &disabled);
QSet<QString> extraPlugins() const;
const QSet<QString>& extraPlugins() const;
void setExtraPlugins(const QSet<QString> &extraPlugins);
void addExtraPlugins(const QString &extraPlugin);
@ -66,11 +66,11 @@ public:
bool isValid();
QSet<QString> extraData() const;
const QSet<QString>& extraData() const;
void setExtraData(const QSet<QString> &extraFiles);
void addExtraData(const QString &extraFile);
QSet<QString> translation() const;
const QSet<QString>& translation() const;
void setTranslation(const QSet<QString> &tr);
void addTranslation(const QString &tr);

@ -1,6 +1,6 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,6 +1,6 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
@ -8,7 +8,6 @@
#include "deploycore.h"
#include "envirement.h"
#include "pathutils.h"
#include "quasarapp.h"
#include <QDir>
#include <QFileInfo>

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -10,6 +10,7 @@
#include "pluginsparser.h"
#include "configparser.h"
#include "metafilemanager.h"
#include "qmlqt5.h"
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
@ -99,8 +100,8 @@ void Extracter::extractAllTargets() {
for (auto i = cfg->packages().cbegin(); i != cfg->packages().cend(); ++i) {
auto &dep = _packageDependencyes[i.key()];
for (const auto &target : i.value().targets()) {
extract(target, &dep);
for (const auto &targetId : i.value().targets()) {
extract(targetId, &dep);
}
}
}
@ -405,9 +406,16 @@ void Extracter::extractLib(const QString &file,
QuasarAppUtils::Params::log("extract lib :" + file,
QuasarAppUtils::Debug);
auto data = _scaner->scan(file);
QSet<LibInfo> allDependencies;
auto targetObject = DeployCore::_config->targets().value(file);
if (targetObject.isValid()) {
_scaner->scan(targetObject);
allDependencies = targetObject.getAllDep();
} else {
allDependencies = _scaner->scan(file).getAllDep();
}
for (const auto &line : data.getAllDep()) {
for (const auto &line : qAsConst(allDependencies)) {
if (mask.size() && !line.getName().contains(mask, DeployCore::getCaseSensitivity())) {
continue;
@ -447,6 +455,8 @@ bool Extracter::extractQml() {
QStringList plugins;
QStringList listItems;
auto QtVersion = cnf->isNeededQt(i.key());
const auto qmlInputList = distro.qmlInput();
for (const auto &qmlInput: qmlInputList) {
QFileInfo info(qmlInput);
@ -464,34 +474,51 @@ bool Extracter::extractQml() {
continue;
}
QML ownQmlScaner(cnf->qtDir.getQmls(), cnf->isNeededQt(i.key()));
QSharedPointer<iQML> qmlScaner;
if (QtVersion & QtMajorVersion::Qt6) {
qmlScaner = QSharedPointer<QMLQt6>::create(cnf->qtDir.getQmls());
} else if (QtVersion & QtMajorVersion::Qt5) {
qmlScaner = QSharedPointer<QMLQt5>::create(cnf->qtDir.getQmls());
}
if (!ownQmlScaner.scan(plugins, info.absoluteFilePath())) {
if (qmlScaner && !qmlScaner->scan(plugins, info.absoluteFilePath())) {
QuasarAppUtils::Params::log("Failed to run qml scanner",
QuasarAppUtils::Error);
continue;
}
}
QStringList toCopyQmlFiles;
for (const auto& plugin: qAsConst(plugins)) {
const auto qmlFiles = QDir(plugin).entryInfoList(QDir::Files);
for (const auto& qmlFile: qmlFiles) {
toCopyQmlFiles.push_back(qmlFile.absoluteFilePath());
if (QtVersion & QtMajorVersion::Qt5) {
// See the https://github.com/QuasarApp/CQtDeployer/issues/728 issue
// use old method of parse qml for qt5
if (!_fileManager->copyFolder(cnf->qtDir.getQmls(),
targetPath + distro.getQmlOutDir(),
DeployCore::debugExtensions() ,
&listItems, &plugins)) {
return false;
}
} else {
for (const auto& plugin: qAsConst(plugins)) {
const auto qmlFiles = QDir(plugin).entryInfoList(QDir::Files);
for (const auto& qmlFile: qmlFiles) {
toCopyQmlFiles.push_back(qmlFile.absoluteFilePath());
}
}
// This function works very slow because use list mask
// solution: use the QSet and restriction comparese of the pathes for the mask argument.
// to-do optimise this function
if (!_fileManager->copyFolder(cnf->qtDir.getQmls(),
targetPath + distro.getQmlOutDir(),
DeployCore::debugExtensions() ,
&listItems,
&toCopyQmlFiles)) {
return false;
}
}
// This function works very slow because use list mask
// solution: use the QSet and restriction comparese of the pathes for the mask argument.
// to-do optimise this function
if (!_fileManager->copyFolder(cnf->qtDir.getQmls(),
targetPath + distro.getQmlOutDir(),
DeployCore::debugExtensions() ,
&listItems,
&toCopyQmlFiles)) {
return false;
}
for (const auto &item : qAsConst(listItems)) {
extractPluginLib(item, i.key());

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -14,7 +14,7 @@
#include "dependencymap.h"
#include "deploy_global.h"
#include "filemanager.h"
#include "qml.h"
#include "qmlqt6.h"
class ConfigParser;
class MetaFileManager;

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2021-2022 QuasarApp.
//# Copyright (C) 2021-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2021-2022 QuasarApp.
//# Copyright (C) 2021-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

13
src/Deploy/src/iqml.cpp Normal file

@ -0,0 +1,13 @@
//#
//# Copyright (C) 2022-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#include "iqml.h"
iQML::iQML(const QString &qmlRoot) {
_qmlRoot = qmlRoot;
}

40
src/Deploy/src/iqml.h Normal file

@ -0,0 +1,40 @@
//#
//# Copyright (C) 2022-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#ifndef IQML_H
#define IQML_H
#include <QString>
#include "deploy_global.h"
/**
* @brief The iQML class Bae interface for scannin qml depends.
*/
class DEPLOYSHARED_EXPORT iQML
{
public:
/**
* @brief iQML base constructor
* @param qmlRoot This is qml root dir of Qt destribution. Example: Qt/6.4.0/gcc_64/qml
*/
iQML(const QString& qmlRoot);
virtual ~iQML() = default;
/**
* @brief scan This method scane qml files in the qmlRoot and return needed to deploy files
* @param res This is result of scan. List of needed to deploy files
* @param _qmlProjectDir This is
* @return true if function finished succesful
*/
virtual bool scan(QStringList &res, const QString &_qmlProjectDir) = 0;
protected:
QString _qmlRoot;
};
#endif // IQML_H

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -60,6 +60,10 @@ void LibInfo::addDependncies(const QString &value) {
_dependncies.insert(value);
}
void LibInfo::addDepends(const QString &value) {
addDependncies(value);
}
void LibInfo::addDependncies(const QSet<QString> &value) {
_dependncies += value;
}

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
@ -37,6 +37,7 @@ public:
QSet<QString> getDependncies() const;
void setDependncies(const QSet<QString> &value);
void addDependncies(const QString &value);
void addDepends(const QString &value);
void addDependncies(const QSet<QString> &value);
void removeDependncies(const QString &value);

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -128,7 +128,7 @@ bool PE::getLibInfo(const QString &lib, LibInfo &info) const {
info.setPlatform(Win_ARM_32);
} else {
info.setPlatform(win_ARM_64);
info.setPlatform(Win_ARM_64);
}
} else if (parsedPeLib->peHeader.nt.FileHeader.Machine == peparse::IMAGE_FILE_MACHINE_I386 ||

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,11 +1,11 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "qml.h"
#include "qmlqt5.h"
#include <QDir>
#include <QFile>
@ -13,18 +13,18 @@
#include "deploycore.h"
#include "qregularexpression.h"
QStringList QML::extractImportLine(const QString& line) const {
QStringList QMLQt5::extractImportLine(const QString& line) const {
QStringList result;
QStringList list = line.split(" ", splitbehavior);
if (list.count() == 3 || (list.count() == 5 && list[3] == "as")) {
if (list[2] == "auto" || (_qtVersion & QtMajorVersion::Qt6)) {
if (list[2] == "auto") {
// qt6
result << (list[1].replace(".", "/"));
return result;
}
// qt5
result << (list[2][0] + QString("#") + list[1].replace(".", "/"));
result << (QString(list[2][0]) + "#" + list[1].replace(".", "/"));
} else if (list.count() == 2 || (list.count() == 4 && list[2] == "as")) {
// qt6
result << (list[1].replace(".", "/"));
@ -33,7 +33,7 @@ QStringList QML::extractImportLine(const QString& line) const {
return result;
}
QStringList QML::extractImportsFromFile(const QString &filepath) const {
QStringList QMLQt5::extractImportsFromFile(const QString &filepath) const {
QStringList imports;
QFile F(filepath);
if (!F.open(QIODevice::ReadOnly)) return QStringList();
@ -65,7 +65,7 @@ QStringList QML::extractImportsFromFile(const QString &filepath) const {
return imports;
}
bool QML::extractImportsFromDir(const QString &path, bool recursive) {
bool QMLQt5::extractImportsFromDir(const QString &path, bool recursive) {
QDir dir(path);
if (!dir.isReadable()) {
@ -82,33 +82,22 @@ bool QML::extractImportsFromDir(const QString &path, bool recursive) {
for (const auto &import : qAsConst(imports)) {
if (!_imports.contains(import)) {
_imports.insert(import);
extractImportsFromDir(getPathFromImport(import), false);
extractImportsFromDir(getPathFromImport(import), recursive);
}
}
}
for (const auto& module: qAsConst(qmlmodule)) {
QStringList imports = extractImportsFromQmlModule(module.absoluteFilePath());
imports += extractImportsFromFile(module.absoluteFilePath());
for (const auto &import : qAsConst(imports)) {
if (!_imports.contains(import)) {
_imports.insert(import);
extractImportsFromDir(getPathFromImport(import), false);
extractImportsFromDir(getPathFromImport(import), recursive);
}
}
}
// task https://github.com/QuasarApp/CQtDeployer/issues/600
// There are no import lines for the qt models module in Qt 6.1, but this module is required for all qml applications.
if (_qtVersion & QtMajorVersion::Qt6) {
auto importQtQml = "QtQml";
if (!_imports.contains(importQtQml)) {
_imports.insert(importQtQml);
extractImportsFromDir(getPathFromImport(importQtQml), false);
}
}
if (recursive) {
for (const auto &info: dirs) {
extractImportsFromDir(info.absoluteFilePath(), recursive);
@ -118,7 +107,7 @@ bool QML::extractImportsFromDir(const QString &path, bool recursive) {
return true;
}
QString QML::getPathFromImport(const QString &import, bool checkVersions) {
QString QMLQt5::getPathFromImport(const QString &import, bool checkVersions) {
if (!import.contains("#")) {
// qt 6
auto info = QFileInfo(_qmlRoot + "/" + import);
@ -136,6 +125,7 @@ QString QML::getPathFromImport(const QString &import, bool checkVersions) {
} else {
return "";
}
QRegularExpression matcher;
matcher.setPattern("[/\\\\]");
auto words = importData.value(index).split(matcher);
@ -161,7 +151,7 @@ QString QML::getPathFromImport(const QString &import, bool checkVersions) {
return info.absoluteFilePath();
}
bool QML::deployPath(const QString &path, QStringList &res) {
bool QMLQt5::deployPath(const QString &path, QStringList &res) {
QDir dir(path);
auto infoList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
@ -178,7 +168,7 @@ bool QML::deployPath(const QString &path, QStringList &res) {
return true;
}
bool QML::scanQmlTree(const QString &qmlTree) {
bool QMLQt5::scanQmlTree(const QString &qmlTree) {
QDir dir(qmlTree);
if (!dir.isReadable()) {
@ -198,7 +188,7 @@ bool QML::scanQmlTree(const QString &qmlTree) {
return true;
}
QStringList QML::extractImportsFromQmlModule(const QString &module) const {
QStringList QMLQt5::extractImportsFromQmlModule(const QString &module) const {
QStringList imports;
QFile F(module);
if (!F.open(QIODevice::ReadOnly)) return QStringList();
@ -217,17 +207,12 @@ QStringList QML::extractImportsFromQmlModule(const QString &module) const {
return imports;
}
void QML::setQtVersion(const QtMajorVersion &qtVersion) {
_qtVersion = qtVersion;
}
QML::QML(const QString &qmlRoot, QtMajorVersion qtVersion) {
_qmlRoot = qmlRoot;
setQtVersion(qtVersion);
QMLQt5::QMLQt5(const QString &qmlRoot): iQML(qmlRoot) {}
}
QMLQt5::~QMLQt5() {}
bool QML::scan(QStringList &res, const QString& _qmlProjectDir) {
bool QMLQt5::scan(QStringList &res, const QString& _qmlProjectDir) {
if (!scanQmlTree(_qmlRoot)) {
return false;

@ -1,19 +1,18 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#ifndef QML_DEPLY_H
#define QML_DEPLY_H
#ifndef QML_QT5_DEPLY_H
#define QML_QT5_DEPLY_H
#include <QSet>
#include <QStringList>
#include "deploy_global.h"
#include "deploycore.h"
#include "iqml.h"
class DEPLOYSHARED_EXPORT QML {
class DEPLOYSHARED_EXPORT QMLQt5: public iQML {
private:
QStringList extractImportsFromFile(const QString &filepath) const;
@ -25,22 +24,20 @@ private:
bool deployPath( const QString& path, QStringList& res);
bool scanQmlTree(const QString& qmlTree);
QStringList extractImportsFromQmlModule(const QString& module) const;
QString _qmlRoot = "";
QSet<QString> _imports;
QSet<QString> secondVersions;
QtMajorVersion _qtVersion = QtMajorVersion::Qt5;
QStringList extractImportLine(const QString &line) const;
public:
QML(const QString& qmlRoot, QtMajorVersion isQt6);
QMLQt5(const QString& qmlRoot);
~QMLQt5() override;
bool scan(QStringList &res, const QString &_qmlProjectDir);
void setQtVersion(const QtMajorVersion &qtVersion);
bool scan(QStringList &res, const QString &_qmlProjectDir) override;
friend class deploytest;
friend class QmlScanerTest;
friend class QMLExtractTest;
};
#endif // QML_DEPLY_H
#endif // QML_QT5_DEPLY_H

226
src/Deploy/src/qmlqt6.cpp Normal file

@ -0,0 +1,226 @@
/*
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "qmlqt6.h"
#include <QDir>
#include <QFile>
#include "defines.h"
#include "deploycore.h"
#include "qregularexpression.h"
QStringList QMLQt6::extractImportLine(const QString& line) const {
QStringList result;
QStringList list = line.split(" ", splitbehavior);
result << (list[1].replace(".", "/"));
return result;
return result;
}
QStringList QMLQt6::extractImportsFromFile(const QString &filepath) const {
QStringList imports;
QFile F(filepath);
if (!F.open(QIODevice::ReadOnly)) return QStringList();
QString content = F.readAll();
QRegularExpression matcher;
matcher.setPattern("\\{(.*)\\}");
content.remove(matcher);
matcher.setPattern("/\\*(.*)\\*/");
content.remove(matcher);
// Replace optional imports to restrict option, because before Qt 6.3 The Qml app needee of optional qml packas.
content.replace("optional import", "import");
const auto list = content.split("\n");
for (const QString &line : list)
for (QString &word : line.split(";", splitbehavior))
{
word = word.simplified();
if (word.startsWith("//")) continue;
if (!word.startsWith("import")) continue;
imports += extractImportLine(word);
}
return imports;
}
bool QMLQt6::extractImportsFromDir(const QString &path, bool recursive) {
QDir dir(path);
if (!dir.isReadable()) {
return false;
}
auto files = dir.entryInfoList(QStringList() << "*.qml" << "*.QML", QDir::Files);
auto qmlmodule = dir.entryInfoList(QStringList() << "qmldir", QDir::Files);
auto dirs = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs);
for (const auto &info: files) {
auto imports = extractImportsFromFile(info.absoluteFilePath());
for (const auto &import : qAsConst(imports)) {
if (!_imports.contains(import)) {
_imports.insert(import);
extractImportsFromDir(getPathFromImport(import), false);
}
}
}
for (const auto& module: qAsConst(qmlmodule)) {
QStringList imports = extractImportsFromQmlModule(module.absoluteFilePath());
imports += extractImportsFromFile(module.absoluteFilePath());
for (const auto &import : qAsConst(imports)) {
if (!_imports.contains(import)) {
_imports.insert(import);
extractImportsFromDir(getPathFromImport(import), false);
}
}
}
// task https://github.com/QuasarApp/CQtDeployer/issues/600
// There are no import lines for the qt models module in Qt 6.1, but this module is required for all qml applications.
auto importQtQml = "QtQml";
if (!_imports.contains(importQtQml)) {
_imports.insert(importQtQml);
extractImportsFromDir(getPathFromImport(importQtQml), false);
}
if (recursive) {
for (const auto &info: dirs) {
extractImportsFromDir(info.absoluteFilePath(), recursive);
}
}
return true;
}
QString QMLQt6::getPathFromImport(const QString &import, bool checkVersions) {
if (!import.contains("#")) {
// qt 6
auto info = QFileInfo(_qmlRoot + "/" + import);
return info.absoluteFilePath();
}
auto importData = import.split("#");
int index;
if (importData.size() == 2)
index = 1;
else if (!importData.isEmpty()) {
index = 0;
} else {
return "";
}
QRegularExpression matcher;
matcher.setPattern("[/\\\\]");
auto words = importData.value(index).split(matcher);
const bool isSecond = importData.first() == "2" && checkVersions;
bool secondVersion = isSecond;
QString path;
for (auto i = words.rbegin(); i != words.rend(); ++i) {
QString word = *i;
if (secondVersion && secondVersions.contains(word)) {
secondVersion = false;
word.push_back(".2");
}
path.push_front(word + "/");
}
auto info = QFileInfo(_qmlRoot + "/" + path);
if (isSecond && !info.exists()) {
return getPathFromImport(import, false);
}
return info.absoluteFilePath();
}
bool QMLQt6::deployPath(const QString &path, QStringList &res) {
QDir dir(path);
auto infoList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
for (const auto &info : qAsConst(infoList)) {
if (DeployCore::isDebugFile(info.fileName())) {
QuasarAppUtils::Params::log("Skip debug library " +
info.absoluteFilePath());
continue;
}
res.push_back(info.absoluteFilePath());
}
return true;
}
bool QMLQt6::scanQmlTree(const QString &qmlTree) {
QDir dir(qmlTree);
if (!dir.isReadable()) {
return false;
}
auto list = dir.entryInfoList( QDir::Dirs | QDir::NoDotAndDotDot);
for (const auto &info : list) {
if (info.fileName().contains(".2")) {
secondVersions.insert(info.fileName().left(info.fileName().size() - 2));
}
scanQmlTree(info.absoluteFilePath());
}
return true;
}
QStringList QMLQt6::extractImportsFromQmlModule(const QString &module) const {
QStringList imports;
QFile F(module);
if (!F.open(QIODevice::ReadOnly)) return QStringList();
QString content = F.readAll();
const auto list = content.split("\n");
for (QString line : list) {
line = line.simplified();
if (line.startsWith("//") || line.startsWith("#")) continue;
if (!line.startsWith("depends")) continue;
imports += extractImportLine(line);
}
return imports;
}
QMLQt6::QMLQt6(const QString &qmlRoot): iQML(qmlRoot) {}
QMLQt6::~QMLQt6(){}
bool QMLQt6::scan(QStringList &res, const QString& _qmlProjectDir) {
if (!scanQmlTree(_qmlRoot)) {
return false;
}
if (!extractImportsFromDir(_qmlProjectDir, true)) {
return false;
}
for (const auto &import : qAsConst(_imports)) {
res.push_back(getPathFromImport(import));
}
return true;
}

45
src/Deploy/src/qmlqt6.h Normal file

@ -0,0 +1,45 @@
//#
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#ifndef QML_QT6_DEPLY_H
#define QML_QT6_DEPLY_H
#include <QSet>
#include <QStringList>
#include "iqml.h"
class DEPLOYSHARED_EXPORT QMLQt6: public iQML {
public:
QMLQt6(const QString& qmlRoot);
~QMLQt6() override;
bool scan(QStringList &res, const QString &_qmlProjectDir) override;
private:
QStringList extractImportsFromFile(const QString &filepath) const;
bool extractImportsFromDir(const QString &path, bool recursive = false);
QString getPathFromImport(const QString& import, bool checkVersions = true);
bool deployPath( const QString& path, QStringList& res);
bool scanQmlTree(const QString& qmlTree);
QStringList extractImportsFromQmlModule(const QString& module) const;
QStringList extractImportLine(const QString &line) const;
QSet<QString> _imports;
QSet<QString> secondVersions;
friend class deploytest;
friend class QmlScanerTest;
friend class QMLExtractTest;
};
#endif // QML_QT6_DEPLY_H

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -12,8 +12,27 @@ QtMajorVersion QtDir::getQtVersion() const {
return _qtVersion;
}
void QtDir::setQtVersion(const QtMajorVersion &qtVersion) {
_qtVersion = qtVersion;
QString QtDir::toString() const {
return QString {
"Qt Inforamtion: \n"
"Platform: %0\n"
"Major version: %1\n"
"Binaries dir: %2\n"
"Libraries dir: %3\n"
"Libexecs dir: %4\n"
"Plugins dir: %5\n"
"QMLs dir: %6\n"
"Translations dir: %7\n"
"Resources dir: %8\n"
}.arg(DeployCore::platformToString(_platform),
QString::number(DeployCore::qtVersionToString(_qtVersion)),
bins,
libs,
libexecs,
plugins,
qmls,
translations,
resources);
}
QString QtDir::getLibs() const {
@ -22,6 +41,18 @@ QString QtDir::getLibs() const {
void QtDir::setLibs(const QString &value) {
libs = PathUtils::fixPath(value);
auto qtLibs = QDir(libs).entryList(QDir::Files);
if (qtLibs.contains("libQt4Core.so")) {
_qtVersion = QtMajorVersion::Qt4;
_platform = Unix;
} else if (qtLibs.contains("libQt5Core.so")) {
_qtVersion = QtMajorVersion::Qt5;
_platform = Unix;
} else if (qtLibs.contains("libQt6Core.so")) {
_qtVersion = QtMajorVersion::Qt6;
_platform = Unix;
}
}
QString QtDir::getBins() const {
@ -30,6 +61,18 @@ QString QtDir::getBins() const {
void QtDir::setBins(const QString &value) {
bins = PathUtils::fixPath(value);
auto qtLibs = QDir(bins).entryList(QDir::Files);
if (qtLibs.contains("Qt4Core.dll", Qt::CaseInsensitive)) {
_qtVersion = QtMajorVersion::Qt4;
_platform = Win;
} else if (qtLibs.contains("Qt5Core.dll", Qt::CaseInsensitive)) {
_qtVersion = QtMajorVersion::Qt5;
_platform = Win;
} else if (qtLibs.contains("Qt6Core.dll", Qt::CaseInsensitive)) {
_qtVersion = QtMajorVersion::Qt6;
_platform = Win;
}
}
QString QtDir::getLibexecs() const {
@ -74,11 +117,7 @@ void QtDir::setResources(const QString &value) {
}
Platform QtDir::getQtPlatform() const {
return qtPlatform;
}
void QtDir::setQtPlatform(const Platform &value) {
qtPlatform = value;
return _platform;
}
bool QtDir::isQt(QString path) const {

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
@ -9,10 +9,11 @@
#define QTDIR_H
#include <QDir>
#include <humanreadableobject.h>
#include "deploy_global.h"
#include "deploycore.h"
class DEPLOYSHARED_EXPORT QtDir {
class DEPLOYSHARED_EXPORT QtDir: QuasarAppUtils::iHRO {
QString libs;
QString bins;
QString libexecs;
@ -21,9 +22,9 @@ class DEPLOYSHARED_EXPORT QtDir {
QString translations;
QString resources;
Platform qtPlatform = UnknownPlatform;
Platform _platform = UnknownPlatform;
QtMajorVersion _qtVersion;
QtMajorVersion _qtVersion = NoQt;
public:
QString getLibs() const;
void setLibs(const QString &value);
@ -40,7 +41,6 @@ public:
QString getResources() const;
void setResources(const QString &value);
Platform getQtPlatform() const;
void setQtPlatform(const Platform &value);
/**
* @brief isQt - This method check a path for belonging to QtDirs.
@ -54,7 +54,8 @@ public:
* @return the masjor version of qt
*/
QtMajorVersion getQtVersion() const;
void setQtVersion(const QtMajorVersion &qtVersion);
QString toString() const override;
};
#endif // QTDIR_H

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,13 +1,11 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#include "targetinfo.h"
#include "deploycore.h"
#include "deployconfig.h"
TargetInfo::TargetInfo() {
@ -101,5 +99,3 @@ void TargetInfo::setFEnableRunScript(bool newFEnableRunScript) {
void TargetInfo::disableRunScript() {
setFEnableRunScript(false);
}

@ -1,5 +1,5 @@
//#
//# Copyright (C) 2018-2022 QuasarApp.
//# Copyright (C) 2018-2023 QuasarApp.
//# Distributed under the lgplv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
#
# Copyright (C) 2020-2022 QuasarApp.
# Copyright (C) 2020-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1 +1 @@
Subproject commit 7ff9620735e269be06a1eb846e11b3e7d56a298f
Subproject commit a23bbe92689b472c69b73d0e49646de991a0390f

@ -1 +1 @@
Subproject commit b7193d815a1bd9722abd081f4739ac37a91bd868
Subproject commit fefb8d6acc78b5f63d5a78b86a4900e694bd2862

@ -1,5 +1,5 @@
#
# Copyright (C) 2020-2022 QuasarApp.
# Copyright (C) 2020-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
@ -14,9 +14,10 @@ add_subdirectory(TestCPPOnly)
add_subdirectory(TestOnlyC)
add_subdirectory(TestQMLWidgets)
add_subdirectory(TestQtWidgets)
add_subdirectory(virtualkeyboard)
if (NOT WIN32)
add_subdirectory(QMLFileDialog)
add_subdirectory(virtualkeyboard)
add_subdirectory(quicknanobrowser)
add_subdirectory(webui)
endif()

@ -0,0 +1,21 @@
cmake_minimum_required(VERSION 3.16)
project(QMLFileDialog LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 COMPONENTS Quick REQUIRED)
qt_add_executable(QMLFileDialog
main.cpp
)
qt_add_qml_module(QMLFileDialog
URI QMLFileDialog
VERSION 1.0
QML_FILES main.qml
)
target_link_libraries(QMLFileDialog
PRIVATE Qt6::Quick)

@ -0,0 +1,19 @@
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
const QUrl url(u"qrc:/QMLFileDialog/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();
}

@ -0,0 +1,33 @@
import QtCore
import QtQuick
import QtQuick.Dialogs
import QtQuick.Controls
ApplicationWindow {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
header: ToolBar {
Button {
text: qsTr("Choose Image...")
onClicked: fileDialog.open()
}
}
Image {
id: image
anchors.fill: parent
fillMode: Image.PreserveAspectFit
}
FileDialog {
id: fileDialog
currentFolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]
onAccepted: image.source = selectedFile
}
}

@ -1,5 +1,5 @@
#
# Copyright (C) 2021-2022 QuasarApp.
# Copyright (C) 2021-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
#
# Copyright (C) 2021-2022 QuasarApp.
# Copyright (C) 2021-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
#
# Copyright (C) 2020-2022 QuasarApp.
# Copyright (C) 2020-2023 QuasarApp.
# Distributed under the GPLv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2022 QuasarApp.
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.

@ -1,3 +1,10 @@
/*
* Copyright (C) 2023-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "modulesqt515.h"
ModulesQt515::ModulesQt515()

@ -1,3 +1,10 @@
/*
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef MODULESQT515_H
#define MODULESQT515_H

@ -1,3 +1,10 @@
/*
* Copyright (C) 2023-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "modulesqt5152.h"
ModulesQt5152::ModulesQt5152()

@ -1,3 +1,10 @@
/*
* Copyright (C) 2018-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef MODULESQT5152_H
#define MODULESQT5152_H

@ -1,3 +1,10 @@
/*
* Copyright (C) 2023-2023 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "modulesqt6_3.h"
ModulesQt63::ModulesQt63() {
@ -397,6 +404,9 @@ QSet<QString> ModulesQt63::qmlLibs(const QString &distDir) const {
"./" + distDir + "/qml/QtQuick/plugins.qmltypes",
"./" + distDir + "/qml/QtQuick/qmldir",
"./" + distDir + "/qml/QtQuick/qtquick2plugin.dll",
"./" + distDir + "/plugins/tls/qcertonlybackend.dll",
"./" + distDir + "/plugins/tls/qopensslbackend.dll",
"./" + distDir + "/plugins/tls/qschannelbackend.dll",
"./" + distDir + "/translations/qtdeclarative_ar.qm",
"./" + distDir + "/translations/qtdeclarative_bg.qm",
"./" + distDir + "/translations/qtdeclarative_ca.qm",

Some files were not shown because too many files have changed in this diff Show More