From a2c796b62a4520fd628c231bea5687b64970fd50 Mon Sep 17 00:00:00 2001 From: EndrII Date: Mon, 8 Aug 2022 22:45:58 +0300 Subject: [PATCH 01/76] remove submodules --- .gitmodules | 15 --------------- QuasarAppLib | 1 - QuasarAppScripts | 1 - pe | 1 - qtTools | 1 - zip | 1 - 6 files changed, 20 deletions(-) delete mode 160000 QuasarAppLib delete mode 160000 QuasarAppScripts delete mode 160000 pe delete mode 160000 qtTools delete mode 160000 zip diff --git a/.gitmodules b/.gitmodules index 99847480..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,15 +0,0 @@ -[submodule "QuasarAppLib"] - path = QuasarAppLib - url = https://github.com/QuasarApp/QuasarAppLib.git -[submodule "qtTools"] - path = qtTools - url = https://github.com/qt/qttools.git -[submodule "pe"] - path = pe - url = https://github.com/QuasarApp/pe-parse.git -[submodule "QuasarAppScripts"] - path = QuasarAppScripts - url = https://github.com/QuasarApp/QuasarAppScripts.git -[submodule "zip"] - path = zip - url = https://github.com/QuasarApp/zip.git diff --git a/QuasarAppLib b/QuasarAppLib deleted file mode 160000 index d69306c1..00000000 --- a/QuasarAppLib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d69306c1210fe6def35cf0ff7323e3e82f9ae8f4 diff --git a/QuasarAppScripts b/QuasarAppScripts deleted file mode 160000 index f680b277..00000000 --- a/QuasarAppScripts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f680b277968f6bbd966a7dcfe2014dbb343fefd2 diff --git a/pe b/pe deleted file mode 160000 index f681c21b..00000000 --- a/pe +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f681c21b7b2c6232b3252a4025a4b94c8d960d65 diff --git a/qtTools b/qtTools deleted file mode 160000 index cc52debd..00000000 --- a/qtTools +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cc52debd905e0ed061290d6fd00a5f1ab67478a5 diff --git a/zip b/zip deleted file mode 160000 index 76651e2d..00000000 --- a/zip +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 76651e2d614612718d9a8ec21f0a91da394e0506 From 32d2203c7f533ba3c332f7f5dd7a492c21c4fa80 Mon Sep 17 00:00:00 2001 From: EndrII Date: Mon, 8 Aug 2022 22:46:51 +0300 Subject: [PATCH 02/76] restructure project --- CMakeLists.txt | 62 +- CQtDeployer.pro | 78 --- CQtDeployer/CQtDeployer.pro | 44 -- Deploy/Deploy.pri | 25 - Deploy/Deploy.pro | 129 ---- QIFData/InstallerBase.pri | 64 -- QIFData/QIF.pri | 27 - QIFData/config/banner.png | Bin 392487 -> 0 bytes QIFData/config/configLinux.xml | 26 - QIFData/config/configWin.xml | 26 - QIFData/config/controlScript.js | 53 -- QIFData/config/icon.ico | Bin 39353 -> 0 bytes QIFData/config/logo.png | Bin 24729 -> 0 bytes QIFData/config/ru.ts | 53 -- QIFData/config/style.css | 61 -- QIFData/installerCQtDeployer.pri | 163 ----- QIFData/packages/QIF/meta/package.xml | 8 - .../cqtdeployer.1_5/data/1.5/icon.png | Bin 143802 -> 0 bytes .../cqtdeployer.1_5/meta/installscript.js | 152 ---- .../packages/cqtdeployer.1_5/meta/package.xml | 14 - QIFData/packages/cqtdeployer.1_5/meta/ru.ts | 53 -- QIFData/packages/cqtdeployer/meta/package.xml | 10 - QIFData/scripts/QIF.py | 39 -- QIFData/scripts/alias.py | 12 - QIFData/scripts/alias/cqt.sh | 7 - UnitTests/.gitignore | 73 -- UnitTests/UnitTests.pro | 58 -- UnitTests/res.qrc | 25 - UnitTests/testRes/TestTr.qm | 1 - UnitTests/testRes/win32/mingw/libEGL.dll | Bin 22016 -> 0 bytes .../testRes/win32/msvc/qtaudio_windows.dll | Bin 44032 -> 0 bytes UnitTests/testRes/win64/mingw/Deploy.dll | Bin 198144 -> 0 bytes UnitTests/testRes/win64/msvc/lib.dll | Bin 27648 -> 0 bytes _config.yml | 1 - doxygen.conf | 28 +- examples/TestQMLWidgets/.qmake.stash | 24 - examples/TestQMLWidgets/HomeForm.ui.qml | 14 - examples/TestQMLWidgets/Page1Form.ui.qml | 14 - examples/TestQMLWidgets/Page2Form.ui.qml | 14 - examples/TestQMLWidgets/README.md | 16 - examples/TestQMLWidgets/TestQMLWidgets.pro | 27 - examples/TestQMLWidgets/main.cpp | 16 - examples/TestQMLWidgets/main.qml | 65 -- examples/TestQMLWidgets/qml.qrc | 9 - examples/TestQMLWidgets/qtquickcontrols2.conf | 6 - examples/TestQMLWidgets/snap/snapcraft.yaml | 53 -- .../TestQMLWidgets/wrapper/bin/desktop-launch | 442 ------------ md/Marketplace/CqtDeployer-Manifest.json | 40 -- md/Marketplace/Marketplace.md | 33 - md/README.md | 13 - md/_config.yml | 1 - md/en/1_4.md | 422 ----------- md/en/1_5.md | 158 ----- md/en/Build-and-Install.md | 90 --- md/en/Changelog.md | 363 ---------- md/en/CompareFeatures.md | 17 - md/en/CustomScripts.md | 69 -- md/en/DEB.md | 101 --- md/en/DeployConfigFile.md | 228 ------ md/en/Description.md | 9 - md/en/DisableShortcats.md | 19 - md/en/EnvironmentVariables.md | 50 -- md/en/ExtraFiles.md | 107 --- md/en/ExtractDefaultsTemplates.md | 49 -- md/en/Guide.md | 550 --------------- md/en/Home.md | 26 - md/en/Options.md | 174 ----- md/en/Packing.md | 139 ---- md/en/QIF.md | 176 ----- md/en/QuickGuide.md | 81 --- md/en/ReleaseReviews.md | 4 - md/en/ZIP.md | 47 -- md/ru/1_4.md | 409 ----------- md/ru/1_5.md | 157 ----- md/ru/Build-and-Install.md | 86 --- md/ru/Changelog.md | 346 --------- md/ru/CompareFeatures.md | 15 - md/ru/CustomScripts.md | 68 -- md/ru/DEB.md | 100 --- md/ru/DeployConfigFile.md | 226 ------ md/ru/Description.md | 9 - md/ru/DisableShortcats.md | 19 - md/ru/EnvironmentVariables.md | 46 -- md/ru/ExtraFiles.md | 107 --- md/ru/ExtractDefaultsTemplates.md | 56 -- md/ru/Guide.md | 536 -------------- md/ru/Home.md | 26 - md/ru/Options.md | 171 ----- md/ru/Packing.md | 138 ---- md/ru/QIF.md | 175 ----- md/ru/QuickGuide.md | 81 --- md/ru/ReleaseReviews.md | 4 - md/ru/ZIP.md | 47 -- md/screenshots/customStyle.png | Bin 26438 -> 0 bytes md/screenshots/defaultStyle.png | Bin 16985 -> 0 bytes md/screenshots/quasaraStyle.png | Bin 24609 -> 0 bytes plug.pro | 5 + src/CQtDeployer/CMakeLists.txt | 147 ++++ src/CQtDeployer/Deploy/CQtDeployer.json | 27 + src/CQtDeployer/Deploy/CQtDeployer.json.in | 27 + .../ru.ts => src/CQtDeployer/languages/de.ts | 0 .../ru.ts => src/CQtDeployer/languages/en.ts | 0 src/CQtDeployer/languages/es.ts | 4 + src/CQtDeployer/languages/fr.ts | 4 + src/CQtDeployer/languages/ja.ts | 4 + src/CQtDeployer/languages/pl.ts | 4 + src/CQtDeployer/languages/ru.ts | 4 + src/CQtDeployer/languages/tr.ts | 4 + src/CQtDeployer/languages/uk.ts | 4 + src/CQtDeployer/languages/zh.ts | 4 + {CQtDeployer => src/CQtDeployer}/main.cpp | 0 src/Deploy/CMakeLists.txt | 49 ++ src/Deploy/CQtDeployer.qrc | 9 + src/Deploy/languages/en.ts | 4 + .../Deploy/src}/DeployResources.qrc | 0 .../src}/Distributions/Templates/Icon.ico | Bin .../src}/Distributions/Templates/Icon.png | Bin .../Templates/deb/DEBIAN/control | 0 .../Templates/deb/DEBIAN/postinst | 0 .../Distributions/Templates/deb/DEBIAN/prerm | 0 .../Templates/qif/Styles/quasar.css | 0 .../Templates/qif/Styles/quasarDark.css | 0 .../qif/config custom designe/config.xml | 0 .../config custom designe/controlScript.qs | 0 .../qif/config custom designe/style.css | 0 .../Templates/qif/config/config.xml | 0 .../Templates/qif/config/controlScript.qs | 0 .../packages/default/meta/installscript.qs | 0 .../qif/packages/default/meta/package.xml | 0 .../Init multiPackage configuration.json | 0 .../configures/Init single configuration.json | 0 .../src}/Distributions/configures/Init.json | 0 .../Deploy/src}/Distributions/deb.cpp | 0 .../Deploy/src}/Distributions/deb.h | 0 .../src}/Distributions/defaultdistro.cpp | 0 .../Deploy/src}/Distributions/defaultdistro.h | 0 .../src}/Distributions/idistribution.cpp | 0 .../Deploy/src}/Distributions/idistribution.h | 0 .../Deploy/src}/Distributions/qif.cpp | 0 .../Deploy/src}/Distributions/qif.h | 0 .../src}/Distributions/templateinfo.cpp | 0 .../Deploy/src}/Distributions/templateinfo.h | 0 .../Deploy/src}/Distributions/ziparhive.cpp | 0 .../Deploy/src}/Distributions/ziparhive.h | 0 .../Deploy/src}/ScriptsTemplates/linux.sh | 0 .../Deploy/src}/ScriptsTemplates/windows.bat | 0 {Deploy => src/Deploy/src}/configparser.cpp | 0 {Deploy => src/Deploy/src}/configparser.h | 0 {Deploy => src/Deploy/src}/defines.h | 0 .../Deploy/src}/dependenciesscanner.cpp | 0 .../Deploy/src}/dependenciesscanner.h | 0 {Deploy => src/Deploy/src}/dependencymap.cpp | 0 {Deploy => src/Deploy/src}/dependencymap.h | 0 {Deploy => src/Deploy/src}/deploy.cpp | 0 {Deploy => src/Deploy/src}/deploy.h | 0 {Deploy => src/Deploy/src}/deploy_global.h | 0 {Deploy => src/Deploy/src}/deployconfig.cpp | 0 {Deploy => src/Deploy/src}/deployconfig.h | 0 {Deploy => src/Deploy/src}/deploycore.cpp | 0 {Deploy => src/Deploy/src}/deploycore.h | 0 {Deploy => src/Deploy/src}/distromodule.cpp | 0 {Deploy => src/Deploy/src}/distromodule.h | 0 {Deploy => src/Deploy/src}/distrostruct.cpp | 0 {Deploy => src/Deploy/src}/distrostruct.h | 0 {Deploy => src/Deploy/src}/elf_type.cpp | 0 {Deploy => src/Deploy/src}/elf_type.h | 0 {Deploy => src/Deploy/src}/envirement.cpp | 0 {Deploy => src/Deploy/src}/envirement.h | 0 {Deploy => src/Deploy/src}/extra.cpp | 0 {Deploy => src/Deploy/src}/extra.h | 0 {Deploy => src/Deploy/src}/extracter.cpp | 0 {Deploy => src/Deploy/src}/extracter.h | 0 {Deploy => src/Deploy/src}/filemanager.cpp | 0 {Deploy => src/Deploy/src}/filemanager.h | 0 .../Deploy/src}/generalfiles_type.cpp | 0 .../Deploy/src}/generalfiles_type.h | 0 {Deploy => src/Deploy/src}/igetlibinfo.cpp | 0 {Deploy => src/Deploy/src}/igetlibinfo.h | 0 {Deploy => src/Deploy/src}/ignorerule.cpp | 0 {Deploy => src/Deploy/src}/ignorerule.h | 0 {Deploy => src/Deploy/src}/libinfo.cpp | 0 {Deploy => src/Deploy/src}/libinfo.h | 0 .../Deploy/src}/metafilemanager.cpp | 0 {Deploy => src/Deploy/src}/metafilemanager.h | 0 {Deploy => src/Deploy/src}/packagecontrol.cpp | 0 {Deploy => src/Deploy/src}/packagecontrol.h | 0 {Deploy => src/Deploy/src}/packing.cpp | 0 {Deploy => src/Deploy/src}/packing.h | 0 {Deploy => src/Deploy/src}/pathutils.cpp | 0 {Deploy => src/Deploy/src}/pathutils.h | 0 {Deploy => src/Deploy/src}/pe_type.cpp | 0 {Deploy => src/Deploy/src}/pe_type.h | 0 {Deploy => src/Deploy/src}/pluginsparser.cpp | 0 {Deploy => src/Deploy/src}/pluginsparser.h | 0 {Deploy => src/Deploy/src}/qml.cpp | 0 {Deploy => src/Deploy/src}/qml.h | 0 {Deploy => src/Deploy/src}/qtdir.cpp | 0 {Deploy => src/Deploy/src}/qtdir.h | 0 {Deploy => src/Deploy/src}/targetdata.cpp | 0 {Deploy => src/Deploy/src}/targetdata.h | 0 {Deploy => src/Deploy/src}/targetinfo.cpp | 0 {Deploy => src/Deploy/src}/targetinfo.h | 0 {Deploy => src/Deploy/src}/zipcompresser.cpp | 0 {Deploy => src/Deploy/src}/zipcompresser.h | 0 test.pri | 30 - tests/CMakeLists.txt | 29 + tests/TestCPPOnly/TestCPPOnly.pro | 10 - tests/TestCPPOnly/conf.qrc | 5 - tests/TestCPPOnly/main.cpp | 9 - tests/TestCPPOnly/qt.conf | 0 tests/TestOnlyC/TestOnlyC.pro | 10 - tests/TestOnlyC/conf.qrc | 5 - tests/TestOnlyC/main.cpp | 9 - tests/TestOnlyC/qt.conf | 0 tests/TestQMLWidgets/HomeForm.ui.qml | 14 - tests/TestQMLWidgets/Page1Form.ui.qml | 14 - tests/TestQMLWidgets/Page2Form.ui.qml | 14 - tests/TestQMLWidgets/TestQMLWidgets.pro | 28 - tests/TestQMLWidgets/conf.qrc | 5 - tests/TestQMLWidgets/main.cpp | 19 - tests/TestQMLWidgets/main.qml | 65 -- tests/TestQMLWidgets/qml.qrc | 9 - tests/TestQMLWidgets/qtquickcontrols2.conf | 6 - tests/TestQtWidgets/TestQtWidgets.pro | 41 -- tests/TestQtWidgets/conf.qrc | 5 - tests/TestQtWidgets/main.cpp | 16 - tests/TestQtWidgets/mainwindow.cpp | 14 - tests/TestQtWidgets/mainwindow.h | 22 - tests/TestQtWidgets/mainwindow.ui | 24 - tests/TestQtWidgets/qt.conf | 2 - tests/quicknanobrowser/ApplicationRoot.qml | 89 --- tests/quicknanobrowser/BrowserDialog.qml | 74 -- tests/quicknanobrowser/BrowserWindow.qml | 654 ------------------ tests/quicknanobrowser/DownloadView.qml | 175 ----- .../FullScreenNotification.qml | 109 --- .../doc/images/quicknanobrowser-demo.jpg | Bin 30156 -> 0 bytes .../doc/src/quicknanobrowser.qdoc | 149 ---- tests/quicknanobrowser/icons/3rdparty/COPYING | 1 - .../icons/3rdparty/go-next.png | Bin 930 -> 0 bytes .../icons/3rdparty/go-previous.png | Bin 955 -> 0 bytes .../icons/3rdparty/process-stop.png | Bin 1272 -> 0 bytes .../icons/3rdparty/qt_attribution.json | 24 - .../icons/3rdparty/view-refresh.png | Bin 1364 -> 0 bytes tests/quicknanobrowser/main.cpp | 98 --- tests/quicknanobrowser/quicknanobrowser.pro | 25 - tests/quicknanobrowser/resources.qrc | 15 - tests/quicknanobrowser/utils.h | 70 -- .../DEBCustomTemplate/chrome/DEBIAN/control | 0 .../DEBCustomTemplate/chrome/DEBIAN/postinst | 0 .../DEBCustomTemplate/chrome/DEBIAN/postrm | 0 .../DEBCustomTemplate/chrome/DEBIAN/prerm | 0 .../QIFCustomTemplate/config/config.xml | 0 .../QIFCustomTemplate/config/style.qss | 0 .../testRes/QIFCustomTemplate/customRes.qrc | 0 .../QIFCustomTemplate/customconfig.xml | 0 .../meta/installscript.qs | 0 .../meta/package.xml | 0 .../meta/installscript.qs | 0 .../meta/package.xml | 0 {UnitTests => tests}/testRes/TestIcon.png | Bin .../testRes/TestQMLWidgets.sh | 0 {UnitTests => tests}/testRes/Unix/Start | Bin {UnitTests => tests}/testRes/Unix/lib.so.1 | Bin .../testRes/customRunScript.sh | 0 {UnitTests => tests}/testRes/debugLibData | Bin {UnitTests => tests}/testRes/qml/Scene | 0 {UnitTests => tests}/testRes/qml/SceneQt6 | 0 {UnitTests => tests}/testRes/qml/qmldir | 0 .../testRes/testMultiPackageConfig.json | 0 .../testRes/win32/mingw/hanoi-towers.exe | Bin .../testRes/win32/msvc/TestStart.exe | Bin .../testRes/win64/mingw/cqtdeployer.exe | Bin .../testRes/win64/msvc/exe.exe | Bin tests/tstMain.cpp | 86 +++ {UnitTests => tests/units}/libcreator.cpp | 0 {UnitTests => tests/units}/libcreator.h | 0 {UnitTests => tests/units}/modules.cpp | 0 {UnitTests => tests/units}/modules.h | 0 {UnitTests => tests/units}/modulesqt513.cpp | 0 {UnitTests => tests/units}/modulesqt513.h | 0 {UnitTests => tests/units}/modulesqt514.cpp | 0 {UnitTests => tests/units}/modulesqt514.h | 0 {UnitTests => tests/units}/modulesqt515.cpp | 0 {UnitTests => tests/units}/modulesqt515.h | 0 {UnitTests => tests/units}/modulesqt5152.cpp | 0 {UnitTests => tests/units}/modulesqt5152.h | 0 {UnitTests => tests/units}/qmlcreator.cpp | 0 {UnitTests => tests/units}/qmlcreator.h | 0 tests/units/test.cpp | 9 + tests/units/test.h | 20 + {UnitTests => tests/units}/testutils.cpp | 0 {UnitTests => tests/units}/testutils.h | 0 {UnitTests => tests/units}/tst_deploytest.cpp | 0 tests/virtualkeyboard/basic/Basic.qml | 146 ---- tests/virtualkeyboard/basic/basic-b2qt.qml | 174 ----- tests/virtualkeyboard/basic/basic.pro | 35 - .../basic/content/AutoScroller.qml | 104 --- .../basic/content/FloatingButton_Active.svg | 41 -- .../content/FloatingButton_Available.svg | 41 -- .../content/FloatingButton_Unavailable.svg | 39 -- .../basic/content/HandwritingModeButton.qml | 165 ----- .../basic/content/TextArea.qml | 53 -- .../basic/content/TextField.qml | 53 -- tests/virtualkeyboard/basic/demo.qrc | 13 - tests/virtualkeyboard/basic/main.cpp | 47 -- tests/virtualkeyboard/virtualkeyboard.pro | 3 - tests/webui/about.html | 129 ---- tests/webui/doc/images/webui-example.png | Bin 28862 -> 0 bytes tests/webui/main.cpp | 82 --- tests/webui/webui.pro | 15 - tests/webui/webui.qrc | 5 - tests/webui/webuihandler.cpp | 98 --- tests/webui/webuihandler.h | 70 -- 313 files changed, 514 insertions(+), 10882 deletions(-) delete mode 100644 CQtDeployer.pro delete mode 100644 CQtDeployer/CQtDeployer.pro delete mode 100644 Deploy/Deploy.pri delete mode 100644 Deploy/Deploy.pro delete mode 100644 QIFData/InstallerBase.pri delete mode 100644 QIFData/QIF.pri delete mode 100644 QIFData/config/banner.png delete mode 100644 QIFData/config/configLinux.xml delete mode 100644 QIFData/config/configWin.xml delete mode 100644 QIFData/config/controlScript.js delete mode 100644 QIFData/config/icon.ico delete mode 100644 QIFData/config/logo.png delete mode 100644 QIFData/config/ru.ts delete mode 100644 QIFData/config/style.css delete mode 100644 QIFData/installerCQtDeployer.pri delete mode 100644 QIFData/packages/QIF/meta/package.xml delete mode 100644 QIFData/packages/cqtdeployer.1_5/data/1.5/icon.png delete mode 100644 QIFData/packages/cqtdeployer.1_5/meta/installscript.js delete mode 100644 QIFData/packages/cqtdeployer.1_5/meta/package.xml delete mode 100644 QIFData/packages/cqtdeployer.1_5/meta/ru.ts delete mode 100644 QIFData/packages/cqtdeployer/meta/package.xml delete mode 100755 QIFData/scripts/QIF.py delete mode 100755 QIFData/scripts/alias.py delete mode 100755 QIFData/scripts/alias/cqt.sh delete mode 100644 UnitTests/.gitignore delete mode 100644 UnitTests/UnitTests.pro delete mode 100644 UnitTests/res.qrc delete mode 100755 UnitTests/testRes/TestTr.qm delete mode 100644 UnitTests/testRes/win32/mingw/libEGL.dll delete mode 100644 UnitTests/testRes/win32/msvc/qtaudio_windows.dll delete mode 100644 UnitTests/testRes/win64/mingw/Deploy.dll delete mode 100644 UnitTests/testRes/win64/msvc/lib.dll delete mode 100644 _config.yml delete mode 100644 examples/TestQMLWidgets/.qmake.stash delete mode 100644 examples/TestQMLWidgets/HomeForm.ui.qml delete mode 100644 examples/TestQMLWidgets/Page1Form.ui.qml delete mode 100644 examples/TestQMLWidgets/Page2Form.ui.qml delete mode 100644 examples/TestQMLWidgets/README.md delete mode 100644 examples/TestQMLWidgets/TestQMLWidgets.pro delete mode 100644 examples/TestQMLWidgets/main.cpp delete mode 100644 examples/TestQMLWidgets/main.qml delete mode 100644 examples/TestQMLWidgets/qml.qrc delete mode 100644 examples/TestQMLWidgets/qtquickcontrols2.conf delete mode 100644 examples/TestQMLWidgets/snap/snapcraft.yaml delete mode 100755 examples/TestQMLWidgets/wrapper/bin/desktop-launch delete mode 100644 md/Marketplace/CqtDeployer-Manifest.json delete mode 100644 md/Marketplace/Marketplace.md delete mode 100644 md/README.md delete mode 100644 md/_config.yml delete mode 100755 md/en/1_4.md delete mode 100755 md/en/1_5.md delete mode 100644 md/en/Build-and-Install.md delete mode 100755 md/en/Changelog.md delete mode 100644 md/en/CompareFeatures.md delete mode 100644 md/en/CustomScripts.md delete mode 100644 md/en/DEB.md delete mode 100644 md/en/DeployConfigFile.md delete mode 100644 md/en/Description.md delete mode 100644 md/en/DisableShortcats.md delete mode 100644 md/en/EnvironmentVariables.md delete mode 100644 md/en/ExtraFiles.md delete mode 100644 md/en/ExtractDefaultsTemplates.md delete mode 100644 md/en/Guide.md delete mode 100644 md/en/Home.md delete mode 100644 md/en/Options.md delete mode 100644 md/en/Packing.md delete mode 100644 md/en/QIF.md delete mode 100644 md/en/QuickGuide.md delete mode 100755 md/en/ReleaseReviews.md delete mode 100644 md/en/ZIP.md delete mode 100755 md/ru/1_4.md delete mode 100755 md/ru/1_5.md delete mode 100644 md/ru/Build-and-Install.md delete mode 100755 md/ru/Changelog.md delete mode 100644 md/ru/CompareFeatures.md delete mode 100644 md/ru/CustomScripts.md delete mode 100644 md/ru/DEB.md delete mode 100644 md/ru/DeployConfigFile.md delete mode 100644 md/ru/Description.md delete mode 100644 md/ru/DisableShortcats.md delete mode 100644 md/ru/EnvironmentVariables.md delete mode 100644 md/ru/ExtraFiles.md delete mode 100644 md/ru/ExtractDefaultsTemplates.md delete mode 100644 md/ru/Guide.md delete mode 100644 md/ru/Home.md delete mode 100644 md/ru/Options.md delete mode 100644 md/ru/Packing.md delete mode 100644 md/ru/QIF.md delete mode 100644 md/ru/QuickGuide.md delete mode 100755 md/ru/ReleaseReviews.md delete mode 100644 md/ru/ZIP.md delete mode 100644 md/screenshots/customStyle.png delete mode 100644 md/screenshots/defaultStyle.png delete mode 100644 md/screenshots/quasaraStyle.png create mode 100644 plug.pro create mode 100644 src/CQtDeployer/CMakeLists.txt create mode 100644 src/CQtDeployer/Deploy/CQtDeployer.json create mode 100644 src/CQtDeployer/Deploy/CQtDeployer.json.in rename QIFData/packages/QIF/meta/ru.ts => src/CQtDeployer/languages/de.ts (100%) rename QIFData/packages/cqtdeployer/meta/ru.ts => src/CQtDeployer/languages/en.ts (100%) create mode 100644 src/CQtDeployer/languages/es.ts create mode 100644 src/CQtDeployer/languages/fr.ts create mode 100644 src/CQtDeployer/languages/ja.ts create mode 100644 src/CQtDeployer/languages/pl.ts create mode 100644 src/CQtDeployer/languages/ru.ts create mode 100644 src/CQtDeployer/languages/tr.ts create mode 100644 src/CQtDeployer/languages/uk.ts create mode 100644 src/CQtDeployer/languages/zh.ts rename {CQtDeployer => src/CQtDeployer}/main.cpp (100%) create mode 100644 src/Deploy/CMakeLists.txt create mode 100644 src/Deploy/CQtDeployer.qrc create mode 100644 src/Deploy/languages/en.ts rename {Deploy => src/Deploy/src}/DeployResources.qrc (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/Icon.ico (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/Icon.png (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/deb/DEBIAN/control (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/deb/DEBIAN/postinst (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/deb/DEBIAN/prerm (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/Styles/quasar.css (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/Styles/quasarDark.css (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/config custom designe/config.xml (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/config custom designe/controlScript.qs (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/config custom designe/style.css (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/config/config.xml (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/config/controlScript.qs (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/packages/default/meta/installscript.qs (100%) rename {Deploy => src/Deploy/src}/Distributions/Templates/qif/packages/default/meta/package.xml (100%) rename {Deploy => src/Deploy/src}/Distributions/configures/Init multiPackage configuration.json (100%) rename {Deploy => src/Deploy/src}/Distributions/configures/Init single configuration.json (100%) rename {Deploy => src/Deploy/src}/Distributions/configures/Init.json (100%) rename {Deploy => src/Deploy/src}/Distributions/deb.cpp (100%) rename {Deploy => src/Deploy/src}/Distributions/deb.h (100%) rename {Deploy => src/Deploy/src}/Distributions/defaultdistro.cpp (100%) rename {Deploy => src/Deploy/src}/Distributions/defaultdistro.h (100%) rename {Deploy => src/Deploy/src}/Distributions/idistribution.cpp (100%) rename {Deploy => src/Deploy/src}/Distributions/idistribution.h (100%) rename {Deploy => src/Deploy/src}/Distributions/qif.cpp (100%) rename {Deploy => src/Deploy/src}/Distributions/qif.h (100%) rename {Deploy => src/Deploy/src}/Distributions/templateinfo.cpp (100%) rename {Deploy => src/Deploy/src}/Distributions/templateinfo.h (100%) rename {Deploy => src/Deploy/src}/Distributions/ziparhive.cpp (100%) rename {Deploy => src/Deploy/src}/Distributions/ziparhive.h (100%) rename {Deploy => src/Deploy/src}/ScriptsTemplates/linux.sh (100%) rename {Deploy => src/Deploy/src}/ScriptsTemplates/windows.bat (100%) rename {Deploy => src/Deploy/src}/configparser.cpp (100%) rename {Deploy => src/Deploy/src}/configparser.h (100%) rename {Deploy => src/Deploy/src}/defines.h (100%) rename {Deploy => src/Deploy/src}/dependenciesscanner.cpp (100%) rename {Deploy => src/Deploy/src}/dependenciesscanner.h (100%) rename {Deploy => src/Deploy/src}/dependencymap.cpp (100%) rename {Deploy => src/Deploy/src}/dependencymap.h (100%) rename {Deploy => src/Deploy/src}/deploy.cpp (100%) rename {Deploy => src/Deploy/src}/deploy.h (100%) rename {Deploy => src/Deploy/src}/deploy_global.h (100%) rename {Deploy => src/Deploy/src}/deployconfig.cpp (100%) rename {Deploy => src/Deploy/src}/deployconfig.h (100%) rename {Deploy => src/Deploy/src}/deploycore.cpp (100%) rename {Deploy => src/Deploy/src}/deploycore.h (100%) rename {Deploy => src/Deploy/src}/distromodule.cpp (100%) rename {Deploy => src/Deploy/src}/distromodule.h (100%) rename {Deploy => src/Deploy/src}/distrostruct.cpp (100%) rename {Deploy => src/Deploy/src}/distrostruct.h (100%) rename {Deploy => src/Deploy/src}/elf_type.cpp (100%) rename {Deploy => src/Deploy/src}/elf_type.h (100%) rename {Deploy => src/Deploy/src}/envirement.cpp (100%) rename {Deploy => src/Deploy/src}/envirement.h (100%) rename {Deploy => src/Deploy/src}/extra.cpp (100%) rename {Deploy => src/Deploy/src}/extra.h (100%) rename {Deploy => src/Deploy/src}/extracter.cpp (100%) rename {Deploy => src/Deploy/src}/extracter.h (100%) rename {Deploy => src/Deploy/src}/filemanager.cpp (100%) rename {Deploy => src/Deploy/src}/filemanager.h (100%) rename {Deploy => src/Deploy/src}/generalfiles_type.cpp (100%) rename {Deploy => src/Deploy/src}/generalfiles_type.h (100%) rename {Deploy => src/Deploy/src}/igetlibinfo.cpp (100%) rename {Deploy => src/Deploy/src}/igetlibinfo.h (100%) rename {Deploy => src/Deploy/src}/ignorerule.cpp (100%) rename {Deploy => src/Deploy/src}/ignorerule.h (100%) rename {Deploy => src/Deploy/src}/libinfo.cpp (100%) rename {Deploy => src/Deploy/src}/libinfo.h (100%) rename {Deploy => src/Deploy/src}/metafilemanager.cpp (100%) rename {Deploy => src/Deploy/src}/metafilemanager.h (100%) rename {Deploy => src/Deploy/src}/packagecontrol.cpp (100%) rename {Deploy => src/Deploy/src}/packagecontrol.h (100%) rename {Deploy => src/Deploy/src}/packing.cpp (100%) rename {Deploy => src/Deploy/src}/packing.h (100%) rename {Deploy => src/Deploy/src}/pathutils.cpp (100%) rename {Deploy => src/Deploy/src}/pathutils.h (100%) rename {Deploy => src/Deploy/src}/pe_type.cpp (100%) rename {Deploy => src/Deploy/src}/pe_type.h (100%) rename {Deploy => src/Deploy/src}/pluginsparser.cpp (100%) rename {Deploy => src/Deploy/src}/pluginsparser.h (100%) rename {Deploy => src/Deploy/src}/qml.cpp (100%) rename {Deploy => src/Deploy/src}/qml.h (100%) rename {Deploy => src/Deploy/src}/qtdir.cpp (100%) rename {Deploy => src/Deploy/src}/qtdir.h (100%) rename {Deploy => src/Deploy/src}/targetdata.cpp (100%) rename {Deploy => src/Deploy/src}/targetdata.h (100%) rename {Deploy => src/Deploy/src}/targetinfo.cpp (100%) rename {Deploy => src/Deploy/src}/targetinfo.h (100%) rename {Deploy => src/Deploy/src}/zipcompresser.cpp (100%) rename {Deploy => src/Deploy/src}/zipcompresser.h (100%) delete mode 100644 test.pri create mode 100644 tests/CMakeLists.txt delete mode 100644 tests/TestCPPOnly/TestCPPOnly.pro delete mode 100644 tests/TestCPPOnly/conf.qrc delete mode 100644 tests/TestCPPOnly/main.cpp delete mode 100644 tests/TestCPPOnly/qt.conf delete mode 100644 tests/TestOnlyC/TestOnlyC.pro delete mode 100644 tests/TestOnlyC/conf.qrc delete mode 100644 tests/TestOnlyC/main.cpp delete mode 100644 tests/TestOnlyC/qt.conf delete mode 100644 tests/TestQMLWidgets/HomeForm.ui.qml delete mode 100644 tests/TestQMLWidgets/Page1Form.ui.qml delete mode 100644 tests/TestQMLWidgets/Page2Form.ui.qml delete mode 100644 tests/TestQMLWidgets/TestQMLWidgets.pro delete mode 100644 tests/TestQMLWidgets/conf.qrc delete mode 100644 tests/TestQMLWidgets/main.cpp delete mode 100644 tests/TestQMLWidgets/main.qml delete mode 100644 tests/TestQMLWidgets/qml.qrc delete mode 100644 tests/TestQMLWidgets/qtquickcontrols2.conf delete mode 100644 tests/TestQtWidgets/TestQtWidgets.pro delete mode 100644 tests/TestQtWidgets/conf.qrc delete mode 100644 tests/TestQtWidgets/main.cpp delete mode 100644 tests/TestQtWidgets/mainwindow.cpp delete mode 100644 tests/TestQtWidgets/mainwindow.h delete mode 100644 tests/TestQtWidgets/mainwindow.ui delete mode 100644 tests/TestQtWidgets/qt.conf delete mode 100644 tests/quicknanobrowser/ApplicationRoot.qml delete mode 100644 tests/quicknanobrowser/BrowserDialog.qml delete mode 100644 tests/quicknanobrowser/BrowserWindow.qml delete mode 100644 tests/quicknanobrowser/DownloadView.qml delete mode 100644 tests/quicknanobrowser/FullScreenNotification.qml delete mode 100644 tests/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg delete mode 100644 tests/quicknanobrowser/doc/src/quicknanobrowser.qdoc delete mode 100644 tests/quicknanobrowser/icons/3rdparty/COPYING delete mode 100644 tests/quicknanobrowser/icons/3rdparty/go-next.png delete mode 100644 tests/quicknanobrowser/icons/3rdparty/go-previous.png delete mode 100644 tests/quicknanobrowser/icons/3rdparty/process-stop.png delete mode 100644 tests/quicknanobrowser/icons/3rdparty/qt_attribution.json delete mode 100644 tests/quicknanobrowser/icons/3rdparty/view-refresh.png delete mode 100644 tests/quicknanobrowser/main.cpp delete mode 100644 tests/quicknanobrowser/quicknanobrowser.pro delete mode 100644 tests/quicknanobrowser/resources.qrc delete mode 100644 tests/quicknanobrowser/utils.h rename {UnitTests => tests}/testRes/DEBCustomTemplate/chrome/DEBIAN/control (100%) rename {UnitTests => tests}/testRes/DEBCustomTemplate/chrome/DEBIAN/postinst (100%) rename {UnitTests => tests}/testRes/DEBCustomTemplate/chrome/DEBIAN/postrm (100%) rename {UnitTests => tests}/testRes/DEBCustomTemplate/chrome/DEBIAN/prerm (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/config/config.xml (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/config/style.qss (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/customRes.qrc (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/customconfig.xml (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/package.xml (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs (100%) rename {UnitTests => tests}/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/package.xml (100%) rename {UnitTests => tests}/testRes/TestIcon.png (100%) rename {UnitTests => tests}/testRes/TestQMLWidgets.sh (100%) rename {UnitTests => tests}/testRes/Unix/Start (100%) rename {UnitTests => tests}/testRes/Unix/lib.so.1 (100%) rename {UnitTests => tests}/testRes/customRunScript.sh (100%) rename {UnitTests => tests}/testRes/debugLibData (100%) rename {UnitTests => tests}/testRes/qml/Scene (100%) rename {UnitTests => tests}/testRes/qml/SceneQt6 (100%) rename {UnitTests => tests}/testRes/qml/qmldir (100%) rename {UnitTests => tests}/testRes/testMultiPackageConfig.json (100%) rename {UnitTests => tests}/testRes/win32/mingw/hanoi-towers.exe (100%) rename {UnitTests => tests}/testRes/win32/msvc/TestStart.exe (100%) rename {UnitTests => tests}/testRes/win64/mingw/cqtdeployer.exe (100%) rename {UnitTests => tests}/testRes/win64/msvc/exe.exe (100%) create mode 100644 tests/tstMain.cpp rename {UnitTests => tests/units}/libcreator.cpp (100%) rename {UnitTests => tests/units}/libcreator.h (100%) rename {UnitTests => tests/units}/modules.cpp (100%) rename {UnitTests => tests/units}/modules.h (100%) rename {UnitTests => tests/units}/modulesqt513.cpp (100%) rename {UnitTests => tests/units}/modulesqt513.h (100%) rename {UnitTests => tests/units}/modulesqt514.cpp (100%) rename {UnitTests => tests/units}/modulesqt514.h (100%) rename {UnitTests => tests/units}/modulesqt515.cpp (100%) rename {UnitTests => tests/units}/modulesqt515.h (100%) rename {UnitTests => tests/units}/modulesqt5152.cpp (100%) rename {UnitTests => tests/units}/modulesqt5152.h (100%) rename {UnitTests => tests/units}/qmlcreator.cpp (100%) rename {UnitTests => tests/units}/qmlcreator.h (100%) create mode 100644 tests/units/test.cpp create mode 100644 tests/units/test.h rename {UnitTests => tests/units}/testutils.cpp (100%) rename {UnitTests => tests/units}/testutils.h (100%) rename {UnitTests => tests/units}/tst_deploytest.cpp (100%) delete mode 100644 tests/virtualkeyboard/basic/Basic.qml delete mode 100644 tests/virtualkeyboard/basic/basic-b2qt.qml delete mode 100644 tests/virtualkeyboard/basic/basic.pro delete mode 100644 tests/virtualkeyboard/basic/content/AutoScroller.qml delete mode 100644 tests/virtualkeyboard/basic/content/FloatingButton_Active.svg delete mode 100644 tests/virtualkeyboard/basic/content/FloatingButton_Available.svg delete mode 100644 tests/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg delete mode 100644 tests/virtualkeyboard/basic/content/HandwritingModeButton.qml delete mode 100644 tests/virtualkeyboard/basic/content/TextArea.qml delete mode 100644 tests/virtualkeyboard/basic/content/TextField.qml delete mode 100644 tests/virtualkeyboard/basic/demo.qrc delete mode 100644 tests/virtualkeyboard/basic/main.cpp delete mode 100644 tests/virtualkeyboard/virtualkeyboard.pro delete mode 100644 tests/webui/about.html delete mode 100644 tests/webui/doc/images/webui-example.png delete mode 100644 tests/webui/main.cpp delete mode 100644 tests/webui/webui.pro delete mode 100644 tests/webui/webui.qrc delete mode 100644 tests/webui/webuihandler.cpp delete mode 100644 tests/webui/webuihandler.h diff --git a/CMakeLists.txt b/CMakeLists.txt index be3722e0..5b3502c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,67 @@ # -# Copyright (C) 2018-2021 QuasarApp. -# Distributed under the lgplv3 software license, see the accompanying +# Copyright (C) 2020-2022 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. # -# This is a stub for the cmake build system. +cmake_minimum_required(VERSION 3.18) +project(CQtDeployer LANGUAGES CXX) +if(TARGET ${PROJECT_NAME}) + message("The ${PROJECT_NAME} arledy included in main Project") + return() +endif() +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) -project(CQtDeployer LANGUAGES CXX) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +if (ANDROID OR IOS) + set(BUILD_SHARED_LIBS ON) +endif() + +if (NOT QT_VERSION_MAJOR) + find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Test QUIET) +endif() +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test QUIET) + +include(submodules/CMake/QuasarApp.cmake) + +updateGitVars() +set(CQtDeployer_VERSION "0.${GIT_COMMIT_COUNT}.${GIT_COMMIT_HASH}") +set(CQtDeployer_PACKAGE_ID "quasarapp.core.CQtDeployer") + +option(CQtDeployer_TESTS "This option disables or enables tests of the ${PROJECT_NAME} project" ON) +option(CQtDeployer_EXAMPLE "This option disables or enables example app of the ${PROJECT_NAME} project" ON) -cmake_minimum_required(VERSION 3.1) -include(QuasarAppLib/CMake/QuasarAppCITargets.cmake) +if (ANDROID OR IOS OR NOT QT_VERSION_MAJOR OR QA_WASM32) + set(CQtDeployer_TESTS OFF CACHE BOOL "This option force disbled for ANDROID IOS QA_WASM32 and Not Qt projects" FORCE) +endif() + +if (NOT QT_VERSION_MAJOR) + set(CQtDeployer_EXAMPLE OFF CACHE BOOL "This option force disbled for Not Qt projects" FORCE) +endif() + +make_directory(Distro) initAll() + +add_subdirectory(src/Library) + +if (DEFINED CQtDeployer_EXAMPLE) + add_subdirectory(src/Example) +endif() + +if (CQtDeployer_TESTS) + add_subdirectory(tests) +else() + message("The ${PROJECT_NAME} tests is disabled.") +endif() + + addDoc(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.conf) +addDeployFromCustomFile("CQtDeployer" "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") diff --git a/CQtDeployer.pro b/CQtDeployer.pro deleted file mode 100644 index da35d8af..00000000 --- a/CQtDeployer.pro +++ /dev/null @@ -1,78 +0,0 @@ -# -# Copyright (C) 2018-2022 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. -# - -TEMPLATE = subdirs -CONFIG += ordered - -lessThan(QT_MAJOR_VERSION, 6):lessThan(QT_MINOR_VERSION, 12) { - warning("Tests are only enabled on Qt 5.12.0 or later version. You are using $$[QT_VERSION].") - DEFINES += WITHOUT_TESTS - DEFINES += WITHOUT_TR -} - -unix:gcc { - COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion") - COMPILER_MAJOR_VERSION = $$COMPILER_VERSION - lessThan(COMPILER_MAJOR_VERSION, 5): { - warning("The PE parser library is disabled. For build the PE parser library require gcc 5 or later version.") - DEFINES += DISABLE_PE - } - message(Version GCC : $$COMPILER_VERSION) -} - -android: DEFINES += WITHOUT_TESTS - -!android { - SUBDIRS += QuasarAppLib \ - Pe \ - zip \ - Deploy \ - CQtDeployer \ - UnitTests \ - tests/TestOnlyC \ - tests/TestCPPOnly \ - tests/TestQtWidgets \ - tests/TestQMLWidgets \ - tests/virtualkeyboard - - unix:SUBDIRS += tests/quicknanobrowser - unix:SUBDIRS += tests/webui - - contains(DEFINES, DISABLE_PE) { - SUBDIRS -= Pe - DEFINES += WITHOUT_TESTS - } - - contains(DEFINES, WITHOUT_TESTS) { - SUBDIRS -= UnitTests \ - tests/TestOnlyC \ - tests/TestCPPOnly \ - tests/TestQtWidgets \ - tests/TestQMLWidgets \ - tests/quicknanobrowser \ - tests/webui - } - - CQtDeployer.depends=QuasarAppLib - CQtDeployer.depends=Deploy - - QuasarAppLib.file = $$PWD/QuasarAppLib/QuasarApp.pro - Pe.file = $$PWD/pe/pe-parser-library/pe-parser-library.pro - - include('$$PWD/QIFData/installerCQtDeployer.pri') - !contains(QMAKE_HOST.arch, arm.*):{ - include($$PWD/test.pri) - } - - DISTFILES += \ - snap/snapcraft.yaml \ - snap/gui/cqtdeployer.desktop \ - README.md \ - - -} - diff --git a/CQtDeployer/CQtDeployer.pro b/CQtDeployer/CQtDeployer.pro deleted file mode 100644 index d26c4842..00000000 --- a/CQtDeployer/CQtDeployer.pro +++ /dev/null @@ -1,44 +0,0 @@ -# -# Copyright (C) 2018-2022 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. -# - -QT -= gui - -CONFIG += c++17 console -CONFIG -= app_bundle - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which as been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -CONFIG(release, debug|release): { - DESTDIR="$$PWD/build/release" -} else { - DESTDIR="$$PWD/build/debug" -} - -include('$$PWD/../QuasarAppLib/QuasarLib.pri') -include('$$PWD/../Deploy/Deploy.pri') -include('$$PWD/../zip/zip.pri') - -!contains(DEFINES, DISABLE_PE) { - include('$$PWD/../pe/pe-parser-library/pe-parser-library.pri') -} - -TARGET = cqtdeployer - -SOURCES += \ - main.cpp \ - - -win32: RC_ICONS = $$PWD/../res/icon.ico diff --git a/Deploy/Deploy.pri b/Deploy/Deploy.pri deleted file mode 100644 index 740c1b45..00000000 --- a/Deploy/Deploy.pri +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (C) 2018-2022 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. -# - -!isEmpty(DEPLOY_LIB):error("Deploy.pri already included") -DEPLOY_LIB = 1 - -#DEPENDS -CONFIG(release, debug|release): { - DEPLOY_LIB_OUTPUT_DIR="$$PWD/build/release" -} else { - DEPLOY_LIB_OUTPUT_DIR="$$PWD/build/debug" -} - -unix:LIBS += -L$$DEPLOY_LIB_OUTPUT_DIR -lDeploy -win32:LIBS += -L$$DEPLOY_LIB_OUTPUT_DIR -lDeploy1 - - -INCLUDEPATH += "$$PWD/" - - - diff --git a/Deploy/Deploy.pro b/Deploy/Deploy.pro deleted file mode 100644 index 7591bf95..00000000 --- a/Deploy/Deploy.pro +++ /dev/null @@ -1,129 +0,0 @@ -# -# Copyright (C) 2018-2022 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. -# - - -#------------------------------------------------- -# -# Project created by QtCreator 2019-01-26T13:55:47 -# -#------------------------------------------------- - -QT -= gui -CONFIG += c++17 -TARGET = Deploy -TEMPLATE = lib - -DEFINES += DEPLOY_LIBRARY - -VERSION = 1.5.4.17 - -DEFINES += APP_VERSION='\\"$$VERSION\\"' - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which has been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -CONFIG(release, debug|release): { - DESTDIR="$$PWD/build/release" -} else { - DESTDIR="$$PWD/build/debug" -} - -include('$$PWD/../QuasarAppLib/QuasarLib.pri') -!contains(DEFINES, DISABLE_PE) { - include('$$PWD/../pe/pe-parser-library/pe-parser-library.pri') -} -include('$$PWD/../zip/zip.pri') - - -SOURCES += \ - Distributions/deb.cpp \ - Distributions/defaultdistro.cpp \ - Distributions/templateinfo.cpp \ - Distributions/ziparhive.cpp \ - dependencymap.cpp \ - deployconfig.cpp \ - distromodule.cpp \ - distrostruct.cpp \ - configparser.cpp \ - deploy.cpp \ - deploycore.cpp \ - elf_type.cpp \ - envirement.cpp \ - extra.cpp \ - extracter.cpp \ - filemanager.cpp \ - Distributions/idistribution.cpp \ - generalfiles_type.cpp \ - ignorerule.cpp \ - metafilemanager.cpp \ - packagecontrol.cpp \ - packing.cpp \ - pathutils.cpp \ - igetlibinfo.cpp \ - dependenciesscanner.cpp \ - ../qtTools/src/shared/winutils/elfreader.cpp \ - pe_type.cpp \ - pluginsparser.cpp \ - Distributions/qif.cpp \ - qml.cpp \ - libinfo.cpp \ - qtdir.cpp \ - targetdata.cpp \ - targetinfo.cpp \ - zipcompresser.cpp - -HEADERS += \ - Distributions/deb.h \ - Distributions/defaultdistro.h \ - Distributions/templateinfo.h \ - Distributions/ziparhive.h \ - defines.h \ - dependencymap.h \ - deployconfig.h \ - distromodule.h \ - distrostruct.h \ - configparser.h \ - deploy.h \ - deploy_global.h \ - deploycore.h \ - elf_type.h \ - envirement.h \ - extra.h \ - extracter.h \ - filemanager.h \ - Distributions/idistribution.h \ - generalfiles_type.h \ - ignorerule.h \ - metafilemanager.h \ - packagecontrol.h \ - packing.h \ - pathutils.h \ - igetlibinfo.h \ - dependenciesscanner.h \ - ../qtTools/src/shared/winutils/elfreader.h \ - pe_type.h \ - pluginsparser.h \ - Distributions/qif.h \ - qml.h \ - libinfo.h \ - qtdir.h \ - targetdata.h \ - targetinfo.h \ - zipcompresser.h - -STATECHARTS += - -RESOURCES += \ - DeployResources.qrc diff --git a/QIFData/InstallerBase.pri b/QIFData/InstallerBase.pri deleted file mode 100644 index fbd60c63..00000000 --- a/QIFData/InstallerBase.pri +++ /dev/null @@ -1,64 +0,0 @@ - -QT_DIR= $$[QT_HOST_BINS] - -win32:QMAKE_BIN= $$QT_DIR/qmake.exe -win32:LUPDATE = $$QT_DIR/lupdate.exe -win32:LRELEASE = $$QT_DIR/lrelease.exe -win32:DEPLOYER=cqtdeployer - - -contains(QMAKE_HOST.os, Linux):{ - QMAKE_BIN= $$QT_DIR/qmake - LUPDATE = $$QT_DIR/lupdate - LRELEASE = $$QT_DIR/lrelease - DEPLOYER = cqtdeployer -} - -android { - DEPLOYER = $$QT_DIR/androiddeployqt -} - -message( PWD :$$PWD) - -message( Configuration variables :) -message(QT_DIR = $$QT_DIR) -message(QMAKE_BIN = $$QMAKE_BIN) -message(LUPDATE = $$LUPDATE) -message(LRELEASE = $$LRELEASE) -message(DEPLOYER = $$DEPLOYER) - -BINARY_LIST -REPO_LIST - -sopprted_versions = 4.5 4.4 4.3 4.2 4.1 4.0 3.2 3.1 3.0 -for(val, sopprted_versions) { - - exists( $$QT_DIR/../../../Tools/QtInstallerFramework/$$val/bin/ ) { - message( "QtInstallerFramework v$$val: yes" ) - BINARY_LIST += $$QT_DIR/../../../Tools/QtInstallerFramework/$$val/bin/binarycreator - REPO_LIST += $$QT_DIR/../../../Tools/QtInstallerFramework/$$val/bin/repogen - } -} - -isEmpty (BINARY_LIST) { - warning( "QtInstallerFramework not found! use binaries from PATH." ) - EXEC=binarycreator - REPOGEN=repogen - -} else: { - win32:EXEC=$$first(BINARY_LIST).exe - win32:REPOGEN=$$first(REPO_LIST).exe - - contains(QMAKE_HOST.os, Linux):{ - unix:EXEC=$$first(BINARY_LIST) - win32:EXEC=wine $$first(BINARY_LIST).exe - - REPOGEN=$$first(REPO_LIST) - } -} - - - -message( selected $$EXEC and $$REPOGEN) - - diff --git a/QIFData/QIF.pri b/QIFData/QIF.pri deleted file mode 100644 index 6cbeed0f..00000000 --- a/QIFData/QIF.pri +++ /dev/null @@ -1,27 +0,0 @@ -OTHER_FILES += \ - $$PWD/*.md \ - $$PWD/*.sh \ - $$PWD/scripts/*.py \ - $$PWD/packages/QIF/meta/*.xml - -win32:PLATFORM = windows -unix: PLATFORM = linux - -win32:PY = python -unix: PY = python3 - -qif.commands= $$PY $$PWD/scripts/QIF.py $$PLATFORM 4.4 $$PWD/packages/QIF/data -alias.commands= $$PY $$PWD/scripts/alias.py - -!isEmpty( ONLINE ) { - - message(prepare release QIF) - deployOffline.depends += qif - buildSnap.depends += qif -} - -unix:deployOffline.depends += alias - -QMAKE_EXTRA_TARGETS += \ - qif \ - alias diff --git a/QIFData/config/banner.png b/QIFData/config/banner.png deleted file mode 100644 index ccd40d4a62d03281e9cb0cd55d0485d4e3ad4f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392487 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%0Alj%U}I2efPmim(7jnpLp&L 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

3E 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 z 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 zt@gns172W - - 640px - 400px - CQtDeployer - 1.5.4.17 - CQtDeployer - QuasarApp - CQtDeployer - @HomeDir@/CQtDeployer - true - true - controlScript.js - CQtDeployerTool - Modern - style.css - logo.png - - - - http://quasarapp.ddns.net:3030/CQtDeployer/Linux - 1 - QuasarApp - - - diff --git a/QIFData/config/configWin.xml b/QIFData/config/configWin.xml deleted file mode 100644 index adfbc531..00000000 --- a/QIFData/config/configWin.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 640px - 400px - CQtDeployer - 1.5.4.17 - CQtDeployer - QuasarApp - CQtDeployer - @ApplicationsDir@/CQtDeployer - true - true - controlScript.js - CQtDeployerTool - Modern - style.css - logo.png - - - - http://quasarapp.ddns.net:3030/CQtDeployer/Windows - 1 - QuasarApp - - - diff --git a/QIFData/config/controlScript.js b/QIFData/config/controlScript.js deleted file mode 100644 index a09553a0..00000000 --- a/QIFData/config/controlScript.js +++ /dev/null @@ -1,53 +0,0 @@ -function Controller() -{ - generateTr(); - - installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes); - installer.uninstallationFinished.connect(this, Controller.prototype.uninstallationFinished); - installer.installationFinished.connect(this, Controller.prototype.installationFinished); - - -} - -Controller.prototype.ComponentSelectionPageCallback = function() -{ - var widget = gui.currentPageWidget(); // get the current wizard page - if (widget !== null && installer.isInstaller()) { - widget.deselectAll(); - widget.selectComponent('cqtdeployer.1_5'); - widget.selectComponent('QIF'); - - } -} - -function generateTr() { - console.log("generate tr start ") - - installer.setValue("Name", qsTr("CQtDeployer")); - installer.setValue("Title", qsTr("Install CQtDeployer")); -} - -Controller.prototype.uninstallationFinished = function() -{ - -} - - -Controller.prototype.installationFinished = function() -{ - - if (systemInfo.kernelType === "winnt") { - - QMessageBox["information"](qsTr("install in system"), qsTr("Installer"), - qsTr("CQtDeployer successfully installed on your computer to use the call \"cqtdeployer\"."), - QMessageBox.Ok); - - } else { - - QMessageBox["information"](qsTr("install in system"), qsTr("Installer"), - qsTr("CQtDeployer successfully installed on your computer to use the call \"cqtdeployer\", cqt or cqtdeployer.cqt."), - QMessageBox.Ok); - } - - -} diff --git a/QIFData/config/icon.ico b/QIFData/config/icon.ico deleted file mode 100644 index e39643da7f814b8ece7fcde7dd6642017c9e466f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39353 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 diff --git a/QIFData/config/logo.png b/QIFData/config/logo.png deleted file mode 100644 index 6f912788f9fc1257bafe879c7776248aef135bb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24729 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 diff --git a/QIFData/config/ru.ts b/QIFData/config/ru.ts deleted file mode 100644 index 1b284c01..00000000 --- a/QIFData/config/ru.ts +++ /dev/null @@ -1,53 +0,0 @@ - - - - - controlScript - - - CQtDeployer - CQtDeployer - - - - Install CQtDeployer - Install Snake - Установка CQtDeployer - - - - - install in system - Установка в систему - - - - - Installer - Установщик - - - - CQtDeployer successfully installed on your computer to use the call "cqtdeployer". - To uninstall cqtdeployer on your system, you need administrator rights!. - Чтобы удалить cqtdeployer в вашей системе, вам нужны права администратора !. - - - - CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. - - - - To install cqtdeployer on your system, you need administrator rights!. - Чтобы установить cqtdeployer в вашей системе, вам нужны права администратора!. - - - The installation was successful, but cqtdeployer will not be available from the console. - Установка прошла успешно, но cqtdeployer не будет доступен из консоли. - - - Example: - Пример: - - - diff --git a/QIFData/config/style.css b/QIFData/config/style.css deleted file mode 100644 index 7ff14bdf..00000000 --- a/QIFData/config/style.css +++ /dev/null @@ -1,61 +0,0 @@ -.QWidget { - background-color: rgb(255, 255, 255); -} - -.QLabel { - color: #000000; -} - -.QPushButton { - background-color: transparent; - border: 2px solid #ffffff; - border-radius: 3px; - height: 30px; - min-width: 100px; - padding: 0 15px; -} - -.QPushButton:pressed, -.QPushButton:checked { - background-color: #2ed3ed; -} - -.QPushButton:focus { - background-color: #aaf2ff; -} - -.QPushButton:hover { - border: 2px solid #2ed3ed; -} - - -.QProgressBar { - background: #b1dbcc; - border: 1px solid #cdcdcd; - border-radius: 2px; - padding: 0; - margin: 0; - color: #ffffff; - height: 30px; - text-align: center; -} - -.QProgressBar::chunk { - background: #16dbcc; - border-radius: 2px; - margin: 0; -} - -.QProgressBar:hover { - border-color: #2ed3ed; -} - -.QLineEdit { - background-color: transparent; - border-color: #cdcdcd; - height: 30px; -} - -.QLineEdit:hover { - border-color: #2ed3ed; -} diff --git a/QIFData/installerCQtDeployer.pri b/QIFData/installerCQtDeployer.pri deleted file mode 100644 index 1afb1864..00000000 --- a/QIFData/installerCQtDeployer.pri +++ /dev/null @@ -1,163 +0,0 @@ -VERSION = 1.5.4.17 - -include($$PWD/InstallerBase.pri); -mkpath( $$PWD/../Distro) - -message(QMAKE_HOST.arch = $$QMAKE_HOST.arch) - -win32:OUT_FILE = CQtDeployer_'$$VERSION'_Installer_Win'_$$QMAKE_HOST.arch'.exe -unix:OUT_FILE = CQtDeployer_'$$VERSION'_Installer_Linux'_$$QMAKE_HOST.arch'.run - -win32:OUT_FILE_OFF = CQtDeployer_'$$VERSION'_OfflineInstaller_Win'_$$QMAKE_HOST.arch'.exe -unix:OUT_FILE_OFF = CQtDeployer_'$$VERSION'_OfflineInstaller_Linux'_$$QMAKE_HOST.arch'.run - -DEPLOY_TARGET = $$PWD/../CQtDeployer/build/release - -DATA_DIR = $$PWD/packages/cqtdeployer.1_5/data/1.5 -META_DIR = $$PWD/packages/cqtdeployer.1_5/meta/ - -win32:OUT_LIB= -libOut lib -win32:OUT_BIN= -binOut bin - -BASE_DEPLOY_FLAGS = clear -qmake $$QMAKE_BIN -libDir $$PWD/../ -recursiveDepth 4 -ignoreEnv $$DEPLOY_TARGET -extraLibs icu -BASE_DEPLOY_FLAGS_CQT = $$BASE_DEPLOY_FLAGS -targetDir $$DATA_DIR $$OUT_LIB $$OUT_BIN - - -win32:CQT_ICON = -icon $$PWD/config/icon.ico -unix:CQT_ICON = -icon $$PWD/config/logo.png -BASE_DEPLOY_FLAGS_DEB = $$BASE_DEPLOY_FLAGS -targetDir $$PWD/../Distro $$OUT_LIB $$OUT_BIN deb zip -name CQtDeployer -publisher QuasarApp $$CQT_ICON -deployVersion 1.5.4.17 -debOut CQtDeployer_'$$VERSION'_Linux'_$$QMAKE_HOST.arch'.deb -zipOut CQtDeployer_'$$VERSION'_Linux'_$$QMAKE_HOST.arch'.zip - -DEPLOY_TARGET_DEB = $$DEPLOY_TARGET,$$PWD/packages/QIF/data/QIF -deploy_dep.commands += $$DEPLOYER -bin $$DEPLOY_TARGET $$BASE_DEPLOY_FLAGS_CQT -deploy_deb.commands += $$DEPLOYER -bin $$DEPLOY_TARGET_DEB $$BASE_DEPLOY_FLAGS_DEB - -win32:CONFIG_FILE = $$PWD/config/configWin.xml -unix:CONFIG_FILE = $$PWD/config/configLinux.xml - -deployOffline.commands = $$EXEC \ - --offline-only \ - -c $$CONFIG_FILE \ - -p $$PWD/packages \ - $$PWD/../Distro/$$OUT_FILE_OFF - - -!contains(QMAKE_HOST.arch, arm.*):{ - deploy.depends = deploy_dep - deploy.depends += deployOffline - -} - -unix:deploy.depends += deploy_deb - -win32:ONLINE_REPO_DIR = $$ONLINE/CQtDeployer/Windows -unix:ONLINE_REPO_DIR = $$ONLINE/CQtDeployer/Linux - -win32:PY = python -unix: PY = python3 - -create_repo.commands = $$PY $$PWD/../QuasarAppScripts/cp.py $$PWD/packages/ $$PWD/../Repo - -chmodSnap.commands = chmod 777 -R $$DATA_DIR -unix:deploy.depends += chmodSnap - - -message( ONLINE_REPO_DIR $$ONLINE_REPO_DIR) -!isEmpty( ONLINE ) { - - message(online) - - release.depends = create_repo - - deploy.commands = $$EXEC \ - --online-only \ - -c $$CONFIG_FILE \ - -p $$PWD/packages \ - $$PWD/../Distro/$$OUT_FILE -} - -buildSnap.commands = snapcraft -clearSnap.commands = rm parts prime stage *.snap -rdf -clearSnap2.commands = rm parts prime stage -rdf - -deploySnap.commands = rm *.snap -rdf && chmod 777 -R $$PWD/../prime && snapcraft && cp *.snap $$PWD/../Distro/ -releaseSnap.commands = snapcraft push *.snap # bad patern - - - -!isEmpty( ONLINE ) { - - !contains(QMAKE_HOST.arch, arm.*):{ - - message(Snap) - unix:deploy.depends += clearSnap - unix:deploy.depends += buildSnap - unix:deploy.depends += deploySnap - unix:deploy.depends += clearSnap2 - unix:release.depends += releaseSnap - } -} - -OTHER_FILES += \ - $$META_DIR/* \ - $$PWD/config/*.* - -include(QIF.pri) - -QMAKE_EXTRA_TARGETS += \ - deploy_dep \ - deploy_deb \ - deployOffline \ - deploy \ - create_repo \ - release \ - clearSnap \ - clearSnap2 \ - deploySnap \ - releaseSnap \ - buildSnap \ - chmodSnap - - -!contains(DEFINES, WITHOUT_TR) { - - # Translations - SUPPORT_LANGS = ru - - defineReplace(findFiles) { - patern = $$1 - path = $$2 - - all_files = $$files(*$${patern}, true) - win32:all_files ~= s|\\\\|/|g - win32:path ~= s|\\\\|/|g - - for(file, all_files) { - result += $$find(file, $$path) - } - - return($$result) - } - - XML_FILES = $$files(*.xml, true) - - for(LANG, SUPPORT_LANGS) { - for(XML, XML_FILES) { - FILE_PATH = $$dirname(XML) - - JS_FILES = $$findFiles(".js", $$FILE_PATH) - UI_FILES = $$findFiles(".ui", $$FILE_PATH) - - commands += "$$LUPDATE $$JS_FILES $$UI_FILES -ts $$FILE_PATH/$${LANG}.ts" - TS_FILES += $$FILE_PATH/$${LANG}.ts - - } - - for(TS, TS_FILES) { - commands += "$$LRELEASE $$TS" - } - } - - for(command, commands) { - system($$command)|error("Failed to run: $$command") - } -} diff --git a/QIFData/packages/QIF/meta/package.xml b/QIFData/packages/QIF/meta/package.xml deleted file mode 100644 index f3b3f058..00000000 --- a/QIFData/packages/QIF/meta/package.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - Qt Installer Framework - Qt Installer Framework for CQtDeployer - 4.4.0.0 - 2022-07-25 - true - diff --git a/QIFData/packages/cqtdeployer.1_5/data/1.5/icon.png b/QIFData/packages/cqtdeployer.1_5/data/1.5/icon.png deleted file mode 100644 index 6c282fec8feafadd6be1a7e53e90db148b34a82c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143802 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 vf!Xh;;Nzx5_5GD>%!X@U; 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 UUT0aL)Bpeg07*qoM6N<$f=b^i#Q*>R diff --git a/QIFData/packages/cqtdeployer.1_5/meta/installscript.js b/QIFData/packages/cqtdeployer.1_5/meta/installscript.js deleted file mode 100644 index cbc7df46..00000000 --- a/QIFData/packages/cqtdeployer.1_5/meta/installscript.js +++ /dev/null @@ -1,152 +0,0 @@ -const VERSION = "1.5" - -function Component() -{ - generateTr(); -} - -function generateTr() { - component.setValue("DisplayName", qsTr("CQtDeployer " + VERSION )); - component.setValue("Description", qsTr("This package contains CQtDeployer version " + VERSION)); -} - -Component.prototype.createOperations = function() { -// // call default implementation to actually install README.txt! - component.createOperations(); - systemIntegration(); - -} - -function stripPath(path, separator) { - const array = path.split(separator); - - let newPath = []; - - array.forEach(function (item) { - if (!newPath.includes(item)) { - newPath.push(item); - } - }); - - return newPath.join(separator); -} - -function stripWinPath(path) { - return stripPath(path, ';'); -} - -function stripUnixPath(path) { - return stripPath(path, ':'); -} - -function extractFileName(path) { - const fullName = path.substring(path.lastIndexOf('/') + 1); - - const index = fullName.lastIndexOf('.'); - if (index >= 0) { - return fullName.substring(0, index) - } - - return fullName; -} - -function generateShortCutCmd(cmd, icon) { - if (systemInfo.kernelType === "winnt") { - - console.log("create icons!!! on Windows"); - component.addOperation("CreateShortcut", - "@TargetDir@/" + cmd, - "@DesktopDir@/" + extractFileName(cmd) + ".lnk"); - - } - - - if (systemInfo.kernelType === "linux") { - console.log("create icons!!! on LINUX"); - const name = extractFileName(cmd); - component.addOperation("CreateDesktopEntry", - "@HomeDir@/.local/share/applications/" + name + ".desktop", - "Version=@Version@\n - Type=Application\n - Terminal=true\n - Exec=@TargetDir@/" + cmd + ".sh\n - Name=" + name + "\n - Icon=@TargetDir@/" + icon + "\n - Name[en_US]=" + name); - - console.log("create icons!!! on LINUX done"); - } -} - -function systemIntegration() { - targetDir = installer.value("TargetDir", ""); - homeDir = installer.value("HomeDir", ""); - - console.log("install component") - console.log("targetDir " + targetDir) - console.log("hometDir " + homeDir) - - if (systemInfo.kernelType === "winnt") { - - component.addOperation('Execute', ["SETX", "cqtdeployer", targetDir + "\\" + VERSION + "\\cqtdeployer.bat"], - "UNDOEXECUTE", ["SETX", "cqtdeployer", ""]) - component.addOperation('Execute', ["SETX", "cqtDir", targetDir + "\\" + VERSION + "\\"], - "UNDOEXECUTE", ["SETX", "cqtDir", ""]) - - - let PATH = installer.environmentVariable("PATH"); - const cqtDir = installer.environmentVariable("cqtDir"); - - console.log("path befor strip : " + PATH); - - if (!PATH.includes(cqtDir) && cqtDir.length) { - PATH = stripWinPath(PATH); - console.log("path after strip : " + PATH); - - component.addOperation('Execute', ["SETX", "PATH", PATH + ";%cqtDir%"]) - } - - } else { - - if (!installer.fileExists(homeDir + "/.local/bin")) { - - component.addOperation('Execute', ["mkdir", "-p", homeDir + "/.local/bin"]) - - QMessageBox["warning"](qsTr("install in system"), qsTr("Installer"), - qsTr("The \"~/local/bin\" folder was not initialized, you may need to reboot to work correctly!"), - QMessageBox.Ok); - - const ansver = installer.execute('cat', [homeDir + "/.profile"]); - let result; - if (ansver.length >= 2) { - result = ansver[0]; - } - - if (!result.includes("/.local/bin")) { - - const script = '\n# set PATH so it includes users private bin if it exists (generated by cqtdeployer installer) \n' + - 'if [ -d "$HOME/.local/bin" ] ; then \n' + - ' PATH="$HOME/.local/bin:$PATH" \n' + - 'fi \n'; - - component.addOperation('AppendFile', [homeDir + "/.profile", script]) - } - - } - component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqtdeployer.sh", - homeDir + "/.local/bin/cqtdeployer"], - "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqtdeployer"] ) - - component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqt.sh", - homeDir + "/.local/bin/cqt"], - "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqt"] ) - - component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqt.sh", - homeDir + "/.local/bin/cqtdeployer.cqt"], - "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqtdeployer.cqt"] ) - - generateShortCutCmd(VERSION + "/cqtdeployer", VERSION + "/icon.png"); - - } - -} diff --git a/QIFData/packages/cqtdeployer.1_5/meta/package.xml b/QIFData/packages/cqtdeployer.1_5/meta/package.xml deleted file mode 100644 index 476df750..00000000 --- a/QIFData/packages/cqtdeployer.1_5/meta/package.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - CQtDeployer 1.5 - CQtDeployer 1.5 - 1.5.4.17 - true - false - - 2022-03-03 - 201 - - ru.qm - - diff --git a/QIFData/packages/cqtdeployer.1_5/meta/ru.ts b/QIFData/packages/cqtdeployer.1_5/meta/ru.ts deleted file mode 100644 index 1a671e47..00000000 --- a/QIFData/packages/cqtdeployer.1_5/meta/ru.ts +++ /dev/null @@ -1,53 +0,0 @@ - - - - - installscript - - CQtDeployer 1.3 - CQtDeployer - CQtDeployer - - - This package contains CQtDeployer version 1.3 - This package contains CQtDeployer - Этот пакет содержит CQtDeployer - - - install in system - Установка в систему - - - Installer - Установщик - - - To uninstall cqtdeployer on your system, you need administrator rights!. - Чтобы удалить cqtdeployer в вашей системе, вам нужны права администратора !. - - - To install cqtdeployer on your system, you need administrator rights!. - Чтобы установить cqtdeployer в вашей системе, вам нужны права администратора!. - - - The installation was successful, but cqtdeployer will not be available from the console. - Установка прошла успешно, но cqtdeployer не будет доступен из консоли. - - - To take advantage of this program you will need to enter the full path to it. - Чтобы воспользоваться этой программой, вам нужно будет ввести полный путь к ней. - - - Example: - Пример: - - - CQtDeployer successfully installed on your computer to use the call "cqtdeployer". - CQtDeployer успешно установлен на вашем компьютере, чтобы использоваться введите в консоле "cqtdeployer". - - - The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! - - - - diff --git a/QIFData/packages/cqtdeployer/meta/package.xml b/QIFData/packages/cqtdeployer/meta/package.xml deleted file mode 100644 index 35d0c064..00000000 --- a/QIFData/packages/cqtdeployer/meta/package.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - CQtDeployer - CQtDeployer - 1.5 - true - false - 2021-05-25 - 100 - diff --git a/QIFData/scripts/QIF.py b/QIFData/scripts/QIF.py deleted file mode 100755 index 8908651e..00000000 --- a/QIFData/scripts/QIF.py +++ /dev/null @@ -1,39 +0,0 @@ -import sys -import os -import subprocess -import shutil - -PLATFORM = sys.argv[1] -VERSION = sys.argv[2] -PATHQIF = sys.argv[3] - -if len(PLATFORM) <= 0: - PLATFORM = "linux" - -if os.path.isdir(PATHQIF + "/QIF"): - print("if target already executed") - exit(0) - -print("PLATFORM=" + PLATFORM) -print("VERSION=" + VERSION) - -# Command Example : aqt tool linux tools_ifw 4.0 qt.tools.ifw.40 -command = ["aqt", - "tool", -# "-b", -# "https://mirrors.ocf.berkeley.edu/qt/", - "--outputdir", - PATHQIF, - PLATFORM, - "tools_ifw", - VERSION, - "qt.tools.ifw." + VERSION.replace('.', '')] - -print("command=" + " ".join(command)) - -subprocess.call(command) - -os.rename(PATHQIF + "/Tools/QtInstallerFramework/" + VERSION[0:3] + "/bin/", - PATHQIF + "/QIF") -shutil.rmtree(PATHQIF + "/Tools") -os.remove("aqtinstall.log") diff --git a/QIFData/scripts/alias.py b/QIFData/scripts/alias.py deleted file mode 100755 index 3d34156e..00000000 --- a/QIFData/scripts/alias.py +++ /dev/null @@ -1,12 +0,0 @@ -import os -import shutil -import subprocess - -dir_path = os.path.dirname(os.path.realpath(__file__)) -dest = dir_path + "/../packages/cqtdeployer.1_5/data/1.5/" -if not os.path.isdir(dest): - os.makedirs(dest) - - -shutil.copyfile(dir_path + "/alias/cqt.sh", dest + "/cqt.sh") -subprocess.run(["chmod", "777", dest + "/cqt.sh"]) diff --git a/QIFData/scripts/alias/cqt.sh b/QIFData/scripts/alias/cqt.sh deleted file mode 100755 index 46dcf9f9..00000000 --- a/QIFData/scripts/alias/cqt.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -function join_by { local IFS="$1"; shift; echo "$*"; } - -var=$(join_by , $@) -cqtdeployer $var -bin $var - diff --git a/UnitTests/.gitignore b/UnitTests/.gitignore deleted file mode 100644 index fab7372d..00000000 --- a/UnitTests/.gitignore +++ /dev/null @@ -1,73 +0,0 @@ -# This file is used to ignore files which are generated -# ---------------------------------------------------------------------------- - -*~ -*.autosave -*.a -*.core -*.moc -*.o -*.obj -*.orig -*.rej -*.so -*.so.* -*_pch.h.cpp -*_resource.rc -*.qm -.#* -*.*# -core -!core/ -tags -.DS_Store -.directory -*.debug -Makefile* -*.prl -*.app -moc_*.cpp -ui_*.h -qrc_*.cpp -Thumbs.db -*.res -*.rc -/.qmake.cache -/.qmake.stash - -# qtcreator generated files -*.pro.user* - -# xemacs temporary files -*.flc - -# Vim temporary files -.*.swp - -# Visual Studio generated files -*.ib_pdb_index -*.idb -*.ilk -*.pdb -*.sln -*.suo -*.vcproj -*vcproj.*.*.user -*.ncb -*.sdf -*.opensdf -*.vcxproj -*vcxproj.* - -# MinGW generated files -*.Debug -*.Release - -# Python byte code -*.pyc - -# Binaries -# -------- -*.dll -*.exe - diff --git a/UnitTests/UnitTests.pro b/UnitTests/UnitTests.pro deleted file mode 100644 index fd44e60b..00000000 --- a/UnitTests/UnitTests.pro +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright (C) 2018-2022 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. -# - - -QT += testlib -QT -= gui - -CONFIG(release, debug|release): { - DESTDIR="$$PWD/build/release" -} else { - DESTDIR="$$PWD/build/debug" -} - -include('$$PWD/../QuasarAppLib/QuasarLib.pri') -include('$$PWD/../Deploy/Deploy.pri') -include('$$PWD/../zip/zip.pri') - -include('$$PWD/../pe/pe-parser-library/pe-parser-library.pri') - - -QT_DIR = $$[QT_HOST_BINS]/../ -DEFINES+=QT_BASE_DIR='\\"$$QT_DIR\\"' -DEFINES+=TEST_BIN_DIR='\\"$$PWD/../tests/build/\\"' -DEFINES+=QTEST_FUNCTION_TIMEOUT=900000 - -CONFIG += qt console warn_on depend_includepath testcase -CONFIG -= app_bundle - -TEMPLATE = app - -SOURCES += tst_deploytest.cpp \ - libcreator.cpp \ - modules.cpp \ - modulesqt513.cpp \ - modulesqt514.cpp \ - modulesqt515.cpp \ - modulesqt5152.cpp \ - qmlcreator.cpp \ - testutils.cpp - -RESOURCES += \ - res.qrc - -HEADERS += \ - backward-cpp/backward.hpp \ - libcreator.h \ - modules.h \ - modulesqt513.h \ - modulesqt514.h \ - modulesqt515.h \ - modulesqt5152.h \ - qmlcreator.h \ - testutils.h - diff --git a/UnitTests/res.qrc b/UnitTests/res.qrc deleted file mode 100644 index 9d01e3e7..00000000 --- a/UnitTests/res.qrc +++ /dev/null @@ -1,25 +0,0 @@ - - - testRes/debugLibData - testRes/Unix/lib.so.1 - testRes/Unix/Start - testRes/win32/mingw/hanoi-towers.exe - testRes/win32/mingw/libEGL.dll - testRes/win32/msvc/qtaudio_windows.dll - testRes/win32/msvc/TestStart.exe - testRes/win64/mingw/cqtdeployer.exe - testRes/win64/mingw/Deploy.dll - testRes/win64/msvc/exe.exe - testRes/win64/msvc/lib.dll - testRes/qml/Scene - testRes/qml/SceneQt6 - testRes/qml/qmldir - - - testRes/TestQMLWidgets.sh - testRes/testMultiPackageConfig.json - testRes/customRunScript.sh - testRes/TestTr.qm - testRes/TestIcon.png - - diff --git a/UnitTests/testRes/TestTr.qm b/UnitTests/testRes/TestTr.qm deleted file mode 100755 index 50279046..00000000 --- a/UnitTests/testRes/TestTr.qm +++ /dev/null @@ -1 +0,0 @@ -TEST TR diff --git a/UnitTests/testRes/win32/mingw/libEGL.dll b/UnitTests/testRes/win32/mingw/libEGL.dll deleted file mode 100644 index 8aaf710070022fcd80a4b957b97ca3e0402f2c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22016 zcmeHv4Rll2mF}^9O%yC7r`W`4%tNFial%g}Bgy~9wrsG80R_tWkIqLn8R3l2JY#A31Aa${+uk?odgNl z&#z&8BJuEwB!+BU2B{nspz^r*t&_38f?l?lu^06uO>iAy>~TratOVf@<7UQZhWi-n zC&Ln4D@4~W5qU>%#RnNgZB-kAXIxFp(X^t~DLV0NAb|-WTe2w;y~>zrc!f_Q=1`l; z01fb8fS3!svK6i!jc)W#F}2wNP~CUNknqTP&0Sq2%^{nb=;@2sUe-Ch!X?$qec1^P z)oYu{<@!7lkNbKr@~Pg^FYty}*f-XbbQyhw0BY}gN<=T-UeU|#Gm!WYKs*N!b8()} zrf(IUb8r?bq%TSss^L1TOCNNCGuXh;v%8;t|!yM05fX~I1)tbZaC+5T{n`C`y& zc??QOKB*t|Mu3;$#R z7A7M5Pp5Bvu<>;*3rr85ybA*6|8)}2>He^Fh^CNvI@lltOQ_PxTTx%Z1%1C3MU{Hr zMZJM3RJl;D^0N7&TxpWNe=(Rmg*Nnm0(H@>Tah(zQQ!ZMB=we&xnefjoikQx6lm}T z>Wvzt4S@_}WZZvM>rbUdC&6UNSKRK9dH70RBoa~WA0i)<%Rik9{lkG#v3!U;PNE5j z0wexOq2O|_J~)5iy!a^+k@E$Ydp-$RjNt>BXjdw+Q9YhW6+M}U$5P3U^t?Zn+BwsC zuaYaT%z+v1(0=ZREB7D~8Witj)SC3rgd6_S(2Xl1ez*d)UAg+(NJQzC0uo##0m=wc z8HQUpi`zvOkYBEhf}*x})0V)GH`fKm0&n@RW)GYXWNJ+l?(Q0S;E1i^AEu$vUZaMT zqBIK>8^hbN_`{=tQU7Nt;<|y0VhtLLaxgmLKb;+z!k~Cygxeo}2;~Ru5mFJ@W)x7| ze?6)9WVr4(;9k{Ykd>LICtnK<9_6cE3@^<4Ki z{GTOt|25^t8vp+1yy7c0+}}j$43ExLI;cnf6+m}t=HxDPeGJCsd1!(u)p z<jDlzt&D zeIYKr%s-QFj7#UlrKjS`UyDn#IQ~I3Ke8l)@_Ll5(A zE-rl{Ejf}>3WqPS+Z@G`f6kHC#bCI zzsQn9aq09~%7^0WI}(=;$E7dDrC*FopNUIntM*Clt&U4q#-*F$(q(aJAugRCmoAP= zo8r=zxb)RHdq0m$YvcHaxb$`KL;ON?lB4di-$mr%za9xx8ng8Mk72fAs#Clgeo%)^ zUD=5}U=c;#hZ`h8_F$zk8yOnhvv3!%BAPIr!}%y37(ptFQiWji$O(dM65I`eToDhZ z!r^%^<8)5o0^%o-NJk{I6(&QtbwplRqw6s!2GV23QiC=0;4l_o{juR+T^KVY zRoBth!?nl?R%s4jMS{08P&G9~Eecd!i)5N4t5B}B47*EanUs!XGCa_3M78kt=JOm) z_!J@-K6dE?QBtrH!S%41>A#*LO0gsc0Cr#=?_k@_k;kHeB2Z`wpTKr3M|^yzj@{p> z|NSNDur8VOigU+Oc>--h*e%|IU`Z@O&r2~YYI!v$G~w?1j6TJGb%%l}FeMoQ?uZ}> zyMGbOrt!=pV)7Nu6{Pv#HNvLJ|LI2jOQSY=Az$DFQy%X;9nB7ry+hk1S7~mCQgRt7 zAKYd%!l|8bs(-i)RcXVWh?jYN+u#S#csa_1Pb|m_Z^y^vycq2v>HJ~}S}&jz2d4E; zya(06l1oULFAi=ILczHOr+Rh4M}(9Onu0U>$Nmoa{*fgA>)L`(yMGGJfst_aO+0iT z)AwH>!?JsVR#I^4XUR#I1FJP-XgVst11n9+8f{>;fDxO4W@zXb&+R03urf=4x=3a< z9|j0i#Wpl1XVCGv|EHgcHh&n4?rY)-$P6h9sRXGglT|>PfpAxfE-JZ(bUtQMsbNX} z(YJ7e3=_$5JVWdMdmN4j2^528987A>p5x3U7ul#<*z^u)9ygBa0wEOeUPj zSv}!iP9Og3H|d{vhKgKI(?78Zx`s%MHE>`M(xGK?VlNWG5))FdT1XVp_b&(eRU!xN z8VqUuz-JKnN3yb3w@EjrOEcRUki5Iyn@aN24a` zlVG{PTUo9NmdzNvFMkH2)Oi}}ydNN~t^v~il#PxJLrWy{IwJGn!U;Un*0a1A6D3$e z(*-+a4z|5u3OVn8(OZPk$h+8DwFA?lCTJIMAdid(w`vA1c3)Jr8Tm{UuwF}BTMrxh z5UNp3nJ=`yp*sb-_f$`u*O@P-k`5ydB_EAG=()ND` z-taBNzSliZ_M3j-dyuI+&PYg=KM6Tcpk()D?j9^lw*(t_C=midsPt6x`t^$`TA&VY){67UR&{qp9h$DV%OKu_#bbeg5`BTdA*bL>_Z9Or*Xj-h-r*1Gc&jsCRO=T7YJpVa zX$+%*Vg9VgIu5zC|IBC~#uJ<;6?l>t5SPG3+Ap~1n3VaoV43k(ve_KLoQ(EJP&8(VHAi3#n*6>TGLU=1c8N0DH$ut4 z``u}iuV6g-KZZ*(f@`tobl()Lps*){DW{Wr7abmtkplXstjpy68xLoxe8JkF(HTE61b zktGK(u}OcweBUeI_sI8M@?Dhgo$}o)-*?FOCi&hV-|OYOgWt&(`iJw!16Ph;RhEko zCSD|ja~CaB^i22P_jLsNNjF{eijYoBFX349`>yAPzCS$=csfaZtIM#Y)3C$YWoYj(c-oxX zUCX;%EuyERof!<9JwCD9>AkPp<=f2*x>^nH4xeF3tD$+f=;|^!MT1k-Lf%%(ID8!< z^eClzJ>m{S3%-mtn077MMZ8Vz54Csnwi`OTT-~i52L8RFlj@}}w8f5=4zHod2ojlxq3{?3>DoTFTN<> zZGd;yY+1eq-a(x^VeZ`q%Zh>(D;fKDm$$B1xx(~EEdRUOf1~{G*8eyB_s8|$?>hhf z*!?Hl|EITe-LUBQ;Q{_49*UA4*~pUiXp(N%3c>-La&sV~_mdN^MIx)HqH>+apKR9| z+UDvs_7R;>o@Uo+R^x#&FS4tFYvA5R0VKHllgoA5eJSO-biaU7UAk<1cF)zNmyhVQ z<)b=H`It_qO?#NjlUsBd$X<(VXjHQ+(~=*JD`CgGakdA*xq}@&6^T4aCvwy`K=tiU zvFpU<@7yo>a zf7Zu*ev3b6p~`&J`}XUyZ(w`NT%E8M#wGG6{ho>Y6J@U9S+coeUh3-oDfVYk?ypk;pe=`415xaXkibsq70VM=^?84_CZ;K8i8}PzD@Kz@aWQ z0Ik5@1RT6I;2fNNnKuDP(eolW4GB1ko^fz0zk)-4GbP}lJGebrc*y<=PBA!|1RTYl zCUCByuV(Whad4jGzwes>XAYj}G5}Ab+@;ye;aft9a}u00U&0~X6W|<;(|rxHBeR#A zulPC(56>pxC~YeS=fGERn!phga9{>A0R7-JCEzG^y#P*a0*<2R960&2bGXmQA5-8M z!HM;?fJzKsQjToQ0Y^JKNA+1PIM=b3%+}YambbMNoDUOlki|I%@i3l%qqOw|I45W4 zsBOIj&I{ngwsi`!=VmX*=QQ~!1Cu)xQ;uXgkUbtJD~9YqjLZO@1G4@E`V}9D;B+S7 zDD8V1oNWm>$l`uFiHGV095j=2Ccv>I;3#?oyeBs#;3)RwfTK;oQQB1t&h_Eh`(LrA z6Pypff^!g@@dO;DE_%0rG66@a>k>FGB;X*6`-grLeJ}w>sf)gI-TM`sYH++?!SRCA zkbtB3IRs8+0*=yON5L^A;3#@7fRmkoqqOUDa5S@X)HT+C?_?<+nPpCMPNIEUiF?kV zEPdBY`zOUcrsThn1D}dC2Z9I+d`JhyJ=W0qMr2f;woX@!yf*&1V-`k58pS_*fVZK4zp5Xx44xC&MD`F&n2UBQ17B@I%v7D$ zL?I;qy>~J0O~`+g@|AeA6+WOa)1Ky%pDHN^q_xcp908x^4PA-qCN9-|5L~j6E|Qr5 zS}zq@qVm*UDldY2AMUDccq{|*ffL9pq(S_J*taY>q_e=I-_e=yxjrtSMc4AS??F-8 z?~l_UzmMYCnAmVKCN@NYM0VDqDA~E}jYy;o_XPcJTBlo9qch#FTZUo1gMZq;I1oq= zKt8U8zFyqPE`A0Ob=lQA!)9G}mCj&~j?rRJo+W@!U(>06a)3i;h8hg6>>8b62ao!x zq$J(S)7+1jQ0#M*e?PXoG6pKrk~eayQymIWh>`TweSct7o}IL;1c%x=tADF>rp8%L955ZjJ)T$^R_>-%2=@>k+$9C#8P=$#@ZTTF?8jD1h5*HVZ$8?NE3uL_CFedjU z*HT+*=E{w!NlUI(p6zMSB{h-zp%!I#q3k`RjL$;{s91%z@GAMAs&sU7#3 z%;hy0%anc`d1sJEKi#16@>vjPGdc@qZNwBnzpKZ*^0ed!V`fDS4u)&smUI}UauSYt zYJWD6e{)1%O-4>9 z9v)`w0^nGHwGL&3*3_ugm3G4+z zz#-rWFbr%!o3{ZSz+=Ec;CbK`;5_gFFb#Yi-(y&T4M00E2s{J)J#ZFy5BL~J78$z* zxC_V!HUMtm+rS|34Db^0W8eeemq1E4W0}BGpa7@^wgY{@_kh0vP5~3ZbwJm{*kZs6 ztOgo@?LaT!2c87xvH5HcyNemv0>l<~vs`uyyP3_!H=)be68w?Yt?VAQlBMBKziwiw z>^62g`#SIYrR)y27;k@)Sr#)g9mc*qo&NlV)V%_fc7B1=N++ES_cH;{drI^p<6sZ{f;ar*7##vle>FV*cxXRbBsjZs9<&{Qh zJb7>RMx{<(*3rx>S?%j+vvVV)N@wHLb^F}T7PS>panG(cXQ!GIW0b?|6!Fben{svCGMGe~mND_vcpuVc63k9;aC%hYzqrm5kvB*o?#GTHfST%y!H z<)Y~GG|M%rQuGLKC<(fKKJ=Vo1@FwLxYE2>ZdixVqV^8o_3LQ~RJK3|7VEu?r# zW>Gs)CQe$_P%n2q<@q{V0z9;X*y&&j3MIUjP#ZIK)2=;#vb zx|^lpuzqt{F1L<<@koQ4H;Jc|wo5+YB6&b^=S3}x$*O}}+qY8|cfXV)IZHA!u9U=& zAuBG7sZ+xl4PYjpO0W9PaST$d&8a?_zI-Y_`km$NMILu0yz=0LFpKz%Kz! zKmJr1SOHW3^*}rDDDaoS-vO@!mw;ab$pZ*E03%QaYy{|P#=R4G6!;j$zP688v=FgxLXaM#C&jDwEt3XB&F$B;FJO_*ep999n;eTKc za0CbghC#$JfCxMeJO`WvE&+7i=z~9g9~cwI%_^~cBk=KI%W83Y>*U|U zOtC6jY~#hum9*ODa@Bg8eNNwQ_C^x+K6zuKZ4tk&VWVG^)wHrVW2E(b?T3&F$tYjz z>=OB&j9EwNbseqUURSlVz18a~M+8c;m^~Nck|cGz@e881di=ttylb_`>!K(2H09KL zS{|}@;MYGG<;l^lIKC-&rPR8dJzr=zyC3g15+E+55P&h{1riBRtH zF|SbP5;wK);Fh*l?P_s#((id-4dw0@>bx#jC)+Qm8XgRrb}m~aIGa0sB3mk8DDeN+V4dJbe`Ea++`Skgc-k+t z$$38#5F>hB?O65bslBDGlYJocxH}Pjh;GJKCN>m(&fru= zIkC|oI8vjl)clpwc$-m?+zIgB>L`ydBueN$qcZq#O_VnyYL$l$tB&T+2w`PCd;r&| z9E%j3DyLAHw409##@5F0qT>grDv1|6gxI}NuI%p_4dnx%_6wXD9_5^MQ4ahNv&2?8 z?rp&gSg+<=WBXM#ij-`Ka@092pE3A6QRcBD%8NVtDBkj5f>_vnQJ&&+`FJn$g6z9drDs^6(MLnRQVf**D`nsq|z0Y#e2&k(LRzX*Q1HQfawhn^jIe`BOfjD~fii zMs11mvj*`MmDYuC#h06LxR=Y>s<*7KY~*VaEhhIX zWpd?pT7GMxG*4Raq&0hMl*{LG+*uSA@E+&u?zUOE@=DcEPh36@A5eMbS^NfK)OEC@ zNqb7JS*kzoSQ~3Vqsp~NYozpsCH4p_IfO4}(z@EDmXXJm(v7qDKf0nY=1f#>7XQbV z!>%m1N9pI;-x$GAS_9;ww39H_qLj5sXI*7Hw<_{H`CVDnPQIVH6gdq~9&t$}+^U?r z3GW{y`F2$vw`j?8aEFp#phh?_lUIeq1`GuF&$nm({+ne${)fQ5RU6k=)vnCtZwgU; z4(j>$qOGf^#V1OdilOH}BhWW^r&-sdIt)JhgI?*<-V%oof*H7Dn0^^jjXc9JIV>dD-%Y z<(%a$%Voan{pSK>fj#}Tbeq^1t&ao}9-C?uY zR@*k(+_oOuKHF2a=WWMqqqg(5k8IPnIe826?##30Rpf2XYtHlKJ(l-W-t&3K@<#LC z$@?g8I&V(?g8V!4ZTYM7H|M+ad-C_?Kb8M{{;~Yg{CDzyo}X5bU9hE~qaaXls^G1H ze<_$Qm{a(*!exc!g&PZZ6z(g0rtrnWqlG66|FQ7n!cPmcigJnyib{*@MfVmtiW-WX zMGqA{T=Ym$uxPp{rTC8GoZ^z=?-vgj|L7~+7N`G4_tTL~vS+!wR<0{vxo>hBR`B(k7 zRe!bW?5c@Xzh1=*jGace3#KKeJd@qjXxd?V-1MU9wCR1*$ELaFbn^o9BJ&b+gZV-8 z!{+askD6abznnFnH~(Mr{M_4e7v)ywuFZWow>Nix?hkTL<^EIdh1^ebf0L_Osav^t z<o2TJZRNHNwoSHHTbJ#xZLizjwB3<+PhM_bA$ntN-p0K9(IY$2Cy$_4p37s1e6+j` q_$b3WQ`}n74lm^N|2a}xYsxZZQ~HpU7EBtG)|5_?8`poZ2mT*x0(+$Z diff --git a/UnitTests/testRes/win32/msvc/qtaudio_windows.dll b/UnitTests/testRes/win32/msvc/qtaudio_windows.dll deleted file mode 100644 index 9c284fa8d8f0c2732cfc19b9f9d42f9ae3617ae3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44032 zcmeEv3tUv!)$bV?bkxxqbubu7GD*jT1fuf-1_qcxd6}RNf`HM8D1$%{$S~uhLB$Lh zC&x)_Ytz`;);w;TrfFjv+n8rT3>fP(F$sybHTi76F_;F8RZM8+{?|U|3^RzfUwiNG zcOT#Q+vlny3Z(Xn=-#BaW zg-00tqYQq&^|cGhc%N_GEY{y7=C`r?g4z`|)aJE%=*Z=`LfI(p;JElw3Fb5xb?Z2p zlH;n7Qy}E(AHZFW)XLt~>^X|#M&UIE|LD$s{kRg7@r&Z@;2bJZz0h5FwQuLR7UaH; z`yMJj#&HfBpy9vM7%Ro_%&XtEj}05kR*vfjeb@TUa68w!QK(yv3(-e?73szk`)N6D z*$h`zrMr^j?wg6MRwO-A4N}<8j;3b_VBE9Bh}}qp>q(@rpPl16W<2O#<#bn84N!gu z64AI5DePwlD`vQwT`Q2scmm!qd_M{U!lRwqbvf%B0myiC8ku8}o<<7$**R`j*z5n7 zk2S|0e2nPtJMID$bJF z6Rq?s<B98O!m-F3Jm*7z%m$6D_peB&L5gS5Myibubw8XG~4(wDzu! z`5k-9mzh3m?{MGf9SE*bIRXoToDYD4_Rl<{g0Tf)9=}8v*M8DH&AUOPcFFlseNlWj z-p3U?76y_Q5V=ZLG&YzLh!<$<9>w`)_%>*KOV!?>+7-qBt)g3gGq?2q#rqT?PEhX- z9V!NT#X`Pbr$!$hQuF7ne{UXFlL77pV>8ft;@{I+bn&WLxLCjNB>Uwv)AH025Y)IY zk6M|quv;$U_#<^(;LlLU3UCoEDmh}xxSAw}(?UJU(^z|&Zwanemjzx27utjFI`2d1 zT@)|$@-BWtUqXA(^Qmux+B=|jP2fjWbb~P>J^?W@fSW&p+7rtB@^co^-sQ(yWaI}n{r}171@z~ny$`xLxfaUM=dFtqW)~?kC%9{eI zQ}d(vBZ=1u^!|d_ z`|+XPQybKq#ng9tMBm4i6*~etM@SB+p9@rS6Z!B`EHkv|f+Jci?zqL!(Hu8gnJrG^}Yzy@HT`W^1k z{DHH3Z{+|gC|FGgl`oAb?@b;mFXho*X)x9fxnUSUqr#_mkL$6^F+V`Z6&xNF;^QIG zN4^9gYF~jIW%O<>kbB1SoE0@aF}r2RHFijJ@-lykZoqqvn4nw`bSP0-%@@e6_sBgH zP$$Zx*ew%yV(b{k8|ouOhcDDA%J>ax>y-$-V2FC4>-*N+%5-F&+Qo)aP9sNj(@=Kf z4Ug^bxO3Rxiwd6jWwAeA!K1ocY-1z?lBWU@$0>d9cjCPUe4BM^KN- zvfDa5R}zm_FsL^|P~w2o@X(kkyaO`N^txEF4gQGOO3ia<8%+hgp_-1;Kq(BP(3nVX z4w;Gn61}DnKK?rNjt@bJ^zN+zJ;Kz)a`x^V_I@hzy_h(wEkEBY)4Jf7YP&%K8bu34A|aKp@sDEf;)Q-hFZ_WZXT9K>PMoEDh`Zp+iL^ z&6o;cvJ$U!2BY|%9f|w+{^MV_U)nIkKZi_Q9G~;6!FfK|3O|yg3`FnuDFUCs-hpVq z5oUGYdlgIJB7kG%VQ zhxucCoZp<_TLLyuO~ZA)+6S6-YM%^O9Rt1DdgJ;yKFT-BcOx&e_5w+iZ)ymMTbBSM zewcqhu>?d+WteUhFflw+eNkbUrUH`;n5Obk43i8viBM{*5SaA9q?u{Gus#Mx$vl&v z$m^}|ub<^J_|&{|ruF#xRP;bIlO`$eeq|S{cY{z9mE@?DD%P36>ZnkKI(>swLlk9p zqxoFTWYnJ*q@g=-{0i8YK_eQE@gw?4K5tmBg=G4(gFE>15>(44tW;G2$t2MWJ>-B3 z3X~~@g7EfWIhjht@!d=%!~xc-9(xXh2x7GDCsmJi;2DymgTSaE;zj%khtEJ=^o52|{-9}iNs<6rSz=*#he=w48v<&PzP;QeHdFv%pcu3F_AT z6`BGws3}y2dh^FfClil@HQq1f8((D(I_WcMALDR$VyCxz5NN>6GRD|}B7epvvB$(m z3s5G3kGVqE{qyDI{xwhG%Le&W>-#O^truFxczXsZ*YzooYOP0_C-XNziT1UOvmR?1 z?d_CXkGMYPJNXa%RXWbv-JHPR!Y5e&&@$E9*AmZvNC3TVCI8@{uXYfe1`cnB+}iEx zg;|PUt@pbI`5F8z0G>#dyr0XhU&C14;+yHa+54&7`&W4y;9MtJ<9PB|tljQ4u#O6} zWALRy5BvGgG0p6n>Gy+o|TisRXtD_#ON`c$NDzUiB*fIkFxIwU-Q5c2EGz#;*2Z9)bDAjj6;KO7W^HagC zW+nfS!rM(^;y1tK&v*^eHnmS7x;xt-Zq$`R;I&@%oQE40k4LysG&zG6;rJIs;Lo`> z{`evM!PSFkBCujMbCA)*Un84u;ViT=h?pVHy z#7pR!BDgv}_yLII=V59>_a{;Jhl9k4AQ}M)foOnZ>b)T(8V2E?2M3ZEP{AKrx;Qx9 zjmMA>fV@CCh`I#7kFB70%wjze#7yvyNAVmCtotSqGPO=t1L%zb4dOa@pT3ko5S&iS z2$&-U$%3?~2*y@X|1iEjg|rwaeq%Atu+2d2yCiI*MsZx7obM0B3az8eNLBeUm?uXu zfoJF#%=v6aAz&s%!k9V)*ih&2;5}zyqFPLAcF%YMO{f0^$Iq1I8_%30kLxe(fcfyHKYA8CsEyK~m(2VH9k6i5kHy$>_$j z^|H$U{UIE$6OJ6v&^*fxOF zk!PI5_oI|*IgsVRId9sFTO;5%4CBUc}?2B<{VKw^Q0F^#;K!qAh% zzB-viq^j)*+*snQ2!wGd;wJ_dVB`WAv5KYqTjZu$B&V6_Cr!{WqA-{H)c*K~MYBEy zF`;{uWXI)?iUyro^BWR7F$K4GY?#n_I*KfLwVhdVel$dq8LBwJkc<`-aco(*(GlZP zl8hGfA5!#bGDwIM2}pVvJc&d1m!bQ-2~=QIK?Yx{h(73-KjxpO_A9?-J?oAnWMNU@ z4>o}i!1I&+^?nYuqVG{elPm60!boB|@|%B+s?!qBcYYlOUmr8lZ!m_O1J!>dR{zKS z;KyOgq)Dek9u32>7&DK!Y9)UX-pYA$PqdiCH6gxcP`9*j>_S~j;d`N!@!q#s*FN

^;@LKS1m$a0fy5zM>wZ=SPkQ4ZPRC-E)?&2%vQpy7NpTJtA8%w*U6 zYk$TT;Fw1K%eC-COJkKUj8(KSR%!p_d_s~LIiHZs5mOY4Lwr$!Etu^h*7N_%`BU(} zh(E*d{G0r_dcOT9`BNkbPaJuGk-`%uH~~>7$^@lQJ_fNV@++T!ZPOGX`oUJGqy|&` z^2ebCkzP@BCw~NTt0gBX@F}F9&!x#sLsRHHK^}5BK_F~=uF`LAC)c0PRYd>IpTVA^ z{|+}Jme$ka{BI@AlhgdaP|$WzLT&~>LC_RZ6TwAW6d@1(Y$duPhqluIfJyR5198@h z%^=BG;7$txM5|hK5I^@VfNA_@kc#(*W|o_C1Pwjvg)FE6qe8v zia=55DTkiaeTg*_6GOlZ66)|_9TFrBq%j(8phR_6KbHFMX6D5BX9WF#EvPB<< zoX2nuLf_c@?^o)4a$3L2OC6YPm6%+)K;vaLSIB9se4}_p``d1<_e#)R^a>Tjmm-fw z9_alWz`Eg+D#-J08gl%B4H8`zX(3%Ci$2Uq49~W3JmRpB{}mv& z0N##2FU}Eo=nF=ZTk z0s~n8Nx4}6HR%6^i2hUgflzt8Be3}Dau%sz^|g+`Ymw#Nb4gF_LU7r%AB*b*=$9TC z8H*eNhlylf(bnO1kQfuE$O9zrYBl^U&rQMDV-T*(y-TNc*g;@|=}_R1h3X`cAjIw; zUif0D5YS1+j-{yZgHRsp@TPOL%PW!8hK)6jV-qG{8eit$5KjRP%#nJ`ZPr-|ReKT^ zZl;snIl5^a(dd~}R{}blh{9m(2@ueyu5%3K96(Ncheyfp)KNQBPsXdf2ZKzA_`7M% z;TtWkI`+Az@cV{V9b<}u?|Jvj0gR0l{|0f%HyYG9h87`{!)uHZYG9S(ZxC08xg3KH zcZ0-5&Df%l8^q7k`b)KpB!mfR390qL5%xs|R$=s7ThLimn-QB5d@@@^ba_w9Fnn6i z_)A?zkK%F{XNuT*<9Q}qL^`XMFf zPP}IInoxCS_EFP|$QI|BaH%WGGY0I9xzwdV^P`2PHE0^9j;)LMqk+4qwj6c~&6Ay@ z=GADvhN_*uX0c+FWr>|4@ zp|HBGuL*V0FzObty4(a})yVDI!s>Esuyu$^0;@7{Q*)ja+-f+_%u8K%&s}(~;ymBL z=wa>XnTFSR&ZEJr9j{pO2+hekcLJv45mv>k``LUe)E~%2L z?N=zn;;8LsxJ%=5IPh&$78Wf0O-!l^v8)1zXgbgmw!pIUFg@Y9w7Lo0gIq``rX8B^ zP(w=SRK$FzX4=H1F|qp&7J{o&a$fOYxh-fsJJAk)Ms-t4%bC z0UJ$)yb1xJY-M6L%|99;a+(L2&Cq$8VPUcLJi=2E=#B*Rgl+<#O!FnG1E-SVd>=$> zh}a~Uew5Wk3r(@lupPi4 z$&9|J9f56q=phkBj>io&^~QVOrU;ip@IBd16FeL-Vuea(Vtsj_j4BrDO8C2JeuDT= zm`}3_Hnbe$?pJQwOY#hN6I#3s7IumCxT@`2M5qyLS|g4Ti3xDl)ARwyV^)$h8y0#u zve~d+nhn>`Y$y-DM{y6D^q^eZ5rT7ngU^rm&yOF$0#Aq1zyf3NK<5%u2i9%n*tqic z%ZNxKOVz%TVqw$^X@a?d{O@?d{}v|=itv;SO&p*!T>Acz4Ez`ZJ0t`4Tdpeut_a}P ztm^{jMgVi`uL~R(0lcN08Om#kV&CWCG;@EAVsZ

6n->53ORzLvz4GgG?j{F$*T{ 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

G4;l3O9ev}=jn1u+ATOmGY_ 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�%X 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 diff --git a/UnitTests/testRes/win64/msvc/lib.dll b/UnitTests/testRes/win64/msvc/lib.dll deleted file mode 100644 index d33efe0a8012c8dba109e1a80753bbebaee87da5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 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 P`FF#s{0rv)9u53YdrLaP diff --git a/_config.yml b/_config.yml deleted file mode 100644 index ddeb671b..00000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-time-machine \ No newline at end of file diff --git a/doxygen.conf b/doxygen.conf index 2d9a0e49..d7da7d56 100644 --- a/doxygen.conf +++ b/doxygen.conf @@ -32,7 +32,8 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = CQtDeployer official documentation page +PROJECT_NAME = CQtDeployer + # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. @@ -50,7 +51,8 @@ PROJECT_BRIEF = # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = "res/CQtDeployer logo_web.png" +PROJECT_LOGO = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If @@ -701,7 +703,7 @@ FILE_VERSION_FILTER = # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = QuasarAppLib/CMake/DoxyStyle/DoxygenLayout.xml +LAYOUT_FILE = submodules/CMake/DoxyStyle/DoxygenLayout.xml # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -788,10 +790,8 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = ./md \ - - - +INPUT = ./src/Library/src \ + ./README.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 @@ -874,7 +874,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = ./submodules # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -927,7 +927,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = ./res +IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -983,7 +983,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = md/README.md +USE_MDFILE_AS_MAINPAGE = ./README.md #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -1193,7 +1193,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = QuasarAppLib/CMake/DoxyStyle/doxygenStyles.css +HTML_EXTRA_STYLESHEET = submodules/CMake/DoxyStyle/doxygenStyles.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1392,7 +1392,7 @@ QCH_FILE = # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_NAMESPACE = QuasarApp +QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual @@ -1496,7 +1496,7 @@ ENUM_VALUES_PER_LINE = 4 # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. -TREEVIEW_WIDTH = 300 +TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. @@ -1621,7 +1621,7 @@ SERVER_BASED_SEARCH = NO # The default value is: NO. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH = NO +EXTERNAL_SEARCH = YES # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. diff --git a/examples/TestQMLWidgets/.qmake.stash b/examples/TestQMLWidgets/.qmake.stash deleted file mode 100644 index 17a7f337..00000000 --- a/examples/TestQMLWidgets/.qmake.stash +++ /dev/null @@ -1,24 +0,0 @@ -QMAKE_CXX.INCDIRS = \ - /usr/include/c++/7 \ - /usr/include/x86_64-linux-gnu/c++/7 \ - /usr/include/c++/7/backward \ - /usr/lib/gcc/x86_64-linux-gnu/7/include \ - /usr/local/include \ - /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed \ - /usr/include/x86_64-linux-gnu \ - /usr/include -QMAKE_CXX.LIBDIRS = \ - /usr/lib/gcc/x86_64-linux-gnu/7 \ - /usr/lib/x86_64-linux-gnu \ - /usr/lib \ - /lib/x86_64-linux-gnu \ - /lib -QMAKE_CXX.QT_COMPILER_STDCXX = 201402L -QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 7 -QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3 -QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0 -QMAKE_CXX.COMPILER_MACROS = \ - QT_COMPILER_STDCXX \ - QMAKE_GCC_MAJOR_VERSION \ - QMAKE_GCC_MINOR_VERSION \ - QMAKE_GCC_PATCH_VERSION diff --git a/examples/TestQMLWidgets/HomeForm.ui.qml b/examples/TestQMLWidgets/HomeForm.ui.qml deleted file mode 100644 index 6474fad0..00000000 --- a/examples/TestQMLWidgets/HomeForm.ui.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -Page { - width: 600 - height: 400 - - title: qsTr("Home") - - Label { - text: qsTr("You are on the home page.") - anchors.centerIn: parent - } -} diff --git a/examples/TestQMLWidgets/Page1Form.ui.qml b/examples/TestQMLWidgets/Page1Form.ui.qml deleted file mode 100644 index a25e78ae..00000000 --- a/examples/TestQMLWidgets/Page1Form.ui.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -Page { - width: 600 - height: 400 - - title: qsTr("Page 1") - - Label { - text: qsTr("You are on Page 1.") - anchors.centerIn: parent - } -} diff --git a/examples/TestQMLWidgets/Page2Form.ui.qml b/examples/TestQMLWidgets/Page2Form.ui.qml deleted file mode 100644 index c34bb984..00000000 --- a/examples/TestQMLWidgets/Page2Form.ui.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -Page { - width: 600 - height: 400 - - title: qsTr("Page 2") - - Label { - text: qsTr("You are on Page 2.") - anchors.centerIn: parent - } -} diff --git a/examples/TestQMLWidgets/README.md b/examples/TestQMLWidgets/README.md deleted file mode 100644 index 9c1b75f4..00000000 --- a/examples/TestQMLWidgets/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# This example for packing apps to snap -You need to build your project with your own Qt version. - -1. cd ~/ # go to home dir -2. snap install cqtdeployer # install cqtdeployer from snap store -3. git clone https://github.com/QuasarApp/CQtDeployer.git # clone this project -4. cd Console-QtDeployer/examples/TestQMLWidgets # go to folder with example -5. /path/to/your/qmake/bin/qmake TestQMLWidgets.pro # run your qmake for this example -6. make # build example -7. cqtdeployer -bin ./build/TestQMLWidgets -qmake /path/to/your/qmake/bin/qmake -qmlDir ./ -targetDir ./distro - # run cqtdeployer for deploy example project -8. snapcraft # create snapcraft build -9. snap install cqtdeployerexample_0.1_amd64.snap --dangerous # install this example -10. cqtdeployerexample # check - -Done! diff --git a/examples/TestQMLWidgets/TestQMLWidgets.pro b/examples/TestQMLWidgets/TestQMLWidgets.pro deleted file mode 100644 index 762b55dd..00000000 --- a/examples/TestQMLWidgets/TestQMLWidgets.pro +++ /dev/null @@ -1,27 +0,0 @@ -QT += quick -CONFIG += c++11 - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Refer to the documentation for the -# deprecated API to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp - -RESOURCES += qml.qrc - -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = - -# Additional import path used to resolve QML modules just for Qt Quick Designer -QML_DESIGNER_IMPORT_PATH = - -DESTDIR="$$PWD/build" - diff --git a/examples/TestQMLWidgets/main.cpp b/examples/TestQMLWidgets/main.cpp deleted file mode 100644 index 6333b85c..00000000 --- a/examples/TestQMLWidgets/main.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -int main(int argc, char *argv[]) -{ - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - - QGuiApplication app(argc, argv); - - QQmlApplicationEngine engine; - engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); - if (engine.rootObjects().isEmpty()) - return -1; - - return app.exec(); -} diff --git a/examples/TestQMLWidgets/main.qml b/examples/TestQMLWidgets/main.qml deleted file mode 100644 index d5d621a3..00000000 --- a/examples/TestQMLWidgets/main.qml +++ /dev/null @@ -1,65 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -ApplicationWindow { - id: window - visible: true - width: 640 - height: 480 - title: qsTr("Stack") - - header: ToolBar { - contentHeight: toolButton.implicitHeight - - ToolButton { - id: toolButton - text: stackView.depth > 1 ? "\u25C0" : "\u2630" - font.pixelSize: Qt.application.font.pixelSize * 1.6 - onClicked: { - if (stackView.depth > 1) { - stackView.pop() - } else { - drawer.open() - } - } - } - - Label { - text: stackView.currentItem.title - anchors.centerIn: parent - } - } - - Drawer { - id: drawer - width: window.width * 0.66 - height: window.height - - Column { - anchors.fill: parent - - ItemDelegate { - text: qsTr("Page 1") - width: parent.width - onClicked: { - stackView.push("Page1Form.ui.qml") - drawer.close() - } - } - ItemDelegate { - text: qsTr("Page 2") - width: parent.width - onClicked: { - stackView.push("Page2Form.ui.qml") - drawer.close() - } - } - } - } - - StackView { - id: stackView - initialItem: "HomeForm.ui.qml" - anchors.fill: parent - } -} diff --git a/examples/TestQMLWidgets/qml.qrc b/examples/TestQMLWidgets/qml.qrc deleted file mode 100644 index 77259896..00000000 --- a/examples/TestQMLWidgets/qml.qrc +++ /dev/null @@ -1,9 +0,0 @@ - - - main.qml - HomeForm.ui.qml - Page1Form.ui.qml - Page2Form.ui.qml - qtquickcontrols2.conf - - diff --git a/examples/TestQMLWidgets/qtquickcontrols2.conf b/examples/TestQMLWidgets/qtquickcontrols2.conf deleted file mode 100644 index 08109fee..00000000 --- a/examples/TestQMLWidgets/qtquickcontrols2.conf +++ /dev/null @@ -1,6 +0,0 @@ -; This file can be edited to change the style of the application -; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Imagine diff --git a/examples/TestQMLWidgets/snap/snapcraft.yaml b/examples/TestQMLWidgets/snap/snapcraft.yaml deleted file mode 100644 index 078e1247..00000000 --- a/examples/TestQMLWidgets/snap/snapcraft.yaml +++ /dev/null @@ -1,53 +0,0 @@ -name: cqtdeployerexample # you probably want to 'snapcraft register ' -base: core18 # the base snap is the execution environment for this snap -version: '0.1' # just for humans, typically '1.2+git' or '1.3.2' -summary: simple example for packing with cqtdeployer # 79 char long summary -description: | - simple example for packing with cqtdeployer - -grade: stable # must be 'stable' to release into candidate/stable channels -confinement: strict # use 'strict' once you have the right plugs and slots - - -apps: - cqtdeployerexample: - command: desktop-launch $SNAP/TestQMLWidgets.sh - - plugs: [desktop, unity7, home, opengl, x11, wayland] - - -parts: - cqtdeployerexample: - # See 'snapcraft plugins' - plugin: dump - source: distro - after: [wrapper, libsgl] - - wrapper: - plugin: dump - source: wrapper - - libsgl: - plugin: nil - stage-packages: - # Here for the plugins-- they're not linked in automatically. - - libx11-xcb1 - - libglu1-mesa - - libxrender1 - - libxi6 - - libegl1-mesa - - fontconfig - - libgl1-mesa-dri - - libxkbcommon0 - - ttf-ubuntu-font-family - - dmz-cursor-theme - - adwaita-icon-theme - - gnome-themes-standard - - shared-mime-info - - libgdk-pixbuf2.0-0 - - libgtk2.0-0 - - xdg-user-dirs - - libxrandr2 - - libwayland-cursor0 - - libwayland-egl1 - - libpq5 diff --git a/examples/TestQMLWidgets/wrapper/bin/desktop-launch b/examples/TestQMLWidgets/wrapper/bin/desktop-launch deleted file mode 100755 index 2a6d60ca..00000000 --- a/examples/TestQMLWidgets/wrapper/bin/desktop-launch +++ /dev/null @@ -1,442 +0,0 @@ -#!/bin/bash -################# -# Launcher init # -################# - -START=$(date +%s.%N) - -# On Fedora $SNAP is under /var and there is some magic to map it to /snap. -# # We need to handle that case and reset $SNAP -SNAP=`echo $SNAP | sed -e "s|/var/lib/snapd||g"` - -needs_update=true - -. $SNAP_USER_DATA/.last_revision 2>/dev/null || true -if [ "$SNAP_DESKTOP_LAST_REVISION" = "$SNAP_REVISION" ]; then - needs_update=false -fi - -# Set $REALHOME to the users real home directory -REALHOME=`getent passwd $UID | cut -d ':' -f 6` - -# If the user has modified their user-dirs settings, force an update -if [[ -f $HOME/.config/user-dirs.dirs.md5sum && -f $HOME/.config/user-dirs.locale.md5sum ]]; then - if [[ "$(md5sum < $REALHOME/.config/user-dirs.dirs)" != "$(cat $HOME/.config/user-dirs.dirs.md5sum)" || - "$(md5sum < $REALHOME/.config/user-dirs.locale)" != "$(cat $HOME/.config/user-dirs.locale.md5sum)" ]]; then - needs_update=true - fi -fi - -if [ "$SNAP_ARCH" == "amd64" ]; then - ARCH="x86_64-linux-gnu" -elif [ "$SNAP_ARCH" == "armhf" ]; then - ARCH="arm-linux-gnueabihf" -elif [ "$SNAP_ARCH" == "arm64" ]; then - ARCH="aarch64-linux-gnu" -else - ARCH="$SNAP_ARCH-linux-gnu" -fi - -export SNAP_LAUNCHER_ARCH_TRIPLET=$ARCH - -# Don't LD_PRELOAD bindtextdomain for classic snaps -if ! grep -qs "^\s*confinement:\s*classic\s*" $SNAP/meta/snap.yaml; then - if [ -f $SNAP/lib/bindtextdomain.so ]; then - export LD_PRELOAD=$LD_PRELOAD:$SNAP/lib/bindtextdomain.so - fi -fi -############################################### -# Launcher common exports for any desktop app # -############################################### - -function prepend_dir() { - local var="$1" - local dir="$2" - if [ -d "$dir" ]; then - eval "export $var=\"\$dir\${$var:+:\$$var}\"" - fi -} - -function append_dir() { - local var="$1" - local dir="$2" - if [ -d "$dir" ]; then - eval "export $var=\"\${$var:+\$$var:}\$dir\"" - fi -} - -function can_open_file() { - return `head -c0 "$1" &> /dev/null`; -} - -WITH_RUNTIME=no -if [ -z "$RUNTIME" ]; then - RUNTIME=$SNAP -else - # add general paths not added by snapcraft due to runtime snap - append_dir LD_LIBRARY_PATH $RUNTIME/lib/$ARCH - append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH - append_dir PATH $RUNTIME/usr/bin - WITH_RUNTIME=yes -fi - -# XKB config -export XKB_CONFIG_ROOT=$RUNTIME/usr/share/X11/xkb - -# Give XOpenIM a chance to locate locale data. -# This is required for text input to work in SDL2 games. -export XLOCALEDIR=$RUNTIME/usr/share/X11/locale - -# Set XCursors path -export XCURSOR_PATH=$RUNTIME/usr/share/icons - -# Mesa Libs for OpenGL support -append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/mesa -append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/mesa-egl - -# Tell libGL where to find the drivers -export LIBGL_DRIVERS_PATH=$RUNTIME/usr/lib/$ARCH/dri -append_dir LD_LIBRARY_PATH $LIBGL_DRIVERS_PATH - -# Workaround in snapd for proprietary nVidia drivers mounts the drivers in -# /var/lib/snapd/lib/gl that needs to be in LD_LIBRARY_PATH -# Without that OpenGL using apps do not work with the nVidia drivers. -# Ref.: https://bugs.launchpad.net/snappy/+bug/1588192 -append_dir LD_LIBRARY_PATH /var/lib/snapd/lib/gl - -# Unity7 export (workaround for https://launchpad.net/bugs/1638405) -append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/libunity - -# Pulseaudio export -append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/pulseaudio - -# EGL vendor files on glvnd enabled systems -[ -d /var/lib/snapd/lib/glvnd/egl_vendor.d ] && \ - append_dir __EGL_VENDOR_LIBRARY_DIRS /var/lib/snapd/lib/glvnd/egl_vendor.d - -# Tell GStreamer where to find its plugins -export GST_PLUGIN_PATH=$SNAP/usr/lib/$ARCH/gstreamer-1.0 -export GST_PLUGIN_SYSTEM_PATH=$RUNTIME/usr/lib/$ARCH/gstreamer-1.0 -# gst plugin scanner doesn't install in the correct path: https://github.com/ubuntu/snapcraft-desktop-helpers/issues/43 -export GST_PLUGIN_SCANNER=$RUNTIME/usr/lib/$ARCH/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner - -# XDG Config -[ "$WITH_RUNTIME" = yes ] && prepend_dir XDG_CONFIG_DIRS $RUNTIME/etc/xdg -prepend_dir XDG_CONFIG_DIRS $SNAP/etc/xdg - -# Define snaps' own data dir -[ "$WITH_RUNTIME" = yes ] && prepend_dir XDG_DATA_DIRS $RUNTIME/usr/share -prepend_dir XDG_DATA_DIRS $SNAP/usr/share -prepend_dir XDG_DATA_DIRS $SNAP/share -prepend_dir XDG_DATA_DIRS $SNAP/data-dir -prepend_dir XDG_DATA_DIRS $SNAP_USER_DATA - -# Set XDG_DATA_HOME to local path -export XDG_DATA_HOME=$SNAP_USER_DATA/.local/share -mkdir -p $XDG_DATA_HOME - -# Workaround for GLib < 2.53.2 not searching for schemas in $XDG_DATA_HOME: -# https://bugzilla.gnome.org/show_bug.cgi?id=741335 -prepend_dir XDG_DATA_DIRS $XDG_DATA_HOME - -# Set cache folder to local path -export XDG_CACHE_HOME=$SNAP_USER_COMMON/.cache -if [[ -d $SNAP_USER_DATA/.cache && ! -e $XDG_CACHE_HOME ]]; then - # the .cache directory used to be stored under $SNAP_USER_DATA, migrate it - mv $SNAP_USER_DATA/.cache $SNAP_USER_COMMON/ -fi -mkdir -p $XDG_CACHE_HOME - -# Set config folder to local path -export XDG_CONFIG_HOME=$SNAP_USER_DATA/.config -mkdir -p $XDG_CONFIG_HOME - -# Create $XDG_RUNTIME_DIR if not exists (to be removed when LP: #1656340 is fixed) -[ -n "$XDG_RUNTIME_DIR" ] && mkdir -p $XDG_RUNTIME_DIR -m 700 - -# Ensure the app finds locale definitions (requires locales-all to be installed) -append_dir LOCPATH $RUNTIME/usr/lib/locale - -# If any, keep track of where XDG dirs were so we can potentially migrate the content later -test -f ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs && . ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs -for d in DOCUMENTS DESKTOP DOWNLOAD MUSIC PICTURES VIDEOS PUBLICSHARE TEMPLATES; do - eval $(echo "OLD_XDG_${d}_DIR")=`eval "$(echo "echo \\$XDG_${d}_DIR")"` -done - -# Setup user-dirs.* or run xdg-user-dirs-update if needed -needs_xdg_update=false -needs_xdg_links=false -if can_open_file "$REALHOME/.config/user-dirs.dirs" && can_open_file "$REALHOME/.config/user-dirs.locale"; then - mkdir -p $HOME/.config -m 700 - sed /^#/!s#\$HOME#${REALHOME}#g $REALHOME/.config/user-dirs.dirs > $HOME/.config/user-dirs.dirs - cp -a $REALHOME/.config/user-dirs.locale $HOME/.config/ - for f in user-dirs.dirs user-dirs.locale; do - md5sum < $REALHOME/.config/$f > $HOME/.config/$f.md5sum - done -else - needs_xdg_update=true - needs_xdg_links=true -fi - -# Check if we can actually read the contents of each xdg dir -test -f ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs && . ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs -XDG_SPECIAL_DIRS=($XDG_DOCUMENTS_DIR $XDG_DESKTOP_DIR $XDG_DOWNLOAD_DIR $XDG_MUSIC_DIR $XDG_PICTURES_DIR $XDG_VIDEOS_DIR $XDG_PUBLIC_DIR $XDG_TEMPLATES_DIR) -for d in ${XDG_SPECIAL_DIRS[@]}; do - if ! can_open_file $d; then - needs_xdg_update=true - fi -done - -# If needs XDG update and xdg-user-dirs-update exists in $PATH, run it -if [ $needs_xdg_update = true ] && command -v xdg-user-dirs-update >/dev/null; then - xdg-user-dirs-update -fi - -# Create links for user-dirs.dirs -if [ $needs_xdg_links = true ]; then - test -f ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs && . ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs - XDG_SPECIAL_DIRS=($XDG_DOCUMENTS_DIR $XDG_DESKTOP_DIR $XDG_DOWNLOAD_DIR $XDG_MUSIC_DIR $XDG_PICTURES_DIR $XDG_VIDEOS_DIR $XDG_PUBLIC_DIR $XDG_TEMPLATES_DIR) - for d in ${XDG_SPECIAL_DIRS[@]}; do - b=$(realpath "$d" --relative-to="$REALHOME") - if [ -e $REALHOME/$b ] && [ ! -e $HOME/$b ]; then - ln -s $REALHOME/$b $HOME/$b - fi - done -else - # If we aren't creating new links, check if we have content saved in old locations and move it - for d in DOCUMENTS DESKTOP DOWNLOAD MUSIC PICTURES VIDEOS PUBLICSHARE TEMPLATES; do - old=`eval "$(echo "echo \\$OLD_XDG_${d}_DIR")"` - new=`eval "$(echo "echo \\$XDG_${d}_DIR")"` - if [ -L "$old" ] && [ -d "$new" ] && [ `readlink "$old"` != "$new" ]; then - mv "$old"/* "$new"/ 2>/dev/null - elif [ -d "$old" ] && [ -d "$new" ] && [ "$old" != "$new" ]; then - mv "$old"/* "$new"/ 2>/dev/null - fi - done -fi - -# If detect wayland server socket, then set environment so applications prefer -# wayland, and setup compat symlink (until we use user mounts. Remember, -# XDG_RUNTIME_DIR is /run/user//snap.$SNAP so look in the parent directory -# for the socket. For details: -# https://forum.snapcraft.io/t/wayland-dconf-and-xdg-runtime-dir/186/10 -# Applications that don't support wayland natively may define DISABLE_WAYLAND -# (to any non-empty value) to skip that logic entirely. -wayland_available=false -if [[ -n "$XDG_RUNTIME_DIR" && -z "$DISABLE_WAYLAND" ]]; then - wdisplay="wayland-0" - if [ -n "$WAYLAND_DISPLAY" ]; then - wdisplay="$WAYLAND_DISPLAY" - fi - wayland_sockpath="$XDG_RUNTIME_DIR/../$wdisplay" - wayland_snappath="$XDG_RUNTIME_DIR/$wdisplay" - if [ -S "$wayland_sockpath" ]; then - # if running under wayland, use it - #export WAYLAND_DEBUG=1 - wayland_available=true - # create the compat symlink for now - if [ ! -e "$wayland_snappath" ]; then - ln -s "$wayland_sockpath" "$wayland_snappath" - fi - fi -fi - -# Make PulseAudio socket available inside the snap-specific $XDG_RUNTIME_DIR -if [ -n "$XDG_RUNTIME_DIR" ]; then - pulsenative="pulse/native" - pulseaudio_sockpath="$XDG_RUNTIME_DIR/../$pulsenative" - if [ -S "$pulseaudio_sockpath" ]; then - export PULSE_SERVER="unix:${pulseaudio_sockpath}" - fi -fi - -# GI repository -[ "$WITH_RUNTIME" = yes ] && prepend_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/$ARCH/girepository-1.0 -[ "$WITH_RUNTIME" = yes ] && prepend_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/girepository-1.0 -prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/$ARCH/girepository-1.0 -prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/girepository-1.0 -prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/gjs/girepository-1.0 - -# Keep an array of data dirs, for looping through them -IFS=':' read -r -a data_dirs_array <<< "$XDG_DATA_DIRS" - -# Font Config and themes -export FONTCONFIG_PATH=$RUNTIME/etc/fonts -export FONTCONFIG_FILE=$RUNTIME/etc/fonts/fonts.conf - -function make_user_fontconfig { - echo "" - if [ -d $REALHOME/.local/share/fonts ]; then - echo "

$REALHOME/.local/share/fonts" - fi - if [ -d $REALHOME/.fonts ]; then - echo " $REALHOME/.fonts" - fi - for d in "${data_dirs_array[@]}"; do - if [ -d "$d/fonts" ]; then - echo " $d/fonts" - fi - done - echo ' conf.d' - # We need to include this default cachedir first so that caching - # works: without it, fontconfig will try to write to the real user home - # cachedir and be blocked by AppArmor. - echo ' fontconfig' - if [ -d $REALHOME/.cache/fontconfig ]; then - echo " $REALHOME/.cache/fontconfig" - fi - echo "" -} - -if [ $needs_update = true ]; then - rm -rf $XDG_DATA_HOME/{fontconfig,fonts,fonts-*,themes,.themes} - - # This fontconfig fragment is installed in a location that is - # included by the system fontconfig configuration: namely the - # etc/fonts/conf.d/50-user.conf file. - mkdir -p $XDG_CONFIG_HOME/fontconfig - make_user_fontconfig > $XDG_CONFIG_HOME/fontconfig/fonts.conf - - # the themes symlink are needed for GTK 3.18 when the prefix isn't changed - # GTK 3.20 looks into XDG_DATA_DIR which has connected themes. - ln -sf $RUNTIME/usr/share/themes $XDG_DATA_HOME - ln -sfn $RUNTIME/usr/share/themes $SNAP_USER_DATA/.themes -fi - -# Build mime.cache -# needed for gtk and qt icon -if [ $needs_update = true ]; then - rm -rf $XDG_DATA_HOME/mime - if [ ! -f $RUNTIME/usr/share/mime/mime.cache ]; then - if command -v update-mime-database >/dev/null; then - cp --preserve=timestamps -dR $RUNTIME/usr/share/mime $XDG_DATA_HOME - update-mime-database $XDG_DATA_HOME/mime - fi - fi -fi - -# Gio modules and cache (including gsettings module) -export GIO_MODULE_DIR=$XDG_CACHE_HOME/gio-modules -function compile_giomodules { - if [ -f $1/glib-2.0/gio-querymodules ]; then - rm -rf $GIO_MODULE_DIR - mkdir -p $GIO_MODULE_DIR - ln -s $1/gio/modules/*.so $GIO_MODULE_DIR - $1/glib-2.0/gio-querymodules $GIO_MODULE_DIR - fi -} -if [ $needs_update = true ]; then - compile_giomodules $RUNTIME/usr/lib/$ARCH -fi - -# Setup compiled gsettings schema -GS_SCHEMA_DIR=$XDG_DATA_HOME/glib-2.0/schemas -function compile_schemas { - if [ -f "$1" ]; then - rm -rf $GS_SCHEMA_DIR - mkdir -p $GS_SCHEMA_DIR - for d in "${data_dirs_array[@]}"; do - schema_dir=$d/glib-2.0/schemas - if [ -f "$schema_dir/gschemas.compiled" ]; then - # This directory already has compiled schemas - continue - fi - if [ -n "$(ls -A $schema_dir/*.xml 2>/dev/null)" ]; then - ln -s $schema_dir/*.xml $GS_SCHEMA_DIR - fi - if [ -n "$(ls -A $schema_dir/*.override 2>/dev/null)" ]; then - ln -s $schema_dir/*.override $GS_SCHEMA_DIR - fi - done - # Only compile schemas if we copied anyting - if [ -n "$(ls -A $GS_SCHEMA_DIR/*.xml $GS_SCHEMA_DIR/*.override 2>/dev/null)" ]; then - "$1" $GS_SCHEMA_DIR - fi - fi -} -if [ $needs_update = true ]; then - compile_schemas $RUNTIME/usr/lib/$ARCH/glib-2.0/glib-compile-schemas -fi - -# Enable gsettings user changes -# symlink the dconf file if home plug is connected for read -DCONF_DEST_USER_DIR=$SNAP_USER_DATA/.config/dconf -if [ ! -f $DCONF_DEST_USER_DIR/user ]; then - if [ -f $REALHOME/.config/dconf/user ]; then - mkdir -p $DCONF_DEST_USER_DIR - ln -s $REALHOME/.config/dconf/user $DCONF_DEST_USER_DIR - fi -fi - -# Testability support -append_dir LD_LIBRARY_PATH $SNAP/testability -append_dir LD_LIBRARY_PATH $SNAP/testability/$ARCH -append_dir LD_LIBRARY_PATH $SNAP/testability/$ARCH/mesa - -# Gdk-pixbuf loaders -export GDK_PIXBUF_MODULE_FILE=$XDG_CACHE_HOME/gdk-pixbuf-loaders.cache -export GDK_PIXBUF_MODULEDIR=$RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/2.10.0/loaders -if [ $needs_update = true ]; then - rm -f $GDK_PIXBUF_MODULE_FILE - if [ -f $RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders ]; then - $RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders > $GDK_PIXBUF_MODULE_FILE - fi -fi - -# Icon themes cache -if [ $needs_update = true ]; then - rm -rf $XDG_DATA_HOME/icons - mkdir -p $XDG_DATA_HOME/icons - for d in "${data_dirs_array[@]}"; do - for i in $d/icons/*; do - if [ -f "$i/index.theme" -a ! -f "$i/icon-theme.cache" ]; then - theme_dir=$XDG_DATA_HOME/icons/$(basename "$i") - if [ ! -d "$theme_dir" ]; then - mkdir -p "$theme_dir" - ln -s $i/* "$theme_dir" - if [ -f $RUNTIME/usr/sbin/update-icon-caches ]; then - $RUNTIME/usr/sbin/update-icon-caches "$theme_dir" - elif [ -f $RUNTIME/usr/sbin/update-icon-cache.gtk2 ]; then - $RUNTIME/usr/sbin/update-icon-cache.gtk2 "$theme_dir" - fi - fi - fi - done - done -fi - -# GTK theme and behavior modifier -# Those can impact the theme engine used by Qt as well -gtk_configs=(.config/gtk-3.0/settings.ini .config/gtk-3.0/bookmarks .config/gtk-2.0/gtkfilechooser.ini) -for f in ${gtk_configs[@]}; do - dest="$SNAP_USER_DATA/$f" - if [ ! -L "$dest" ] - then - mkdir -p `dirname $dest` - ln -s $REALHOME/$f $dest - fi -done - -# create symbolic link to ibus socket path for ibus to look up its socket files -# (see comments #3 and #6 on https://launchpad.net/bugs/1580463) -IBUS_CONFIG_PATH=$XDG_CONFIG_HOME/ibus -mkdir -p $IBUS_CONFIG_PATH -[ -d $IBUS_CONFIG_PATH/bus ] && rm -rf $IBUS_CONFIG_PATH/bus -ln -sfn $REALHOME/.config/ibus/bus $IBUS_CONFIG_PATH - -############################## -# Glib minimum specific part # -############################## - -############################### -# Mark update and exec binary # -############################### - -[ $needs_update = true ] && echo "SNAP_DESKTOP_LAST_REVISION=$SNAP_REVISION" > $SNAP_USER_DATA/.last_revision - -if [ -n "$SNAP_DESKTOP_DEBUG" ]; then - echo "desktop-launch elapsed time: " $(date +%s.%N --date="$START seconds ago") - echo "Now running: exec $@" -fi - -exec "$@" diff --git a/md/Marketplace/CqtDeployer-Manifest.json b/md/Marketplace/CqtDeployer-Manifest.json deleted file mode 100644 index 55a63b95..00000000 --- a/md/Marketplace/CqtDeployer-Manifest.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://qt.io/schema/extension-schema-v1#", - "title": "CQtDeployer", - "extensionType": [ - "tool" - ], - "version": "1.3.2", - "vendor": { - "name": "QuasarApp group", - "url": "https://github.com/QuasarApp" - }, - "contact": " QuasarApp@yandex.by", - "copyright": [ "QuasarApp" ], - "author": "QuasarApp team", - "icon": "https://github.com/QuasarApp/CQtDeployer/blob/master/res/icon%20(snapAlpha).png", - "licenses": [ - { "licenseType": "lGPLv3", - "licenseUrl": "https://github.com/QuasarApp/CQtDeployer/blob/master/LICENSE" } - ], - "created": "2018-08-19", - "lastUpdate": "2019-11-15", - "platforms": [ - "Linux (libc 2.27 or later)", "Windows 7 or later" - ], - "qtVersions": [ - "5.12", "5.13", "5.14" - ], - "tags": [ - "Deploy", "Deployment" ], - "price": { - "listprice": 0 - }, - "support": "https://github.com/QuasarApp/CQtDeployer/issues", - "bugUrl": "https://github.com/QuasarApp/CQtDeployer/issues", - "sourceRepoUrl": "https://github.com/QuasarApp/CQtDeployer", - "dependencies": [ - "Core" - ] -} - diff --git a/md/Marketplace/Marketplace.md b/md/Marketplace/Marketplace.md deleted file mode 100644 index 7bb31f72..00000000 --- a/md/Marketplace/Marketplace.md +++ /dev/null @@ -1,33 +0,0 @@ -## What is CQtDeployer -The CQtDeployer is application for extract all depends library of executable and create 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's got flags that help you to configure the deployment for your or your project's needs -* Crossdeploy: this application's support windows and linux distrebutives, This means that you can use it not only to deploy a project for your platform, but also to deploy a project on Linux for Windows and vice versa. - -## How to use -Deploying a Qt or QML application is easy! -To do this, simply install cqtdeployer on your computer and enter the following line: - -#### Linux: -``` bash -cqtdeployer -bin myApp -qmake /media/D/Qt/5.12.3/gcc_64/bin/qmake -qmlDir ./ -``` - -#### Windows: -``` bash -%cqtdeployer% -bin myApp.exe -qmake /media/D/Qt/5.12.3/gcc_64/bin/qmake.exe -qmlDir ./ -``` - - -#### Discription -* -bin - this is option for set the path to executable files. -* -qmake - this is option for set the path to qmake with which the application was created. -* -qmlDir - this is option for set the path to folder with qml files of application. - -## Install -You can download the latest version of the CQtDeployer [here](https://github.com/QuasarApp/CQtDeployer/releases) for Windows and linux platforms. -Or use the snap version for servers without gui. - -[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) diff --git a/md/README.md b/md/README.md deleted file mode 100644 index c07e95f1..00000000 --- a/md/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# CQtDeployer - -Here you can find documentation for the CQtDeployer in different languages. It describes: - -* Information on how to use this deployment Tool. (How to create installers with cqtdeployer) -* Main description (description of the functionality and capabilities of the program) -* Description of recent changes (changelog) - - -## Сhoose your language to read the CQtDeployer documentation: - -* [Документация на русском языке](ru/Home.md) -* [English language documentation](en/Home.md) diff --git a/md/_config.yml b/md/_config.yml deleted file mode 100644 index 9da9a029..00000000 --- a/md/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-dinky \ No newline at end of file diff --git a/md/en/1_4.md b/md/en/1_4.md deleted file mode 100755 index 866a1ada..00000000 --- a/md/en/1_4.md +++ /dev/null @@ -1,422 +0,0 @@ -# Release of CQtDeployer v1.4.0 (Binary Box) - -Release of C++/Qt and QML application deployment utility CQtDeployer v1.4.0 (Binary Box) - -Almost half a year later, a major update of the CQtDeployer deployment utility was released. -This update has many new futures, but the main emphasis is on creating packages. - -## CQtDeployer 1.4.0 -### Fixes -- Fixed The help output in the console, now the actual size of the console is recounted before the output, which allows you to correctly transfer text. -- Fixed work with the deployment of Qt plugins. Now plug-ins do not extract all system dependencies, but only qt. Extract system dependencies caused applications to crash due to incompatible plugin libraries. -- Minor bug fixes and improvements. - -### New features -- Added support for qmake search from the system environment. -- Added the ability to initialize the repository for further packaging, similar to git init. -- Added support for Qt Install Framework packages. Now you can pack the distribution into the installer. -- Added the ability to split the final distribution into several packages. -- Added the ability to unify the creation of packages for the final distribution. -- Added support for adding custom scripts to application launch scripts. -- Added support for extracting system dependencies for Windows. -- Added support for RPATH for Linux. Now cqtdeployer can independently determine the necessary qmake to deploy the application. -- Added support for finding the required dependency by library name. -- Added support for Qt libraries from Linux distributions repositories. -- Added new alias for the run command (cqt and cqtdeployer.cqt) for fast deploy of applications. -- Added support the native name of command for windows. Now you can run a cqtdeployer from cqtdeployer commnad in cmd and powershell. - -### New options -- init - will initialize cqtdeployer.json file (configuration file). For example: "cqtdeployer init" - to initialize the configuration of a base package. "cqtdeployer -init multi" - to initialize the configuration of several packages. -- noCheckRPATH - disables the automatic search for paths to qmake in executable files (Linux only). -- noCheckPATH - disables the automatic search for paths to qmake in the system environment. -- extractPlugins - forces to extract all plug-in dependencies. -- qif - creates an installer at the end of the deployment. -- extraLibs - adds a template for an additional library, which should be included in the distribution. -- customScript - adds a custom script to the startup script of the application. -- -targetPackage [package; tar1, package; tar2] - used to form packages, denotes lists of target files for specific packages. -- recOut - indicates in which folder the resources will be added after deployment. -- name - sets the name of the package. -- description - sets the package description -- deployVersion - sets the package version -- releaseDate - sets the release date of the package. -- icon - sets the package icon. -- publisher - sets the publisher of the package. -- qifStyle - Sets the path to the CSS style file or sets the default style. Available styles: quasar -- qifBanner - Sets path to the banner png file. -- qifLogo - Sets path to the logo png file. - -## A detailed analysis of the most interesting changes. - -The first thing you should pay attention to is that CQtDeployer has learned to work with RPATH (Linux only) and PATH. This means that if your application is built with RPATH support (and RPATH in qt is enabled by default) or your qmake is registered in PATH, then you do not need to specify the path to qmake. CQtDeployer will find qmake for itself. - -Let's test it in practice. -I created a simple console application using Qt. - -``` cpp -#include -#include -int main(int, char *[]) -{ - QString str = "hello CQtDeployer 1.4"; - qInfo() << str; - return 0; -} -``` - -I will use the cmake build system, as it is more relevant than qmake. - -``` bash -andrei@HP:~/Hello$ tree -. -├── CMakeLists.txt -├── CMakeLists.txt.user -└── main.cpp - -0 directories, 3 files -``` - -Create a folder for the assembly. - -``` bash -andrei@HP:~/Hello$ mkdir build -``` - -Run the cmake in the created folder. - -``` bash -andrei@HP:~/Hello/build$ cmake .. -DCMAKE_PREFIX_PATH=~/Qt/5.14.1/gcc_64 --- Configuring done --- Generating done --- Build files have been written to: /home/andrei/Hello/build -``` - -building a project - -``` bash -andrei@HP:~/Hello/build$ make -Scanning dependencies of target Hello_autogen -[ 25%] Automatic MOC and UIC for target Hello -[ 25%] Built target Hello_autogen -Scanning dependencies of target Hello -[ 50%] Building CXX object CMakeFiles/Hello.dir/Hello_autogen/mocs_compilation.cpp.o -[ 75%] Building CXX object CMakeFiles/Hello.dir/main.cpp.o -[100%] Linking CXX executable Hello -[100%] Built target Hello -``` - -Checking our program. - -``` bash -andrei@HP:~/Hello/build$ ls -CMakeCache.txt CMakeFiles cmake_install.cmake Hello Hello_autogen Makefile -``` -And we start cqtdeployer passing it the program without qmake. -``` bash -andrei@HP:~/Hello/build$ cqtdeployer -bin Hello -Deploy ... -flag targetDir not used. use default target dir : "/home/andrei/Hello/build/DistributionKit" -target deploy started!! -copy : "/home/andrei/Hello/build/Hello" -extract lib : "/home/andrei/Hello/build/DistributionKit//bin//Hello" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libQt5Core.so.5" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicuuc.so.56" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicui18n.so.56" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicudata.so.56" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ar.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_bg.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ca.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_cs.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_da.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_de.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_en.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_es.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fi.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fr.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_gd.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_he.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_hu.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_it.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ja.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ko.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_lv.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_pl.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ru.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_sk.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_uk.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_zh_TW.qm" -try deploy msvc -deploy done! -``` - -Oh miracle, now our application is completely autonomous. -Check it out. - -``` bash -andrei@HP:~/Hello/build$ cd DistributionKit/ -andrei@HP:~/Hello/build/DistributionKit$ tree -. -├── bin -│   ├── Hello -│   └── qt.conf -├── Hello.sh -├── lib -│   ├── libicudata.so.56 -│   ├── libicui18n.so.56 -│   ├── libicuuc.so.56 -│   └── libQt5Core.so.5 -└── translations - ├── qtbase_ar.qm - ├── qtbase_bg.qm - ├── qtbase_ca.qm - ├── qtbase_cs.qm - ├── qtbase_da.qm - ├── qtbase_de.qm - ├── qtbase_en.qm - ├── qtbase_es.qm - ├── qtbase_fi.qm - ├── qtbase_fr.qm - ├── qtbase_gd.qm - ├── qtbase_he.qm - ├── qtbase_hu.qm - ├── qtbase_it.qm - ├── qtbase_ja.qm - ├── qtbase_ko.qm - ├── qtbase_lv.qm - ├── qtbase_pl.qm - ├── qtbase_ru.qm - ├── qtbase_sk.qm - ├── qtbase_uk.qm - └── qtbase_zh_TW.qm - -3 directories, 29 files -andrei@HP:~/Hello/build/DistributionKit$ -``` -The root of the program: - -![image](https://user-images.githubusercontent.com/12465465/77245272-619a0280-6c2e-11ea-92f2-447563f72dcc.png) - -Libraries needed for the program to work: - -![image](https://user-images.githubusercontent.com/12465465/77245274-6363c600-6c2e-11ea-8729-7d494a073b66.png) - - -As you can see from the example, the application is fully assembled. - -## Qt Installer Framework -The second innovation worth knowing is the ability to form QIF installers out of the box. All that is needed for our example is to add the qif option to the packaging command. - -Usage example. - - -``` -andrei@HP:~/Hello/build$ cqtdeployer -bin Hello qif -``` - -Just one simple command and the program gets a presentable look. - -![image](https://user-images.githubusercontent.com/12465465/77245315-b3428d00-6c2e-11ea-9326-c23229020eb5.png) - -This installer supports minimal integration of Linux distributions and Windows. Namely: creating shortcuts, and registering the application in the OS. -If for some reason you are not satisfied with the appearance of this installer, you can change it using the qifStyle flag. At the time of version 1.4, cqtdeployer supports only 2 styles (native and quasar). - -Example quasar style: - -![image](https://user-images.githubusercontent.com/12465465/77245334-d2d9b580-6c2e-11ea-9e55-e205499a9219.png) - -You can also use your own qss stylesheet. To do this, pass the path to your qss or css file instead of the style name. -For example, consider the following qss stylesheet. - - -Style.qss: -``` css -QWidget -{ - color: white; - background-color: rgb(65, 65, 65); -} - -QPushButton -{ - background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(150, 150, 150, 60%), stop:1 rgba(50, 50, 50, 60%)); - border-color: rgb(60, 60, 60); - border-style: solid; - border-width: 2px; - border-radius: 9px; - min-height: 20px; - max-height: 20px; - min-width: 60px; - max-width: 60px; - padding-left: 15px; - padding-right: 15px; -} - -QPushButton:pressed, QPushButton:checked -{ - background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(50, 50, 50, 60%), stop:1 rgba(150, 150, 150, 60%)); -} - -``` - -Let's check what we get in this case. - -``` bash -cqtdeployer -bin Hello qif -qifStyle ./../style.qss -``` - -![image](https://user-images.githubusercontent.com/12465465/77245346-00266380-6c2f-11ea-8426-42bf58038458.png) - -Here, in fact, is the dark theme of the installer. - -## Splitting into packages -And, probably, the last important update worth knowing is the ability to split a large multi-binar project into subprojects. - -This feature is the most difficult of all listed, since it requires a lot of text to use it. So I recommend using the configuration file. - -To begin with, we will complicate our project by adding 2 more executable files to it. I did not bother and just made 2 copies of my Hello utility. - -To simplify working with packages, you need to initialize the directory. - -``` bash -cqtdeployer init -``` - -This is another new function that creates a CQtDeployer.json file, in which we will write our configurations, instead of passing options to the utility. - -``` js -{ - "binDir": ".", - "clear": true, - "libDir": "./", - "recursiveDepth": 5 -} -``` - -Now let's make 2 packages of 3 of our programs. To do this, specify: -```js -{ - "binDir": ".", - "clear": true, - "libDir": "./", - "recursiveDepth": 5, - "targetPackage": [ - ["Dstro1", "Hello1"], - ["Dstro2", "Hello2"], - ["Dstro2", "Hello3"] - ] -} -``` - -Please note that I had to explicitly specify the binding for Dstro2 to Hello2 Hello3. Unfortunately, at the time of version 1.4 cqtdeployer was not able to parse target enumerations. Please note that if I write Hello1 Hello instead, then the selection will be made for all matches and all 3 programs will be selected. -So, let's see what happened. - - -``` bash -cqtdeployer - -. -├── Dstro1 -│   ├── bin -│   │   ├── Hello1 -│   │   └── qt.conf -│   ├── Hello1.sh -│   ├── lib -│   │   ├── libicudata.so.56 -│   │   ├── libicui18n.so.56 -│   │   ├── libicuuc.so.56 -│   │   └── libQt5Core.so.5 -│   └── translations -│   ├── qtbase_ar.qm -│   ├── qtbase_bg.qm -│   ├── qtbase_ca.qm -│   ├── qtbase_cs.qm -│   ├── qtbase_da.qm -│   ├── qtbase_de.qm -│   ├── qtbase_en.qm -│   ├── qtbase_es.qm -│   ├── qtbase_fi.qm -│   ├── qtbase_fr.qm -│   ├── qtbase_gd.qm -│   ├── qtbase_he.qm -│   ├── qtbase_hu.qm -│   ├── qtbase_it.qm -│   ├── qtbase_ja.qm -│   ├── qtbase_ko.qm -│   ├── qtbase_lv.qm -│   ├── qtbase_pl.qm -│   ├── qtbase_ru.qm -│   ├── qtbase_sk.qm -│   ├── qtbase_uk.qm -│   └── qtbase_zh_TW.qm -└── Dstro2 - ├── bin - │   ├── Hello2 - │   ├── Hello3 - │   └── qt.conf - ├── Hello2.sh - ├── Hello3.sh - ├── lib - │   ├── libicudata.so.56 - │   ├── libicui18n.so.56 - │   ├── libicuuc.so.56 - │   └── libQt5Core.so.5 - └── translations - ├── qtbase_ar.qm - ├── qtbase_bg.qm - ├── qtbase_ca.qm - ├── qtbase_cs.qm - ├── qtbase_da.qm - ├── qtbase_de.qm - ├── qtbase_en.qm - ├── qtbase_es.qm - ├── qtbase_fi.qm - ├── qtbase_fr.qm - ├── qtbase_gd.qm - ├── qtbase_he.qm - ├── qtbase_hu.qm - ├── qtbase_it.qm - ├── qtbase_ja.qm - ├── qtbase_ko.qm - ├── qtbase_lv.qm - ├── qtbase_pl.qm - ├── qtbase_ru.qm - ├── qtbase_sk.qm - ├── qtbase_uk.qm - └── qtbase_zh_TW.qm - -8 directories, 60 files -``` - -As you can see from the result tree, we got 2 distributions. -1. Dstro1 - contains the application Hello1 -2. Dstro2 - contains the remaining 2. - -Now let's check what happens if all this is packaged by the installer. Add the qif option to true in CQtDeployer.json: ** qif: true, **. - -``` js -{ - "binDir": ".", - "clear": true, - "qif": true, - "libDir": "./", - "recursiveDepth": 5, - "targetPackage": [ - ["Dstro1", "Hello1"], - ["Dstro2", "Hello2"], - ["Dstro2", "Hello3"] - ] -``` - -![image](https://user-images.githubusercontent.com/12465465/77245542-534ce600-6c30-11ea-9323-72ec5e200f39.png) - -As can be seen from the screenshot, now we have 2 packages during installation. - -## New aliases - -And the last small but nice addition: now new commands have been added to cqtdeployer. -* сqt — is a quick way to deploy your application. It simplifies the deployment call. - * Example: - **cqt myApp** — this is the same as **cqtdeployer -bin myApp**. -* cqtdeployer.cqt - same as cqt but for snap package. -* В windows-версии теперь не нужно добовлять знак % для вызова утилиты. -* In the windows version, now there is no need to add the% sign to call the utility. -Now the call looks like in Linux. (cqtdeployer) diff --git a/md/en/1_5.md b/md/en/1_5.md deleted file mode 100755 index 3a0e7b4a..00000000 --- a/md/en/1_5.md +++ /dev/null @@ -1,158 +0,0 @@ -# Release of CQtDeployer v1.5.0 - -Release of the C++/Qt and QML application deployment utility CQtDeployer v1.5.0 - -This is the first major update in 2021. CQtDeployer 1.5 contains many useful improvements. The biggest improvements are the addition of the ability to package deb packages, and the ability to use your own packaging template for the qt install framework. - -## Complete list of all changes - -## CQtDeployer 1.5.0 - -### New features - -- Added new theme of qif installer "quasarDark". -- Added support of work with custom template for qif option. -- Added support of debian packages. -- Added support of targets icons. now the icon option work with targets but not packages. -- Added support of the control custom translation files. -- Added support the deploy nonexecutable data. (extraData option) -- Added envirement variables for deployed applications. -- Added support of the generate deb packages. -- Added support of the generate zip arrhives. -- Added support create a qif installer using custom template -- Added command for init default qif and deb templates (getDefaulttemplate) -- Added support of import custom launch scripts -- Added support of md5 packages hashes -- Added support of Qt6.1 - -### Fixes - -- Fixed stability for the deploySystem option on windows -- Fixed verbose log. -- Fixed general output log. -- Fixed typo errors in log. -- Fixed cross-deployment for ARM platform . -- Fixed deploy Qt6 qml -- Fixed powershell commands on Windows -- bug fixes and improvements. - - -### New Envirement Variables - -- CQT_RUN_FILE - This variable contains path to the run script of the using application. -- CQT_PKG_ROOT - This variable contains path to root of the current package. - -### New parameters - -- zip - create a ZIP archive for deployable programm -- deb - Create the deb package for deployable programm -- homepage - Sets the homepage url for a package -- noQt - Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework -- allowEmptyPackages - Allows configure the empty packages. -- getDefaultTemplate - Extracts defaults deb or qif templates. -- tr - Adds qm files into the translations folder. -- extraData - Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure. -- extraDataOut - Sets path to extra data files out directory. -- prefix - Sets the prefix for the package relatively a target directory -- homePage - Sets the homepage url for a package -- binPrefix - Sets prefix for bin option. -- noHashSum - Disables campute hashes of packages - -### Deprecated and removed options - -- deploySystem-with-libc - instead of this option use the deploySystem option. -- allQmlDependes - instead of this option use the qmlDir option. - - -## Detailed analysis of the most interesting changes. - -### Debian pacakges -This feature is very conveniently if you want to create server application. -For example i need to create simple server for my simple game. -And my steps: -* build my application in the release mode. -* run cqtdeployer with deb option. - -```bash -cqtdeployer -bin mySimpleServer deb -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -``` -The SimpleServer depends only on qt, so it was enough for me to specify only the path to qmake for my application. - -It is all!!!. And i get the workly deb package. -By Default CQtDeployer create an independet debian packages. - - -### Zip arrhives -This feature allow compress your distribution pacakges to zip arrhive. - -Example: -```bash -cqtdeployer -bin mySimpleServer zip -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -``` - -### Custom Qt Installer Framework tempaltes. - -Now you can override default template of the cqtdeployer. To do this, you must pass the path to your template to the qif parameter. - -``` -cqtdeployer ... -qif /path/to/my/custom/qif/template -``` - -### Template -The qif template should contain 2 folders: -* packages -* config - -### Attention -The name of the packages in the packages folder must match the names of the packages during deployment. - -For example: -``` json -"targetPackage": [ - [ - "myCustomInstaller", - "tar1" - ] -], -``` - -``` bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` - -If the folder names do not match the package names then CQtDeployer will use the standard QIF package. - -If you have only one package then you can use the **name** option for set name the application. - -```bash -cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller -``` - -#### Do not forget to rename the your package folder to the packaga name of the name option. - - -```bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller << "This is folder of the your package" - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` diff --git a/md/en/Build-and-Install.md b/md/en/Build-and-Install.md deleted file mode 100644 index abc4ea3f..00000000 --- a/md/en/Build-and-Install.md +++ /dev/null @@ -1,90 +0,0 @@ -# Install CQtDeployer - -You can download the latest version of the application [here](https://github.com/QuasarApp/CQtDeployer/releases). - -### Installer - -- [Download](https://github.com/QuasarApp/CQtDeployer/releases) CQtDeployer_X.X.X.X_Installer_Linux64.run or CQtDeployer_X.X.X.X_Installer_Win64.exe - -#### Install without 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 -``` - -**Note** the package name and links can be changed, please check [Download](https://github.com/QuasarApp/CQtDeployer/releases) page before installation. - -### Snap - -[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) - -``` bash -sudo snap install cqtdeployer -``` - -#### Features of the snap version - -If you are using the snap version of the application. Enable all permissions for cqtdeployer. -this can be done in the snap-store -Or starting with ubuntu 20.04 in the ubuntu application settings manager. - -If you do not have the GUI then you can enable all permissions using next commands: - -``` bash -sudo snap connect cqtdeployer:process-control -sudo snap connect cqtdeployer:removable-media -sudo snap connect cqtdeployer:system-backup -``` - ---- - -# Build from sources - -## Build for Linux - -- install qt and qt QtInstallFrameWork from [qt installer](https://www.qt.io/download-qt-installer?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f9bb77-7bb77-4bb77-4) -- git clone https://github.com/QuasarApp/CQtDeployer.git -- cd CQtDeployer -- git submodule update --init --recursive -- qmake -r - - Here you must definitely call the qmake that was loaded from the 1st item. - - Example: ~/Qt/5.15.0/gcc_64/bin/qmake -r -- make -j$(nproc) -- make deploy - - this command requires installed [cqtdeployer](https://github.com/QuasarApp/CQtDeployer/releases) -- ./Distro/CQtDeployerInstaller.run - -## Build for Windows (CMD) - -- install qt and qt QtInstallFrameWork from [qt installer](https://www.qt.io/download-qt-installer?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f9bb77-7bb77-4bb77-4) -- git clone https://github.com/QuasarApp/CQtDeployer.git -- cd CQtDeployer -- git submodule update --init --recursive -- SET PATH=C:/Qt/Tools/mingw810_64/bin;%PATH% - - It is important to set up the qt environment. -- qmake.exe -r - - Here you must definitely call the qmake that was loaded from the 1st item. - - Example: C:/Qt/5.15.0/mingw81_64/bin/qmake.exe -r -- migw32-make -j8 -- migw32-make deploy - - this command requires installed [cqtdeployer](https://github.com/QuasarApp/CQtDeployer/releases) -- ./Distro/CQtDeployerInstaller.exe - diff --git a/md/en/Changelog.md b/md/en/Changelog.md deleted file mode 100755 index 18394ea6..00000000 --- a/md/en/Changelog.md +++ /dev/null @@ -1,363 +0,0 @@ -# Change log - -## CQtDeployer 1.5.4 - - -### New options - -* qifConfig - Sets a custom path to the configure file of the qt ifw installer. By default it is qif/config/config.xml #653 -* qifPackages - Sets a custom path to the packages directories. By default it is qif/packages #653 -* qifResources - Sets a custom path to the resources files. By default this option is skipped #653 -* debOut - Sets name of the output debian file. This option can be work with multiple packages -* zipOut - Sets name of the output zip arrhive. This option can be work with multiple packages - -### Bug fixes : - -* fixed crossdeploy linux -> windows #652 - - -## CQtDeployer 1.5.3 - -### New options - -* installDirDeb - Sets install target directory for debian package (by default it is /opt path) #640 -* installDirQIFW - Sets install target directory for installers (by default it is /home path) #640 - -### Bug fixes - -* Fix warning on installer fix #628 -* Added support validation input options of the command line fix #421 -* Added Error message for conflict between libDir and targetDir options #629 - -## CQtDeployer 1.5.2 - -### New parameters - -* Added **qifOut** option for set name of the output installer -* Added **disableRunScript** option for disabling the generation of run script for selected targets -* Added **disableShortCut** option for disabling the generation of shortcut for selected targets - -### Fixes - -* Fix documentation -* Fix deploy openssl libraries - -## CQtDeployer 1.5.1 - -### Fixes - -* Fix deploy multi target Debian packages -* Fix deploy qt6 qml applications - - -Change log for all versions of the CQtDeployer. - -## CQtDeployer 1.5.0 - -### New features - -- Added new theme of qif installer "quasarDark". -- Added support of work with custom template for qif option. -- Added support of debian packages. -- Added support icons for targets. now the icon option work with targets but not packages. -- Added support of the control custom translation files. -- Added support the deploy nonexecutable data. (extraData option) -- Added envirement variables for deployed applications. -- Added support of the generate deb packages. -- Added support of the generate zip arrhives. -- Added support create a qif installer using custom template -- Added command of init default qif of deb template (getDefaulttemplate) -- Added support of import custom launch scripts -- Added support of md5 packages hashes -- Added support of Qt6.1 - -### Fixes - -- Fixed stability for the deploySystem option on windows -- Fixed verbose log. -- Fixed general output log. -- Fixed typo errors in log. -- Fixed crossdeploy of the arm distributions. -- Fixed deploy Qt6 qml -- Fixed powershell commands on Windows -- bug fixes and improvements. - - -### New Envirement Variables - -- CQT_RUN_FILE - This variable contains path to the run script of the using application. -- CQT_PKG_ROOT - This variable contains path to root of the current package. - -### New parameters - -- zip - create a ZIP archive for deployable programs -- deb - Create the deb package for deployment programm -- homepage - Sets the homepage url for a package -- noQt - Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework -- allowEmptyPackages - Allows configure the empty packages. -- getDefaultTemplate - Extracts defaults deb or qif templates. -- tr - Adds qm files into the translations folder. -- extraData - Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure. -- extraDataOut - Sets path to extra data files out directory. -- prefix - Sets the prefix for the package relatively a target directory -- homePage - Sets the homepage url for a package -- binPrefix - Sets prefix for bin option. -- noHashSum - Disables campute hashes of packages - -### Deprecated and removed options - -- deploySystem-with-libc - instead of this option use the deploySystem option. -- allQmlDependes - instead of this option use the qmlDir option. - -## CQtDeployer 1.5.0 Alpha - -### Corrections - -- bug fixes and improvements. - -### New Features - -- Added a new Theme for qif installer "quasarDark". - -### New options - -- zip - create the ZIP arhive for deployement programm - - -## CQtDeployer 1.4.7 - -### Corrections - -- Fixed deploy the qxcb plugin. #438 -- Fixed deploy the qtGui module. #446 - -### New Features - -- Added support of Qt6 #437 -- Added support of Qt installer Framework 4 (with improved command line interface experience) #436 - -## CQtDeployer 1.4.6 - -### Corrections - -- Fixed deploy sql drivers #367 -- Fixed algorithm of deploy libraryes. #423 #371 -- Fixed working with a qt from the linux system repository. (classic instaler only) #422 -- Fixed snap version of cqtdeployer, added support for qmake search by RPATH #424 #420 -- Fixed help message. -- Minor bug fixes and improvements. -- Removed deprecated option extractPlugins. #371 - -### New options - -- noQt - Ignore the error of initialize of a qmake. Use only if your application does not use the qt framework. - -## CQtDeployer 1.4.5 - -### Corrections - -- Optimized project deployment performance. 60% faster. -- Optimized output size of distributions. Size reduced by 25%. -- Fixed display of shortcuts after installing deployed applications. -- Fixed launching applications with spaces in the name. Thanks ahndee (#384) -- Fixed deployment of the Renderer plugin. -- Minor bug fixes and improvements. - -### New Features - -- Added a new deployment plugin management system. - -### New options - -- extraPlugin - sets an additional path to third-party application plug-in -- enablePlugins - enables additional plugins for distribution. -- disablePlugins - disables plugins for distribution. - -## CQtDeployer 1.4.4 - -### New options -- qifFromSystem - force use system binarycreator tool of qif from path or qt. - - -## CQtDeployer 1.4.3 -### Fixes -- Fixed display of the application downloaded from the snap store and installers in the ubuntu 20.04 application settings menu - -### New features -- added support recursive ignore for ignoreEnvirement #356 - -### New options -- noRecursiveiIgnoreEnv - Disables recursive ignore for ignoreEnv option. - - - -## CQtDeployer 1.4.2 -### Fixes - -- fixed #337 (error generate installer with custom name) -- fixed #338 (windows version collect pdb files) -- fixed #339 (error of show all help messages) -- fixed #340 (cqdeployer don't added a targets dirs into "ignore") -- fixed #341 (The clear option don't delete old installer) - - -## CQtDeployer 1.4.1 - -### Fixes -- Fixed Not deploying platformthemes (#324) -- Fixed create shortcuts on windows (#322) -- Minor improvements and fixes - - -## CQtDeployer 1.4.0 -### Fixes -- Fixed The help output in the console, now the actual size of the console is recounted before the output, which allows you to correctly transfer text. -- Fixed work with the deployment of Qt plugins. Now plug-ins do not extract all system dependencies, but only qt. Extract system dependencies caused applications to crash due to incompatible plugin libraries. -- Minor bug fixes and improvements. - -### New features -- Added support for qmake search from the system environment. -- Added the ability to initialize the repository for further packaging, similar to git init. -- Added support for Qt Install Framework packages. Now you can pack the distribution into the installer. -- Added the ability to split the final distribution into several packages. -- Added the ability to unify the creation of packages for the final distribution. -- Added support for adding custom scripts to application launch scripts. -- Added support for extracting system dependencies for Windows. -- Added support for RPATH for Linux. Now cqtdeployer can independently determine the necessary qmake to deploy the application. -- Added support for finding the required dependency by library name. -- Added support for Qt libraries from Linux distributions repositories. -- Added new alias for the run command (cqt and cqtdeployer.cqt) for fast deploy of applications. -- Added support the native name of command for windows. Now you can run a cqtdeployer from cqtdeployer commnad in cmd and powershell. - -### New options -- init - will initialize cqtdeployer.json file (configuration file). For example: "cqtdeployer init" - to initialize the configuration of a base package. "cqtdeployer -init multi" - to initialize the configuration of several packages. -- noCheckRPATH - disables the automatic search for paths to qmake in executable files (Linux only). -- noCheckPATH - disables the automatic search for paths to qmake in the system environment. -- extractPlugins - forces to extract all plug-in dependencies. -- qif - creates an installer at the end of the deployment. -- extraLibs - adds a template for an additional library, which should be included in the distribution. -- customScript - adds a custom script to the startup script of the application. -- -targetPackage [package; tar1, package; tar2] - used to form packages, denotes lists of target files for specific packages. -- recOut - indicates in which folder the resources will be added after deployment. -- name - sets the name of the package. -- description - sets the package description -- deployVersion - sets the package version -- releaseDate - sets the release date of the package. -- icon - sets the package icon. -- publisher - sets the publisher of the package. -- qifStyle - Sets the path to the CSS style file or sets the default style. Available styles: quasar -- qifBanner - Sets path to the banner png file. -- qifLogo - Sets path to the logo png file. - -## CQtDeployer 1.3.2 -- Fixed #218 (The CQtDeployer adding sh scripts for target libraries.) -- Fixed #217 (The Qmake option did not work with the configuration file.) ---- - -## CQtDeployer 1.3.1 -- Fixed a task #191 (ignore command for plugins) -- Fixed a task #192 (invalid paths when creating) -- Fixed absalute pathes of deployement file (see [confFile](DeployConfigFile)) ---- - -## CQtDeployer 1.3.0 -- Added support of qt.conf for Linux -- Added support of config file for project (deploy.json) with all rules of deployment, for create deploy.json use flag -confFile [./path/to/file.json], -- Added support of output dirs for all deployement files #145, -- Added support of deploy WebEngine #146 -- Added support multi package in cqtdeployer installer -- Renamed project from Console-QtDeployer to CQtDeployer #139 -- Fixed deployment of system libs in linux #172 -- Added new tests of application -- Removed flag noLibC and added flag deploySystem-with-libc. If you need libc in the program, use the deploySystem-with-libc flag, and if not, use deploySystem. -- The always-overwrite flag has been replaced with noOverwrite, now all files are overwritten by default, use noOverwrite to disable overwriting. ---- - -## CQtDeployer 1.2.3 -- Added support of qt.conf for Windows builds #130 -- Fixed bug #129 now the 'clear' flag remove only copied files. -- Fixed ignoreEnv flag -- Fixed deploySystem flag ---- - -## CQtDeployer 1.2.2 -- Added new flag noLibc for ignore libc and li-linux libs -- Fixed bug #125 Deployed system lib (working with simple projects, for big projects no recommended) -- Fixed ignoreEnv flag ---- - -## CQtDeployer 1.2.1 -- Added new ignore flag (ignoreEnv). This flag disables unnecessary environment -- Added support QIFW (online installer for windows and Other Linux distributives) -- Added support update for windows and Other Linux distributives (not snap) -- Fixed bug #116 (copy files from removable media) -- Fixed bug #115 (create target in folder with russean name) -- Fixed big size of msvc version -- FIxed crossdeploy Linux >> Windows -- Removeв old build scripts ---- - -## CQtDeployer 1.2.0 -- Added own qml dependecies scaner. -- Moved to used a new [PE-Lib scaner](https://github.com/QuasarApp/pe-parse/tree/7138bb218a05c81d825728ba8a0a6f6a56c4fdbc). -- Moved to used a new [ELF-lib scaner](https://github.com/qt/qttools/blob/b0147a5d79ce7a7e77a24f36aaddfacb1a1517c8/src/shared/winutils/elfreader.h). -- Added a new unit tests. -- Added support of snap version (home dir only). -- Added new flag qmlExtern - for use qt qml import scaner. -- Added support a levels of verbose log (0-3). -- Fixed log of deploy app. -- Fixed deploy the app on snap version. ---- - -## CQtDeployer 1.1.2 -- Added support of translations -- Added a flag for disable deploy translations -- Added the strip flag on linux version -- Added unit tests -- Fixed deploy with shared version -- Fixed bug deploy on current dir with snap and static versions ---- - -## CQtDeployer 1.1.1 -- Fixed qml build in dinomisc version -- Fixed -recursiveDepth flag -- Fixed -libDir flag operation -- The output of the application has been cleaned, a part of the log has been moved to verbose ---- - -## CQtDeployer 1.1.0 -- Added windows support (dynamic linking only) -- Added support for snap (now available in the snapstore) -- Added snap build scripts -- Added flag binDir allowing recursively to capture exe dll and so -- Changed the logic of the bin flag now, if you select a folder in the file location, then all its contents will be captured -- Changed and corrected the logic of the clear flag now it cleans all the expanded content on a specific target. -- Added flag targetDir which defines the place where the expanded project will lie -- The structure of the deployed project has been changed, now all the launch shells are in the root and the binaries are in the bin folder, a launch script of the same name is created for each binary. -- Removed old runScript flag due to change of deployment logic -- Added verbose flag for debugging by -- Fixed performance bugs ---- - -## CQtDeployer 1.0.2 -- Added a script to build (dynamic and static release) -- Added flag -libDir to install additional path for additional libraries of the application -- Added flag -extraPlugin to install an additional path for additional application plugins -- Added build for C libraries only -- Fixed deployment -- Fixed startup script -- Fixed static build ---- - -## CQtDeployer 1.0.1 -- fix qml deploy (redundancy) -- fix run script ---- - -## CQtDeployer 1.0.0 -- Added a flag runScript -- Added a flag allQmlDependes -- Fixed bug of deploy qml -- Fixed bug of deploy plugins -- Added support static build - diff --git a/md/en/CompareFeatures.md b/md/en/CompareFeatures.md deleted file mode 100644 index 20992118..00000000 --- a/md/en/CompareFeatures.md +++ /dev/null @@ -1,17 +0,0 @@ -# Compare Features - -Compare Features of Distributions of the CQtDeployer - -### snap vs installer vs windows installer - -| Feature name | Classic linux version (Installer) | Snap Version | Windows version | -|---|---|---|----| -| Automatic updates | NO | YES | NO | -| Online updates | YES | YES | YES | -| Deploy system libraries | YES | YES | YES | -| Create installers | YES | YES | YES | -| Create archives | YES | YES | YES | -| Search of libraries and cmake from environment | YES | NO | YES | -| Search of the qmake from a RPATH | YES | YES | NO | -| Support of the 'strip' command | YES | NO | NO | -| Support work with the qmake from a system repository of OS| YES| NO| NO | diff --git a/md/en/CustomScripts.md b/md/en/CustomScripts.md deleted file mode 100644 index 77a49d14..00000000 --- a/md/en/CustomScripts.md +++ /dev/null @@ -1,69 +0,0 @@ -# Custom Scripts - -After version 1.5.1 cqtdeployer support self variables in the custom scripts. -For using custom scripts use the **runScript option** - -### Exmaples : - -```bash -cqtdeployer -bin MyExecutable.exe -runScript MyExecutable,path/to/my/custom/script.bat -``` - -```bash -cqtdeployer -bin MyExecutable -runScript MyExecutable,path/to/my/custom/script.sh -``` - -## 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_SYSTEM_LIB_PATH - are releative path to system libraryes 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. - - -## The Scripts tempalte - -### Linux - -```bash -#!/bin/sh - -BASE_DIR=$(dirname "$(readlink -f "$0")") -export LD_LIBRARY_PATH="$BASE_DIR"CQT_LIB_PATH:"$BASE_DIR":$LD_LIBRARY_PATH -export QML_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML_IMPORT_PATH -export QML2_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML2_IMPORT_PATH -export QT_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH:$QT_PLUGIN_PATH -export QTWEBENGINEPROCESS_PATH="$BASE_DIR"CQT_BIN_PATH/QtWebEngineProcess -export QTDIR="$BASE_DIR" -export CQT_PKG_ROOT="$BASE_DIR" -export CQT_RUN_FILE="$BASE_DIR/CQT_BASE_NAME.sh" - -export QT_QPA_PLATFORM_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH/platforms:$QT_QPA_PLATFORM_PLUGIN_PATH - -CQT_CUSTOM_SCRIPT_BLOCK - -CQT_RUN_COMMAND -``` - -### Windows - -```bash - -@echo off -SET BASE_DIR=%~dp0 -SET PATH=%BASE_DIR%CQT_LIB_PATH;%PATH%;CQT_SYSTEM_LIB_PATH -SET CQT_PKG_ROOT=%BASE_DIR% -SET CQT_RUN_FILE=%BASE_DIR%CQT_BASE_NAME.bat - -CQT_CUSTOM_SCRIPT_BLOCK - -CQT_RUN_COMMAND -``` - - -Or you can get last version of this scripts from the github [repository](https://github.com/QuasarApp/CQtDeployer/tree/main/Deploy/ScriptsTemplates). diff --git a/md/en/DEB.md b/md/en/DEB.md deleted file mode 100644 index 119d0c4f..00000000 --- a/md/en/DEB.md +++ /dev/null @@ -1,101 +0,0 @@ -# DEB using - -General rules for using DEB - -#### Available from version CQtDeployer 1.5 - -### How to use deb option - -Just add to cqtdeployer option "deb". - -#### For example: - -``` bash - cqtdeployer ... deb -``` - -Where: -* **...** - is list of other options. -* **deb** - option for create the deb package. - - -By default, cqtdeployer will create one deb package. -If you want create multi package destribution, you should use [Controll of packages options](Options.md) -To create a new package, use the -targetPackage [package; tar1] option - -cqtdeployer create deb package for each packages. - -Where: - -* **package** - it is package name -* **tar1** - it is name of the target that should be included in this package. - -Or you can describe packages in [configuration file](DeployConfigFile.md) - - -```json -{ -"targetPackage": [ - [ - "package", - "tar1" - ], -], -"deb": true -} -``` - - -## Custom Template for DEB - -You can create a own Template fo the debian pacakges. - -### The debian pacakge structure: - - -```bash -└── Debian templates - ├── debPacakge1 - │ └── DEBIAN - │ ├── control - │ ├── postinst - │ └── prerm - └── debPacakge2 - └── DEBIAN - ├── control - ├── postinst - └── prerm - -``` - -For include your templates into your destribution you need to add path of the Debian templates folder into deployConfig.json - -```json -{ -"targetPackage": [ - [ - "debPacakge1", - "tar1" - ], - [ - "debPacakge2", - "tar2" - ], -], -"deb": "./Debian templates" -} -``` - - -## Initialization of the debian template - -For initialize default templates you can use the getDefaultTemplate option. -The getDefaultTemplate option extract default template of the cqtdeployer. This is can be very convinion if you want override default behavior of the installer or anothe distribution package. - -### Example - -### Getting default debian template. - -```bash -cqtdeployer getDefaultTemplate deb -``` diff --git a/md/en/DeployConfigFile.md b/md/en/DeployConfigFile.md deleted file mode 100644 index 106e235f..00000000 --- a/md/en/DeployConfigFile.md +++ /dev/null @@ -1,228 +0,0 @@ -# Deployment file - -**Deployment file** - it's a json file containing the parameters for cqtdeployer. This file supports all parameters except confFile, since this parameter is responsible for connecting and initializing the file itself. - -### Configuration file structure - -```json -{ - "Bool option": true/false, - "Option": "Value", - "Enumeration-enabled option": [ - "Value 1", - "Value 2", - "Value 3", - ], - "Option with support for multilevel enumerations": [ - [ - "Value A1", - "Value A2" - ], - [ - "Value B1", - "Value B2" - ], - [ - "Value C1", - "Value C2" - ], - ] - -} -``` - -Read more about cqtdeployer options in the [options](Options.md) section. - -Examples of the contents of this file: - -File without using enumerated parameters -```json -{ - "noOverwrite": false, - "bin": "./", - "binDir": "./", - "qmlDir": "./", - "deploySystem": false, - "deploySystem-with-libc": false, - "qmake": "my/custom/path/to/qmake", - "ignore": "ignoreLib.dll", - "ignoreEnv": "/my/ignore/path", - "clear": true, - "force-clear": false, - "allQmlDependes": false, - "libDir": "./", - "recursiveDepth": 3, - "extraLibs": "myExtraLib (libssl)", - "extraPlugin": "myExtraPulgin (platforms)", - "targetDir": "./Distro", - "targetPackage": "", - "noStrip": false, - "extractPlugins": false, - "noTranslations": false, - "qmlOut": "qml", - "libOut": "lib", - "trOut": "tr", - "pluginOut": "plug", - "binOut": "bin", - "recOut": "rec", - "verbose": 3, - "qif": false, - "noCheckRPATH": false, - "noCheckPATH": false, - "name": "mainApplication", - "description": "this is description for default package", - "deployVersion": "1.0.0", - "releaseDate": "yyyy-MM-dd", - "icon": "/path/main/icon.png", - "publisher": "main team", - "customScript": "echo 'I am use custom script!!!'" -} - -``` - -File Using Enumerated Parameters -``` json -{ - "noOverwrite": false, - "bin": "./", - "binDir": "./", - "qmlDir": [ - [ - "package2", - "./TestQMLWidgets/" - ], - [ - "./qml/for/All" - ] - ], - - "deploySystem": false, - "deploySystem-with-libc": false, - "qmake": "this parameter should contain the path to your qmake, for Windows this field is required. On Linux, you can remove it, then qmake will be found by rpath.", - "ignore": "ignoreLib.dll", - "ignoreEnv": "/my/ignore/path", - "clear": true, - "force-clear": false, - "allQmlDependes": false, - "libDir": "./", - "recursiveDepth": 3, - "extraLibs": "myExtraLib (libssl)", - "extraPlugin": "myExtraPulgin (platforms)", - "targetDir": "./Distro", - "targetPackage": [ - [ - "/package1/", - "TestOnlyC" - ], - [ - "/package2/", - "TestQMLWidgets" - ] - ], - "noStrip": false, - "extractPlugins": false, - "noTranslations": false, - "qmlOut": "qml", - "libOut": "lib", - "trOut": "tr", - "pluginOut": "plug", - "binOut": "bin", - "recOut": "rec", - "verbose": 3, - "qif": false, - "noCheckRPATH": false, - "noCheckPATH": false, - "name": [ - [ - "package2", - "package2Application" - ], - [ - "mainApplication" - ] - ], - "description": [ - [ - "package2", - "this is description for package 'package2'" - ], - [ - "this is description for default package" - ] - ], - "deployVersion": [ - [ - "package2", - "1.0.0" - ], - [ - "1.0.0" - ] - ], - "releaseDate": [ - [ - "package2", - "yyyy-MM-dd" - ], - [ - "yyyy-MM-dd" - ] - ], - "icon": [ - [ - "package2", - "/path/icon.png" - ], - [ - "/path/main/icon.png" - ] - ], - "publisher": [ - [ - "package2", - "team of package2" - ], - [ - "main team" - ] - ], - "customScript": "echo 'I am use custom script!!!'" -} - -``` - -The purpose of file is to simplify the cqtdeployer's call and move some of the parameters into a file. The parameters specified in the file have a lower priority than the parameters added to the console at the run. - -### Creating of the file - -#### The first method - -1. Call `cqtdeployer init` to initialize the file for a single-package application. - Or `cqtdeployer -init multi` to initialize the file for a project with multiple packages. -2. Open CQtDeployer.json and edit it to fit your needs. -3. Call 'cqtdeployer' in the directory with the file 'CQtDeployer.json', or specify the path to it using the flag '-confFile path/to/my/CQtDeployer.json' - - -#### The second method -Call the cqtdeployer with a set of parameters you need and specify the path to the file using -confFile flag (the file should be absent). If the file exists, cqtdeployer will start unloading the parameters from it. - -An example: -``` bash -cqtdeployer -confFile deploy.json -bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite -``` - -Where: - -* cqtdeployer - the call of cqtdeployer -* -confFile deploy.json - the path to the file,that should be created -* "-bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite" - necessary parameters. - - -### Using of the deployment file. - - Use the flag -confFile [path to the file] to make cqtdeployer start reading the parameters from the file - -#### Example: - -cqtdeployer -qmake ~/Qt/bin/qmake -confFile ./deploy.json - diff --git a/md/en/Description.md b/md/en/Description.md deleted file mode 100644 index 25f5a857..00000000 --- a/md/en/Description.md +++ /dev/null @@ -1,9 +0,0 @@ -# What is CQtDeployer - -The CQtDeployer is application for extract all depends library of executable and create 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 utility got flags that help you to configure the deployment for your or your project's needs -* Crossdeploy: this utility support windows and linux distrebutives, This means that you can use it not only to deploy a project for your platform, but also to deploy a project on Linux for Windows and vice versa. -* Packaging - this utility can create installation files and packages for your application. diff --git a/md/en/DisableShortcats.md b/md/en/DisableShortcats.md deleted file mode 100644 index 3787bc34..00000000 --- a/md/en/DisableShortcats.md +++ /dev/null @@ -1,19 +0,0 @@ -# Disabling shortcuts - -Disabling shortcuts for multi targets distribution Kit in the Qt Installer framework. - -Some times we need to disable creating automaticly shortcuts for some applications. -For solve this problem i recomendet override the default qt installer framework template. - -# Note -Starting from CQtDeployer 1.5.1, you can use the -disableShortcuts option to disable the automatic creation of shortcuts. - -### Example: - -```bash -cqtdeployer -disableShortCut targetName,target2Name -``` - -```bash -cqtdeployer -bin myProgramm.exe -disableShortCut myProgramm -``` diff --git a/md/en/EnvironmentVariables.md b/md/en/EnvironmentVariables.md deleted file mode 100644 index b88084ee..00000000 --- a/md/en/EnvironmentVariables.md +++ /dev/null @@ -1,50 +0,0 @@ -# Environment variables - -Environment variables of the CQtDeployer - -This page contains information about environment variables of the default launcher script. - -## Initialization - -All environment variables initialized in the default launcher script. So if you use the runScript option then you must be reunited all needed variables manually. - - -## Variables list - -| Variable name | Description | -|---|---| -| CQT_PKG_ROOT | This variable contains path to root of the current package.| -| CQT_RUN_FILE | This variable contains path to the run script of the using application.| - -## Description of definitions - -**Root of the current package** - This root is local root for any separate packages. - - -Example : - -```bash -. -├── pakcage1 << This is local root of the package1 -│ ├── bin -│ ├── lib -│ ├── plugins -│ ├── qml -│ └── translations -├── package2 << This is local root of the package2 -│ ├── bin -│ ├── lib -│ ├── plugins -│ ├── qml -│ └── translations -└── pakcage3 << This is local root of the package3 - ├── bin - ├── lib - ├── plugins - ├── qml - └── translations - -``` - - - diff --git a/md/en/ExtraFiles.md b/md/en/ExtraFiles.md deleted file mode 100644 index 5de95ecb..00000000 --- a/md/en/ExtraFiles.md +++ /dev/null @@ -1,107 +0,0 @@ -# Adding extraData - -Adding extraData into distributive. - -CQtDeployer has support to work with extra data files. - -For this you should use the -extraData and -extraDataOut options. - -## Examples: - -### Add custom file into root directory of the your distribution. - -``` -cqtdeployer -extraData path/to/my/customFile -``` - -Or in configFile.json - -```json -{ - ... - "extraData": "./path/to/my/customFile" - ... -} -``` - -This command support list of arguments. - - -```bash -cqtdeployer -extraData path/to/my/customFile,path/to/my/customFile2,path/to/my/customFile3 -``` - -Or in configFile.json - -```json -{ - ... - "extraData": [ - "./path/to/my/customFile", - "./path/to/my/customFile2", - "./path/to/my/customFile3" - ] - ... -} -``` - -### Changing location of extra data files. - -For change location you should use the extraDataOut options. This option change destination path based on the root of the distributive. - -### Example. Add custom scripts into scripts folder in the Distribution. - -```bash -cqtdeployer -extraData /path/to/myScripts.sh,/another/path/to/myScripts.sh -extraDataOut scripts -``` - -Or in configFile.json - -```json -{ - ... - "extraData": [ - "./path/to/myScripts.sh", - "./another/path/to/myScripts.sh" - ], - "extraDataOut": "scripts" - ... -} -``` - -## Packages - -extraData and extraDataOut options have support to work with packages. See the packaging [page](Packing.md) to get more information about packages. - -Sometimes we need to create a multipackages application. For example create a installer for client-server application with the client and server applications. The client and server have a own default configuration files. We add config files using the extraData option. - -For create a big distribution i recommend use the [confFile](DeployConfigFile.md). - -## Example multipacking application. - - -```json -{ - - "bin": [ - "myClientExecutable", - "myServerExecutable" - ], - - "targetPackage" : [ - ["Client", "myClientExecutable"], - ["Server", "myServerExecutable"] - ], - - "extraData": [ - ["Client", "./path/to/clientConfig.conf"], - ["Server", "./path/to/serverConfig.conf"] - ], - "extraDataOut": [ - ["Client", "defaultConfigurations"], - ["Server", "defaultConfigurations"] - ] -} -``` - -This config create a distribution with two appications (client and server). Each application have a own configuration file in the defaultConfigurations folder. diff --git a/md/en/ExtractDefaultsTemplates.md b/md/en/ExtractDefaultsTemplates.md deleted file mode 100644 index 35ed6663..00000000 --- a/md/en/ExtractDefaultsTemplates.md +++ /dev/null @@ -1,49 +0,0 @@ -# Extracting default templates - -Sometimes you need to create your own templates for installers or deb packages. -Fot this you can use the getDefaultTemplate option. This option extracts your distribution's default template to the target directory. This option will generate a template according to your settings. If you use the targetPackage option then a template will be generated for each package you configured. - -### Example: - -``` bash -cqtdeployer -bin myExecutable getDefaultTemplate qif -``` -This command generate template for qt installer framework into DistributionKit folder for your "myExecutable" programm. - -If you want change target location just add the targetDir option -``` bash -cqtdeployer -bin myExecutable getDefaultTemplate qif -targetDir "/distanation/Dir" - -``` - -## Work With multipackage distribution. - -This option support the configFile.json - -### Example : - -#### configFile.json - -```json -{ - - "bin": [ - "myClientExecutable", - "myServerExecutable" - ], - - "targetPackage" : [ - ["Client", "myClientExecutable"], - ["Server", "myServerExecutable"] - ], -} -``` - -```bash -cqtdeployer getDefaultTemplate qif -confFile "path/to/configFile.json" -``` - - -## Note -This option support work with all packages except of zip. -If you want get more information about available packages see the packing [page](Packing.md). diff --git a/md/en/Guide.md b/md/en/Guide.md deleted file mode 100644 index 6885443e..00000000 --- a/md/en/Guide.md +++ /dev/null @@ -1,550 +0,0 @@ -# How to deploy - -How to deploy C++ Application - - -In this article i describe deploy processes of c++/qt application with cqtdeployer. - -## Recommendation -If you want maximum stability of your distribution and you want to run your application on different Distributions with a different versions then you need to use Qt from official [build](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5). - -## Case -In this case we deploy Qt GUI Application for Ubuntu 16.04,Ubuntu 18.04 and Ubuntu 20.04 ++. - -**If you want support all distributions begin from Ubuntu 16.04 you need build and deploy you application on the older distribution (in my case it is 16.04)** - -## Install CQtDeployer -If you want use system qt from your OS then install [classic](https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run) version of the cqtdeployer. - -```bash -wget https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run -``` - -``` -chmod +x LinuxInstaller.run -./LinuxInstaller.run -``` -![CQtDeployer Setup](https://user-images.githubusercontent.com/12465465/100077575-9280a600-2e53-11eb-8d9d-d184341cfa7c.png) - -Select latest stable version (1.4) - -![Screenshot from 2020-11-24 12-50-54](https://user-images.githubusercontent.com/12465465/100077707-bb08a000-2e53-11eb-9838-6f896af33105.png) - -Done. - -If You use official qt build then you can use snap version of the cqtdeployer. - -``` -sudo snap install cqtdeployer -``` - -After install add requirement permissions. - -``` -sudo snap connect cqtdeployer:process-control -sudo snap connect cqtdeployer:removable-media -sudo snap connect cqtdeployer:system-backup -``` - -Done!!! - -## Deploy Qt GUI Application - -### Deploy your executable file. - -* For Linux systems: - -```bash -cqtdeployer -bin myexecutable -``` - -* For Windows systems: - -```bash -cqtdeployer -bin myexecutable.exe -qmake C:/Qt/5.15.0/min_gw/bin/qmake.exe -``` - -* For crossplatform build (Linux -> Windows) - -```bash -cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/bin/qmake -``` - -## Extra options - -If you use extra libraries, just add path for cqtdeployer to used libs. - -```bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -``` - -If you want find libraries recursively from libDir path, just add recursive Depth option. - -```bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -``` - -If you application use qml, just add qmlDir option - -```bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources -``` - -If you want create simple installer for your application just add gif option. -``` -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -``` - -If cqtdeployer not found qmake then add the -qmake option to an invoke command. - -``` -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -qmake /path/to/my/qmake - -``` - - -# Using a live animation example from [Qt Examples](https://doc.qt.io/qt-5/qtquick-animation-example.html) - -## Build the project as a release - -Run qmake with the -r option for release build - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.152/quick/animation$ ~/Qt/5.15.2/gcc_64/binqmake -r . -``` - -Call your make command. - -For Linux: - -```bash -make -j${nproc} -``` - -For Windows - -```bash -Qt/Tools/QtCreator/bin/jom.exe -``` - -Build log: - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ make -j${nproc} -g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o main.o main.cpp -/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name shared ../shared/shared.qrc -o qrc_shared.cpp -/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name animation animation.qrc -o qrc_animation.cpp -g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_animation.o qrc_animation.cpp -g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_shared.o qrc_shared.cpp -g++ -Wl,-O1 -Wl,-rpath,/home/andrei/Qt/5.15.2/gcc_64/lib -o animation main.o qrc_shared.o qrc_animation.o /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so -lGL -lpthread -``` - -## Find our resulting executable file - -If you built the project using qtCreator, your executable file will be found one level higher in the **build-animations-Desktop_Qt_5_15_2_GCC_64bit-Release** folder. In my case, the executable file is located in the root directory of the project. - -```bash - andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ tree -. -├── animation # Here it is. -├── animation.pro -├── animation.qml -├── animation.qmlproject -├── animation.qrc -├── basics -│ ├── animators.qml -│ ├── color-animation.qml -│ ├── images -│ │ ├── face-smile.png -│ │ ├── moon.png -│ │ ├── shadow.png -│ │ ├── star.png -│ │ └── sun.png -│ └── property-animation.qml -├── behaviors -│ ├── behavior-example.qml -│ ├── FocusRect.qml -│ ├── SideRect.qml -│ ├── tvtennis.qml -│ └── wigglytext.qml -├── doc -│ ├── images -│ │ └── qml-animations-example.png -│ └── src -│ └── animation.qdoc -├── easing -│ └── easing.qml -├── main.cpp -├── main.o -├── Makefile -├── pathanimation -│ └── pathanimation.qml -├── pathinterpolator -│ └── pathinterpolator.qml -├── qrc_animation.cpp -├── qrc_animation.o -├── qrc_shared.cpp -├── qrc_shared.o -└── states - ├── qt-logo.png - ├── states.qml - └── transitions.qml - -10 directories, 33 files -``` - -## Call cqtdeployer to form the base distribution - -For Linux: - -```bash -cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -``` - -For Windows: - -```bash -cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/mingw_810_64/bin/qmake.exe -``` - -Deploy log: - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -Info: Deploy ... -Info: flag targetDir not used. use default target dir :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit -Info: target deploy started!! -Info: copy :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/animation -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/libqmlplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/libmodelsplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/libqtqmlremoteobjects.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/libqtqmlstatemachine.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/libworkerscriptplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/libparticlesplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/libqtquick2plugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/qmldir -Info: platform : libqvnc is disabled -Info: platform : libqvnc is disabled -Info: platform : libqwebgl is disabled -Info: platform : libqwebgl is disabled -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqconnmanbearer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqgenericbearer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqnmbearer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/iconengines/libqsvgicon.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqgif.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqicns.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqico.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqjpeg.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqsvg.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtga.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtiff.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwbmp.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwebp.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqeglfs.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqlinuxfb.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimal.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimalegl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqoffscreen.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-generic.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-glx.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqgtk3.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqxdgdesktopportal.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-decoration-client/libbradient.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdmabuf-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdrm-egl-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libqt-plugin-wayland-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libshm-emulation-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libvulkan-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-glx.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-dmabuf-server-buffer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-drm-egl-server-buffer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-linux-dmabuf-unstable-v1.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-shm-emulation-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-vulkan-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-eglstream-controller.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-glx.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libfullscreen-shell-v1.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libivi-shell.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libwl-shell.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v5.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v6.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-egl-integration.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-glx-integration.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5EglFSDeviceIntegration.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5XcbQpa.so.5 -Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicui18n.so.56 -Info: copy :/usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5RemoteObjects.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QuickParticles.so.5 -Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicudata.so.56 -Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicuuc.so.56 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlWorkerScript.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Widgets.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandClient.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5DBus.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Svg.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandCompositor.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ar.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_bg.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ca.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_cs.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_da.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_de.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_en.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_es.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fi.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_gd.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_he.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_hu.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_it.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ja.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ko.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_lv.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_pl.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ru.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_sk.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_tr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_uk.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_zh_TW.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_bg.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_da.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_de.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_en.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_es.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fi.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_hu.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ja.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ko.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_lv.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_pl.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ru.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_sk.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_tr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_uk.qm -Info: try deploy msvc -Info: deploy done! -Info: copy ::/shared/Distributions/Templates/Icon.png -Error: not exits -Info: [0] Parsed arguments, ok. -Info: [2] Collecting information about available packages... -Info: [4] Found subdirectory "Application" -Info: [4] - it provides the package "Application" - "1.0" -Info: [4] Copying component data for "Application" -Info: [5] Compressing data directory "bin" -Info: [21] Compressing data directory "icons" -Info: [31] Compressing data directory "lib" -Info: [11111] Compressing data directory "plugins" -Info: [11740] Compressing data directory "qml" -Info: [11786] Compressing data directory "translations" -Info: [12321] Compressing files found in data directory: ("/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/data/animation.sh") -Info: [12321] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" -[12321] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" -Info: [12321] Generated sha1 hash: "0af6cb9dc074407a8857403f07d13aa7d1b3c9cb" -Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" -[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" -Info: [12322] Generated sha1 hash: "aa938cb332bfb427a6d0280c07c204c1bb48da22" -Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" -[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" -Info: [12347] Generated sha1 hash: "7c3a43111e694bc82a0ab0d19a6e4d0025f17313" -Info: [12347] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" -[12347] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" -Info: [12349] Generated sha1 hash: "4ed23c36835a9b62701478ab6897737dfe9dfc9a" -Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" -Info: [12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" -Info: [12349] Generated sha1 hash: "bd44e15d2c26c8f6cb50760032eadf0241eedf43" -Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" -[12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" -Info: [12350] Generated sha1 hash: "030e0ede0c0e058a5d5a3b6c43c6a4767119d3f1" -Info: [12350] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" -Info: [12350] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" -Info: [12350] Generated sha1 hash: "acd2cd63e77971acedbcda2a65f93b2cc036025f" -Info: [12350] Copy meta data for package "Application" using "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/package.xml" -Info: [12350] calculate size of directory "/tmp/binarycreator-yOPMPa/Application/data" -Info: [12359] Copying associated "script" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/installscript.qs" -Info: [12360] done. -Info: [12360] Begin to copy configuration file and data. -Info: [12360] Copying associated "configuration" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/config.xml" -Info: [12360] done. -Info: [12360] Read dom element: animation. -Info: [12360] Read dom element: 1.0. -Info: [12360] Read dom element: animation. -Info: [12360] Read dom element: Company. -[12360] Read dom element: animation. -[12360] Read dom element: @HomeDir@/animation. -Info: [12360] Read dom element: true. -[12360] Read dom element: true. -Info: [12360] Read dom element: controlScript.qs. -Info: [12360] Copying associated "ControlScript" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/controlScript.qs" -Info: [12360] done. -Info: [12360] Read dom element: animationTool. -[12360] Read dom element: . -Info: [12360] done. -Info: [12362] Creating the binary -Info: [12407] Creating resource archive for "Application" -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" ("61.58 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" ("108.00 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" ("18.08 MB") -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" ("1.08 MB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" ("53.29 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" ("40.00 bytes") -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" ("595.71 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" ("439.00 bytes") -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" ("40.00 bytes") -Info: [12449] Cleaning up... -``` - -Done. The distribution has been saved to the **DistributionKit** folder - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ ./DistributionKit/Installeranimation.run -``` -![2021-02-22 11-25-34](https://user-images.githubusercontent.com/12465465/108681955-c629a580-7500-11eb-8087-cedfa8134aae.png) - -After installation, all the necessary shortcuts will be created. - -![2021-02-22 11-27-11](https://user-images.githubusercontent.com/12465465/108682148-012bd900-7501-11eb-9f0b-f46fd79aef25.png) - -![2021-02-22 11-29-23](https://user-images.githubusercontent.com/12465465/108682391-48b26500-7501-11eb-8d81-b430ddf97d46.png) - - -## Integration with QtCreator - -Unfortunately, there is currently no integration with qtcreator. -The only way is to enable build target for ** qmake ** or ** cmake ** - -### qmake - -```qmake -QT_DIR= $$[QT_HOST_BINS] -win32:QMAKE_BIN= $$QT_DIR/qmake.exe -contains(QMAKE_HOST.os, Linux):{ - QMAKE_BIN= $$QT_DIR/qmake -} - -deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif - -QMAKE_EXTRA_TARGETS += deploy - -``` - -### cmake - -```cmake - find_program(Q_MAKE_EXE qmake) - - find_program(CQT_EXE cqtdeployer) - - IF(NOT EXISTS ${CQT_EXE}) - message("the cqtdeployer not exits please install the cqtdeployer and run cmake again!") - return() - endif(NOT EXISTS ${CQT_EXE}) - - ADD_CUSTOM_TARGET( - deploy - COMMAND cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5 - COMMENT "Deploy: cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5" - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - ) -``` - -The **libDir** parameter is used to set the paths to the directory paths contain dependencies of your application, and the **qmlDir** parameter is used to set the directory paths contain the qml files required by your application. In this example, the application source code root is selected by these two options. -The **recursiveDepth** parameter is used to set the search depth of **libDir** and **qmlDir**. -The **qif** parameter is used to create a installer using Qt Installer Framework. - - -## Integration example -Create a test project - -```qmake - -QT += quick - -CONFIG += c++11 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp - -RESOURCES += qml.qrc - -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = - -# Additional import path used to resolve QML modules just for Qt Quick Designer -QML_DESIGNER_IMPORT_PATH = - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target - - -QT_DIR= $$[QT_HOST_BINS] -win32:QMAKE_BIN= $$QT_DIR/qmake.exe -contains(QMAKE_HOST.os, Linux):{ - QMAKE_BIN= $$QT_DIR/qmake -} - -DESTDIR=$$PWD/Build - -deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif - -QMAKE_EXTRA_TARGETS += deploy - -``` - -2. Open the project control panel - ![Снимок экрана от 2021-02-22 12-15-51](https://user-images.githubusercontent.com/12465465/108687472-d09b6d80-7507-11eb-9b56-8d09d42dac5e.png) - -3. Choose a release build - ![изображение](https://user-images.githubusercontent.com/12465465/108688147-a39b8a80-7508-11eb-81b9-9a24426a94a3.png) - - -3. Add "Custom build step" - ![изображение](https://user-images.githubusercontent.com/12465465/108687640-02143900-7508-11eb-8d1c-532afd7f6ccb.png) - -4. In the "Make arguments" field, add our "deploy" deployment step - ![изображение](https://user-images.githubusercontent.com/12465465/108687800-35ef5e80-7508-11eb-8f69-aec090d4baa0.png) - -5. Save -6. Start the building - -#### As a result, you will receive a DistributionKit folder with the installer of your application. diff --git a/md/en/Home.md b/md/en/Home.md deleted file mode 100644 index 3953aa3c..00000000 --- a/md/en/Home.md +++ /dev/null @@ -1,26 +0,0 @@ -# Welcome to the "C Qt Deployer"! -# ![Logo](https://user-images.githubusercontent.com/12465465/84260958-99289480-ab23-11ea-8aab-374368a545dc.png) - -*************************** - -# Main sections - -* [Description CQtDeployer](Description.md) -* [Options](Options.md) -* [Guide](Guide.md) -* [Quick guide](QuickGuide.md) -* [Build and Install](Build-and-Install.md) -* [Deploy file](DeployConfigFile.md) -* [Packing](Packing.md) -* [Change log page](Changelog.md) -* [Reviews](ReleaseReviews.md) -* [Compare Features](CompareFeatures.md) -* [Adding extra files](ExtraFiles.md) -* [Retrieving packaging templates](ExtractDefaultsTemplates.md) -* [Default Environment Variables](EnvironmentVariables.md) -* [Disable standard shortcuts ](DisableShortcats.md) -* [Custom scripts](CustomScripts.md) - - -## Support the project -If you like what we do and it benefits you, you can support the project on the official page [QuasarApp in Patreon](https://www.patreon.com/QuasarApp) diff --git a/md/en/Options.md b/md/en/Options.md deleted file mode 100644 index 6407e142..00000000 --- a/md/en/Options.md +++ /dev/null @@ -1,174 +0,0 @@ -# Options general rules - -General rules for using options - -``` -cqtdeployer -option1 value1 -option2 list, of, values ​​flag1 flag2 flag3 -``` - -* All options must begin with a '-' sign. -* After specifying the desired option, you must specify the value. -* Some options support enumerations (arrays of values). When initializing such options, specify the list of values through ',' without spaces. If you use any programming language and call the cqtdeployer process, then the array of values must be passed as 1 parameter. -* Some options support redistributions with the ability to select the target for which the flag will be applied. Target and values are separated using the ';' sign. Example -libOut target1;value1,target2;value2,defaultValue. -* To include a flag, simply include the flag name in the list of options. - -## Description of values in the table - -* **-binDir [params]** - option without array support. -* **-bin [params,list]** - option with support for arrays. The delimiter used is ','. -* **-libOut [package;path,path]** - parameter with support for selecting the package for which the flag value is set. As a separator, use ';'. Please note that the rule described above is used to enumerate parameter values. The last parameter does not have a package value, this means that this value will be set for all non-configured packages by default. -* **clear** - boolean option - -## Definitions in description - -**System environments** - paths of directories containing the system libraries. - * Windows: - * Paths defined in the PATH variable. - * C:/Windows/System32 - * C:/Windows/SysWOW64 - * Linux: - * Paths defined in the LD_LIBRARY_PATH and PATH variables. - * /usr/lib - * /lib - -**Deployable files** - all file that will be copied into distribution (include executable files) - -**Targets** - all executable files marked by bin option. - -**Executable files** - all files with PE, ELF and Mach-O formats. - -## Options: - -### Boolean options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| init | will initialize cqtdeployer.json file (configuration file)| -| | For example: "cqtdeployer init" - for initialize base package configuration| -| | "cqtdeployer -init multi" - for initialize multi package configuration| -| | "cqtdeployer -init single" - for initialize single package configuration | -| help / h | Shows help. | -| clear | Deletes deployable files of the previous session. -| force-clear | Deletes the destination directory before deployment. | -| noStrip | Skips strip step | -| noTranslations | Skips the translations files. | -| | It doesn't work without qmake and inside a snap package | -| noOverwrite | Prevents replacing existing files. | -| noCheckRPATH | Disables automatic search of paths to qmake in executable files.| -| noCheckPATH | Disables automatic search of paths to qmake in system PATH. | -| noRecursiveiIgnoreEnv | Disables recursive ignore for ignoreEnv option. | -| v / version | Shows compiled version | -| qif | Create the QIF installer for deployment programm" | -| | Example: cqtdeployer qif" }, | -| | Starting with CQtDeployer 1.5 you can specify the path to your own installer template. | -| | Examples: cqtdeployer -qif path/to/myCustom/qif. More details can be found [here](QIF.md) | -| deb | Create the deb package for deployment programm" | -| | Example: cqtdeployer deb" }, | -| | you can specify the path to your own DEBIAN template. | -| | Examples: cqtdeployer -deb path/to/myCustom/DEBIAN. More details can be found [here](DEB.md) | -| deploySystem | Deploys all libraries not recomendet because there may be conflicts with system libraries | -| noQt | Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework. | -| allowEmptyPackages | Allows configure the empty packages. | -| getDefaultTemplate | Extracts defaults deb or qif templates. For more information see the extracting default templates [page](ExtractDefaultsTemplates.md) | -| noHashSum | Disable computation of a packages hash sum | - - -### Deploy options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -bin [list,params] | Files to deploy or folders that contain files to deploy. For example -bin ~/my/project/bin/,~/my/project/bin.exe,~/my/project/runtimeLinking/lib.dll. For files: These files will be unconditional copied to the destination directory, regardless of their format or suffix. For folders: CQtDeployer will enter these folders and non-recursively copy all executable files to the destination directory. Then, CQtDeployer will extract all dependencies of the copied files and search dependencies in system environments and **libDir** paths. **Note**: If CQtDeployer can't find required file then CQtDeployer try find required file in the system PATH enviroment.| -| -binPrefix [prefixPath] | Sets prefix path for bin option. Example: **-bin path/MyExecutable** is some as **-bin MyExecutable -binPrefix path** | -| -confFile [params] | The path to the json file with all deployment configurations.| -| | Using this file, you can add the necessary options, | -| | thereby simplifying in the command invocation the console. | -| | However, the parameters in Kansol have a higher priority than in the file.| -| | For more info about this flag see [wiki](DeployConfigFile) | -| -qmlDir [params] | Qml data dir. For example -qmlDir ~/my/project/qml | -| -qmake [params] | Qmake path. For example | -| | -qmake ~/Qt/5.14.0/gcc_64/bin/qmake | -| -ignore [list,params] | The list of libs to ignore. | -| | For example -ignore libicudata.so.56,libicudata2.so.56 | -| -ignoreEnv [list,params] | The list of the environment to ignore. | -| | For example -ignoreEnv /bad/dir,/my/bad/Dir | -| -libDir [list,params] | Sets additional paths for extra libs of an app. | -| | For example -libDir ~/myLib,~/newLibs. **Attention** the libDir option should not be children of the targetDir directory. The targetDir option is forbidden for library searches, as it may contain outdated project libraries, which in turn may lead to unwanted crashes. | -| -extraLibs [list,params] | Sets the mask of the library name for forced copying. | -| | Example: "-extraLib mySql" - forces to copy all libraries whose names contain mySql to the project folder. This option is case-insensitive on Windows and case-sensitive on other platforms. This option will only search libraries in system environments similar to **deploySystem**.| -| -customScript [scriptCode]| Insert extra code inTo All run script. | -| -extraPlugin [list,params]| Sets an additional path to extraPlugin of an app | -| -recursiveDepth [params] | Sets the Depth of recursive search of libs and ignoreEnv (default 0) | -| -targetDir [params] | Sets target directory(by default it is the path to the first deployable file)| -| -installDirDeb [params] | Sets install target directory fordebian package (by default it is /opt path) | -| -installDirQIFW [params] | Sets install target directory for installers (by default it is /home path) | -| -verbose [0-3] | Shows debug log. By default it is 2 | -| -platform [list] | If this option is enabled then CQtDeployer will deploy only binaries of a selected platform. Supported values: [win_x86 win_x86_64 win_arm win_arm64 linux_x86 linux_x86_64 linux_ARM linux_ARM64] | - -### Controll of packages options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -targetPackage [package;tar1,package;tar2]| Creates a new package and adds 'tar1 and tar2' to it | -| -qmlOut [package;path,path] | Sets path to qml out directory | -| -libOut [package;path,path] | Sets path to libraries out directory | -| -trOut [package;path,path] | Sets path to translations out directory | -| -pluginOut [package;path,path]| Sets path to plugins out directory | -| -binOut [package;path,path] | Sets path to binary out directory | -| -recOut [package;path,path] | Sets path to recurses out directory | -| -extraDataOut [package;path,path] | Sets path to extra data files out directory. By Default it is root dir of the distribution. | -| -name [package;val,val] | Sets name for package. If this if you do not specify a package, the value will be assigned to the default package ("")| -| -description [package;val,val] | Sets description for package | -| -deployVersion [package;val,val] | Sets version for package | -| -releaseDate [package;val,val] | Sets release date for package | -| -publisher [package;val,val]| Sets publisher for package | -| -homePage [package;val,val] | Sets the homepage url for a package | -| -prefix [package;val,val] | Sets the prefix for the package relatively a target directory | -| -extraData [package;val,val]| Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure.| -| -tr [package;val,val] | Adds qm files into the translations folder. | - -### Controll of targets options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -icon [target;val,val] | Sets path to icon for a targets. This option support only png (Linux) and ico (Windows) files. | -| -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)| - -### Plugins Controll Options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -extraPlugin [package;val1;val2,SingeleVal]| Sets an additional path to third-party application plug-in | -| -enablePlugins [package;val1;val2,SingeleVal] | Enables additional plugins for distribution. | -| -disablePlugins [package;val1;val2,SingeleVal]| Disables plugins for distribution. | -| |You can disable any plugin of your Qt build, just see the yourQtFolder/plugins forlder for available plugins.| -| |Example: if you want disable qxcb plugin: -disablePlugins qxcb. Note that the name of the plugin is indicated without its extension.| - -### QtInstallFramework options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -qifStyle [path/to/style.css]| Sets the path to the CSS style file or sets the default style. Available styles: quasar | -| -qifBanner [path/to/banner.png]| Sets path to the banner png file. | -| -qifLogo [path/to/logo.png]| Sets path to the logo png file. | -| -qifOut [nameOfOutputInstallerFile] | Sets name of output qifw installer. Note: on Windows, the exe suffix will be added to the installer automatically. | -| -qifConfig [path/to/config.xml] | Sets a custom path to the configure file of the qt ifw installer. By default it is qif/config/config.xml. Note This path sets releative target folder (sets by TargetDir option). | -| -qifPackages [path/to/packagesFodoler] | Sets a custom path to the packages directories. By default it is qif/packages. Note This path sets releative target folder (sets by TargetDir option). | -| -qifResources [path/to/resources1.qrc,path/to/resources2.qrc] | Sets a custom path to the resources files. By default this option is skipped. Note This path sets releative target folder (sets by TargetDir option). | -| -qifArchiveFormat [7z,zip,tar,tar.gz,tar.bz2,tar.xz] | Sets the format used when packaging new component data archives. If you omit this option, the 7z format will be used as a default. | -| -binarycreator [binarycreator command] | Sets new binarycreator command. Example : cqtdeployer -bin my.exe qifw -binarycreator 'wine path/to/binarycreator.exe'| - -### Deb package options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -debOut [package;nameOfOutputDebFile,nameOfOutputDebFile]| Sets name of the output debian file. This option can be work with multiple packages | - -### Zip pacakge options - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -zipOut [package;nameOfOutputZipFile,nameOfOutputZipFile]| Sets name of the output zip arrhive. This option can be work with multiple packages | - -#### Example: cqtdeployer -bin myApp -qmlDir ~/MyAppProject/qml -qmake ~/Qt/5.15.4/gcc_64/bin/qmake clear diff --git a/md/en/Packing.md b/md/en/Packing.md deleted file mode 100644 index 20ed6fbc..00000000 --- a/md/en/Packing.md +++ /dev/null @@ -1,139 +0,0 @@ -# Packaging distributions - -General information on packaging your distributions in packages. - -## Packaging Types - -* Automatic -* Manual - -## Automatic Packages - -Packages with this type creates automaticly. -By default the distribution have a one main package. You can configure it using [Controll of packages options](Options.md). - -#### Example (Set new name for pacakge) - -``` -ctdeployer ... -name "MyPackage" -``` - -If your distribution have a multiple executable files then you can be create a distribution with multiple package. - -One package can contain from 1 to infinity of executable files. - -For configure a package you must be use the targetPackage option. - -Example of using: - -``` -cqtdeployer ... -targetPackage myPacage;target1,myPacage2;target2 -``` - -Where myPacage is a name of package and target1 is a name of executable file. -so This example create 2 packages from 2 targets. - -The Next example create a 2 packages from 3 targets. -``` -cqtdeployer ... -targetPackage myPacage;target1,myPacage;target2,myPacage2;target3 -``` - - -You can also do the same in the config file - -``` -{ -"targetPackage": [ - [ - "myPacage", - "target1" - ], - [ - "myPacage2", - "target2" - ] - ] -} -``` - -``` -{ -"targetPackage": [ - [ - "myPacage", - "target1" - ], - [ - "myPacage", - "target2" - ], - [ - "myPacage2", - "target3" - ] - ] -} -``` - - -## Manual Packages - -Manual packages is packages created by user template. -For example you have a aplication that must be execute a complex script on the debian package or the installer. -So you need to create your template and add tehe path to you template for a package option. - -Example - -``` -cqtdeployer ... -qif /path/to/my/template/installer -``` - -The /path/to/my/template/installer folder must be contains a folder with the package name. -for example i am deploy application with the "MyExample" name, so my custom template must be locate in the -/path/to/my/template/installer/MyExample path. - -For multi-package distributions, the same rules apply. - -Your folder with the templates must be contains folders with same names as packages. - -Example: - -``` -{ -"targetPackage": [ - [ - "myPacage", - "target1" - ], - [ - "myPacage", - "target2" - ], - [ - "myPacage2", - "target3" - ] - ] -} -``` - -``` -~/path/to/my/template/installer$ tree -. -├── myPacage -│ └── ... -└── myPacage2 - └── ... - -``` - -### Note - -You can also extract the standard package template in order to override it if for some reason you are not satisfied with the standard implementation. See this [page](ExtractDefaultsTemplates.md) for details on how to do this - - -## Available packages - -* [Qt Install Framework](QIF.md) -* [ZIP Arhive](ZIP.md) -* [DEB Package](DEB.md) diff --git a/md/en/QIF.md b/md/en/QIF.md deleted file mode 100644 index 622774e0..00000000 --- a/md/en/QIF.md +++ /dev/null @@ -1,176 +0,0 @@ -# Qt Installer Framwork - -General rules for using Qt Installer Framwork - -### What is Qt Installer Framwork - -The **Qt Installer Framework** (QIF) provides a set of tools and utilities to create installers for the supported desktop Qt platforms: Linux, Microsoft Windows, and OS X. -In **CQtDeployer** QIF availabel in qif option. - -### How to use qif option - -The qif option invoke with path to custo qt installer template or with default installer template. - -#### For example: - -```bash - cqtdeployer ... qif -``` - -Where: -* **...** - is list of other options. -* **qif** - option for use qt installer framework with default template. - - -By default, cqtdeployer will create an installation file with one package in which your entire distribution kit will lie. -If you want to configure it, you should use [Controll of packages options](Options.md) -To create a new package, use the -targetPackage [package; tar1] option - - -Where: - -* **package** - it is package name -* **tar1** - it is name of the target that should be included in this package. - -Or you can describe packages in [configuration file](DeployConfigFile.md) - - -```json -{ -"targetPackage": [ - [ - "package", - "tar1" - ] -], -} -``` - -# Custom Template for QIF - -Starting with CQtDeployer Version 1.5 you can use your own installer template. To do this, you must pass the path to your template to the qif parameter. - -```bash -cqtdeployer ... -qif /path/to/my/custom/qif/template -``` - -### Template - -The qif template should contain 2 folders: -* packages -* config - -### Attention - -The name of the packages in the packages folder must match the names of the packages during deployment. - -For example: - -```json -"targetPackage": [ - [ - "myCustomInstaller", - "tar1" - ] -], -``` - -```bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` - -If the folder names do not match the package names then CQtDeployer will use the standard QIF package. - -If you have only one package then you can use the **name** option for set name the application. - -```bash -cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller -``` - -#### Do not forget to rename the your package folder to the packaga name of the name option. - - -```bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller << "This is folder of the your package" - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` - -## Initialization of the qifw template - -For initialize default templates you can use the getDefaultTemplate option. -The getDefaultTemplate option extract default template of the cqtdeployer. This is can be very convinion if you want override default behavior of the installer or anothe distribution package. - -### Example - -### Getting default qt installer framwork template. - -```bash -cqtdeployer getDefaultTemplate qif -``` - - -### Note - -CQtDeployer will skip create a packages directory for the template because this commmnad do not contains any deploying data. -If you want to prepare template with packages configurations then you should add deployed data to your command or your config.json file using bin or extraData options. -If you create multi pacakges distribution then you need to configure your packages in your deploying commnad. - - -#### Example: - -Extracting template with pacakges: - -```bash -cqtdeployer getDefaultTemplate qif -bin myExecutable -``` - -Extracting template for multi packages distribution - -```bash -cqtdeployer getDefaultTemplate qif -bin myExecutable1,myExecutable2 -targetPackage p1;myExecutable1,p2;myExecutable2 -``` - -You also can use the config file for configure templates. - -Config.json - -```json -{ - "qif": true, - "bin": [ - "myExecutable1", - "myExecutable2" - ], - "targetPackage": [ - ["p1", "myExecutable1"], - ["p2", "myExecutable2"] - ] -} -``` - -Run CQtDeployer for generate template: - -```bash -cqtdeployer -confFile Config.json getDefaultTemplate -``` diff --git a/md/en/QuickGuide.md b/md/en/QuickGuide.md deleted file mode 100644 index f6137d4c..00000000 --- a/md/en/QuickGuide.md +++ /dev/null @@ -1,81 +0,0 @@ -# Quick Guide - -How to deploy project with cqtdeployer. - -1. First one you need to install cqtdeployer into your platform - - * Snap (14 more linux destributions): - ``` - sudo snap install cqtdeployer - ``` - Or - - Install from snap store and add all requirement permissions. - - [![Download from Snap Store](https://snapcraft.io/static/images/badges/ru/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) - - * Other linux [LinuxInstaller.run][1]. - ``` - chmod +x LinuxInstaller.run - ./LinuxInstaller.run - ``` - - * Windows [installer][1] - -2. Build your project on release mode. -3. Deploy yor executable file. - - * For Linux systems: - ``` bash - cqtdeployer -bin myexecutable - ``` - - * For Windows systems: - ``` bash - cqtdeployer -bin myexecutable.exe -qmake C:/Qt/5.15.0/min_gw/bin/qmake.exe - ``` - - * For crossplatform build (Linux -> Windows) - ``` bash - cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/bin/qmake - ``` - -## Extra options - -If you use extra libraries, just add path for cqtdeployer to used libs. -``` bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -``` - -If you want find libraries recursively from libDir path, just add recursive Depth option. -``` bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -``` - -If you application use qml, just add qmlDir option -``` bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources -``` - -If you want create simple installer for your application just add gif option. -``` -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -``` - -If you use system libraries from system PATH, just add deploySystem option. - -#### Warning: snap version do not have permision to system files. To deploy system libraries use the cqtdeployer version from the [installer][1] - -``` -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif deploySystem -``` - - -### If you have any problems with use cqtdeployer then ask you questions on the official github issues [page][2]. - -### For more options of CQtDeploye see oficial [documentation][3]. - -[1]: https://github.com/QuasarApp/CQtDeployer/releases -[2]: https://github.com/QuasarApp/CQtDeployer/issues -[3]: https://github.com/QuasarApp/CQtDeployer/blob/main/md/en/Options.md - diff --git a/md/en/ReleaseReviews.md b/md/en/ReleaseReviews.md deleted file mode 100755 index a0b5f9a8..00000000 --- a/md/en/ReleaseReviews.md +++ /dev/null @@ -1,4 +0,0 @@ -# Release Reviews - -* [Review v1.5](1_5.md) -* [Review v1.4 (Binary Box)](1_4.md) diff --git a/md/en/ZIP.md b/md/en/ZIP.md deleted file mode 100644 index d837802a..00000000 --- a/md/en/ZIP.md +++ /dev/null @@ -1,47 +0,0 @@ -# ZIP Using - -General rules for using ZIP - - -Available from version CQtDeployer 1.5 - -### How to use zip option - -Just add to cqtdeployer option "zip". - -### For example: - -```bash -cqtdeployer ... zip -``` - -Where: -* **...** - is list of other options. -* **zip** - option for use zip arhives. - - -By default, cqtdeployer will create one zip arhive. -If you want create multi package destribution, you should use [Controll of packages options](Options.md) -To create a new package, use the -targetPackage [package; tar1] option - -cqtdeployer create zip arhive for each packages. - -Where: - -* **package** - it is package name -* **tar1** - it is name of the target that should be included in this package. - -Or you can describe packages in [configuration file](DeployConfigFile.md) - - -```json -{ -"targetPackage": [ - [ - "package", - "tar1" - ], -], -"zip": true -} -``` diff --git a/md/ru/1_4.md b/md/ru/1_4.md deleted file mode 100755 index adaeef78..00000000 --- a/md/ru/1_4.md +++ /dev/null @@ -1,409 +0,0 @@ -# Релиз CQtDeployer v1.4.0 (Binary Box) - -Релиз утилиты развертывания С++/Qt и QML приложений CQtDeployer v1.4.0 (Binary Box) - -Спустя почти полгода, вышло мажорное обновление утилиты развёртывания CQtDeployer. -В данном обновлении множество нововведений, но основной упор в сделан на создание пакетов. - -## Полный список всех изменений - -### Исправления -- Исправлен вывод справки в консоли, теперь перед выводом пересчитывается реальный размер консоли, что позволяет выполнять переносы текста правильно. -- Исправлена работа с развертыванием плагинов Qt. Теперь плагины не тянут за собой все системные зависимости, а только qt. Захват системных зависимостей приводил к падению приложений из-за несовместимости библиотек плагинов. -- Мелкие исправления и улучшения. -### Нововведения -- Добавлена поддержка поиска qmake из системного окружения. -- Добавлена возможность инициализировать репозиторий для дальнейшей упаковки аналогично git init. -- Добавлена поддержка Qt Install Framework пакетов. Теперь можно запаковать дистрибутив в инсталлятор. -- Добавлена возможность разбивать конечный дистрибутив на несколько пакетов. -- Добавлен механизм, позволяющий унифицировать создание пакетов для конечного дистрибутива. -- Добавлена поддержка добавления пользовательских скриптов в скрипты запуска приложений. -- Добавлена поддержка сборки системных зависимостей для Windows. -- Добавлена поддержка RPATH для Linux. Теперь cqtdeployer может самостоятельно определить нужный qmake для развертывания приложения. -- Добавлена поддержка поиска необходимой зависимости по имени библиотеки. -- Добавлена поддержка Qt библиотек из репозиториев Linux дистрибутивов. -### Новые опции -- init - инициализирует файл cqtdeployer.json (файл конфигурации). Например: «cqtdeployer init» - для инициализации конфигурации одного пакета. "cqtdeployer -init multiPackage" - для инициализации конфигурации нескольких пакетов. -- noCheckRPATH - отключает автоматический поиск путей к qmake в исполняемых файлах (Только Linux). -- noCheckPATH - отключает автоматический поиск путей к qmake в системном окружении. -- extractPlugins - заставляет извлекать все зависимости плагинов. -- qif - создает инсталлятор в конце развертывания. -- extraLibs - добавляет шаблон дополнительной библиотеки, которая должна будет попасть в дистрибутив. -- customScript - добавляет пользовательский скрипт в скрип запуска приложения. -- -targetPackage [package;tar1,package;tar2] - используется для формирования пакетов, обозначает списки целевых файлов для определенных пакетов. -- recOut - указывает в какую папку будут складываться ресурсы после развертывания. -- name - устанавливает имя пакета. -- description - устанавливает описание пакета -- deployVersion - устанавливает версию пакета -- releaseDate - дата релиза пакета. -- icon - иконка пакета. -- publisher - издатель пакета. -- qifStyle - Устанавливает путь к CSS файлу стиля или устанавливает стиль по умолчанию. Доступные стили: quasar -- qifBanner - Устанавливает путь к png-файлу баннера. -- qifLogo - Устанавливает путь к файлу логотипа png. - -## Подробный разбор самых интересных изменений. - -Первое, на что стоит обратить внимание, это то что CQtDeployer научился работать с RPATH (Только Linux) и PATH. Это значит, что если ваше приложение собранно с поддержкой RPATH (а RPATH в qt включен по молчанию) или ваш qmake прописан в PATH, то вам не нужно указывать путь к qmakе. CQtDeployer сам найдет нужный ему qmake. -Давайте проверим это на практике. -Я написал простое консольное приложение с использованием Qt. -``` cpp -#include -#include -int main(int, char *[]) -{ - QString str = "hello CQtDeployer 1.4"; - qInfo() << str; - return 0; -} -``` - -Я буду использовать сборочную систему cmake, так как она более актуальная чем qmake. - -``` bash -andrei@HP:~/Hello$ tree -. -├── CMakeLists.txt -├── CMakeLists.txt.user -└── main.cpp - -0 directories, 3 files -``` - -Создадим папку для сборки. -``` bash -andrei@HP:~/Hello$ mkdir build -``` - -Выполним в созданной папке cmake. - -``` bash -andrei@HP:~/Hello/build$ cmake .. -DCMAKE_PREFIX_PATH=~/Qt/5.14.1/gcc_64 --- Configuring done --- Generating done --- Build files have been written to: /home/andrei/Hello/build -``` - -Выполняем сборку. - -``` bash -andrei@HP:~/Hello/build$ make -Scanning dependencies of target Hello_autogen -[ 25%] Automatic MOC and UIC for target Hello -[ 25%] Built target Hello_autogen -Scanning dependencies of target Hello -[ 50%] Building CXX object CMakeFiles/Hello.dir/Hello_autogen/mocs_compilation.cpp.o -[ 75%] Building CXX object CMakeFiles/Hello.dir/main.cpp.o -[100%] Linking CXX executable Hello -[100%] Built target Hello -``` - -Проверяем нашу программу. -``` bash -andrei@HP:~/Hello/build$ ls -CMakeCache.txt CMakeFiles cmake_install.cmake Hello Hello_autogen Makefile -``` -И запускаем cqtdeployer передав ему программу без qmake. -``` bash -andrei@HP:~/Hello/build$ cqtdeployer -bin Hello -Deploy ... -flag targetDir not used. use default target dir : "/home/andrei/Hello/build/DistributionKit" -target deploy started!! -copy : "/home/andrei/Hello/build/Hello" -extract lib : "/home/andrei/Hello/build/DistributionKit//bin//Hello" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libQt5Core.so.5" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicuuc.so.56" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicui18n.so.56" -copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicudata.so.56" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ar.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_bg.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ca.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_cs.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_da.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_de.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_en.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_es.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fi.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fr.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_gd.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_he.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_hu.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_it.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ja.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ko.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_lv.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_pl.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ru.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_sk.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_uk.qm" -copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_zh_TW.qm" -try deploy msvc -deploy done! -``` - -О чудо, теперь наше приложение полностью автономно. -Проверяем это. - -``` bash -andrei@HP:~/Hello/build$ cd DistributionKit/ -andrei@HP:~/Hello/build/DistributionKit$ tree -. -├── bin -│   ├── Hello -│   └── qt.conf -├── Hello.sh -├── lib -│   ├── libicudata.so.56 -│   ├── libicui18n.so.56 -│   ├── libicuuc.so.56 -│   └── libQt5Core.so.5 -└── translations - ├── qtbase_ar.qm - ├── qtbase_bg.qm - ├── qtbase_ca.qm - ├── qtbase_cs.qm - ├── qtbase_da.qm - ├── qtbase_de.qm - ├── qtbase_en.qm - ├── qtbase_es.qm - ├── qtbase_fi.qm - ├── qtbase_fr.qm - ├── qtbase_gd.qm - ├── qtbase_he.qm - ├── qtbase_hu.qm - ├── qtbase_it.qm - ├── qtbase_ja.qm - ├── qtbase_ko.qm - ├── qtbase_lv.qm - ├── qtbase_pl.qm - ├── qtbase_ru.qm - ├── qtbase_sk.qm - ├── qtbase_uk.qm - └── qtbase_zh_TW.qm - -3 directories, 29 files -andrei@HP:~/Hello/build/DistributionKit$ -``` -Корень программы: - -![image](https://user-images.githubusercontent.com/12465465/77245272-619a0280-6c2e-11ea-92f2-447563f72dcc.png) - -Библиотеки,нужные для работы программы: - -![image](https://user-images.githubusercontent.com/12465465/77245274-6363c600-6c2e-11ea-8729-7d494a073b66.png) - - -Как видно из примера, приложение полностью собрано. - -## Qt Installer Framework -Второе нововведение, о котором стоит знать, это возможность из коробки формировать установщики QIF. Все, что нужно для нашего примера, это добавить в команду на упаковку опцию qif. - -Пример использования. - -``` -andrei@HP:~/Hello/build$ cqtdeployer -bin Hello qif -``` - -Всего одна простая команда и программа получает презентабельный вид. - -![image](https://user-images.githubusercontent.com/12465465/77245315-b3428d00-6c2e-11ea-9326-c23229020eb5.png) - -Этот установщик поддерживает минимальную интеграцию Linux дистрибутивами и Windows. А именно: создание ярлыков, и регистрация приложения в OС. -Если по каким то причинам вас не устраивает внешний вид данного установщика, его можно изменить при помощи флага qifStyle . На момент версии 1.4 cqtdeployer поддерживает всего 2 стиля (native и quasar). - -Пример стиля quasar: - -![image](https://user-images.githubusercontent.com/12465465/77245334-d2d9b580-6c2e-11ea-9e55-e205499a9219.png) - -Вы также можете использовать свою собственную таблицу стилей qss. Для этого вместо названия стиля передайте путь к вашему qss или css файлу. -Для примера можно рассмотреть следующую таблицу стилей qss. - -Style.qss: -``` css -QWidget -{ - color: white; - background-color: rgb(65, 65, 65); -} - -QPushButton -{ - background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(150, 150, 150, 60%), stop:1 rgba(50, 50, 50, 60%)); - border-color: rgb(60, 60, 60); - border-style: solid; - border-width: 2px; - border-radius: 9px; - min-height: 20px; - max-height: 20px; - min-width: 60px; - max-width: 60px; - padding-left: 15px; - padding-right: 15px; -} - -QPushButton:pressed, QPushButton:checked -{ - background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(50, 50, 50, 60%), stop:1 rgba(150, 150, 150, 60%)); -} -``` - -Давайте проверим, что у нас получится в таком случае. -``` bash -cqtdeployer -bin Hello qif -qifStyle ./../style.qss -``` - -![image](https://user-images.githubusercontent.com/12465465/77245346-00266380-6c2f-11ea-8426-42bf58038458.png) - -Вот,собственно, и тёмная тема установщика. - -## Разбиение на пакеты -И,наверное, последнее важное обновление, о котором стоит знать — это возможность разделять большой многобинарный проект на подпроекты. - -Эта возможность самая сложная из всех перечисленных, так как требует много текста для ее использования. Так что я рекоммендую использовать файл конфигураций. - -Для начала усложним наш проект, добавив в него ещё 2 исполняемого файла. Я не стал заморачиваться и просто сделал 2 копии моей Hello утилиты. - -Для упрощения работы с пакетами нужно инициализировать директорию. - -``` bash -cqtdeployer init -``` - -Это еще одна новая функция, которая создаёт CQtDeployer.json файл, в котором мы и будем писать наши конфигурации, вместо передачи опций в утилиту. - -``` js -{ - "binDir": ".", - "clear": true, - "libDir": "./", - "recursiveDepth": 5 -} -``` - -Теперь давайте сделаем 2 пакета из 3х наших программ. Для этого нужно указать: -```js -{ - "binDir": ".", - "clear": true, - "libDir": "./", - "recursiveDepth": 5, - "targetPackage": [ - ["Dstro1", "Hello1"], - ["Dstro2", "Hello2"], - ["Dstro2", "Hello3"] - ] -} -``` - -Обратите внимание на то, что мне пришлось явно указать привязку для Dstro2 к Hello2 Hello3, К сожалению, на момент версии 1.4 cqtdeployer не умеет парсить перечисления целей. Обратите внимание, что если я напишу вместо Hello1 Hello, то выборка будет сделана по всем совпадениям и будут выбраны все 3 программы. -Итак, смотрим что получилось. - -``` bash -cqtdeployer - -. -├── Dstro1 -│   ├── bin -│   │   ├── Hello1 -│   │   └── qt.conf -│   ├── Hello1.sh -│   ├── lib -│   │   ├── libicudata.so.56 -│   │   ├── libicui18n.so.56 -│   │   ├── libicuuc.so.56 -│   │   └── libQt5Core.so.5 -│   └── translations -│   ├── qtbase_ar.qm -│   ├── qtbase_bg.qm -│   ├── qtbase_ca.qm -│   ├── qtbase_cs.qm -│   ├── qtbase_da.qm -│   ├── qtbase_de.qm -│   ├── qtbase_en.qm -│   ├── qtbase_es.qm -│   ├── qtbase_fi.qm -│   ├── qtbase_fr.qm -│   ├── qtbase_gd.qm -│   ├── qtbase_he.qm -│   ├── qtbase_hu.qm -│   ├── qtbase_it.qm -│   ├── qtbase_ja.qm -│   ├── qtbase_ko.qm -│   ├── qtbase_lv.qm -│   ├── qtbase_pl.qm -│   ├── qtbase_ru.qm -│   ├── qtbase_sk.qm -│   ├── qtbase_uk.qm -│   └── qtbase_zh_TW.qm -└── Dstro2 - ├── bin - │   ├── Hello2 - │   ├── Hello3 - │   └── qt.conf - ├── Hello2.sh - ├── Hello3.sh - ├── lib - │   ├── libicudata.so.56 - │   ├── libicui18n.so.56 - │   ├── libicuuc.so.56 - │   └── libQt5Core.so.5 - └── translations - ├── qtbase_ar.qm - ├── qtbase_bg.qm - ├── qtbase_ca.qm - ├── qtbase_cs.qm - ├── qtbase_da.qm - ├── qtbase_de.qm - ├── qtbase_en.qm - ├── qtbase_es.qm - ├── qtbase_fi.qm - ├── qtbase_fr.qm - ├── qtbase_gd.qm - ├── qtbase_he.qm - ├── qtbase_hu.qm - ├── qtbase_it.qm - ├── qtbase_ja.qm - ├── qtbase_ko.qm - ├── qtbase_lv.qm - ├── qtbase_pl.qm - ├── qtbase_ru.qm - ├── qtbase_sk.qm - ├── qtbase_uk.qm - └── qtbase_zh_TW.qm - -8 directories, 60 files -``` - -Как видно из дерева результата, у нас получилось 2 дистрибутива. -1. Dstro1 — содержит в себе приложение Hello1 -2. Distro2 — содержит оставшиеся 2. - -А теперь давайте проверим, что будет, если все это запаковать а установщик. Добавим в CQtDeployer.json опцию qif **"qif": true,**. - -``` js -{ - "binDir": ".", - "clear": true, - "qif": true, - "libDir": "./", - "recursiveDepth": 5, - "targetPackage": [ - ["Dstro1", "Hello1"], - ["Dstro2", "Hello2"], - ["Dstro2", "Hello3"] - ] -``` - -![image](https://user-images.githubusercontent.com/12465465/77245542-534ce600-6c30-11ea-9323-72ec5e200f39.png) - -Кака видно из скриншота, теперь у нас 2 пакета при установке. - -## Новые алиасы - -И последнее небольшое но приятное дополнение: теперь в cqtdeployer добавлены новые команды. -* сqt — бывстрый способ задеплоить ваше приложение. Он упрощает вызов развертывания. - * Пример: - **cqt myApp** — это тоже самое что и **cqtdeployer -bin myApp**. -* cqtdeployer.cqt — тоже что и cqt но для snap пакета. -* В windows-версии теперь не нужно добовлять знак % для вызова утилиты. -Теперь вызов выглядит так, как и в Linux. (cqtdeployer) diff --git a/md/ru/1_5.md b/md/ru/1_5.md deleted file mode 100755 index 21225803..00000000 --- a/md/ru/1_5.md +++ /dev/null @@ -1,157 +0,0 @@ -# Выпуск CQtDeployer v1.5.0 - -Выпуск утилиты развертывания приложений C ++ / Qt и QML CQtDeployer v1.5.0 - -Это первое крупное обновление в 2021 году. CQtDeployer 1.5 содержит множество полезных улучшений. Самыми большими улучшениями являются добавление возможности упаковывать пакеты deb и возможность использовать собственный шаблон упаковки для среды установки qt. - -## Полный список всех изменений - -## CQtDeployer 1.5.0 - -### Новые возможности - -- Добавлена ​​новая тема установщика qif "quasarDark". -- Добавлена ​​поддержка работы с кастомным шаблоном для опции qif. -- Добавлена ​​поддержка пакетов debian. -- Добавлены поддержка иконок целей. Теперь опция icon работает с целями, но не с пакетами. -- Добавлена ​​поддержка управления файлами пользовательского перевода. -- Добавлена ​​поддержка развертывания неисполняемых файлов. (опция extraData) -- Добавлены переменные окружения для развернутых приложений. -- Добавлена ​​поддержка создания пакетов deb. -- Добавлена ​​поддержка создания архивов zip. -- Добавлена ​​поддержка создания установщика qif с использованием настраиваемого шаблона. -- Добавлена команда для инициализации шаблонов qif и deb по умолчанию (getDefaulttemplate) -- Добавлена ​​поддержка импорта пользовательских скриптов запуска. -- Добавлена ​​поддержка хэшей md5 пакетов. -- Добавлена ​​поддержка Qt6.1. - -### Исправления - -- Исправлена ​​стабильность для опции deploySystem в Windows. -- Исправлен подробный журнал. -- Исправлен общий журнал вывода. -- Исправлены опечатки в логе. -- Исправлено кросс-развертывание под платформу ARM -- Исправлено развертывание Qt6 qml -- Исправлены команды PowerShell в Windows. -- исправления ошибок и улучшения. - - -### Новые переменные окружения - -- CQT_RUN_FILE - Эта переменная содержит путь к сценарию выполнения используемого приложения. -- CQT_PKG_ROOT - эта переменная содержит путь к корню текущего пакета. - -### Новые параметры - -- zip - создать ZIP-архив для развертываемой программы -- deb - Создать пакет deb для развертываемой программы -- homepage - Устанавливает URL-адрес домашней страницы для пакета -- noQt - игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует фреймворк qt -- allowEmptyPackages - позволяет настраивать пустые пакеты. -- getDefaultTemplate - Извлекает шаблоны deb или qif по умолчанию. -- tr - Добавляет qm файлы в папку переводов. -- extraData - добавляет дополнительные файлы или каталоги как цель. Выбранный каталог будет скопирован в папку extraDataOut с сохранением собственной структуры. -- extraDataOut - Устанавливает путь к каталогу с дополнительными файлами данных. -- prefix - Устанавливает префикс для пакета относительно целевого каталога -- homePage - Устанавливает URL-адрес домашней страницы для пакета -- binPrefix - устанавливает префикс для опции bin. -- noHashSum - отключает хэши кампутных пакетов - -### Устаревшие и удаленные параметры - -- deploySystem-with-libc - вместо этого параметра используйте параметр deploySystem. -- allQmlDependes - вместо этого параметра используйте параметр qmlDir. - - -## Подробный разбор наиболее интересных изменений. - -### Пакеты Debian -Эта функция очень удобна, если вы хотите создать серверное приложение. -Например, мне нужно создать простой сервер для простой игры. -Мои шаги: -* собрать мое приложение в режиме релиза. -* запустите cqtdeployer с опцией deb. - -```bash -cqtdeployer -bin mySimpleServer deb -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -``` -SimpleServer зависит только от qt, поэтому мне было достаточно указать только путь к qmake для моего приложения. - -Это все!!!. И я получаю рабочий пакет deb. -По умолчанию CQtDeployer создает независимые пакеты debian. - - -### Почтовые архивы -Эта функция позволяет сжать пакеты вашего дистрибутива в zip-архив. - -Пример: - -```bash -cqtdeployer -bin mySimpleServer zip -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -``` - -# Пользовательский Шаблон для QIF -Начиная с Версии CQtDeployer 1.5 вы можете использовать свой собственный шаблон установщика. Для этого вы должны передать в параметр qif путь к вашему шаблону. - -``` -cqtdeployer ... -qif /path/to/my/custom/qif/template -``` - -### Шаблон -Шаблон qif долже содержать 2 папки: -* packages -* config - -### Внимание -Название пакетов в папке packages должны совподать с названием пакетов при развертывание. -Например: -``` json -"targetPackage": [ - [ - "myCustomInstaller", - "tar1" - ] -], -``` - -``` bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` - -Если имена папок не совподут с именами пакетов то CQtDeployer будет использовать стандартный пакет для QIF. - -Если у вас только один пакет, вы можете использовать опцию **name** для установки имени приложения. - -``` -cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller -``` - -#### Не забудьте переименовать папку вашего пакета в имя пакета из опции имени. - - -``` bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller << "This is folder of the your package" - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` \ No newline at end of file diff --git a/md/ru/Build-and-Install.md b/md/ru/Build-and-Install.md deleted file mode 100644 index 7059c9b9..00000000 --- a/md/ru/Build-and-Install.md +++ /dev/null @@ -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 - diff --git a/md/ru/Changelog.md b/md/ru/Changelog.md deleted file mode 100755 index 38363336..00000000 --- a/md/ru/Changelog.md +++ /dev/null @@ -1,346 +0,0 @@ -# Журнал изменений - -Журнал изменений для всех версий CQtDeployer. - - -## CQtDeployer 1.5.4 - -### Новые параметры -* qifConfig - Устанавливает собственный путь к файлу конфигурации установщика qt ifw. По умолчанию это qif/config/config.xml #653. -* qifPackages - Устанавливает собственный путь к каталогам пакетов. По умолчанию это qif/packages #653. -* qifResources - Устанавливает собственный путь к файлам ресурсов. По умолчанию эта опция пропущена #653 -* debOut - Устанавливает имя выходного файла debian. Эта опция может работать с несколькими пакетами -* zipOut - Устанавливает имя выходного zip-архива. Эта опция может работать с несколькими пакетами - -### Исправление ошибок : - -* исправлено crossdeploy linux -> windows # 652 - - -## CQtDeployer 1.5.3 - -### Новые параметры - -* installDirDeb - Устанавливает целевой каталог установки для пакета debian (по умолчанию это / opt путь) -* installDirQIFW - Устанавливает целевой каталог установки для установщиков (по умолчанию это / home путь) - -### Исправления -* Исправлено предупреждение при установке В windows -* Добавлена пороверка параметров ввода -* Добавлено сообщение об ошибке из-за конфликта между опциями libDir и targetDir - -## CQtDeployer 1.5.2 - -### Новые параметры - -* Добавлена опция **qifOut** для установки имени установщика -* Добавлена опция **disableRunScript** для отключения генерации сценария запуска для выбранных целей -* Добавлена опция **disableShortCut** для отключения генерации ярлыка для выбранных целей - -### Исправления - -* Фикс документации -* Фикс развертывания библиотек openssl - -## CQtDeployer 1.5.1 - -### Исправления - -* Исправлено развертывание многоцелевых пакетов Debian -* Фикс развертывания qt6 qml приложений - -## CQtDeployer 1.5.0 - -### Нововведения - -- Добавлена новая тема установщика qif "quasarDark". -- Добавлена поддержка работы с кастомным шаблоном для опции qif. -- Добавлена поддержка пакетов debian. -- Добавлена поддержка иконок для целей. теперь опция icon работает с целями, а не с пакетами. -- Добавлена поддержка управления файлами пользовательского перевода. -- Добавлена поддержка развертывания дополнительных файлов. (опция extraData) -- Добавлены переменные окружения для развернутых приложений. -- Добавлена поддержка создания пакетов deb. -- Добавлена поддержка создания zip-архивов. -- Добавлена поддержка создания установщика qif с использованием настраиваемого шаблона. -- Добавлена команда инициализации qif по умолчанию шаблона deb (getDefaulttemplate) -- Добавлена поддержка импорта пользовательских скриптов запуска. -- Добавлена поддержка хэш сумм md5 для всех пакетов. -- Добавлена поддержка Qt6.1. - -### Исправления - -- Исправлена стабильность для опции deploySystem в Windows. -- Исправлен подробный журнал. -- Исправлен общий журнал вывода. -- Исправлены опечатки в логе. -- Исправлено кросс-развертывание arm дистрибутива. -- Исправлено развертывание Qt6 qml -- Исправлены команды PowerShell в Windows. -- исправления ошибок и улучшения. - -### Новые переменные среды - -- CQT_RUN_FILE - эта переменная содержит путь к сценарию выполнения используемого приложения. -- CQT_PKG_ROOT - эта переменная содержит путь к корню текущего пакета. - -### Новые параметры - -- zip - создать ZIP-архив для развертываемых программ -- deb - Создаст deb пакет для развертываемой программы -- homepage - Установит URL-адрес домашней страницы для пакета -- noQt - Игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует платформу qt -- allowEmptyPackages - разрешает настраивать пустые пакеты. -- getDefaultTemplate - Извлекает шаблоны deb или qif по умолчанию. -- tr - Добавляет qm файлы в папку переводов. -- extraData - Добавляет дополнительные файлы или каталоги как цель. Выбранный каталог будет скопирован в расположение extraDataOut с сохранением собственной структуры. -- extraDataOut - Устанавливает путь к каталогу с дополнительными файлами данных. По умолчанию это корневой каталог дистрибутива. -- prefix - Устанавливает префикс для пакета относительно целевого каталога -- homePage - Установит URL-адрес домашней страницы для пакета -- binPrefix - Устанавливает путь префикса для опции bin -- noHashSum - Отключить вычисление хеш-суммы пакетов - -### Устаревшие и удаленные параметры - -- deploySystem-with-libc - вместо этого параметра используйте параметр deploySystem. -- allQmlDependes - вместо этого параметра используйте параметр qmlDir. - -## CQtDeployer 1.5.0 Alpha - -### Исправления -- исправления ошибок и улучшения. - -### Новые особенности -- Добавлена новая тема для установщика qif "quasarDark". - -### Новые параметры -- zip - создать ZIP-архив для развертываемых программ - -## CQtDeployer 1.4.7 -### Исправления -- Исправлено развертывание плагина qxcb. #438 -- Исправлено развертывание модуля qtGui. #446 - -### Новые возможности -- Добавлена поддержка Qt6. #437 -- Добавлена поддержка Qt installer Framework 4 (с улучшенным интерфейсом командной строки)ю #436 - -## CQtDeployer 1.4.6 -### Исправления -- Исправлено развертывание драйверов sql #367. -- Исправлен алгоритм развертывания библиотек. #423 #371 -- Исправлена работа с qt из системного репозитория linux. (только классический установщик) #422 -- Исправлена snap версия cqtdeployer, добавлена поддержка поиска qmake по RPATH #424 #420 -- Исправлен хелп. -- Мелкие исправления и улучшения. -- Удалена устаревшая опция extractPlugins. #371 - -### Новые параметры -- noQt - игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует платформу qt. - -## CQtDeployer 1.4.5 -### Исправления -- Оптимизирована производительность развертывания проектов. На 60% быстрее. -- Оптимизирован выходной размер дистрибутивов. Размер уменьшен на 25%. -- Исправлено отображение ярлыков после установки развернутых приложений. -- Исправлен запуск приложений с пробелами в имени. спасибо ahndee (#384) -- Исправлено развертывание плагина Renderer. -- Незначительные исправления и улучшения. - -### Новые особенности -- Добавлена новая система управления плагинами развертывания. - -### Новые опции - -- extraPlugin - устанавливает дополнительный путь к сторонним плагина приложения -- enablePlugins - включает дополнительные плагины для распространения. -- disablePlugins - отключает плагины для распространения. - -## CQtDeployer 1.4.4 - -### New options -- qifFromSystem - Принудительно использовать системный инструмент binarycreator из path или qt - -## CQtDeployer 1.4.3 -### Исправления -- Исправленно отображение приложения скаченого из snap store и установщика в меню настроек приложений ubuntu 20.04 - -### Нововведения -- Добавленна поддержка рекурсивного добовления для флага ignoreEnv #356 - -### Новые опции -- noRecursiveiIgnoreEnv - Отключает рекурсивное игнорирование переменной среды для флага ignoreEnv. - - -## CQtDeployer 1.4.2 -### Исправления - -- исправлено #337 (ошибка генерации установщика с произвольным именем) -- исправлено #338 (версия Windows собирает pdb файлы) -- исправлено #339 (ошибка показа всех справочных сообщений) -- исправлено #340 (cqdeployer не добавлял каталоги целей в "ignore") -- исправлено #341 (опция очистки не удаляет старый установщик) - - -## CQtDeployer 1.4.1 - -### Исправления -- Исправлено не развертывание тем платформ (#324) -- Исправлено создание ярлыков на Windows (#322) -- Незначительные улучшения и исправления - -## CQtDeployer 1.4.0 -### Исправления -- Исправлен вывод справки в консоли, теперь перед выводом пересчитывается реальный размер консоли, что позволяет выполнять правильно переносы текста. -- Исправлена работа с развертыванием плагинов Qt. Теперь плагины не тянут за собой все системные зависимости, а только qt. Захват системных зависимостей приводил к падению приложений из-за несовместимости библиотек плагинов. -- Мелкие исправления и улучшения. - -### Нововведения -- Добавлена поддержка поиска qmake из системного окружения. -- Добавлена возможность инициализировать репозиторий для дальнейшей упаковки аналогично git init. -- Добавлена поддержка Qt Install Framework пакетов. Теперь можно запаковать дистрибутив в инсталлятор. -- Добавлена возможность разбивать конечный дистрибутив на несколько пакетов. -- Добавлен механизм позволяющий унифицировать создание пакетов для конечного дистрибутива. -- Добавлена поддержка добавления пользовательских скриптов в скрипты запуска приложений. -- Добавлена поддержка сборки системных зависимостей для Windows. -- Добавлена поддержка RPATH для Linux. Теперь cqtdeployer может самостоятельно определить нужный qmake для развертывания приложения. -- Добавлена поддержка поиска необходимой зависимости по имени библиотеки. -- Добавлена поддержка Qt библиотек из репозиториев Linux дистрибутивов. -- Добавлены новые псевдонимы для команды запуска (cqt и cqtdeployer.cqt) для быстрого развертывания приложений. -- Добавлена поддержка собственного имени команды для windows. Теперь вы можете запустить cqtdeployer написав cqtdeployer в cmd и powershell. - -### Новые опции -- init - инициализирует файл cqtdeployer.json (файл конфигурации). Например: «cqtdeployer init» - для инициализации конфигурации одного пакета. "cqtdeployer -init multi" - для инициализации конфигурации нескольких пакетов. -- noCheckRPATH - отключает автоматический поиск путей к qmake в исполняемых файлах (Только Linux). -- noCheckPATH - отключает автоматический поиск путей к qmake в системном окружении. -- extractPlugins - заставляет извлекать все зависимости плагинов. -- qif - создает инсталлятор в конце развертывания. -- extraLibs - добавляет шаблон дополнительной библиотеки, которая должна будет попасть в дистрибутив. -- customScript - добавляет пользовательский скрипт в скрип запуска приложения. -- -targetPackage [package;tar1,package;tar2] - используется для формирования пакетов, обозначает списки целевых файлов для определенных пакетов. -- recOut - указывает в какую папку будут складываться ресурсы после развертывания. -- name - устанавливает имя пакета. -- description - устанавливает описание пакета -- deployVersion - устанавливает версию пакета -- releaseDate - дата релиза пакета. -- icon - иконка пакета. -- publisher - издатель пакета. -- qifStyle - Устанавливает путь к CSS файлу стиля или устанавливает стиль по умолчанию. Доступные стили: quasar -- qifBanner - Устанавливает путь к png-файлу баннера. -- qifLogo - Устанавливает путь к файлу логотипа png. - ---- - -## CQtDeployer 1.3.2 -- Исправлено #218 (CQtDeployer добавлял sh-скрипты для целевых библиотек.) -- Исправлено #217 (опция qmake не работала с файлом конфигурации.) ---- - -## CQtDeployer 1.3.1 -- Исправлена задача #191 (команда игнорирования для плагинов) -- Исправлена задача #192 (неверный путь при создании файла развертывания) -- Исправлены абсолютные пути к файлу conf ---- - -## CQtDeployer 1.3.0 -- Добавлена поддержка qt.conf для Linux -- Добавлена поддержка конфигурационного файла для проекта (deploy.json) со всеми правилами развертывания, для создания deploy.json используйте флаг -confFile [./path/to/file.json]. -- Добавлена поддержка выходных каталогов для всех файлов развертывания #145, -- Добавлена поддержка развертывания WebEngine #146. -- Добавлена поддержка нескольких пакетов в установщике cqtdeployer. -- Переименован проект из Console-QtDeployer в CQtDeployer #139 -- Исправлено развертывание системных библиотек в linux #172 -- Добавлены новые тесты приложения -- Удален флаг noLibC и добавлен флаг deploySystem-with-libc. Если вам нужен в программе libc используйте флаг deploySystem-with-libc, а если нет то пользуйтесь deploySystem. -- Заменен флаг always-overwrite на noOverwrite, теперь все файлы по умолчанию перезаписываются, используйте noOverwrite для отключения перезаписи. ---- - -## CQtDeployer 1.2.3 -- Добавлена поддержка qt.conf для сборок Windows #130 -- Исправлена ошибка #129, теперь флаг «очистить» удаляет только скопированные файлы. -- Исправлен флаг ignoreEnv -- Исправлен флаг deploySystem ---- - -## CQtDeployer 1.2.2 -- Добавлен новый флаг noLibc для игнорирования библиотек libc и li-linux -- Исправлена #125 ошибка развертывания системных библиотек (работает с простыми проектами, для больших проектов не рекомендуется) -- Исправлен флаг ignoreEnv ---- - -## CQtDeployer 1.2.1 -- Добавлен новый флаг игнорирования (ignoreEnv). Этот флаг отключает ненужную среду -- Добавлена поддержка QIFW (онлайн-установщик для Windows и других дистрибутивов Linux) -- Добавлено обновление утилиты для Windows и других дистрибутивов Linux (не Snap) -- Исправлена ошибка № 116 (копирование файлов со съемного носителя) -- Исправлена ошибка № 115 (создание цели в папке с русским именем) -- Исправлен большой размер версии msvc -- Исправлено кросс-развертывание Linux >> Windows -- Удалены старые скрипты сборки ---- - -## CQtDeployer 1.2.0 -- Добавлен собственный сканер зависимостей qml. -- Перешел на новый [сканер PE-Lib](https://github.com/QuasarApp/pe-parse/tree/7138bb218a05c81d825728ba8a0a6f6a56c4fdbc). -- Перешел на новый [ELF-lib сканер](https://github.com/qt/qttools/blob/b0147a5d79ce7a7e77a24f36aaddfacb1a1517c8/src/shared/winutils/elfreader.h). -- Добавлены новые юнит-тесты. -- Добавлена поддержка версии Snap (только домашний каталог). -- Добавлен новый флаг qmlExtern - для использования сканера импорта qt qml. -- Добавлена поддержка уровней подробного журнала (0-3). -- Исправлен журнал развертывания приложения. -- Исправлено развертывание приложения в версии Snap. ---- - -## CQtDeployer 1.1.2 -- Добавлена поддержка переводов -- Добавлен флаг для отключения развертывания переводов -- Добавлена strip для Linux -- Добавлены юнит-тесты -- Исправлено развертывание в динамической версией -- Исправлена ошибка развертывания на текущем каталоге с привязкой и статической версией. ---- - -## CQtDeployer 1.1.1 -- Исправлена сборка qml в диномисечкой версии -- Исправленна работа флага -recursiveDepth -- Исправленна работа флага -libDir -- Исправленно копирование библиотек по ссылке -- Почищен вывод приложения, часть лога перенесенна в verbose ---- - -## CQtDeployer 1.1.0 -- Добавлена поддержка windows (только динамическая линковка) -- Добавлена поддержка snap (теперь доступно в snapstore) -- Добавлены сборочные скрипты для snap -- Добавлен флаг binDir позволяющий рекурсивно захватывать exe dll и so -- Изменена логика работы флага bin теперь если выбрать в место файла папку то будет захвачено все ее содержимое -- Изменена и исправлена логика работы флага clear теперь он чистит все развернутое содержимое по определенному таргету. -- Добавлен флаг targetDir который определяет место где будет лежать развернутый проект -- Изменена структура развернутого проекта, теперь все оболочки запуска лежат в корне а бинарники в папке bin, для каждого бинарника создается одноименный скрипт запуска. -- Удален старый флаг runScript из-за смены логики развертывания -- Добавлен флаг verbose для отладки по -- Исправлены ошибки производительности ---- - -## CQtDeployer 1.0.2 -- Добавлен скрипт для сборки (динамический и статический выпуск) -- Добавлен флаг -libDir для установки дополнительного пути для дополнительных библиотек приложения -- Добавлен флаг -extraPlugin для установки дополнительного пути для дополнительных плагинов приложения -- Добавлена сборка только для С библиотек -- Исправленно развертывание -- Исправлен сценарий запуска -- Исправлена статическая сборка ---- - -## CQtDeployer 1.0.1 -- Исправлена ошибка развертывания qml (избыточность) -- Исправлен скрипт запуска приложения - ---- - -## CQtDeployer 1.0.0 -- Добавлен флаг runScript -- Добавлен флаг allQmlDependes -- Исправлена ошибка развертывания qml -- Исправлена ошибка развертывания плагинов -- Добавлена поддержка статической сборки diff --git a/md/ru/CompareFeatures.md b/md/ru/CompareFeatures.md deleted file mode 100644 index 58a36241..00000000 --- a/md/ru/CompareFeatures.md +++ /dev/null @@ -1,15 +0,0 @@ -# Сравнение особенностей - -Сравните особенности дистрибутивов CQtDeployer - -| Название функции | Классическая версия linux (установщик) | Snap версия | Windows версия | -|---|---|---|----| -| Автоматические обновляется | Нет | Да | Нет | -| Онлайн-обновления | Да | Да | Да | -| Поддержка системных библиотек | Да | Да | Да | -| Поддержка создания установщиков | Да | Да | Да | -| Поддержка создания архивов | Да | Да | Да | -| Поддержка поиска библиотек и cmake из среды | Да | Нет | Да | -| Поддержка поиска qmake из RPATH | Да | Да | Нет -| Поддержка команды 'strip' | Да | Нет | Нет | -| Поддержка работы с qmake из системного репозитория ОС| Да| Нет | Нет | diff --git a/md/ru/CustomScripts.md b/md/ru/CustomScripts.md deleted file mode 100644 index 96d823f9..00000000 --- a/md/ru/CustomScripts.md +++ /dev/null @@ -1,68 +0,0 @@ -# Пользовательские скрипты - -После версии 1.5.1 cqtdeployer поддерживает собственные переменные в пользовательских скриптах. -Для использования пользовательских сценариев используйте параметр **runScript**. - -### Примеры: - -```bash -cqtdeployer -bin MyExecutable.exe -runScript MyExecutable,path/to/my/custom/script.bat -``` - -```bash -cqtdeployer -bin MyExecutable -runScript MyExecutable,path/to/my/custom/script.sh -``` - -## Список поддерживаемых переменных: - -* CQT_LIB_PATH - это относительный путь к библиотекам развернутого дистрибутива. -* CQT_QML_PATH - это относительный путь к библиотекам qml развернутого дистрибутива. -* CQT_PLUGIN_PATH - это относительный путь к плагинам qt развернутого дистрибутива. -* CQT_BIN_PATH - это относительный путь к целям развернутого дистрибутива. - -* CQT_SYSTEM_LIB_PATH - это относительный путь к системным библиотекам развернутого дистрибутива. -* CQT_BASE_NAME - это базовое имя исполняемого файла, который будет запущен после запуска этого скрипта. -* CQT_CUSTOM_SCRIPT_BLOCK - это код из опции customScript -* CQT_RUN_COMMAND - это команда для запуска приложения. Требуется переменная BASE_DIR. Важно: Эта переменная уже содержит символы перенапровления аргументов скрипта в исполняемый файл. - -## Шаблоны скриптов запуска - -### Linux - -```bash -#!/bin/sh - -BASE_DIR=$(dirname "$(readlink -f "$0")") -export LD_LIBRARY_PATH="$BASE_DIR"CQT_LIB_PATH:"$BASE_DIR":$LD_LIBRARY_PATH -export QML_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML_IMPORT_PATH -export QML2_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML2_IMPORT_PATH -export QT_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH:$QT_PLUGIN_PATH -export QTWEBENGINEPROCESS_PATH="$BASE_DIR"CQT_BIN_PATH/QtWebEngineProcess -export QTDIR="$BASE_DIR" -export CQT_PKG_ROOT="$BASE_DIR" -export CQT_RUN_FILE="$BASE_DIR/CQT_BASE_NAME.sh" - -export QT_QPA_PLATFORM_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH/platforms:$QT_QPA_PLATFORM_PLUGIN_PATH - -CQT_CUSTOM_SCRIPT_BLOCK - -CQT_RUN_COMMAND -``` - -### Windows - -```bash - -@echo off -SET BASE_DIR=%~dp0 -SET PATH=%BASE_DIR%CQT_LIB_PATH;%PATH%;CQT_SYSTEM_LIB_PATH -SET CQT_PKG_ROOT=%BASE_DIR% -SET CQT_RUN_FILE=%BASE_DIR%CQT_BASE_NAME.bat - -CQT_CUSTOM_SCRIPT_BLOCK - -CQT_RUN_COMMAND -``` - - -Или вы можете получить последнюю версию этих скриптов из github [репозитория](https://github.com/QuasarApp/CQtDeployer/tree/main/Deploy/ScriptsTemplates). diff --git a/md/ru/DEB.md b/md/ru/DEB.md deleted file mode 100644 index 9048f6b8..00000000 --- a/md/ru/DEB.md +++ /dev/null @@ -1,100 +0,0 @@ -# Использование DEB - -Общие правила использования DEB - -#### Доступно с версии CQtDeployer 1.5 - -### Как использовать опцию DEB - -Просто добавьте в cqtdeployer опцию «deb». - -#### Например: - -``` bash - cqtdeployer ... deb -``` - -Где: -* **...** - список других опций. -* **deb** - опция для создания deb пакетов. - - -По умолчанию cqtdeployer создает один deb пакет . -Если вы хотите создать несколько пакетов, вы должны использовать [Параметры управления пакетами](Options.md) -Чтобы создать новый пакет, используйте -targetPackage [package; tar1] - -cqtdeployer создает вуи пакет для каждого пакета. - -Где: - -* **package** - это название пакета -* **tar1** - это имя цели, которая должна быть включена в этот пакет. - -Или вы можете описать пакеты в [файле конфигурации](DeployConfigFile.md) - - -```JSON -{ -"targetPackage": [ - [ - "package", - "Tar1" - ], -], -"deb": true -} -``` - -# Использование собственных шаблонов для создания деб пакетов - -Вы можете создать собственный шаблон для пакетов debian. - -### Структура пакета debian: - - -```bash -└── Debian templates - ├── debPacakge1 - │ └── DEBIAN - │ ├── control - │ ├── postinst - │ └── prerm - └── debPacakge2 - └── DEBIAN - ├── control - ├── postinst - └── prerm - -``` - -Для включения ваших шаблонов в дистрибутив вам необходимо добавить путь к папке шаблонов Debian в deploy Config.json. - -```json -{ -"targetPackage": [ - [ - "debPacakge1", - "tar1" - ], - [ - "debPacakge2", - "tar2" - ], -], -"deb": "./Debian templates" -} -``` - - -## Инициализация шаблона debian - -Для инициализации шаблонов по умолчанию вы можете использовать параметр getDefaultTemplate. -Параметр getDefaultTemplate извлекает шаблон по умолчанию для cqtdeployer. Это может быть очень удобно, если вы хотите переопределить поведение установщика или другого пакета распространения по умолчанию. - -### Пример - -### Получение шаблона debian по умолчанию. - -```bash -cqtdeployer getDefaultTemplate deb -``` diff --git a/md/ru/DeployConfigFile.md b/md/ru/DeployConfigFile.md deleted file mode 100644 index 050845e1..00000000 --- a/md/ru/DeployConfigFile.md +++ /dev/null @@ -1,226 +0,0 @@ -# Файл развертывания - -**Файл развертывания** - это json файл, содержащий в себе параметры для cqtdeployer. Данный файл поддерживает все параметры кроме confFile, так как данный параметр отвечает за подключение и инициализацию самого файла. - -### Структура файла конфигурации -```json -{ - "Флаг": true/false, - "Параметр": "Значение", - "Параметер с поддержкой перечислений": [ - "Значение 1", - "Значение 2", - "Значение 3", - ], - "Параметр с поддержкой многоуровневых перечислений": [ - [ - "Значение A1", - "Значение A2" - ], - [ - "Значение B1", - "Значение B2" - ], - [ - "Значение C1", - "Значение C2" - ], - ] - -} -``` - -Подробно о параметрах cqtdeployer читайте в разделе [Параметры](Options.md). - -Примеры содержимого данного файла: - -Файл без использования параметров с перечислениями -```json -{ - "noOverwrite": false, - "bin": "./", - "binDir": "./", - "qmlDir": "./", - "deploySystem": false, - "deploySystem-with-libc": false, - "qmake": "my/custom/path/to/qmake", - "ignore": "ignoreLib.dll", - "ignoreEnv": "/my/ignore/path", - "clear": true, - "force-clear": false, - "allQmlDependes": false, - "libDir": "./", - "recursiveDepth": 3, - "extraLibs": "myExtraLib (libssl)", - "extraPlugin": "myExtraPulgin (platforms)", - "targetDir": "./Distro", - "targetPackage": "", - "noStrip": false, - "extractPlugins": false, - "noTranslations": false, - "qmlOut": "qml", - "libOut": "lib", - "trOut": "tr", - "pluginOut": "plug", - "binOut": "bin", - "recOut": "rec", - "verbose": 3, - "qif": false, - "noCheckRPATH": false, - "noCheckPATH": false, - "name": "mainApplication", - "description": "this is description for default package", - "deployVersion": "1.0.0", - "releaseDate": "yyyy-MM-dd", - "icon": "/path/main/icon.png", - "publisher": "main team", - "customScript": "echo 'I am use custom script!!!'" -} - -``` - -Файл с использованием параметров с перечислениями -``` json -{ - "noOverwrite": false, - "bin": "./", - "binDir": "./", - "qmlDir": [ - [ - "package2", - "./TestQMLWidgets/" - ], - [ - "./qml/for/All" - ] - ], - - "deploySystem": false, - "deploySystem-with-libc": false, - "qmake": "this parameter should contain the path to your qmake, for Windows this field is required. On Linux, you can remove it, then qmake will be found by rpath.", - "ignore": "ignoreLib.dll", - "ignoreEnv": "/my/ignore/path", - "clear": true, - "force-clear": false, - "allQmlDependes": false, - "libDir": "./", - "recursiveDepth": 3, - "extraLibs": "myExtraLib (libssl)", - "extraPlugin": "myExtraPulgin (platforms)", - "targetDir": "./Distro", - "targetPackage": [ - [ - "/package1/", - "TestOnlyC" - ], - [ - "/package2/", - "TestQMLWidgets" - ] - ], - "noStrip": false, - "extractPlugins": false, - "noTranslations": false, - "qmlOut": "qml", - "libOut": "lib", - "trOut": "tr", - "pluginOut": "plug", - "binOut": "bin", - "recOut": "rec", - "verbose": 3, - "qif": false, - "noCheckRPATH": false, - "noCheckPATH": false, - "name": [ - [ - "package2", - "package2Application" - ], - [ - "mainApplication" - ] - ], - "description": [ - [ - "package2", - "this is description for package 'package2'" - ], - [ - "this is description for default package" - ] - ], - "deployVersion": [ - [ - "package2", - "1.0.0" - ], - [ - "1.0.0" - ] - ], - "releaseDate": [ - [ - "package2", - "yyyy-MM-dd" - ], - [ - "yyyy-MM-dd" - ] - ], - "icon": [ - [ - "package2", - "/path/icon.png" - ], - [ - "/path/main/icon.png" - ] - ], - "publisher": [ - [ - "package2", - "team of package2" - ], - [ - "main team" - ] - ], - "customScript": "echo 'I am use custom script!!!'" -} - -``` - -Цель файла- упростить вызов cqtdeployer и переместить часть или все параметры в файл. Все параметры, указанные в файле, имеют более низкий приоритет, чем параметры, добавленные в консоль при запуске. - -### Создание файла - -#### Способ 1 - -1. Вызовите `cqtdeployer init` Для инициализации файла для приложения состоящего из одного пакета. - Или `cqtdeployer -init multi` Для инициализации файла для проекта с несколькими пакетами. -2. Откройте CQtDeployer.json и отредактируйте его под свои нужды. -3. Вызовите cqtdeployer в дериктории с файлом CQtDeployer.json, или укажите путь к нему используя флаг -confFile path/to/my/CQtDeployer.json - -#### Способ 2 - -Вызовите cqtdeployer с нужным вам набором параметров и укажите путь к файлу при помощи флага -confFile (файл должен отсутствовать). Если файл будет существовать, то cqtdeployer начнет выгружать из него параметры. - -Пример: -``` bash -cqtdeployer -confFile deploy.json -bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite -``` -Где: - -* cqtdeployer - вызов cqtdeployer -* -confFile deploy.json - путь к файлу, который нужно создать -* "-bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite" - необходимые параметры. - - -### Использование файла развертывания. - -Чтобы cqtdeployer начал читать параметры из файла, используйте флаг -confFile [путь к файлу] - -#### Пример: - -cqtdeployer -qmake ~/Qt/bin/qmake -confFile ./deploy.json - diff --git a/md/ru/Description.md b/md/ru/Description.md deleted file mode 100644 index fe7a80d4..00000000 --- a/md/ru/Description.md +++ /dev/null @@ -1,9 +0,0 @@ -# Что такое CQtDeployer - -CQtDeployer - это утилита для извлечения всех зависимых библиотек исполняемых файлов и создания сценария запуска для вашего приложения. - -Основные отличия этой программы: -* Производительность - эта программа развертывает приложение в несколько раз быстрее (до 10 секунд) -* Гибкость - эта утилита имеет флаги, которые помогут вам настроить деплоинг под ваши нужды и нужды вашего проекта -* Crossdeploy - приложение поддерживает Windows и дистрибутивы Linux, это означает, что вы можете использовать его не только для развертывания проекта для вашей платформы, но и для развертывания проекта в Linux для Windows и наоборот. -* Упаковка - эта утилита может создавать установочные файлы и пакеты, для вашего приложения. diff --git a/md/ru/DisableShortcats.md b/md/ru/DisableShortcats.md deleted file mode 100644 index e4d76fae..00000000 --- a/md/ru/DisableShortcats.md +++ /dev/null @@ -1,19 +0,0 @@ -# Отключение ярлыков для Qt Installer. - - Отключение ярлыков для многоцелевого дистрибутива в структуре Qt Installer. - -Иногда нам нужно отключить автоматическое создание ярлыков для некоторых приложений. -Для решения этой проблемы я рекомендую переопределить шаблон фреймворка установщика qt по умолчанию. - -# Примечание -В CQtDeployer 1.5.1 вы можете добавить опцию -disableShortcuts для отключения автоматизации создания ярлыков. - -### Пример: - -```bash -cqtdeployer -disableShortCut targetName,target2Name -``` - -```bash -cqtdeployer -bin myProgramm.exe -disableShortCut myProgramm -``` diff --git a/md/ru/EnvironmentVariables.md b/md/ru/EnvironmentVariables.md deleted file mode 100644 index 4c02be64..00000000 --- a/md/ru/EnvironmentVariables.md +++ /dev/null @@ -1,46 +0,0 @@ -# Переменные окружения CQtDeployer - -Эта страница содержит информацию о переменных содержащихся в скрипте запуска по умолчанию. - -## Инициализация - -Все переменные окружения инициализируются в скрипте запуска по умолчанию. Поэтому, если вы используете опцию runScript, вам необходимо вручную воссоздать все необходимые переменные. - - -## Список стандартных переменных - -| Имя переменной | Описание | -| --- | --- | -| CQT_PKG_ROOT | Эта переменная содержит путь к корню текущего пакета. -| CQT_RUN_FILE | Эта переменная содержит путь к скрипту запуска используемого приложения. | - - -## Описания определений - -**корень текущего пакета** - Этот корень является локальным корнем для любых отдельных пакетов. - - -Пример : - -```bash -. -├── pakcage1 << Это локальный корень пакета package1 -│ ├── bin -│ ├── lib -│ ├── plugins -│ ├── qml -│ └── translations -├── package2 << Это локальный корень пакета package2 -│ ├── bin -│ ├── lib -│ ├── plugins -│ ├── qml -│ └── translations -└── pakcage3 << Это локальный корень пакета package3 - ├── bin - ├── lib - ├── plugins - ├── qml - └── translations - -``` diff --git a/md/ru/ExtraFiles.md b/md/ru/ExtraFiles.md deleted file mode 100644 index 99d071f4..00000000 --- a/md/ru/ExtraFiles.md +++ /dev/null @@ -1,107 +0,0 @@ -# Добавление дополнительных данных - -Добавление дополнительных данных в дистрибутив. - - -CQtDeployer поддерживает работу с дополнительными файлами данных. - -Для этого используйте параметры -extraData и -extraDataOut. - -## Примеры: - -### Добавление собственных файлов в корневой каталог дистрибутива. - -``` -cqtdeployer -extraData путь / к / my / customFile -``` - -Или в configFile.json - -```json -{ - ... - "extraData": "./path/to/my/customFile" - ... -} -``` - -Эта команда поддерживает список аргументов. - - -```bash -cqtdeployer -extraData path/to/my/customFile,path/to/my/customFile2,path/to/my/customFile3 -``` - -Или в configFile.json - -```json -{ - ... - "extraData": [ - "./path/to/my/customFile", - "./path/to/my/customFile2", - "./path/to/my/customFile3" - ] - ... -} -``` - -### Изменение расположения дополнительных файлов данных. - -Для изменения местоположения используйте параметры extraDataOut. Эта опция меняет путь назначения относительно корня дистрибутива. - -### Пример. Добавьте пользовательские скрипты в папку скриптов в Distribution. - -```bash -cqtdeployer -extraData /path/to/myScripts.sh,/another/path/to/myScripts.sh -extraDataOut scripts -``` - -Или в configFile.json - -```json -{ - ... - "extraData": [ - "./path/to/myScripts.sh", - "./another/path/to/myScripts.sh" - ], - "extraDataOut": "скрипты" - ... -} -``` - -## Пакеты -Опции extraData и extraDataOut поддерживают работу с пакетами. Дополнительную информацию о пакетах см. На [странице](Packing.md) упаковки. - -Иногда нам нужно создать многопакетное приложение. Например, создайте установщик для приложения client-server с клиентскими и серверными приложениями. Клиент и сервер имеют собственные файлы конфигурации по умолчанию. Мы добавляем файлы config с помощью опции extraData. - -Для создания большого дистрибьютора я рекомендую использовать [confFile](DeployConfigFile.md). - -## Пример применения мультиупаковки. - - -```json -{ - - "корзина": [ - "myClientExecutable", - "myServerExecutable" - ], - - "targetPackage": [ - ["Клиент", "myClientExecutable"], - ["Сервер", "myServerExecutable"] - ], - - "extraData": [ - ["Клиент", "./path/to/clientConfig.conf"], - ["Сервер", "./path/to/serverConfig.conf"] - ], - "extraDataOut": [ - ["Клиент", "defaultConfigurations"], - ["Сервер", "defaultConfigurations"] - ] -} -``` - -Эта конфигурация создает дистрибутив с двумя приложениями (клиент и сервер). Каждое приложение имеет собственный файл конфигурации в папке defaultConfigurations. diff --git a/md/ru/ExtractDefaultsTemplates.md b/md/ru/ExtractDefaultsTemplates.md deleted file mode 100644 index 6c532540..00000000 --- a/md/ru/ExtractDefaultsTemplates.md +++ /dev/null @@ -1,56 +0,0 @@ -# Извлечение шаблонов - -Извлечение шаблонов по умолчанию - -Иногда вам нужно создать свои собственные шаблоны для установщиков или пакетов deb. -Для этого вы можете использовать опцию getDefaultTemplate. - -Эта опция извлекает шаблон вашего дистрибутива по умолчанию в целевой каталог. - -Эта опция создаст шаблон в соответствии с вашими настройками. Если вы используете опцию targetPackage, то для каждого настроенного вами пакета будет создан шаблон. - -### Пример: - -```bash -cqtdeployer -bin myExecutable getDefaultTemplate qif -``` -Эта команда создает шаблон для среды установки qt в папке DistributionKit для вашей программы "myExecutable". - -Если вы хотите изменить целевое местоположение, просто добавьте параметр targetDir -```bash -cqtdeployer -bin myExecutable getDefaultTemplate qif -targetDir "/distanation/Dir" - -``` - -## Работа с мультипакетной раздачей. - -Эта опция поддерживает configFile.json - -### Пример: - -#### configFile.json - -```json -{ - - "корзина": [ - "myClientExecutable", - "myServerExecutable" - ], - - "targetPackage": [ - ["Клиент", "myClientExecutable"], - ["Сервер", "myServerExecutable"] - ], -} -``` - -```bash -cqtdeployer getDefaultTemplate qif -confFile "path/to/configFile.json" -``` - - -## Запись - -Эта опция поддерживает работу со всеми пакетами, кроме zip. -Если вы хотите получить больше информации о доступных пакетах, смотрите упаковку [страница](Packing.md). \ No newline at end of file diff --git a/md/ru/Guide.md b/md/ru/Guide.md deleted file mode 100644 index fb16ff5c..00000000 --- a/md/ru/Guide.md +++ /dev/null @@ -1,536 +0,0 @@ -# Как развернуть приложение - -В этой статье я описываю процессы развертывания приложения c++/qt с помощью cqtdeployer. - -## Рекомендация -Если вам нужна максимальная стабильность вашего дистрибутива и вы хотите запускать свое приложение в разных дистрибутивах с разными версиями, вам необходимо использовать Qt из официального [build](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5). - -## Кейс -В этом случае мы развертываем приложение Qt GUI для Ubuntu 16.04, Ubuntu 18.04 и Ubuntu 20.04++. - -**Если вы хотите поддерживать все дистрибутивы, начиная с Ubuntu 16.04, вам необходимо собрать и развернуть приложение в более старом дистрибутиве (в моем случае это 16.04)** - -## Установить CQtDeployer -Если вы хотите использовать системный qt из своей ОС, установите [классическую](https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run) версию cqtdeployer. - -``` bash -wget https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run -``` - -``` -chmod + x LinuxInstaller.run -./LinuxInstaller.run -``` -![Настройка CQtDeployer](https://user-images.githubusercontent.com/12465465/100077575-9280a600-2e53-11eb-8d9d-d184341cfa7c.png) - -Выберите последнюю стабильную версию (1.4) - -![Настройка CQtDeployer](https://user-images.githubusercontent.com/12465465/100077707-bb08a000-2e53-11eb-9838-6f896af33105.png) - -Выполнено. - -Если вы используете официальную сборку qt, вы можете использовать snap-версию cqtdeployer. - -``` -sudo snap install cqtdeployer -``` - -После установки добавьте необходимые разрешения. - -``` -sudo snap connect cqtdeployer:process-control -sudo snap connect cqtdeployer:removable-media -sudo snap connect cqtdeployer:system-backup -``` - -Выполнено!!! - -## Развертывание приложения Qt GUI - -### Разверните исполняемый файл. - -* Для систем Linux: - -```bash -cqtdeployer -bin myexecutable -``` - -* Для систем Windows: - -```bash -cqtdeployer -bin myexecutable.exe -qmake C: /Qt/5.15.0/min_gw/bin/qmake.exe -``` - -* Для кроссплатформенной сборки (Linux -> Windows) - -```bash -cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/ bin / qmake -``` - -## Дополнительные параметры - -Если вы используете дополнительные библиотеки, просто добавьте путь для cqtdeployer к используемым библиотекам. - -```bash -cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs -``` - -Если вы хотите найти библиотеки рекурсивно из пути libDir, просто добавьте параметр рекурсивной глубины. - -```bash -cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs -recursiveDepth 5 -``` - -Если ваше приложение использует qml, просто добавьте опцию qmlDir - -```bash -cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources -``` - -Если вы хотите создать простой установщик для своего приложения, просто добавьте опцию gif. -``` -cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -``` - -Если cqtdeployer не нашел qmake, добавьте параметр -qmake в команду вызова. - -``` -cqtdeployer -bin myexecutable -libDir / PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -qmake/path/to/my/qmake - -``` - -# На живом примере animation из [Примеров Qt](https://doc.qt.io/qt-5/qtquick-animation-example.html) - - -## Собираем проект в релизную сборку - -Выполняем qmake с опцие -r для релизной сборки. - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ ~/Qt/5.15.2/gcc_64/bin/qmake -r . -``` - -Вызываем ваш make generator - -Для Linux: - -```bash -make -j${nproc} -``` - -Для Windows - -```bash -Qt/Tools/QtCreator/bin/jom.exe -``` -Билд лог - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ make -j${nproc} -g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o main.o main.cpp -/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name shared ../shared/shared.qrc -o qrc_shared.cpp -/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name animation animation.qrc -o qrc_animation.cpp -g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_animation.o qrc_animation.cpp -g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_shared.o qrc_shared.cpp -g++ -Wl,-O1 -Wl,-rpath,/home/andrei/Qt/5.15.2/gcc_64/lib -o animation main.o qrc_shared.o qrc_animation.o /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so -lGL -lpthread -``` - -## Находим наш получившийся исполняемый файл - -Если вы собирали проект с помощью qtCreator ваш исполняемый файл будет находиться на уровень выше в папке **build-Animations-Desktop_Qt_5_15_2_GCC_64bit-Release** -В моем случае исполняемый файл лежит в корневом катологе проекта. - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ tree -. -├── animation # Вот он. -├── animation.pro -├── animation.qml -├── animation.qmlproject -├── animation.qrc -├── basics -│ ├── animators.qml -│ ├── color-animation.qml -│ ├── images -│ │ ├── face-smile.png -│ │ ├── moon.png -│ │ ├── shadow.png -│ │ ├── star.png -│ │ └── sun.png -│ └── property-animation.qml -├── behaviors -│ ├── behavior-example.qml -│ ├── FocusRect.qml -│ ├── SideRect.qml -│ ├── tvtennis.qml -│ └── wigglytext.qml -├── doc -│ ├── images -│ │ └── qml-animations-example.png -│ └── src -│ └── animation.qdoc -├── easing -│ └── easing.qml -├── main.cpp -├── main.o -├── Makefile -├── pathanimation -│ └── pathanimation.qml -├── pathinterpolator -│ └── pathinterpolator.qml -├── qrc_animation.cpp -├── qrc_animation.o -├── qrc_shared.cpp -├── qrc_shared.o -└── states - ├── qt-logo.png - ├── states.qml - └── transitions.qml -10 directories, 33 files -``` - -## Вызываем cqtdeployer для формирования Базового Дистрибутива - -Для Linux: - -```bash -cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -``` -Для Windows: - -```bash -cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/mingw_810_64/bin/qmake.exe -``` - -Лог развёртывания - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake -Info: Deploy ... -Info: flag targetDir not used. use default target dir :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit -Info: target deploy started!! -Info: copy :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/animation -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/libqmlplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/libmodelsplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/libqtqmlremoteobjects.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/libqtqmlstatemachine.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/libworkerscriptplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/libparticlesplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/qmldir -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/libqtquick2plugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/plugins.qmltypes -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/qmldir -Info: platform : libqvnc is disabled -Info: platform : libqvnc is disabled -Info: platform : libqwebgl is disabled -Info: platform : libqwebgl is disabled -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqconnmanbearer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqgenericbearer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqnmbearer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/iconengines/libqsvgicon.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqgif.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqicns.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqico.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqjpeg.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqsvg.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtga.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtiff.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwbmp.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwebp.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqeglfs.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqlinuxfb.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimal.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimalegl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqoffscreen.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-generic.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-glx.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqgtk3.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqxdgdesktopportal.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-decoration-client/libbradient.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdmabuf-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdrm-egl-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libqt-plugin-wayland-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libshm-emulation-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libvulkan-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-glx.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-dmabuf-server-buffer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-drm-egl-server-buffer.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-linux-dmabuf-unstable-v1.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-shm-emulation-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-vulkan-server.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-eglstream-controller.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-egl.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-glx.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libfullscreen-shell-v1.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libivi-shell.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libwl-shell.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v5.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v6.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-egl-integration.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-glx-integration.so -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5EglFSDeviceIntegration.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5XcbQpa.so.5 -Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicui18n.so.56 -Info: copy :/usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5RemoteObjects.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QuickParticles.so.5 -Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicudata.so.56 -Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicuuc.so.56 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlWorkerScript.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Widgets.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandClient.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5DBus.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Svg.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandCompositor.so.5 -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ar.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_bg.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ca.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_cs.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_da.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_de.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_en.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_es.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fi.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_gd.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_he.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_hu.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_it.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ja.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ko.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_lv.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_pl.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ru.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_sk.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_tr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_uk.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_zh_TW.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_bg.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_da.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_de.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_en.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_es.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fi.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_hu.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ja.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ko.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_lv.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_pl.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ru.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_sk.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_tr.qm -Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_uk.qm -Info: try deploy msvc -Info: deploy done! -Info: copy ::/shared/Distributions/Templates/Icon.png -Error: not exits -Info: [0] Parsed arguments, ok. -Info: [2] Collecting information about available packages... -Info: [4] Found subdirectory "Application" -Info: [4] - it provides the package "Application" - "1.0" -Info: [4] Copying component data for "Application" -Info: [5] Compressing data directory "bin" -Info: [21] Compressing data directory "icons" -Info: [31] Compressing data directory "lib" -Info: [11111] Compressing data directory "plugins" -Info: [11740] Compressing data directory "qml" -Info: [11786] Compressing data directory "translations" -Info: [12321] Compressing files found in data directory: ("/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/data/animation.sh") -Info: [12321] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" -[12321] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" -Info: [12321] Generated sha1 hash: "0af6cb9dc074407a8857403f07d13aa7d1b3c9cb" -Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" -[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" -Info: [12322] Generated sha1 hash: "aa938cb332bfb427a6d0280c07c204c1bb48da22" -Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" -[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" -Info: [12347] Generated sha1 hash: "7c3a43111e694bc82a0ab0d19a6e4d0025f17313" -Info: [12347] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" -[12347] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" -Info: [12349] Generated sha1 hash: "4ed23c36835a9b62701478ab6897737dfe9dfc9a" -Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" -Info: [12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" -Info: [12349] Generated sha1 hash: "bd44e15d2c26c8f6cb50760032eadf0241eedf43" -Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" -[12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" -Info: [12350] Generated sha1 hash: "030e0ede0c0e058a5d5a3b6c43c6a4767119d3f1" -Info: [12350] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" -Info: [12350] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" -Info: [12350] Generated sha1 hash: "acd2cd63e77971acedbcda2a65f93b2cc036025f" -Info: [12350] Copy meta data for package "Application" using "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/package.xml" -Info: [12350] calculate size of directory "/tmp/binarycreator-yOPMPa/Application/data" -Info: [12359] Copying associated "script" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/installscript.qs" -Info: [12360] done. -Info: [12360] Begin to copy configuration file and data. -Info: [12360] Copying associated "configuration" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/config.xml" -Info: [12360] done. -Info: [12360] Read dom element: animation. -Info: [12360] Read dom element: 1.0. -Info: [12360] Read dom element: animation. -Info: [12360] Read dom element: Company. -[12360] Read dom element: animation. -[12360] Read dom element: @HomeDir@/animation. -Info: [12360] Read dom element: true. -[12360] Read dom element: true. -Info: [12360] Read dom element: controlScript.qs. -Info: [12360] Copying associated "ControlScript" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/controlScript.qs" -Info: [12360] done. -Info: [12360] Read dom element: animationTool. -[12360] Read dom element: . -Info: [12360] done. -Info: [12362] Creating the binary -Info: [12407] Creating resource archive for "Application" -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" ("61.58 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" ("108.00 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" ("18.08 MB") -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" ("1.08 MB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" ("53.29 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" ("40.00 bytes") -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" ("595.71 KB") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" ("40.00 bytes") -[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" ("439.00 bytes") -Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" ("40.00 bytes") -Info: [12449] Cleaning up... -``` - -Готово. дистрибутив был сохранен в папку **DistributionKit** - -```bash -andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ ./DistributionKit/Installeranimation.run -``` - -![Снимок экрана от 2021-02-22 11-25-34](https://user-images.githubusercontent.com/12465465/108681955-c629a580-7500-11eb-8087-cedfa8134aae.png) - -После установки буду созданы все необходимые ярлыки. - -![Снимок экрана от 2021-02-22 11-27-11](https://user-images.githubusercontent.com/12465465/108682148-012bd900-7501-11eb-9f0b-f46fd79aef25.png) - -![Снимок экрана от 2021-02-22 11-29-23](https://user-images.githubusercontent.com/12465465/108682391-48b26500-7501-11eb-8d81-b430ddf97d46.png) - - -## Интеграция с QtCreator - -К сожалению, на данный момент нет интеграции с qtcreator. -Единственный способ - включить цель сборки для **qmake** или **cmake** - -### qmake - -```qmake -QT_DIR= $$[QT_HOST_BINS] -win32:QMAKE_BIN= $$QT_DIR/qmake.exe -contains(QMAKE_HOST.os, Linux):{ - QMAKE_BIN= $$QT_DIR/qmake -} - -deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif - -QMAKE_EXTRA_TARGETS += deploy - -``` - -### cmake - -```cmake - find_program(Q_MAKE_EXE qmake) - - find_program(CQT_EXE cqtdeployer) - - IF(NOT EXISTS ${CQT_EXE}) - message("the cqtdeployer not exits please install the cqtdeployer and run cmake again!") - return() - endif(NOT EXISTS ${CQT_EXE}) - - ADD_CUSTOM_TARGET( - deploy - COMMAND cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5 - COMMENT "Deploy: cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5" - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - ) -``` - -Параметр **libDir** используется для установки путей к каталогам, в которых пути содержат зависимости вашего приложения, а параметр **qmlDir** используется для установки путей к каталогам, содержащих файлы qml, необходимые вашему приложению. В этом примере корень исходного кода приложения выбирается этими двумя параметрами. - -Параметр **recursiveDepth** используется для установки глубины поиска **libDir** и **qmlDir**. - -Параметр **qif** используется для создания установщика с использованием Qt Installer Framework. - - - -## Пример интеграции - -Создаем тестовый проект - -```qmake -QT += quick -CONFIG += c++11 -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -SOURCES += \ - main.cpp -RESOURCES += qml.qrc -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = -# Additional import path used to resolve QML modules just for Qt Quick Designer -QML_DESIGNER_IMPORT_PATH = -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target -QT_DIR= $$[QT_HOST_BINS] -win32:QMAKE_BIN= $$QT_DIR/qmake.exe -contains(QMAKE_HOST.os, Linux):{ - QMAKE_BIN= $$QT_DIR/qmake -} -DESTDIR=$$PWD/Build -deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif -QMAKE_EXTRA_TARGETS += deploy -``` - -2. Открываем панель управления проектом - ![Снимок экрана от 2021-02-22 12-15-51](https://user-images.githubusercontent.com/12465465/108687472-d09b6d80-7507-11eb-9b56-8d09d42dac5e.png) - -3. Выбираем релизную сборку. - ![изображение](https://user-images.githubusercontent.com/12465465/108688147-a39b8a80-7508-11eb-81b9-9a24426a94a3.png) - - -3. Добавляем "Особый этап сборки" - ![изображение](https://user-images.githubusercontent.com/12465465/108687640-02143900-7508-11eb-8d1c-532afd7f6ccb.png) - -4. В поле "Make arguments" добавляем наш этап развертывания "Deploy" - ![изображение](https://user-images.githubusercontent.com/12465465/108687800-35ef5e80-7508-11eb-8f69-aec090d4baa0.png) - -5. Сохраняем -6. Запускаем сборку. - -#### На выходе вы получите папку DistributionKit с установщиком вашего приложения. diff --git a/md/ru/Home.md b/md/ru/Home.md deleted file mode 100644 index e636b757..00000000 --- a/md/ru/Home.md +++ /dev/null @@ -1,26 +0,0 @@ -# Добро пожаловать в "C Qt Deployer"! -# ![Логотип](https://user-images.githubusercontent.com/12465465/84260958-99289480-ab23-11ea-8aab-374368a545dc.png) - -*************************** - -# Основные разделы - -* [Описание CQtDeployer](Description.md) -* [Параметры](Options.md) -* [Руководство](Guide.md) -* [Краткое Руководство](QuickGuide.md) -* [Сборка и установка](Build-and-Install.md) -* [Файл развертывания](DeployConfigFile.md) -* [Упаковка](Packing.md) -* [Список изменений](Changelog.md) -* [Обзоры](ReleaseReviews.md) -* [Сравнение возможностей](CompareFeatures.md) -* [Добавление дополнительных файлов](ExtraFiles.md) -* [Получение шаблонов упаковки](ExtractDefaultsTemplates.md) -* [Стандартные переменные окружения](EnvironmentVariables.md) -* [Отключение стандартных ярлыков](DisableShortcats.md) -* [Пользовательские скрипты](CustomScripts.md) - - -## Поддержите проект -Если вам нравится то, что мы делаем, и это приносит вам пользу, вы можете поддержать проект на официальной странице [QuasarApp в Patreon](https://www.patreon.com/QuasarApp) diff --git a/md/ru/Options.md b/md/ru/Options.md deleted file mode 100644 index 715c0c85..00000000 --- a/md/ru/Options.md +++ /dev/null @@ -1,171 +0,0 @@ -# Использование параметров - -Общие правила использования параметров - -``` -cqtdeployer -option1 value1 -option2 list,of,values flag1 flag2 flag3 -``` - -* Все параметры должны начинается с знака '-' за исключением параметров, из котегории "Флаги". -* После указания нужного параметра нужно в обязательном порядке указать значение -* Некоторые параметры поддерживают перечисления (массивы значений). При инициализации таких параметров укажите список значений через ',' без прабелов. Если вы используете какой либо язык программирования и вызываете процесс cqtdeployer то массив значений должен передаваться как 1 параметр. -* Некоторые параметры поддерживают пересисления с возможностью выбрать цель для которой будет применен флаг. Цель и значения разделяются при помощи знака ';'. Пример -libOut target1;value1,target2;value2,defaultValue. -* Для включения какого либо флага достаточно просто включить в список опций имя флага. - -## Обозначения в таблице - - * **-binDir [params]** - параметр без поддержки массивов. - * **-bin [params,list]** - параметр c поддержкой массивов. В качестве разделителя используется ','. - * **-libOut [package;path,path]** - параметр c поддержкой выбора пакета для которого бутет установленно значение флага. В качестве разделителя используется ';'. Обратитте внимание что для перечисления значений параметра используется правило описанное выше. Последний параметр не имеет значение пакета, это значит что это значение будет установленно для всех не настроенных пакетов по умолчанию. - * **clear** - флаг - -## Определения в описании - -**Системное окружение** - пути к системным библиотекам. - * Windows: - * Пути, определенные в переменной PATH. - * C:/Windows/System32 - * C:/Windows/SysWOW64 - - * Linux: - * Пути, определенные в переменных LD_LIBRARY_PATH и PATH. - * /usr/lib - * /lib - -**Развертываемые файлы** - это все файлы, которые будут скопированы в дистрибутив (включая исполняемые файлы) - -**Цели** - это все исполняемые файлы, отмеченные опцией bin. - -**Исполняемые файлы** - это все файлы в форматах PE, ELF и Mach-O. - -## Параметры: - -### Флаги - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| init | проинициализирует файл cqtdeployer.json (файл конфигурации)| -| | Например: «cqtdeployer init» - для инициализации базовой конфигурации пакета| -| | "cqtdeployer -init multi" - для инициализации конфигурации нескольких пакетов| -| | "cqtdeployer -init single" - для инициализации конфигурации одного пакета | -| help / h | Показывает справку | -| clear | Удаляет все старые файлы (с прошлого запуска) | -| force-clear | Удаляет целевую директорию перед развертыванием | -| noStrip | Пропускает шаг strip | -| noTranslations | Пропускает файлы переводов | -| noOverwrite | Запрещает замену уже существующих файлов. | -| noCheckRPATH | Отключает автоматический поиск путей к qmake в исполняемых файлах.| -| noCheckPATH | Отключает автоматический поиск путей к qmake в системном окружении.| -| noRecursiveiIgnoreEnv | Отключает рекурсивное игнорирование переменной среды для флага ignoreEnv. | -| v / version | Показывает версию приложения | -| qif | Создаст установщик QIF для развертываемой программы" | -| | Примеры: cqtdeployer qif | -| | Начиная с версии CQtDeployer 1.5 вы можете указать путь к своему собственному шаблону установщика. | -| | Примеры: cqtdeployer -qif path/to/myCustom/qif. Подробнее можно посмотреть [здесь](QIF.md) | -| deb | Создаст deb пакет для развертываемой программы" | -| | Примеры: cqtdeployer deb | -| | Вы можете указать путь к своему собственному шаблону пакета. | -| | Примеры: cqtdeployer -deb path/to/myCustom/DEBIAN. Подробнее можно посмотреть [здесь](DEB.md) | -| deploySystem | Копирует все библиотеки кроме libc | -| | (не рекомендуется, так как занимает много памяти, возможны конфликты библиотек) | -| noQt | Игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует платформу qt. | -| allowEmptyPackages | Разрешите настраивать пустые пакеты. | -| getDefaultTemplate | Извлекает deb или qif шаблоны по умолчанию. Для получения дополнительной информации см. [Страницу](ExtractDefaultsTemplates.md) извлечения шаблонов по умолчанию. | -| noHashSum | Отключить вычисление хеш-суммы пакетов | - -### Параметры развертывания: - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -bin [list,params] | Развертываемый файл или папка. пример -bin ~/my/project/bin/,~/my/project/bin.exe. Для файлов: эти файлы будут безоговорочно скопированы в целевой каталог, независимо от их формата или суффикса. Для папок: CQtDeployer войдет в эти папки и нерекурсивно скопирует все развертываемые файлы в целевой каталог. Затем CQtDeployer извлечет все зависимости скопированных файлов. CQtDeployer будет искать зависимости в системной среде и в путях libDir. **Примечание**. Если CQtDeployer не может найти требуемый файл, CQtDeployer попытается найти требуемый файл в системной среде PATH. | -| -binPrefix [prefixPath] | Устанавливает путь префикса для опции bin. Пример: **-bin path/MyExecutable** - это тоже что и **-bin MyExecutable -binPrefix path** | -| -confFile [params] | Путь к файлу json со всеми конфигурациями развертывания. С помощью этого файла можно добавить нужные опции, тем самым упрастить вызов комманды в консоле. Однако пораметры в кансоле имеют больший приоритет чем в файле. Для получения дополнительной информации об этом флаге см. [Вики](DeployConfigFile) | -| -qmlDir [params] | Папка qml. пример -qmlDir ~/my/project/qml | -| -qmake [params] | Путь к qmake. пример | -| | -qmake ~/Qt/5.14.0/gcc_64/bin/qmake | -| -ignore [list,params] | Список библиотек для игнорирования | -| | Пример -ignore libicudata.so.56,libicudata2.so.56 | -| -ignoreEnv [list,params] | Список путей для игнорирования. | -| | Пример -ignoreEnv /bad/dir,/my/bad/Dir | -| -libDir [list,params] | Устанавливает дополнительные пути к библиотекам | -| | Пример -libDir ~/myLib,~/newLibs. **Внимание** опция libDir не должна быть дочерней от каталога targetDir. Опция targetDir является запрещенной для поиска библиотек, так как может содержать устаревшие библиотеки проекта, что в свою очередь может привести к нежелательным крашам. | -| -extraLibs [list,params] | Пример: «-extraLib mySql» - заставляет скопировать все библиотеки, имена которых содержат mySql, в папку проекта. Этот параметр не чувствителен к регистру в Windows и чувствителен к регистру на других платформах. Эта опция будет искать библиотеки только в системных средах, подобных **deploySystem**. | -| -customScript [scriptCode] | Установит дополнительный код в скрипты запуска. | -| -extraPlugin [list,params] | Устанавливает дополнительный путь для extraPlugin приложения| -| -recursiveDepth [params] | Устанавливает глубину поиска библиотек и глубину игнорирования окружения для ignoreEnv (по умолчанию 0) | -| -targetDir [params] | Устанавливает целевой каталог (по умолчанию это путь к первому развертываемому файлу)| -| -installDirDeb [параметры] | Устанавливает целевой каталог для установки пакета Debian (по умолчанию это /opt путь) | -| -installDirQIFW [параметры]| Устанавливает целевой каталог установки для инсталляторов (по умолчанию это путь /home) | -| -verbose [0-3] | Показывает дебаг лог. По умолчанию равен 2 | -| -platform [list] | Если этот параметр включен, CQtDeployer будет развертывать только двоичные файлы указанной платформы. Поддерживоемые значения : [win_x86 win_x86_64 win_arm win_arm64 linux_x86 linux_x86_64 linux_ARM linux_ARM64] | - -### Параметры управлениями пакетами: - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -targetPackage [package;tar1,package;tar2]| Создает новый пакет и добавляет в него 'tar1 и tar2'| -| -qmlOut [package;path,path] | Установит путь к папке с qml | -| -libOut [package;path,path] | Установит путь к папке с зависимостями | -| -trOut [package;path,path] | Установит путь к папке с файламми переводов | -| -pluginOut [package;path,path]| Установит путь к папке с плагинами | -| -binOut [package;path,path] | Установит путь к папке с исполняемыми файлами | -| -recOut [package;path,path] | Установит путь к папке с ресурсами | -| -extraDataOut [package;path,path] | Устанавливает путь к каталогу с дополнительными файлами данных. По умолчанию это корневой каталог дистрибутива. | -| -name [package;val,val] | Установит имя пакету. Если указать значение без префикса, то значение будет установленно пакету по умолчанию. | -| -description [package;val,val] | Установит описание пакету | -| -deployVersion [package;val,val]| Установит версию пакету | -| -releaseDate [package;val,val] | Установит дату выпуска пакету | -| -icon [package;val,val] | Установит путь к иконке или логотипу пакету | -| -publisher [package;val,val]| Установит Издательство (автора) пакету | -| -homePage [package;val,val] | Установит URL-адрес домашней страницы для пакета | -| -prefix [package;val,val] | Устанавливает префикс для пакета относительно целевого каталога | -| -extraData [package;val,val]| Добавляет дополнительные файлы или каталоги как цель. Выбранный каталог будет скопирован в расположение extraDataOut с сохранением собственной структуры.| -| -tr [package;val,val] | Добавляет qm файлы в папку переводов. | - -### Параметры управлениями целями: - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -icon [target;val,val] | Установит путь к иконке или логотипу для целе. Эта комманда поддерживает только png файлы для Linux и ico файлы для Windows | -| -disableRunScript [target; val, val]| Отключает создание сценария выполнения для выбранных целей | -| -disableShortCut [target; val, val] | Отключает создание ярлыков для выбранных целей | -| -runScript [target; val, val] | заставляет cqtdeployer заменить сценарий запуска по умолчанию на новый из аргументов параметра. Эта опция копирует все содержимое из входного файла и вставляет весь код в runScript.sh или .bat. Пример использования: cqtdeployer -runScript "myTargetMame;path/to/my/myCustomLaunchScript.sh,myTargetSecondMame;path/to/my/mySecondCustomLaunchScript.sh". Для получения дополнительной информации смотрите статью [Кастомные скрипты](CustomScripts.md)| - -### Параметры управления плагинами: - -| Option | Descriptiion | -| ----------------------------|---------------------------------------------------------- | -| -extraPlugin [пакет; val1; val2, SingeleVal] | Устанавливает дополнительный путь к стороннему плагину приложения | -| -enablePlugins [target,target2,target3] | Включает дополнительные плагины для распространения. | -| -disablePlugins [target,target2,target3] | Отключает плагины для распространения. | -| | Вы можете отключить любой плагин вашей сборки Qt, просто проверте список доступных плагинов в свой qlFolder/plugins папке. -| | Пример: Если вы хотите отключить плагин qxcb: -disablePlugins qxcb. Обратите внимание, что имя плагина указывается без его расширения. - -### Параметры QtInstallFramework: - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -qifStyle [path/to/style.css]| Устанавливает путь к CSS файлу стиля или устанавливает стиль по умолчанию. Доступные стили: quasar | -| -qifBanner [path/to/banner.png]| Устанавливает путь к png-файлу баннера. | -| -qifLogo [path/to/logo.png]| Устанавливает путь к файлу логотипа png. | -| -qifOut [nameOfOutputInstallerFile] | Устанавливает имя выходного установщика qifw. Примечание: для установщика Windows автоматически добавляется суффикс exe. | -| -qifConfig [path/to/config.xml] | Устанавливает пользовательский путь к файлу конфигурации установщика qt ifw. По умолчанию это qif/config/config.xml. Важно путь считаеться относительным целевого католога (установленным опцией targetDir). | -| -qifPackages [path/to/packagesFodoler] | Устанавливает пользовательский путь к каталогам пакетов. По умолчанию это qif/packages. Важно путь считаеться относительным целевого католога (установленным опцией targetDir). | -| -qifResources [path/to/resources1.qrc,path/to/resources2.qrc] | Устанавливает пользовательский путь к файлам ресурсов. По умолчанию эта опция пропущена. Важно путь считаеться относительным целевого католога (установленным опцией targetDir). | -| -qifArchiveFormat [7z,zip,tar,tar.gz,tar.bz2,tar.xz] | Задает формат, используемый при упаковке новых архивов данных компонентов. Если вы опустите этот параметр, по умолчанию будет использоваться формат 7z. | -| -binarycreator [binarycreator command] | Установит новую команду вызова binarycreator. Пример : cqtdeployer -bin my.exe qifw -binarycreator 'wine path/to/binarycreator.exe'| - -### Deb package options: - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -debOut [package;nameOfOutputDebFile,nameOfOutputDebFile]| Устанавливает имя выходного файла debian. Эта опция может работать с несколькими пакетами | - -### Zip pacakge options: - -| Option | Descriptiion | -|-----------------------------|-----------------------------------------------------------| -| -zipOut [package;nameOfOutputZipFile,nameOfOutputZipFile]| Устанавливает имя выходного zip архива. Эта опция может работать с несколькими пакетами | - - -#### Пример: cqtdeployer -bin myApp -qmlDir ~/MyAppProject/qml -qmake ~/Qt/5.15.0/gcc_64/bin/qmake clear diff --git a/md/ru/Packing.md b/md/ru/Packing.md deleted file mode 100644 index 699022a9..00000000 --- a/md/ru/Packing.md +++ /dev/null @@ -1,138 +0,0 @@ -# Упаковка дистрибутивов - -Общая информация об упаковке ваших дистрибутивов в пакеты. - -## Типы упаковки - -* Автоматически -* Вручную - -## Автоматические пакеты - -Пакеты с этим типом создаются автоматически. -По умолчанию в дистрибутиве есть один основной пакет. Вы можете настроить его, используя [Параметры управления пакетами](Options.md). - -#### Пример (Установить новое имя для pacakge) - -``` -ctdeployer ... -name "MyPackage" -``` - -Если в вашем дистрибутиве есть несколько исполняемых файлов, вы можете создать дистрибутив с несколькими пакетами. - -Один пакет может содержать от 1 до бесконечности исполняемых файлов. - -Для настройки пакета необходимо использовать параметр targetPackage. - -Пример использования: - -``` -cqtdeployer ... -targetPackage myPacage; target1, myPacage2; target2 -``` - -Где myPacage - это имя пакета, а target1 - имя исполняемого файла. -Итак, в этом примере создается 2 пакета из 2 целей. - -В следующем примере создается 2 пакета из 3 целей. -``` -cqtdeployer ... -targetPackage myPacage; target1, myPacage; target2, myPacage2; target3 -``` - - -Вы также можете сделать то же самое в файле конфигурации - -``` -{ -"targetPackage": [ - [ - "myPacage", - "target1" - ], - [ - "myPacage2", - "target2" - ] - ] -} -``` - -``` -{ -"targetPackage": [ - [ - "myPacage", - "target1" - ], - [ - "myPacage", - "target2" - ], - [ - "myPacage2", - "target3" - ] - ] -} -``` - - -## Ручные пакеты - -Ручные пакеты - это пакеты, созданные по шаблону пользователя. -Например, у вас есть приложение, которое должно выполнять сложный сценарий в пакете debian или программе установки. -Итак, вам нужно создать свой шаблон и добавить путь к вашему шаблону для варианта пакета. - -пример - -``` -cqtdeployer ... -qif /path/to/my/template/installer -``` - -Папка /path/to/my/template/installer должна содержать папку с именем пакета. -например, я развертываю приложение с именем "MyExample", поэтому мой настраиваемый шаблон должен быть расположен в - /path/to/my/template/installer/MyExample путь. - -Для многопакетных дистрибутивов применяются те же правила. - -Ваша папка с шаблонами должна содержать папки с такими же названиями, что и пакеты. - -Пример: - -``` -{ -"targetPackage": [ - [ - "myPacage", - "target1" - ], - [ - "myPacage", - "target2" - ], - [ - "myPacage2", - "target3" - ] - ] -} -``` - -``` -~/path/to/my/template/installer $ tree -. -├── myPacage -│ └── ... -└── myPacage2 - └── ... - -``` - -### Примечание - -Вы так же можете извлечь стандартный шаблон пакета для того что бы его переопределить если вас по каким то причинам не устраевает стандартная реализация. Подробнее как это сделать смотрите на этой [странице](ExtractDefaultsTemplates.md). - -## Доступные пакеты - -* [Qt Install Framework](QIF.md) -* [ZIP-архив](ZIP.md) -* [Пакет DEB](DEB.md) diff --git a/md/ru/QIF.md b/md/ru/QIF.md deleted file mode 100644 index 9a966eb1..00000000 --- a/md/ru/QIF.md +++ /dev/null @@ -1,175 +0,0 @@ -# Использование Qt Installer Framwork - -Общие правила использования Qt Installer Framwork - -### Что такое Qt Installer Framwork - -**Qt Installer Framework** (QIF) предоставляет набор инструментов и утилит для создания установщиков для поддерживаемых настольных платформ Qt: Linux, Microsoft Windows и OS X. -В **CQtDeployer** QIF доступен в виде опции qif. - -### Как использовать опцию qif - -Опция qif является булевским параметром для создания Установочного файла. - -#### Пример: - -``` bash - cqtdeployer ... qif -``` - -Где: -* **...** - список других опций. -* **qif** - опция для использования qt installer framework с шаблоном по умолчанию. - - -По умолчанию cqtdeployer создаст установочный файл с одним пакетом в котором будет лежать весь ваш дистрибутив. -Если вы хотите его настроить вы должны использовать [параметр c поддержкой выбора пакета](Options.md) -Для создание нового пакета используйте флаг -targetPackage [package;tar1] - - -Где: - -* **package** - это имя пакета -* **tar1** - это название таргета который должен попасть в этот пакет. - -Или вы можете описать пакеты в [конфигурационном файле](DeployConfigFile.md) - -```json -{ -"targetPackage": [ - [ - "package", - "tar1" - ] -], -} -``` - -# Пользовательский Шаблон для QIF - -Начиная с Версии CQtDeployer 1.5 вы можете использовать свой собственный шаблон установщика. Для этого вы должны передать в параметр qif путь к вашему шаблону. - -``` -cqtdeployer ... -qif /path/to/my/custom/qif/template -``` - -### Шаблон - -Шаблон qif долже содержать 2 папки: -* packages -* config - -### Внимание - -Название пакетов в папке packages должны совподать с названием пакетов при развертывание. - -Например: - -```json -"targetPackage": [ - [ - "myCustomInstaller", - "tar1" - ] -], -``` - -```bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` - -Если имена папок не совподут с именами пакетов то CQtDeployer будет использовать стандартный пакет для QIF. - -Если у вас только один пакет, вы можете использовать опцию **name** для установки имени приложения. - -``` -cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller -``` - -#### Не забудьте переименовать папку вашего пакета в имя пакета из опции имени. - - -```bash -. -├── config -│ ├── config.xml -│ └── style.qss -└── packages - └── myCustomInstaller << "This is folder of the your package" - └── meta - ├── installscript.qs - └── package.xml - -4 directories, 4 files - -``` - - -## Инициализация шаблона qifw - -Для инициализации шаблонов по умолчанию вы можете использовать параметр getDefaultTemplate. -Параметр getDefaultTemplate извлекает шаблон по умолчанию для cqtdeployer. Это может быть очень удобно, если вы хотите переопределить поведение установщика или другого пакета распространения по умолчанию. - -### Пример - -### Получение шаблона фреймворка установщика qt по умолчанию. - -```bash -cqtdeployer getDefaultTemplate qif -``` - -### Примечание - -CQtDeployer пропустит создание каталога пакетов для шаблона, поскольку эта команда не содержит данных для развертывания. -Если вы хотите подготовить шаблон с конфигурациями пакетов, вам следует добавить развернутые данные в свою команду или в файл config.json, используя параметры bin или extraData. -Если вы создаете дистрибутив с несколькими пакетами, вам необходимо настроить свои пакеты в развертываемой команде. - - -#### Пример: - -Извлечение шаблона с пакетами: - -```bash -cqtdeployer getDefaultTemplate qif -bin myExecutable -``` - -Извлечение шаблона для распространения нескольких пакетов - -```bash -cqtdeployer getDefaultTemplate qif -bin myExecutable1,myExecutable2 -targetPackage p1;myExecutable1,p2;myExecutable2 -``` - -Вы также можете использовать файл конфигурации для настройки шаблонов. - -Config.json - -```json -{ - "qif": true, - "bin": [ - "myExecutable1", - "myExecutable2" - ], - "targetPackage": [ - ["p1", "myExecutable1"], - ["p2", "myExecutable2"] - ] -} -``` - -Запустите CQtDeployer для создания шаблона: - -```bash -cqtdeployer -confFile Config.json getDefaultTemplate -``` diff --git a/md/ru/QuickGuide.md b/md/ru/QuickGuide.md deleted file mode 100644 index 8247f89c..00000000 --- a/md/ru/QuickGuide.md +++ /dev/null @@ -1,81 +0,0 @@ -# Быстрый гайд - -Как развернуть приложение с помощью CQtDeployer - -1. Прежде всего вам нужно установить CQtDeployer на вашу платформу - - * Snap (более 14 дистрибутивов Linux): - ``` - sudo snap install cqtdeployer - ``` - или - - Установите из магазина snap и включите все необходимые приложению разрешения. - - [![Download from Snap Store](https://snapcraft.io/static/images/badges/ru/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) - - * Другие Linux дистрибутивы [LinuxInstaller.run][1]. - ``` - chmod +x LinuxInstaller.run - ./LinuxInstaller.run - ``` - - * Windows [installer][1] - -2. Скомпилируйте ваш проект в режиме релиза. -3. Разверните ваш исполняемый файл: - - * Для Linux систем: - ``` bash - cqtdeployer -bin myexecutable - ``` - - * Для Windows систем: - ``` bash - cqtdeployer -bin myexecutable.exe -qmake C:/Qt/5.15.0/min_gw/bin/qmake.exe - ``` - - * Для кросплатформенной сборки (Linux -> Windows) - ``` bash - cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/bin/qmake - ``` - -## Дополнительные опции - -Если вы используете дополнительные библиотеки, просто добавьте путь к cqtdeployer для используемых библиотек. -``` bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -``` - -Если вы хотите найти библиотеки рекурсивно по пути libDir, просто добавьте рекурсивный параметр Depth. -``` bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -``` - -Если ваше приложение использует qml, просто добавьте опцию qmlDir -``` bash -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources -``` - -Если вы хотите создать простой установщик для вашего приложения, просто добавьте опцию qif. -``` -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -``` - -Если вы используете системные библиотеки из системного PATH, просто добавьте опцию deploySystem. - -#### Предупреждение: версия Snap не имеет прав доступа к системным файлам. Для развертывания системных библиотек используйте версию cqtdeployer из [установщика][1] - -``` -cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif deploySystem -``` - - -### Если у вас есть какие-либо проблемы с использованием cqtdeployer, тогда задавайте вопросы на официальной github [странице][2]. - -### Дополнительные параметры CQtDeployer см. В официальной [документации][3]. - -[1]: https://github.com/QuasarApp/CQtDeployer/releases -[2]: https://github.com/QuasarApp/CQtDeployer/issues -[3]: https://github.com/QuasarApp/CQtDeployer/blob/main/md/ru/Options.md - diff --git a/md/ru/ReleaseReviews.md b/md/ru/ReleaseReviews.md deleted file mode 100755 index 69cc0086..00000000 --- a/md/ru/ReleaseReviews.md +++ /dev/null @@ -1,4 +0,0 @@ -# Обзоры на релизы - -* [Обзор v1.5](1_5.md) -* [Обзор v1.4 (Бинарный ящик)](1_4.md) diff --git a/md/ru/ZIP.md b/md/ru/ZIP.md deleted file mode 100644 index 0dedaac2..00000000 --- a/md/ru/ZIP.md +++ /dev/null @@ -1,47 +0,0 @@ -# Использование ZIP - -Общие правила использования ZIP - -Доступно с версии CQtDeployer 1.5 - -### Как использовать опцию zip - -Просто добавьте в cqtdeployer опцию «zip». - -### Например: - -```bash -cqtdeployer ... zip -``` - -Где: - -* **...** - список других опций. -* **zip** - опция использования zip архивов. - - -По умолчанию cqtdeployer создает один zip-архив. -Если вы хотите создать рассылку нескольких пакетов, вы должны использовать [Параметры управления пакетами](Options.md). -Чтобы создать новый пакет, используйте -targetPackage [package; tar1] вариант - -cqtdeployer создает zip-архив для каждого пакета. - -Где: - -* **package** - это название пакета -* **tar1** - это имя цели, которая должна быть включена в этот пакет. - -Или вы можете описать пакеты в [файле конфигурации](DeployConfigFile.md) - - -```json -{ -"targetPackage": [ - [ - "package", - "Tar1" - ], -], -"zip": true -} -``` diff --git a/md/screenshots/customStyle.png b/md/screenshots/customStyle.png deleted file mode 100644 index adc7d6b791376ced8ef3718d72cec4228c136209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26438 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 KRQY?8Z~qM!a6>Tw diff --git a/md/screenshots/quasaraStyle.png b/md/screenshots/quasaraStyle.png deleted file mode 100644 index 278b2feb287b94c33c7559d41d7ba14693e6d5a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24609 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 diff --git a/plug.pro b/plug.pro new file mode 100644 index 00000000..be046039 --- /dev/null +++ b/plug.pro @@ -0,0 +1,5 @@ + +TEMPLATE = subdirs + +QMAKE_EXTRA_TARGETS += \ + test diff --git a/src/CQtDeployer/CMakeLists.txt b/src/CQtDeployer/CMakeLists.txt new file mode 100644 index 00000000..9ab9beb5 --- /dev/null +++ b/src/CQtDeployer/CMakeLists.txt @@ -0,0 +1,147 @@ +# +# Copyright (C) 2021-2022 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. +# + +cmake_minimum_required(VERSION 3.18) + +get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +set(CURRENT_PROJECT "${PROJECT_NAME}${CURRENT_PROJECT_DIR}") +option(SIGN_APP "This option enable od disabled sign apk and aab files" ON) + +file(GLOB_RECURSE SOURCE_CPP + "*.cpp" "*.h" +) + +if (${QT_VERSION_MAJOR}) + file(GLOB_RECURSE SOURCE_QRC + "*.qrc" + ) +endif() + +set(ALL_SOURCES ${SOURCE_CPP} ${SOURCE_QRC}) + +set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + +set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Private") + +updateGitVars() + +if (${QT_VERSION_MAJOR} EQUAL 6) + + qt_add_executable(${CURRENT_PROJECT} MANUAL_FINALIZATION ${ALL_SOURCES}) + +else() + if (ANDROID) + add_library(${CURRENT_PROJECT} ${ALL_SOURCES}) + else () + add_executable(${CURRENT_PROJECT} ${ALL_SOURCES} ) + endif() + +endif() + +target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Library) + +target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) +target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) + +SET(TARGET_DIR "${CMAKE_SOURCE_DIR}/Distro") +file(MAKE_DIRECTORY ${TARGET_DIR}) + +if (ANDROID) + + set(ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android CACHE INTERNAL "") + set(ENV{ANDROID_API_VERSION} 31) + set(ANDROID_API_VERSION $ENV{ANDROID_API_VERSION}) + set(OPENSSL_ROOT_PATH "$ENV{OPENSSL_ROOT_DIR}") + + set(CQtDeployer_EXTRA_LIBS + ${PROJECT_NAME}Library +# libName + ) + +# find_package(Qt${QT_VERSION_MAJOR} COMPONENTS AndroidExtras REQUIRED) +# target_link_libraries(${CURRENT_PROJECT} PRIVATE Qt${QT_VERSION_MAJOR}::AndroidExtras) + + if (SIGN_APP) + message("SIGN_APP") + addDeploySignedAPK(${CURRENT_PROJECT} + "${CMAKE_CURRENT_LIST_DIR}/android" + "QuasarAppProject" + "${SIGPATH}/quasarapp.keystore" + "${SIGPASS_QUASARAPP}" + "${TARGET_DIR}" + "${CQtDeployer_EXTRA_LIBS}") + + else() + message("NO_SIGN_APP") + + addDeployAPK(${CURRENT_PROJECT} + "${CMAKE_CURRENT_LIST_DIR}/android" + "${TARGET_DIR}" + "${CQtDeployer_EXTRA_LIBS}") + + endif() + set(manifest_file "${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml") + configure_file("${manifest_file}.in" ${manifest_file} @ONLY) + + set(gradle_file "${CMAKE_CURRENT_SOURCE_DIR}/android/build.gradle") + configure_file("${gradle_file}.in" ${gradle_file} @ONLY) + + file(GLOB java_files + "android/src/com/quasarapp/androidtools/*.java" + "android/*.xml" + "android/*.gradle" + "android/gradlew" + "android/gradle.*" + + ) + + add_custom_target(${name}Android + SOURCES ${java_files} + ) + +elseif(IOS) +# set_xcode_property(${CURRENT_PROJECT} PRODUCT_BUNDLE_IDENTIFIER ${CHEATCARD_PACKAGE_ID} All) + + set_target_properties(${CURRENT_PROJECT} PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER ${CQtDeployer_PACKAGE_ID} + MACOSX_BUNDLE_BUNDLE_VERSION ${CQtDeployer_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${CQtDeployer_VERSION} + ) +else() + # Desctop deploying + + message(GIT_COMMIT_COUNT = ${GIT_COMMIT_COUNT}) + + set(DeployFile "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") + configure_file("${DeployFile}.in" ${DeployFile} @ONLY) + + addDeployFromCustomFile("CQtDeployer" ${DeployFile}) + +endif() + +if(QT_VERSION_MAJOR EQUAL 6) + # Add This line if your project use the Quick module + # qt_import_qml_plugins(${CURRENT_PROJECT}) + qt_finalize_executable(${CURRENT_PROJECT}) +endif() + + +set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/ru.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/uk.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/ja.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/tr.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/zh.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/de.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/fr.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/es.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/pl.ts) + +prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR}/../ "${LANGS}") + + diff --git a/src/CQtDeployer/Deploy/CQtDeployer.json b/src/CQtDeployer/Deploy/CQtDeployer.json new file mode 100644 index 00000000..1cd88b0e --- /dev/null +++ b/src/CQtDeployer/Deploy/CQtDeployer.json @@ -0,0 +1,27 @@ +{ + "bin": [ + "src/build/Debug/CQtDeployerEaxample", + "src/build/Debug/CQtDeployerEaxample.exe" + ], + "clear": true, + "binPrefix": "/media/D/builds/build-CMakeProject-Desktop_Qt_6_1_3_GCC_64bit-Debug", + "libDir": [ + "/media/D/builds/CMakeProject", + "/home/andrei/Qt/5.15.2/gcc_64", + "/media/D/builds/build-CMakeProject-Desktop_Qt_6_1_3_GCC_64bit-Debug" + ], + "recursiveDepth": "10", + "deploySystem": false, + "qmlDir": "../", + "deb": true, + "qif": true, + "zip": true, + "ignoreEnv": [ + "/media/D/builds/CMakeProject/Distro" + ], + "extraLib": "crypto", + "targetDir": "/media/D/builds/CMakeProject/Distro", + "deployVersion": "0.84.1a139e7", + +} + diff --git a/src/CQtDeployer/Deploy/CQtDeployer.json.in b/src/CQtDeployer/Deploy/CQtDeployer.json.in new file mode 100644 index 00000000..a607dc68 --- /dev/null +++ b/src/CQtDeployer/Deploy/CQtDeployer.json.in @@ -0,0 +1,27 @@ +{ + "bin": [ + "src/build/Debug/CQtDeployerEaxample", + "src/build/Debug/CQtDeployerEaxample.exe" + ], + "clear": true, + "binPrefix": "@CMAKE_BINARY_DIR@", + "libDir": [ + "@CMAKE_SOURCE_DIR@", + "@CMAKE_PREFIX_PATH@", + "@CMAKE_BINARY_DIR@" + ], + "recursiveDepth": "10", + "deploySystem": false, + "qmlDir": "../", + "deb": true, + "qif": true, + "zip": true, + "ignoreEnv": [ + "@CMAKE_SOURCE_DIR@/Distro" + ], + "extraLib": "crypto", + "targetDir": "@CMAKE_SOURCE_DIR@/Distro", + "deployVersion": "@CQtDeployer_VERSION@", + +} + diff --git a/QIFData/packages/QIF/meta/ru.ts b/src/CQtDeployer/languages/de.ts similarity index 100% rename from QIFData/packages/QIF/meta/ru.ts rename to src/CQtDeployer/languages/de.ts diff --git a/QIFData/packages/cqtdeployer/meta/ru.ts b/src/CQtDeployer/languages/en.ts similarity index 100% rename from QIFData/packages/cqtdeployer/meta/ru.ts rename to src/CQtDeployer/languages/en.ts diff --git a/src/CQtDeployer/languages/es.ts b/src/CQtDeployer/languages/es.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/es.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/fr.ts b/src/CQtDeployer/languages/fr.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/fr.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/ja.ts b/src/CQtDeployer/languages/ja.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/ja.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/pl.ts b/src/CQtDeployer/languages/pl.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/pl.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/ru.ts b/src/CQtDeployer/languages/ru.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/ru.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/tr.ts b/src/CQtDeployer/languages/tr.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/tr.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/uk.ts b/src/CQtDeployer/languages/uk.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/uk.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/zh.ts b/src/CQtDeployer/languages/zh.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/languages/zh.ts @@ -0,0 +1,4 @@ + + + + diff --git a/CQtDeployer/main.cpp b/src/CQtDeployer/main.cpp similarity index 100% rename from CQtDeployer/main.cpp rename to src/CQtDeployer/main.cpp diff --git a/src/Deploy/CMakeLists.txt b/src/Deploy/CMakeLists.txt new file mode 100644 index 00000000..5f18653d --- /dev/null +++ b/src/Deploy/CMakeLists.txt @@ -0,0 +1,49 @@ +# +# Copyright (C) 2020-2022 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. +# + +cmake_minimum_required(VERSION 3.18) + +get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +set(CURRENT_PROJECT "${PROJECT_NAME}${CURRENT_PROJECT_DIR}") +add_definitions(-DCQtDeployer_LIBRARY) + + +file(GLOB_RECURSE SOURCE_CPP + "src/*.cpp" + "src/*.h" +) + +if (${QT_VERSION_MAJOR}) + file(GLOB_RECURSE SOURCE_QRC + "*.qrc" + ) + +endif() + +set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/public") +set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/private") + + +add_library(${CURRENT_PROJECT} ${SOURCE_CPP} ${SOURCE_QRC}) + +if (${QT_VERSION_MAJOR}) + target_link_libraries(${CURRENT_PROJECT} PUBLIC Qt${QT_VERSION_MAJOR}::Core ) +endif() + +target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) +target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) + +set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts) + + +prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR} "${LANGS}") + +set(QML_IMPORT_PATH ${QML_IMPORT_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/src" CACHE STRING "" FORCE) + +set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/src/public/CQtDeployer/global.h") +configure_file("${global_file}.in" ${global_file} @ONLY) diff --git a/src/Deploy/CQtDeployer.qrc b/src/Deploy/CQtDeployer.qrc new file mode 100644 index 00000000..00c90b7c --- /dev/null +++ b/src/Deploy/CQtDeployer.qrc @@ -0,0 +1,9 @@ + + + src/CQtDeployerModule/qmldir + src/CQtDeployerModule/CQtDeployer.qml + + + languages/en.qm + + diff --git a/src/Deploy/languages/en.ts b/src/Deploy/languages/en.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/Deploy/languages/en.ts @@ -0,0 +1,4 @@ + + + + diff --git a/Deploy/DeployResources.qrc b/src/Deploy/src/DeployResources.qrc similarity index 100% rename from Deploy/DeployResources.qrc rename to src/Deploy/src/DeployResources.qrc diff --git a/Deploy/Distributions/Templates/Icon.ico b/src/Deploy/src/Distributions/Templates/Icon.ico similarity index 100% rename from Deploy/Distributions/Templates/Icon.ico rename to src/Deploy/src/Distributions/Templates/Icon.ico diff --git a/Deploy/Distributions/Templates/Icon.png b/src/Deploy/src/Distributions/Templates/Icon.png similarity index 100% rename from Deploy/Distributions/Templates/Icon.png rename to src/Deploy/src/Distributions/Templates/Icon.png diff --git a/Deploy/Distributions/Templates/deb/DEBIAN/control b/src/Deploy/src/Distributions/Templates/deb/DEBIAN/control similarity index 100% rename from Deploy/Distributions/Templates/deb/DEBIAN/control rename to src/Deploy/src/Distributions/Templates/deb/DEBIAN/control diff --git a/Deploy/Distributions/Templates/deb/DEBIAN/postinst b/src/Deploy/src/Distributions/Templates/deb/DEBIAN/postinst similarity index 100% rename from Deploy/Distributions/Templates/deb/DEBIAN/postinst rename to src/Deploy/src/Distributions/Templates/deb/DEBIAN/postinst diff --git a/Deploy/Distributions/Templates/deb/DEBIAN/prerm b/src/Deploy/src/Distributions/Templates/deb/DEBIAN/prerm similarity index 100% rename from Deploy/Distributions/Templates/deb/DEBIAN/prerm rename to src/Deploy/src/Distributions/Templates/deb/DEBIAN/prerm diff --git a/Deploy/Distributions/Templates/qif/Styles/quasar.css b/src/Deploy/src/Distributions/Templates/qif/Styles/quasar.css similarity index 100% rename from Deploy/Distributions/Templates/qif/Styles/quasar.css rename to src/Deploy/src/Distributions/Templates/qif/Styles/quasar.css diff --git a/Deploy/Distributions/Templates/qif/Styles/quasarDark.css b/src/Deploy/src/Distributions/Templates/qif/Styles/quasarDark.css similarity index 100% rename from Deploy/Distributions/Templates/qif/Styles/quasarDark.css rename to src/Deploy/src/Distributions/Templates/qif/Styles/quasarDark.css diff --git a/Deploy/Distributions/Templates/qif/config custom designe/config.xml b/src/Deploy/src/Distributions/Templates/qif/config custom designe/config.xml similarity index 100% rename from Deploy/Distributions/Templates/qif/config custom designe/config.xml rename to src/Deploy/src/Distributions/Templates/qif/config custom designe/config.xml diff --git a/Deploy/Distributions/Templates/qif/config custom designe/controlScript.qs b/src/Deploy/src/Distributions/Templates/qif/config custom designe/controlScript.qs similarity index 100% rename from Deploy/Distributions/Templates/qif/config custom designe/controlScript.qs rename to src/Deploy/src/Distributions/Templates/qif/config custom designe/controlScript.qs diff --git a/Deploy/Distributions/Templates/qif/config custom designe/style.css b/src/Deploy/src/Distributions/Templates/qif/config custom designe/style.css similarity index 100% rename from Deploy/Distributions/Templates/qif/config custom designe/style.css rename to src/Deploy/src/Distributions/Templates/qif/config custom designe/style.css diff --git a/Deploy/Distributions/Templates/qif/config/config.xml b/src/Deploy/src/Distributions/Templates/qif/config/config.xml similarity index 100% rename from Deploy/Distributions/Templates/qif/config/config.xml rename to src/Deploy/src/Distributions/Templates/qif/config/config.xml diff --git a/Deploy/Distributions/Templates/qif/config/controlScript.qs b/src/Deploy/src/Distributions/Templates/qif/config/controlScript.qs similarity index 100% rename from Deploy/Distributions/Templates/qif/config/controlScript.qs rename to src/Deploy/src/Distributions/Templates/qif/config/controlScript.qs diff --git a/Deploy/Distributions/Templates/qif/packages/default/meta/installscript.qs b/src/Deploy/src/Distributions/Templates/qif/packages/default/meta/installscript.qs similarity index 100% rename from Deploy/Distributions/Templates/qif/packages/default/meta/installscript.qs rename to src/Deploy/src/Distributions/Templates/qif/packages/default/meta/installscript.qs diff --git a/Deploy/Distributions/Templates/qif/packages/default/meta/package.xml b/src/Deploy/src/Distributions/Templates/qif/packages/default/meta/package.xml similarity index 100% rename from Deploy/Distributions/Templates/qif/packages/default/meta/package.xml rename to src/Deploy/src/Distributions/Templates/qif/packages/default/meta/package.xml diff --git a/Deploy/Distributions/configures/Init multiPackage configuration.json b/src/Deploy/src/Distributions/configures/Init multiPackage configuration.json similarity index 100% rename from Deploy/Distributions/configures/Init multiPackage configuration.json rename to src/Deploy/src/Distributions/configures/Init multiPackage configuration.json diff --git a/Deploy/Distributions/configures/Init single configuration.json b/src/Deploy/src/Distributions/configures/Init single configuration.json similarity index 100% rename from Deploy/Distributions/configures/Init single configuration.json rename to src/Deploy/src/Distributions/configures/Init single configuration.json diff --git a/Deploy/Distributions/configures/Init.json b/src/Deploy/src/Distributions/configures/Init.json similarity index 100% rename from Deploy/Distributions/configures/Init.json rename to src/Deploy/src/Distributions/configures/Init.json diff --git a/Deploy/Distributions/deb.cpp b/src/Deploy/src/Distributions/deb.cpp similarity index 100% rename from Deploy/Distributions/deb.cpp rename to src/Deploy/src/Distributions/deb.cpp diff --git a/Deploy/Distributions/deb.h b/src/Deploy/src/Distributions/deb.h similarity index 100% rename from Deploy/Distributions/deb.h rename to src/Deploy/src/Distributions/deb.h diff --git a/Deploy/Distributions/defaultdistro.cpp b/src/Deploy/src/Distributions/defaultdistro.cpp similarity index 100% rename from Deploy/Distributions/defaultdistro.cpp rename to src/Deploy/src/Distributions/defaultdistro.cpp diff --git a/Deploy/Distributions/defaultdistro.h b/src/Deploy/src/Distributions/defaultdistro.h similarity index 100% rename from Deploy/Distributions/defaultdistro.h rename to src/Deploy/src/Distributions/defaultdistro.h diff --git a/Deploy/Distributions/idistribution.cpp b/src/Deploy/src/Distributions/idistribution.cpp similarity index 100% rename from Deploy/Distributions/idistribution.cpp rename to src/Deploy/src/Distributions/idistribution.cpp diff --git a/Deploy/Distributions/idistribution.h b/src/Deploy/src/Distributions/idistribution.h similarity index 100% rename from Deploy/Distributions/idistribution.h rename to src/Deploy/src/Distributions/idistribution.h diff --git a/Deploy/Distributions/qif.cpp b/src/Deploy/src/Distributions/qif.cpp similarity index 100% rename from Deploy/Distributions/qif.cpp rename to src/Deploy/src/Distributions/qif.cpp diff --git a/Deploy/Distributions/qif.h b/src/Deploy/src/Distributions/qif.h similarity index 100% rename from Deploy/Distributions/qif.h rename to src/Deploy/src/Distributions/qif.h diff --git a/Deploy/Distributions/templateinfo.cpp b/src/Deploy/src/Distributions/templateinfo.cpp similarity index 100% rename from Deploy/Distributions/templateinfo.cpp rename to src/Deploy/src/Distributions/templateinfo.cpp diff --git a/Deploy/Distributions/templateinfo.h b/src/Deploy/src/Distributions/templateinfo.h similarity index 100% rename from Deploy/Distributions/templateinfo.h rename to src/Deploy/src/Distributions/templateinfo.h diff --git a/Deploy/Distributions/ziparhive.cpp b/src/Deploy/src/Distributions/ziparhive.cpp similarity index 100% rename from Deploy/Distributions/ziparhive.cpp rename to src/Deploy/src/Distributions/ziparhive.cpp diff --git a/Deploy/Distributions/ziparhive.h b/src/Deploy/src/Distributions/ziparhive.h similarity index 100% rename from Deploy/Distributions/ziparhive.h rename to src/Deploy/src/Distributions/ziparhive.h diff --git a/Deploy/ScriptsTemplates/linux.sh b/src/Deploy/src/ScriptsTemplates/linux.sh similarity index 100% rename from Deploy/ScriptsTemplates/linux.sh rename to src/Deploy/src/ScriptsTemplates/linux.sh diff --git a/Deploy/ScriptsTemplates/windows.bat b/src/Deploy/src/ScriptsTemplates/windows.bat similarity index 100% rename from Deploy/ScriptsTemplates/windows.bat rename to src/Deploy/src/ScriptsTemplates/windows.bat diff --git a/Deploy/configparser.cpp b/src/Deploy/src/configparser.cpp similarity index 100% rename from Deploy/configparser.cpp rename to src/Deploy/src/configparser.cpp diff --git a/Deploy/configparser.h b/src/Deploy/src/configparser.h similarity index 100% rename from Deploy/configparser.h rename to src/Deploy/src/configparser.h diff --git a/Deploy/defines.h b/src/Deploy/src/defines.h similarity index 100% rename from Deploy/defines.h rename to src/Deploy/src/defines.h diff --git a/Deploy/dependenciesscanner.cpp b/src/Deploy/src/dependenciesscanner.cpp similarity index 100% rename from Deploy/dependenciesscanner.cpp rename to src/Deploy/src/dependenciesscanner.cpp diff --git a/Deploy/dependenciesscanner.h b/src/Deploy/src/dependenciesscanner.h similarity index 100% rename from Deploy/dependenciesscanner.h rename to src/Deploy/src/dependenciesscanner.h diff --git a/Deploy/dependencymap.cpp b/src/Deploy/src/dependencymap.cpp similarity index 100% rename from Deploy/dependencymap.cpp rename to src/Deploy/src/dependencymap.cpp diff --git a/Deploy/dependencymap.h b/src/Deploy/src/dependencymap.h similarity index 100% rename from Deploy/dependencymap.h rename to src/Deploy/src/dependencymap.h diff --git a/Deploy/deploy.cpp b/src/Deploy/src/deploy.cpp similarity index 100% rename from Deploy/deploy.cpp rename to src/Deploy/src/deploy.cpp diff --git a/Deploy/deploy.h b/src/Deploy/src/deploy.h similarity index 100% rename from Deploy/deploy.h rename to src/Deploy/src/deploy.h diff --git a/Deploy/deploy_global.h b/src/Deploy/src/deploy_global.h similarity index 100% rename from Deploy/deploy_global.h rename to src/Deploy/src/deploy_global.h diff --git a/Deploy/deployconfig.cpp b/src/Deploy/src/deployconfig.cpp similarity index 100% rename from Deploy/deployconfig.cpp rename to src/Deploy/src/deployconfig.cpp diff --git a/Deploy/deployconfig.h b/src/Deploy/src/deployconfig.h similarity index 100% rename from Deploy/deployconfig.h rename to src/Deploy/src/deployconfig.h diff --git a/Deploy/deploycore.cpp b/src/Deploy/src/deploycore.cpp similarity index 100% rename from Deploy/deploycore.cpp rename to src/Deploy/src/deploycore.cpp diff --git a/Deploy/deploycore.h b/src/Deploy/src/deploycore.h similarity index 100% rename from Deploy/deploycore.h rename to src/Deploy/src/deploycore.h diff --git a/Deploy/distromodule.cpp b/src/Deploy/src/distromodule.cpp similarity index 100% rename from Deploy/distromodule.cpp rename to src/Deploy/src/distromodule.cpp diff --git a/Deploy/distromodule.h b/src/Deploy/src/distromodule.h similarity index 100% rename from Deploy/distromodule.h rename to src/Deploy/src/distromodule.h diff --git a/Deploy/distrostruct.cpp b/src/Deploy/src/distrostruct.cpp similarity index 100% rename from Deploy/distrostruct.cpp rename to src/Deploy/src/distrostruct.cpp diff --git a/Deploy/distrostruct.h b/src/Deploy/src/distrostruct.h similarity index 100% rename from Deploy/distrostruct.h rename to src/Deploy/src/distrostruct.h diff --git a/Deploy/elf_type.cpp b/src/Deploy/src/elf_type.cpp similarity index 100% rename from Deploy/elf_type.cpp rename to src/Deploy/src/elf_type.cpp diff --git a/Deploy/elf_type.h b/src/Deploy/src/elf_type.h similarity index 100% rename from Deploy/elf_type.h rename to src/Deploy/src/elf_type.h diff --git a/Deploy/envirement.cpp b/src/Deploy/src/envirement.cpp similarity index 100% rename from Deploy/envirement.cpp rename to src/Deploy/src/envirement.cpp diff --git a/Deploy/envirement.h b/src/Deploy/src/envirement.h similarity index 100% rename from Deploy/envirement.h rename to src/Deploy/src/envirement.h diff --git a/Deploy/extra.cpp b/src/Deploy/src/extra.cpp similarity index 100% rename from Deploy/extra.cpp rename to src/Deploy/src/extra.cpp diff --git a/Deploy/extra.h b/src/Deploy/src/extra.h similarity index 100% rename from Deploy/extra.h rename to src/Deploy/src/extra.h diff --git a/Deploy/extracter.cpp b/src/Deploy/src/extracter.cpp similarity index 100% rename from Deploy/extracter.cpp rename to src/Deploy/src/extracter.cpp diff --git a/Deploy/extracter.h b/src/Deploy/src/extracter.h similarity index 100% rename from Deploy/extracter.h rename to src/Deploy/src/extracter.h diff --git a/Deploy/filemanager.cpp b/src/Deploy/src/filemanager.cpp similarity index 100% rename from Deploy/filemanager.cpp rename to src/Deploy/src/filemanager.cpp diff --git a/Deploy/filemanager.h b/src/Deploy/src/filemanager.h similarity index 100% rename from Deploy/filemanager.h rename to src/Deploy/src/filemanager.h diff --git a/Deploy/generalfiles_type.cpp b/src/Deploy/src/generalfiles_type.cpp similarity index 100% rename from Deploy/generalfiles_type.cpp rename to src/Deploy/src/generalfiles_type.cpp diff --git a/Deploy/generalfiles_type.h b/src/Deploy/src/generalfiles_type.h similarity index 100% rename from Deploy/generalfiles_type.h rename to src/Deploy/src/generalfiles_type.h diff --git a/Deploy/igetlibinfo.cpp b/src/Deploy/src/igetlibinfo.cpp similarity index 100% rename from Deploy/igetlibinfo.cpp rename to src/Deploy/src/igetlibinfo.cpp diff --git a/Deploy/igetlibinfo.h b/src/Deploy/src/igetlibinfo.h similarity index 100% rename from Deploy/igetlibinfo.h rename to src/Deploy/src/igetlibinfo.h diff --git a/Deploy/ignorerule.cpp b/src/Deploy/src/ignorerule.cpp similarity index 100% rename from Deploy/ignorerule.cpp rename to src/Deploy/src/ignorerule.cpp diff --git a/Deploy/ignorerule.h b/src/Deploy/src/ignorerule.h similarity index 100% rename from Deploy/ignorerule.h rename to src/Deploy/src/ignorerule.h diff --git a/Deploy/libinfo.cpp b/src/Deploy/src/libinfo.cpp similarity index 100% rename from Deploy/libinfo.cpp rename to src/Deploy/src/libinfo.cpp diff --git a/Deploy/libinfo.h b/src/Deploy/src/libinfo.h similarity index 100% rename from Deploy/libinfo.h rename to src/Deploy/src/libinfo.h diff --git a/Deploy/metafilemanager.cpp b/src/Deploy/src/metafilemanager.cpp similarity index 100% rename from Deploy/metafilemanager.cpp rename to src/Deploy/src/metafilemanager.cpp diff --git a/Deploy/metafilemanager.h b/src/Deploy/src/metafilemanager.h similarity index 100% rename from Deploy/metafilemanager.h rename to src/Deploy/src/metafilemanager.h diff --git a/Deploy/packagecontrol.cpp b/src/Deploy/src/packagecontrol.cpp similarity index 100% rename from Deploy/packagecontrol.cpp rename to src/Deploy/src/packagecontrol.cpp diff --git a/Deploy/packagecontrol.h b/src/Deploy/src/packagecontrol.h similarity index 100% rename from Deploy/packagecontrol.h rename to src/Deploy/src/packagecontrol.h diff --git a/Deploy/packing.cpp b/src/Deploy/src/packing.cpp similarity index 100% rename from Deploy/packing.cpp rename to src/Deploy/src/packing.cpp diff --git a/Deploy/packing.h b/src/Deploy/src/packing.h similarity index 100% rename from Deploy/packing.h rename to src/Deploy/src/packing.h diff --git a/Deploy/pathutils.cpp b/src/Deploy/src/pathutils.cpp similarity index 100% rename from Deploy/pathutils.cpp rename to src/Deploy/src/pathutils.cpp diff --git a/Deploy/pathutils.h b/src/Deploy/src/pathutils.h similarity index 100% rename from Deploy/pathutils.h rename to src/Deploy/src/pathutils.h diff --git a/Deploy/pe_type.cpp b/src/Deploy/src/pe_type.cpp similarity index 100% rename from Deploy/pe_type.cpp rename to src/Deploy/src/pe_type.cpp diff --git a/Deploy/pe_type.h b/src/Deploy/src/pe_type.h similarity index 100% rename from Deploy/pe_type.h rename to src/Deploy/src/pe_type.h diff --git a/Deploy/pluginsparser.cpp b/src/Deploy/src/pluginsparser.cpp similarity index 100% rename from Deploy/pluginsparser.cpp rename to src/Deploy/src/pluginsparser.cpp diff --git a/Deploy/pluginsparser.h b/src/Deploy/src/pluginsparser.h similarity index 100% rename from Deploy/pluginsparser.h rename to src/Deploy/src/pluginsparser.h diff --git a/Deploy/qml.cpp b/src/Deploy/src/qml.cpp similarity index 100% rename from Deploy/qml.cpp rename to src/Deploy/src/qml.cpp diff --git a/Deploy/qml.h b/src/Deploy/src/qml.h similarity index 100% rename from Deploy/qml.h rename to src/Deploy/src/qml.h diff --git a/Deploy/qtdir.cpp b/src/Deploy/src/qtdir.cpp similarity index 100% rename from Deploy/qtdir.cpp rename to src/Deploy/src/qtdir.cpp diff --git a/Deploy/qtdir.h b/src/Deploy/src/qtdir.h similarity index 100% rename from Deploy/qtdir.h rename to src/Deploy/src/qtdir.h diff --git a/Deploy/targetdata.cpp b/src/Deploy/src/targetdata.cpp similarity index 100% rename from Deploy/targetdata.cpp rename to src/Deploy/src/targetdata.cpp diff --git a/Deploy/targetdata.h b/src/Deploy/src/targetdata.h similarity index 100% rename from Deploy/targetdata.h rename to src/Deploy/src/targetdata.h diff --git a/Deploy/targetinfo.cpp b/src/Deploy/src/targetinfo.cpp similarity index 100% rename from Deploy/targetinfo.cpp rename to src/Deploy/src/targetinfo.cpp diff --git a/Deploy/targetinfo.h b/src/Deploy/src/targetinfo.h similarity index 100% rename from Deploy/targetinfo.h rename to src/Deploy/src/targetinfo.h diff --git a/Deploy/zipcompresser.cpp b/src/Deploy/src/zipcompresser.cpp similarity index 100% rename from Deploy/zipcompresser.cpp rename to src/Deploy/src/zipcompresser.cpp diff --git a/Deploy/zipcompresser.h b/src/Deploy/src/zipcompresser.h similarity index 100% rename from Deploy/zipcompresser.h rename to src/Deploy/src/zipcompresser.h diff --git a/test.pri b/test.pri deleted file mode 100644 index 09d2f56f..00000000 --- a/test.pri +++ /dev/null @@ -1,30 +0,0 @@ -unix:exec = $$PWD/UnitTests/build/release/UnitTests -win32:exec = $$PWD/UnitTests/build/release/UnitTests.exe - -QT_DIR= $$[QT_HOST_BINS] -win32:QMAKE_BIN= $$QT_DIR/qmake.exe -contains(QMAKE_HOST.os, Linux):{ - QMAKE_BIN= $$QT_DIR/qmake -} - -DEPLOYER=cqtdeployer - -test.commands = -deployTest.commands = $$DEPLOYER -bin $$exec clear -qmake $$QMAKE_BIN -targetDir $$PWD/deployTests -libDir $$PWD -recursiveDepth 4 - -!contains(DEFINES, WITHOUT_TESTS) { - test.depends = deployTest - unix:test.commands = $$PWD/deployTests/UnitTests.sh -maxwarnings 100000 - win32:test.commands = $$PWD/deployTests/UnitTests.exe -maxwarnings 100000 -o buildLog.log -} - -contains(QMAKE_HOST.os, Linux):{ - win32:test.commands = -} - - -QMAKE_EXTRA_TARGETS += \ - deployTest \ - test - - diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 00000000..0a2cbb0e --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,29 @@ +# +# Copyright (C) 2020-2022 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. +# + +cmake_minimum_required(VERSION 3.18) + +get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +set(CURRENT_PROJECT "${PROJECT_NAME}${CURRENT_PROJECT_DIR}") + +file(GLOB_RECURSE SOURCE_CPP + "*.cpp" "*.h" "*.qrc" +) + +set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +set(PUBLIC_INCUDE_DIR ${PUBLIC_INCUDE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/units") + + +add_executable(${CURRENT_PROJECT} ${SOURCE_CPP}) +target_link_libraries(${CURRENT_PROJECT} PRIVATE Qt${QT_VERSION_MAJOR}::Test ${PROJECT_NAME}Library) + +target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) + + +initTests() +addTests(${PROJECT_NAME} ${CURRENT_PROJECT}) diff --git a/tests/TestCPPOnly/TestCPPOnly.pro b/tests/TestCPPOnly/TestCPPOnly.pro deleted file mode 100644 index 25961d84..00000000 --- a/tests/TestCPPOnly/TestCPPOnly.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -CONFIG += console c++11 -CONFIG -= app_bundle -CONFIG -= qt -CONFIG += release - -SOURCES += \ - main.cpp - -DESTDIR="$$PWD/../build" diff --git a/tests/TestCPPOnly/conf.qrc b/tests/TestCPPOnly/conf.qrc deleted file mode 100644 index 03a1bfc7..00000000 --- a/tests/TestCPPOnly/conf.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - qt.conf - - diff --git a/tests/TestCPPOnly/main.cpp b/tests/TestCPPOnly/main.cpp deleted file mode 100644 index fd0821c9..00000000 --- a/tests/TestCPPOnly/main.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include - -using namespace std; - -int main() -{ - cout << "TEST DONE (ONLY_C)" << endl; - return 0; -} diff --git a/tests/TestCPPOnly/qt.conf b/tests/TestCPPOnly/qt.conf deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/TestOnlyC/TestOnlyC.pro b/tests/TestOnlyC/TestOnlyC.pro deleted file mode 100644 index 25961d84..00000000 --- a/tests/TestOnlyC/TestOnlyC.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -CONFIG += console c++11 -CONFIG -= app_bundle -CONFIG -= qt -CONFIG += release - -SOURCES += \ - main.cpp - -DESTDIR="$$PWD/../build" diff --git a/tests/TestOnlyC/conf.qrc b/tests/TestOnlyC/conf.qrc deleted file mode 100644 index 03a1bfc7..00000000 --- a/tests/TestOnlyC/conf.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - qt.conf - - diff --git a/tests/TestOnlyC/main.cpp b/tests/TestOnlyC/main.cpp deleted file mode 100644 index fd0821c9..00000000 --- a/tests/TestOnlyC/main.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include - -using namespace std; - -int main() -{ - cout << "TEST DONE (ONLY_C)" << endl; - return 0; -} diff --git a/tests/TestOnlyC/qt.conf b/tests/TestOnlyC/qt.conf deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/TestQMLWidgets/HomeForm.ui.qml b/tests/TestQMLWidgets/HomeForm.ui.qml deleted file mode 100644 index 6474fad0..00000000 --- a/tests/TestQMLWidgets/HomeForm.ui.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -Page { - width: 600 - height: 400 - - title: qsTr("Home") - - Label { - text: qsTr("You are on the home page.") - anchors.centerIn: parent - } -} diff --git a/tests/TestQMLWidgets/Page1Form.ui.qml b/tests/TestQMLWidgets/Page1Form.ui.qml deleted file mode 100644 index a25e78ae..00000000 --- a/tests/TestQMLWidgets/Page1Form.ui.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -Page { - width: 600 - height: 400 - - title: qsTr("Page 1") - - Label { - text: qsTr("You are on Page 1.") - anchors.centerIn: parent - } -} diff --git a/tests/TestQMLWidgets/Page2Form.ui.qml b/tests/TestQMLWidgets/Page2Form.ui.qml deleted file mode 100644 index c34bb984..00000000 --- a/tests/TestQMLWidgets/Page2Form.ui.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -Page { - width: 600 - height: 400 - - title: qsTr("Page 2") - - Label { - text: qsTr("You are on Page 2.") - anchors.centerIn: parent - } -} diff --git a/tests/TestQMLWidgets/TestQMLWidgets.pro b/tests/TestQMLWidgets/TestQMLWidgets.pro deleted file mode 100644 index f5b9d9f6..00000000 --- a/tests/TestQMLWidgets/TestQMLWidgets.pro +++ /dev/null @@ -1,28 +0,0 @@ -QT += quick -CONFIG += c++17 -CONFIG += release - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Refer to the documentation for the -# deprecated API to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp - -RESOURCES += qml.qrc - -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = - -# Additional import path used to resolve QML modules just for Qt Quick Designer -QML_DESIGNER_IMPORT_PATH = - -DESTDIR="$$PWD/../build" - diff --git a/tests/TestQMLWidgets/conf.qrc b/tests/TestQMLWidgets/conf.qrc deleted file mode 100644 index 03a1bfc7..00000000 --- a/tests/TestQMLWidgets/conf.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - qt.conf - - diff --git a/tests/TestQMLWidgets/main.cpp b/tests/TestQMLWidgets/main.cpp deleted file mode 100644 index b532603f..00000000 --- a/tests/TestQMLWidgets/main.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -int main(int argc, char *argv[]) -{ - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - - QGuiApplication app(argc, argv); - - QQmlApplicationEngine engine; - engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); - if (engine.rootObjects().isEmpty()) - return -1; - - QTimer::singleShot(200, [&app](){ app.exit(0);}); - - return app.exec(); -} diff --git a/tests/TestQMLWidgets/main.qml b/tests/TestQMLWidgets/main.qml deleted file mode 100644 index d5d621a3..00000000 --- a/tests/TestQMLWidgets/main.qml +++ /dev/null @@ -1,65 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -ApplicationWindow { - id: window - visible: true - width: 640 - height: 480 - title: qsTr("Stack") - - header: ToolBar { - contentHeight: toolButton.implicitHeight - - ToolButton { - id: toolButton - text: stackView.depth > 1 ? "\u25C0" : "\u2630" - font.pixelSize: Qt.application.font.pixelSize * 1.6 - onClicked: { - if (stackView.depth > 1) { - stackView.pop() - } else { - drawer.open() - } - } - } - - Label { - text: stackView.currentItem.title - anchors.centerIn: parent - } - } - - Drawer { - id: drawer - width: window.width * 0.66 - height: window.height - - Column { - anchors.fill: parent - - ItemDelegate { - text: qsTr("Page 1") - width: parent.width - onClicked: { - stackView.push("Page1Form.ui.qml") - drawer.close() - } - } - ItemDelegate { - text: qsTr("Page 2") - width: parent.width - onClicked: { - stackView.push("Page2Form.ui.qml") - drawer.close() - } - } - } - } - - StackView { - id: stackView - initialItem: "HomeForm.ui.qml" - anchors.fill: parent - } -} diff --git a/tests/TestQMLWidgets/qml.qrc b/tests/TestQMLWidgets/qml.qrc deleted file mode 100644 index 77259896..00000000 --- a/tests/TestQMLWidgets/qml.qrc +++ /dev/null @@ -1,9 +0,0 @@ - - - main.qml - HomeForm.ui.qml - Page1Form.ui.qml - Page2Form.ui.qml - qtquickcontrols2.conf - - diff --git a/tests/TestQMLWidgets/qtquickcontrols2.conf b/tests/TestQMLWidgets/qtquickcontrols2.conf deleted file mode 100644 index 08109fee..00000000 --- a/tests/TestQMLWidgets/qtquickcontrols2.conf +++ /dev/null @@ -1,6 +0,0 @@ -; This file can be edited to change the style of the application -; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Imagine diff --git a/tests/TestQtWidgets/TestQtWidgets.pro b/tests/TestQtWidgets/TestQtWidgets.pro deleted file mode 100644 index 30c2ca03..00000000 --- a/tests/TestQtWidgets/TestQtWidgets.pro +++ /dev/null @@ -1,41 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2018-12-23T16:21:23 -# -#------------------------------------------------- - -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -TARGET = QtWidgetsProject -TEMPLATE = app - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which has been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -CONFIG += c++17 -CONFIG += release - -SOURCES += \ - main.cpp \ - mainwindow.cpp - -HEADERS += \ - mainwindow.h - -FORMS += \ - mainwindow.ui - -DESTDIR="$$PWD/../build" - - - diff --git a/tests/TestQtWidgets/conf.qrc b/tests/TestQtWidgets/conf.qrc deleted file mode 100644 index 03a1bfc7..00000000 --- a/tests/TestQtWidgets/conf.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - qt.conf - - diff --git a/tests/TestQtWidgets/main.cpp b/tests/TestQtWidgets/main.cpp deleted file mode 100644 index 79fe5e8d..00000000 --- a/tests/TestQtWidgets/main.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "mainwindow.h" -#include -#include - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - MainWindow w; - w.show(); - - - QTimer::singleShot(200, [&a](){ a.exit(0);}); - - - return a.exec(); -} diff --git a/tests/TestQtWidgets/mainwindow.cpp b/tests/TestQtWidgets/mainwindow.cpp deleted file mode 100644 index 49d64fce..00000000 --- a/tests/TestQtWidgets/mainwindow.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow) -{ - ui->setupUi(this); -} - -MainWindow::~MainWindow() -{ - delete ui; -} diff --git a/tests/TestQtWidgets/mainwindow.h b/tests/TestQtWidgets/mainwindow.h deleted file mode 100644 index 93534413..00000000 --- a/tests/TestQtWidgets/mainwindow.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include - -namespace Ui { -class MainWindow; -} - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - explicit MainWindow(QWidget *parent = nullptr); - ~MainWindow(); - -private: - Ui::MainWindow *ui; -}; - -#endif // MAINWINDOW_H diff --git a/tests/TestQtWidgets/mainwindow.ui b/tests/TestQtWidgets/mainwindow.ui deleted file mode 100644 index 6050363f..00000000 --- a/tests/TestQtWidgets/mainwindow.ui +++ /dev/null @@ -1,24 +0,0 @@ - - MainWindow - - - - 0 - 0 - 400 - 300 - - - - MainWindow - - - - - - - - - - - diff --git a/tests/TestQtWidgets/qt.conf b/tests/TestQtWidgets/qt.conf deleted file mode 100644 index b19181a8..00000000 --- a/tests/TestQtWidgets/qt.conf +++ /dev/null @@ -1,2 +0,0 @@ -[Paths] -Prefix = /some/path diff --git a/tests/quicknanobrowser/ApplicationRoot.qml b/tests/quicknanobrowser/ApplicationRoot.qml deleted file mode 100644 index adae6f5f..00000000 --- a/tests/quicknanobrowser/ApplicationRoot.qml +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.1 -import QtWebEngine 1.9 - -QtObject { - id: root - - property QtObject defaultProfile: WebEngineProfile { - storageName: "Profile" - offTheRecord: false - useForGlobalCertificateVerification: true - } - - property QtObject otrProfile: WebEngineProfile { - offTheRecord: true - } - - property Component browserWindowComponent: BrowserWindow { - applicationRoot: root - onClosing: destroy() - } - property Component browserDialogComponent: BrowserDialog { - onClosing: destroy() - } - function createWindow(profile) { - var newWindow = browserWindowComponent.createObject(root); - newWindow.currentWebView.profile = profile; - profile.downloadRequested.connect(newWindow.onDownloadRequested); - return newWindow; - } - function createDialog(profile) { - var newDialog = browserDialogComponent.createObject(root); - newDialog.currentWebView.profile = profile; - return newDialog; - } - function load(url) { - var browserWindow = createWindow(defaultProfile); - browserWindow.currentWebView.url = url; - } -} diff --git a/tests/quicknanobrowser/BrowserDialog.qml b/tests/quicknanobrowser/BrowserDialog.qml deleted file mode 100644 index c2b6737c..00000000 --- a/tests/quicknanobrowser/BrowserDialog.qml +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.1 -import QtQuick.Window 2.2 -import QtWebEngine 1.9 - -Window { - id: window - property alias currentWebView: webView - flags: Qt.Dialog | Qt.WindowStaysOnTopHint - width: 800 - height: 600 - visible: true - onClosing: destroy() - WebEngineView { - id: webView - anchors.fill: parent - - onGeometryChangeRequested: function(geometry) { - window.x = geometry.x - window.y = geometry.y - window.width = geometry.width - window.height = geometry.height - } - } -} diff --git a/tests/quicknanobrowser/BrowserWindow.qml b/tests/quicknanobrowser/BrowserWindow.qml deleted file mode 100644 index 7fb87a24..00000000 --- a/tests/quicknanobrowser/BrowserWindow.qml +++ /dev/null @@ -1,654 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import Qt.labs.settings 1.0 -import QtQml 2.2 -import QtQuick 2.2 -import QtQuick.Controls 1.0 -import QtQuick.Controls.Private 1.0 as QQCPrivate -import QtQuick.Controls.Styles 1.0 -import QtQuick.Dialogs 1.2 -import QtQuick.Layouts 1.0 -import QtQuick.Window 2.1 -import QtWebEngine 1.9 - -ApplicationWindow { - id: browserWindow - property QtObject applicationRoot - property Item currentWebView: tabs.currentIndex < tabs.count ? tabs.getTab(tabs.currentIndex).item : null - property int previousVisibility: Window.Windowed - - width: 1300 - height: 900 - visible: true - title: currentWebView && currentWebView.title - - // Make sure the Qt.WindowFullscreenButtonHint is set on OS X. - Component.onCompleted: flags = flags | Qt.WindowFullscreenButtonHint - - // Create a styleItem to determine the platform. - // When using style "mac", ToolButtons are not supposed to accept focus. - QQCPrivate.StyleItem { id: styleItem } - property bool platformIsMac: styleItem.style == "mac" - - Settings { - id : appSettings - property alias autoLoadImages: loadImages.checked - property alias javaScriptEnabled: javaScriptEnabled.checked - property alias errorPageEnabled: errorPageEnabled.checked - property alias pluginsEnabled: pluginsEnabled.checked - property alias fullScreenSupportEnabled: fullScreenSupportEnabled.checked - property alias autoLoadIconsForPage: autoLoadIconsForPage.checked - property alias touchIconsEnabled: touchIconsEnabled.checked - property alias webRTCPublicInterfacesOnly : webRTCPublicInterfacesOnly.checked - property alias devToolsEnabled: devToolsEnabled.checked - property alias pdfViewerEnabled: pdfViewerEnabled.checked - } - - Action { - shortcut: "Ctrl+D" - onTriggered: { - downloadView.visible = !downloadView.visible; - } - } - Action { - id: focus - shortcut: "Ctrl+L" - onTriggered: { - addressBar.forceActiveFocus(); - addressBar.selectAll(); - } - } - Action { - shortcut: StandardKey.Refresh - onTriggered: { - if (currentWebView) - currentWebView.reload(); - } - } - Action { - shortcut: StandardKey.AddTab - onTriggered: { - tabs.createEmptyTab(tabs.count != 0 ? currentWebView.profile : defaultProfile); - tabs.currentIndex = tabs.count - 1; - addressBar.forceActiveFocus(); - addressBar.selectAll(); - } - } - Action { - shortcut: StandardKey.Close - onTriggered: { - currentWebView.triggerWebAction(WebEngineView.RequestClose); - } - } - Action { - shortcut: "Escape" - onTriggered: { - if (currentWebView.state == "FullScreen") { - browserWindow.visibility = browserWindow.previousVisibility; - fullScreenNotification.hide(); - currentWebView.triggerWebAction(WebEngineView.ExitFullScreen); - } - } - } - Action { - shortcut: "Ctrl+0" - onTriggered: currentWebView.zoomFactor = 1.0 - } - Action { - shortcut: StandardKey.ZoomOut - onTriggered: currentWebView.zoomFactor -= 0.1 - } - Action { - shortcut: StandardKey.ZoomIn - onTriggered: currentWebView.zoomFactor += 0.1 - } - - Action { - shortcut: StandardKey.Copy - onTriggered: currentWebView.triggerWebAction(WebEngineView.Copy) - } - Action { - shortcut: StandardKey.Cut - onTriggered: currentWebView.triggerWebAction(WebEngineView.Cut) - } - Action { - shortcut: StandardKey.Paste - onTriggered: currentWebView.triggerWebAction(WebEngineView.Paste) - } - Action { - shortcut: "Shift+"+StandardKey.Paste - onTriggered: currentWebView.triggerWebAction(WebEngineView.PasteAndMatchStyle) - } - Action { - shortcut: StandardKey.SelectAll - onTriggered: currentWebView.triggerWebAction(WebEngineView.SelectAll) - } - Action { - shortcut: StandardKey.Undo - onTriggered: currentWebView.triggerWebAction(WebEngineView.Undo) - } - Action { - shortcut: StandardKey.Redo - onTriggered: currentWebView.triggerWebAction(WebEngineView.Redo) - } - Action { - shortcut: StandardKey.Back - onTriggered: currentWebView.triggerWebAction(WebEngineView.Back) - } - Action { - shortcut: StandardKey.Forward - onTriggered: currentWebView.triggerWebAction(WebEngineView.Forward) - } - - toolBar: ToolBar { - id: navigationBar - RowLayout { - anchors.fill: parent - ToolButton { - enabled: currentWebView && (currentWebView.canGoBack || currentWebView.canGoForward) - menu:Menu { - id: historyMenu - - Instantiator { - model: currentWebView && currentWebView.navigationHistory.items - MenuItem { - text: model.title - onTriggered: currentWebView.goBackOrForward(model.offset) - checkable: !enabled - checked: !enabled - enabled: model.offset - } - - onObjectAdded: function(index, object) { - historyMenu.insertItem(index, object) - } - onObjectRemoved: function(index, object) { - historyMenu.removeItem(object) - } - } - } - } - - ToolButton { - id: backButton - iconSource: "icons/go-previous.png" - onClicked: currentWebView.goBack() - enabled: currentWebView && currentWebView.canGoBack - activeFocusOnTab: !browserWindow.platformIsMac - } - ToolButton { - id: forwardButton - iconSource: "icons/go-next.png" - onClicked: currentWebView.goForward() - enabled: currentWebView && currentWebView.canGoForward - activeFocusOnTab: !browserWindow.platformIsMac - } - ToolButton { - id: reloadButton - iconSource: currentWebView && currentWebView.loading ? "icons/process-stop.png" : "icons/view-refresh.png" - onClicked: currentWebView && currentWebView.loading ? currentWebView.stop() : currentWebView.reload() - activeFocusOnTab: !browserWindow.platformIsMac - } - TextField { - id: addressBar - Image { - anchors.verticalCenter: addressBar.verticalCenter; - x: 5 - z: 2 - id: faviconImage - width: 16; height: 16 - sourceSize: Qt.size(width, height) - source: currentWebView && currentWebView.icon - } - style: TextFieldStyle { - padding { - left: 26; - } - } - focus: true - Layout.fillWidth: true - text: currentWebView && currentWebView.url - onAccepted: currentWebView.url = utils.fromUserInput(text) - } - ToolButton { - id: settingsMenuButton - menu: Menu { - MenuItem { - id: loadImages - text: "Autoload images" - checkable: true - checked: WebEngine.settings.autoLoadImages - } - MenuItem { - id: javaScriptEnabled - text: "JavaScript On" - checkable: true - checked: WebEngine.settings.javascriptEnabled - } - MenuItem { - id: errorPageEnabled - text: "ErrorPage On" - checkable: true - checked: WebEngine.settings.errorPageEnabled - } - MenuItem { - id: pluginsEnabled - text: "Plugins On" - checkable: true - checked: true - } - MenuItem { - id: fullScreenSupportEnabled - text: "FullScreen On" - checkable: true - checked: WebEngine.settings.fullScreenSupportEnabled - } - MenuItem { - id: offTheRecordEnabled - text: "Off The Record" - checkable: true - checked: currentWebView && currentWebView.profile === otrProfile - onToggled: function(checked) { - if (currentWebView) { - currentWebView.profile = checked ? otrProfile : defaultProfile; - } - } - } - MenuItem { - id: httpDiskCacheEnabled - text: "HTTP Disk Cache" - checkable: currentWebView && !currentWebView.profile.offTheRecord - checked: currentWebView && (currentWebView.profile.httpCacheType === WebEngineProfile.DiskHttpCache) - onToggled: function(checked) { - if (currentWebView) { - currentWebView.profile.httpCacheType = checked ? WebEngineProfile.DiskHttpCache : WebEngineProfile.MemoryHttpCache; - } - } - } - MenuItem { - id: autoLoadIconsForPage - text: "Icons On" - checkable: true - checked: WebEngine.settings.autoLoadIconsForPage - } - MenuItem { - id: touchIconsEnabled - text: "Touch Icons On" - checkable: true - checked: WebEngine.settings.touchIconsEnabled - enabled: autoLoadIconsForPage.checked - } - MenuItem { - id: webRTCPublicInterfacesOnly - text: "WebRTC Public Interfaces Only" - checkable: true - checked: WebEngine.settings.webRTCPublicInterfacesOnly - } - MenuItem { - id: devToolsEnabled - text: "Open DevTools" - checkable: true - checked: false - } - MenuItem { - id: pdfViewerEnabled - text: "PDF viewer enabled" - checkable: true - checked: WebEngine.settings.pdfViewerEnabled - } - } - } - } - ProgressBar { - id: progressBar - height: 3 - anchors { - left: parent.left - top: parent.bottom - right: parent.right - leftMargin: -parent.leftMargin - rightMargin: -parent.rightMargin - } - style: ProgressBarStyle { - background: Item {} - } - z: -2; - minimumValue: 0 - maximumValue: 100 - value: (currentWebView && currentWebView.loadProgress < 100) ? currentWebView.loadProgress : 0 - } - } - - TabView { - id: tabs - function createEmptyTab(profile) { - var tab = addTab("", tabComponent); - // We must do this first to make sure that tab.active gets set so that tab.item gets instantiated immediately. - tab.active = true; - tab.title = Qt.binding(function() { return tab.item.title }); - tab.item.profile = profile; - return tab; - } - - anchors.top: parent.top - anchors.bottom: devToolsView.top - anchors.left: parent.left - anchors.right: parent.right - Component.onCompleted: createEmptyTab(defaultProfile) - - // Add custom tab view style so we can customize the tabs to include a close button - style: TabViewStyle { - property color frameColor: "#999" - property color fillColor: "#eee" - property color nonSelectedColor: "#ddd" - frameOverlap: 1 - frame: Rectangle { - color: "#eee" - border.color: frameColor - } - tab: Rectangle { - id: tabRectangle - color: styleData.selected ? fillColor : nonSelectedColor - border.width: 1 - border.color: frameColor - implicitWidth: Math.max(text.width + 30, 80) - implicitHeight: Math.max(text.height + 10, 20) - Rectangle { height: 1 ; width: parent.width ; color: frameColor} - Rectangle { height: parent.height ; width: 1; color: frameColor} - Rectangle { x: parent.width - 2; height: parent.height ; width: 1; color: frameColor} - Text { - id: text - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: 6 - text: styleData.title - elide: Text.ElideRight - color: styleData.selected ? "black" : frameColor - } - Button { - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.rightMargin: 4 - height: 12 - style: ButtonStyle { - background: Rectangle { - implicitWidth: 12 - implicitHeight: 12 - color: control.hovered ? "#ccc" : tabRectangle.color - Text {text: "x" ; anchors.centerIn: parent ; color: "gray"} - }} - onClicked: tabs.removeTab(styleData.index); - } - } - } - - Component { - id: tabComponent - WebEngineView { - id: webEngineView - focus: true - - onLinkHovered: function(hoveredUrl) { - if (hoveredUrl == "") - hideStatusText.start(); - else { - statusText.text = hoveredUrl; - statusBubble.visible = true; - hideStatusText.stop(); - } - } - - states: [ - State { - name: "FullScreen" - PropertyChanges { - target: tabs - frameVisible: false - tabsVisible: false - } - PropertyChanges { - target: navigationBar - visible: false - } - } - ] - settings.autoLoadImages: appSettings.autoLoadImages - settings.javascriptEnabled: appSettings.javaScriptEnabled - settings.errorPageEnabled: appSettings.errorPageEnabled - settings.pluginsEnabled: appSettings.pluginsEnabled - settings.fullScreenSupportEnabled: appSettings.fullScreenSupportEnabled - settings.autoLoadIconsForPage: appSettings.autoLoadIconsForPage - settings.touchIconsEnabled: appSettings.touchIconsEnabled - settings.webRTCPublicInterfacesOnly: appSettings.webRTCPublicInterfacesOnly - settings.pdfViewerEnabled: appSettings.pdfViewerEnabled - - onCertificateError: function(error) { - error.defer(); - sslDialog.enqueue(error); - } - - onNewViewRequested: function(request) { - if (!request.userInitiated) - print("Warning: Blocked a popup window."); - else if (request.destination === WebEngineView.NewViewInTab) { - var tab = tabs.createEmptyTab(currentWebView.profile); - tabs.currentIndex = tabs.count - 1; - request.openIn(tab.item); - } else if (request.destination === WebEngineView.NewViewInBackgroundTab) { - var backgroundTab = tabs.createEmptyTab(currentWebView.profile); - request.openIn(backgroundTab.item); - } else if (request.destination === WebEngineView.NewViewInDialog) { - var dialog = applicationRoot.createDialog(currentWebView.profile); - request.openIn(dialog.currentWebView); - } else { - var window = applicationRoot.createWindow(currentWebView.profile); - request.openIn(window.currentWebView); - } - } - - onFullScreenRequested: function(request) { - if (request.toggleOn) { - webEngineView.state = "FullScreen"; - browserWindow.previousVisibility = browserWindow.visibility; - browserWindow.showFullScreen(); - fullScreenNotification.show(); - } else { - webEngineView.state = ""; - browserWindow.visibility = browserWindow.previousVisibility; - fullScreenNotification.hide(); - } - request.accept(); - } - - onQuotaRequested: function(request) { - if (request.requestedSize <= 5 * 1024 * 1024) - request.accept(); - else - request.reject(); - } - - onRegisterProtocolHandlerRequested: function(request) { - console.log("accepting registerProtocolHandler request for " - + request.scheme + " from " + request.origin); - request.accept(); - } - - onRenderProcessTerminated: function(terminationStatus, exitCode) { - var status = ""; - switch (terminationStatus) { - case WebEngineView.NormalTerminationStatus: - status = "(normal exit)"; - break; - case WebEngineView.AbnormalTerminationStatus: - status = "(abnormal exit)"; - break; - case WebEngineView.CrashedTerminationStatus: - status = "(crashed)"; - break; - case WebEngineView.KilledTerminationStatus: - status = "(killed)"; - break; - } - - print("Render process exited with code " + exitCode + " " + status); - reloadTimer.running = true; - } - - onWindowCloseRequested: { - if (tabs.count == 1) - browserWindow.close(); - else - tabs.removeTab(tabs.currentIndex); - } - - onSelectClientCertificate: function(selection) { - selection.certificates[0].select(); - } - - Timer { - id: reloadTimer - interval: 0 - running: false - repeat: false - onTriggered: currentWebView.reload() - } - } - } - } - WebEngineView { - id: devToolsView - visible: devToolsEnabled.checked - height: visible ? 400 : 0 - inspectedView: visible && tabs.currentIndex < tabs.count ? tabs.getTab(tabs.currentIndex).item : null - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - onNewViewRequested: function(request) { - var tab = tabs.createEmptyTab(currentWebView.profile); - tabs.currentIndex = tabs.count - 1; - request.openIn(tab.item); - } - } - MessageDialog { - id: sslDialog - - property var certErrors: [] - icon: StandardIcon.Warning - standardButtons: StandardButton.No | StandardButton.Yes - title: "Server's certificate not trusted" - text: "Do you wish to continue?" - detailedText: "If you wish so, you may continue with an unverified certificate. " + - "Accepting an unverified certificate means " + - "you may not be connected with the host you tried to connect to.\n" + - "Do you wish to override the security check and continue?" - onYes: { - certErrors.shift().ignoreCertificateError(); - presentError(); - } - onNo: reject() - onRejected: reject() - - function reject(){ - certErrors.shift().rejectCertificate(); - presentError(); - } - function enqueue(error){ - certErrors.push(error); - presentError(); - } - function presentError(){ - visible = certErrors.length > 0 - } - } - - FullScreenNotification { - id: fullScreenNotification - } - - DownloadView { - id: downloadView - visible: false - anchors.fill: parent - } - - function onDownloadRequested(download) { - downloadView.visible = true; - downloadView.append(download); - download.accept(); - } - - Rectangle { - id: statusBubble - color: "oldlace" - property int padding: 8 - visible: false - - anchors.left: parent.left - anchors.bottom: parent.bottom - width: statusText.paintedWidth + padding - height: statusText.paintedHeight + padding - - Text { - id: statusText - anchors.centerIn: statusBubble - elide: Qt.ElideMiddle - - Timer { - id: hideStatusText - interval: 750 - onTriggered: { - statusText.text = ""; - statusBubble.visible = false; - } - } - } - } -} diff --git a/tests/quicknanobrowser/DownloadView.qml b/tests/quicknanobrowser/DownloadView.qml deleted file mode 100644 index 545a502a..00000000 --- a/tests/quicknanobrowser/DownloadView.qml +++ /dev/null @@ -1,175 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import QtQuick.Controls.Styles 1.0 -import QtWebEngine 1.9 -import QtQuick.Layouts 1.0 - -Rectangle { - id: downloadView - color: "lightgray" - - ListModel { - id: downloadModel - property var downloads: [] - } - - function append(download) { - downloadModel.append(download); - downloadModel.downloads.push(download); - } - - Component { - id: downloadItemDelegate - - Rectangle { - width: listView.width - height: childrenRect.height - anchors.margins: 10 - radius: 3 - color: "transparent" - border.color: "black" - Rectangle { - id: progressBar - - property real progress: downloadModel.downloads[index] - ? downloadModel.downloads[index].receivedBytes / downloadModel.downloads[index].totalBytes : 0 - - radius: 3 - color: width == listView.width ? "green" : "#2b74c7" - width: listView.width * progress - height: cancelButton.height - - Behavior on width { - SmoothedAnimation { duration: 100 } - } - } - Rectangle { - anchors { - left: parent.left - right: parent.right - leftMargin: 20 - } - Label { - id: label - text: path - anchors { - verticalCenter: cancelButton.verticalCenter - left: parent.left - right: cancelButton.left - } - } - Button { - id: cancelButton - anchors.right: parent.right - iconSource: "icons/process-stop.png" - onClicked: { - var download = downloadModel.downloads[index]; - - download.cancel(); - - downloadModel.downloads = downloadModel.downloads.filter(function (el) { - return el.id !== download.id; - }); - downloadModel.remove(index); - } - } - } - } - - } - ListView { - id: listView - anchors { - topMargin: 10 - top: parent.top - bottom: parent.bottom - horizontalCenter: parent.horizontalCenter - } - width: parent.width - 20 - spacing: 5 - - model: downloadModel - delegate: downloadItemDelegate - - Text { - visible: !listView.count - horizontalAlignment: Text.AlignHCenter - height: 30 - anchors { - top: parent.top - left: parent.left - right: parent.right - } - font.pixelSize: 20 - text: "No active downloads." - } - - Rectangle { - color: "gray" - anchors { - bottom: parent.bottom - left: parent.left - right: parent.right - } - height: 30 - Button { - id: okButton - text: "OK" - anchors.centerIn: parent - onClicked: { - downloadView.visible = false; - } - } - } - } -} diff --git a/tests/quicknanobrowser/FullScreenNotification.qml b/tests/quicknanobrowser/FullScreenNotification.qml deleted file mode 100644 index 55f5f00e..00000000 --- a/tests/quicknanobrowser/FullScreenNotification.qml +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.5 - -Rectangle { - id: fullScreenNotification - width: 500 - height: 40 - color: "white" - radius: 7 - - visible: false - opacity: 0 - - function show() { - visible = true; - opacity = 1; - reset.start(); - } - - function hide() { - reset.stop(); - opacity = 0; - } - - Behavior on opacity { - NumberAnimation { - duration: 750 - onStopped: { - if (opacity == 0) - visible = false; - } - } - } - - Timer { - id: reset - interval: 5000 - onTriggered: hide() - } - - anchors.horizontalCenter: parent.horizontalCenter - y: 125 - - Text { - id: message - width: parent.width - - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - - wrapMode: Text.WordWrap - elide: Text.ElideNone - clip: true - - text: qsTr("You are now in fullscreen mode. Press ESC to quit!") - } -} diff --git a/tests/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg b/tests/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg deleted file mode 100644 index 12693bb0fd9323234e38e3269862412579b3be42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30156 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 K&Jw_13;zq!78Q~J diff --git a/tests/quicknanobrowser/doc/src/quicknanobrowser.qdoc b/tests/quicknanobrowser/doc/src/quicknanobrowser.qdoc deleted file mode 100644 index 48a63c79..00000000 --- a/tests/quicknanobrowser/doc/src/quicknanobrowser.qdoc +++ /dev/null @@ -1,149 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example webengine/quicknanobrowser - \title WebEngine Quick Nano Browser - \ingroup webengine-examples - \brief A web browser implemented using the WebEngineView QML type. - - \image quicknanobrowser-demo.jpg - - \e {Quick Nano Browser} demonstrates how to use the \l{Qt WebEngine QML Types} - {Qt WebEngine QML types} to develop a small web browser application that consists of a browser - window with a title bar, toolbar, tab view, and status bar. The web content is loaded in a web - engine view within the tab view. If certificate errors occur, users are prompted for action in a - message dialog. The status bar pops up to display the URL of a hovered link. - - A web page can issue a request for being displayed in fullscreen mode. Users can allow full - screen mode by using a toolbar button. They can leave fullscreen mode by using a keyboard - shortcut. Additional toolbar buttons enable moving backwards and forwards in the browser - history, reloading tab content, and opening a settings menu for enabling the following features: - JavaScript, plugins, fullscreen mode, off the record, HTTP disk cache, autoloading images, and - ignoring certificate errors. - - \include examples-run.qdocinc - - \section1 Creating the Main Browser Window - - When the browser main window is loaded, it creates an empty tab using the default profile. Each - tab is a web engine view that fills the main window. - - We create the main window in the \e BrowserWindow.qml file using the ApplicationWindow type: - - \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml - \skipto ApplicationWindow - \printuntil currentWebView - \dots - \skipto width - \printuntil title - - We use the TabView Qt Quick control to create an empty tab view that fills the main window. We - set the tab active first, to make sure that the tab item is immediately instantiated: - - \skipto TabView - \printuntil Component.onCompleted - - The tab contains a web engine view that loads web content: - - \printuntil focus - - We use the \l Action type to create new tabs: - - \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml - \skipto reload - \skipto Action - \printuntil } - - We use the \l TextField Qt Quick Control within a \l ToolBar to create an address bar that - shows the current URL and where users can enter another URL: - - \skipto toolBar - \printuntil anchors.fill - \dots - \skipto TextField - \printuntil addressBar - \dots - \skipto focus - \printuntil /^\ {16}\}/ - - \section1 Handling Certificate Errors - - If the certificate of the site being loaded triggers a certificate error, we call the - \l{WebEngineCertificateError::}{defer()} QML method to pause the URL request and wait for user - input: - - \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml - \skipto onCertificateError - \printuntil } - - We use the MessageDialog type to prompt users to continue or cancel the loading of the web page. - If users select \uicontrol Yes, we call the - \l{WebEngineCertificateError::}{ignoreCertificateError()} method to ignore the error and - continue loading content from the URL. If users select \uicontrol No, we call the - \l{WebEngineCertificateError::}{rejectCertificate()} method to reject the request and stop - loading content from the URL: - - \skipto MessageDialog - \printuntil /^\ {4}\}/ - - \section1 Entering and Leaving Fullscreen Mode - - We create a menu item for allowing fullscreen mode in a settings menu that we place on the tool - bar. Also, we create an action for leaving fullscreen mode by using a keyboard shortcut. - We call the \l{FullScreenRequest::}{accept()} method to accept the fullscreen request. - The methdod sets the \l{WebEngineView::}{isFullScreen} property to be equal to the - \l{FullScreenRequest::}{toggleOn} property. - - \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml - \skipto onFullScreenRequested - \printuntil /^\ {16}\}/ - - When entering fullscreen mode, we display a notification using the FullScreenNotification custom - type that we create in \e FullScreenNotification.qml. - - We use the \l Action type in the settings menu to create a shortcut for leaving fullscreen mode - by pressing the escape key: - - \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml - \skipto Settings - \printuntil appSettings - \skipto fullScreenSupportEnabled - \printuntil Action - \skipto Escape - \printuntil /^\ {4}\}/ - - \section1 Files and Attributions - - The example uses icons from the Tango Icon Library: - - \table - \row - \li \l{quicknanobrowser-tango}{Tango Icon Library} - \li Public Domain - \endtable -*/ diff --git a/tests/quicknanobrowser/icons/3rdparty/COPYING b/tests/quicknanobrowser/icons/3rdparty/COPYING deleted file mode 100644 index 95490508..00000000 --- a/tests/quicknanobrowser/icons/3rdparty/COPYING +++ /dev/null @@ -1 +0,0 @@ -The icons in this repository are herefore released into the Public Domain. diff --git a/tests/quicknanobrowser/icons/3rdparty/go-next.png b/tests/quicknanobrowser/icons/3rdparty/go-next.png deleted file mode 100644 index 6f3f65d33d303315f0d8d9dd03c7e7e2427d4950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 930 zcmV;T16}-yP)b zm0M^XRTPH5HM8gBV(mpKDJa$_Z|#GH3N?w)f>s1UMXmZGQl%7pX-P>7f}&tiq(1aT zP)ljdLx@@mDPl`Bh9;&enie%Q#!J+svBm_`ljO{0&t5*9IdzgY(T8-w&&-B3-`fA$ zi`k;8T#fLq3ibbj8=Hf!`X=+>l7rQ;d2QV-?>9CVb}uOyV8_ERRIj^vt-Jr}^J`7#mgi;JV)-V&XlM@pz)^Qubt9p3w))KZP8v6Cty-~c zRl~=9ZT*|}%9hiw>&TVBk{`E*J%R4u*)k_V)uAX(9bH4M2p)H=X<%%8)E(<;`P*81 z@8<{N{{IBOvg2J&{nVa86~&Rd6sHcSmeg5NwcJ*BHyV2!{p9dWDJ(v9>J8g5$L0J= zsk213L}W|EX-H&4k~AVoLt+~ery;Q|@y+iixR{RdYHa50=@ zc;Z`>a*MNG;dVYeab$LCdg4%TZMthga6bIN!w)=6m3OItX9Q0?*00)%Kf9c^j>EIlQ#1Qc zA57l?;H7zB5ee#>%FD+$>_Y(0NEvPf-v}qi-lVpshC8o+i1CprJ$AfhX7ZQl+3(t2 zH&6>05s6eaF&WeV1%>gq+V-!$Z0APe-Os&PsP>n$@w!Jj_x-uF^Rtr^!@atFw9gFz zHT*jWDk5oR$3Ecq9kAr&;el~2&q-4lO(_RF6KKCrtkj_?;y0348J zvVd8%$N30LAs>C(5f2Uy_MAE5UP~ip7D;y%aK4(KDFy_}Bhr4nHU9O7(L-n7bFEo! zk}1x<%d6Z9Rkb2Q1|nz80wzuLs~`JES_Y1~?yQi@K`QVBC;_3W>YRUtl<7g%+ko=a zR2)dofzERo0gb zl}%_|RTze!@0@e*&7V^HBN&Y|1&xTHg2tGcEZQg$sloamid{(QrYma`p)R6`8xe$x zE=)JAVs%lCB0?>;8x67IczQ|E_9Y~NZ8{U=yn5|bNt zZ{FN-`>T5f542e0(zO_A*m+=BT65yYyKmi^zpwkzroe@3VKxTmpO<#Qo$9}PN9Ubg z_Xgiie@@TlL5!nPUT}-K{lP!##V{MR`u1A(tAcYQ;T_gAofzD<^P1~6-C!rCJ_VE{ zO?Y9~Tg^rcf*`V-pKddeGBNcDMl99@d@*?#BMu`5 zYb=66M96P>ym1t{;b7mot2ey7qkmV+`Nb)IK6?gh0-Om*H6=|GtZ^8z_|#xB$4MHa zD6$$jKjIFyZ|rzxApcm)!!tZo00$ zhq5n{niALwE`qSx617;GS}jp)^&B)CQmI@XtfQKK{hHtR*X)JiW5*8{*M}YSbUs87 z1lYjfLPHRlDtrlQago7TL4k#H%e?#y8Bg9ja)0mkw!Y3Mr7-(3 zYAQUqh^+o!nj9Hs){H z=}ylcLsNMD&@1I~F^*P_E-*KL76XJLlGGgAOs=NizD)j@|COP{pFB8!alR|pGZbnf z#AOW%WB!5iMHYZ^rc$=oSgzquXnvZ7!rRH-LgDnu&rXb&7mKAv<@GDAIZiV9I`7ewn;fJhF#0jl@vQT*g_QU!iIgs_I1~i>lhOu8{-W_eYbl%HYh8>o&{o zBxWuf-PgfmU=b*(s!IKhkt#g^qHK3{6G$e_R6k`ID61~NDss8UR75P*@7&g@Hcf4! d1W0rh$lr11Sh~C<&aD6d002ovPDHLkV1hiw#cluq diff --git a/tests/quicknanobrowser/icons/3rdparty/process-stop.png b/tests/quicknanobrowser/icons/3rdparty/process-stop.png deleted file mode 100644 index b68290bf1ebf568d8ab080a4e3ec7d75048ec461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 zcmVP(cu>t+olJDB6Oi7<19INt@fcyGh*L?Ahx%bEXfwuEs>^z{fny z%x}K=F8>icV;qMifOy81NDJ6=Ej;zmN%%s+rvl_$>k2dh=Ow(;0_uN(Pr~WyhK7%} zHZ{3*mkX3CnzC)MEUZ+DpWE9rgMEG9OW5-yd=~fwoT;v_|6tqBo$h#FAF1(iux+sI zJXA`Ql(-iyV*Z*nTse0xGt}Gr-RJP`;~f17=vUQsb?mwZsAw=PBr5?>n zVHpONVNg?F?}*0Z)vtxa%RAtQS>O}!_3A)i&-UhKPpqehbRMKZ1HFw&nEyHfUfIk zLXf_H9|}+RS{9)*XAnZL?7#t1<>eTqrM%qQinFwozYZP3ZJM|Mr4&XujIL>@LM|M| zx>PEkc_Bb4Dr}qh)D*$fr&)3EATJ(2j;?8FN-=QwFa(46aygVzD5bEK0x640)*e;7 zDwfm3k}A*TU~-bF3m0&DJUG2xA{Q@Wjg1wdwryiSgv&?0h4CGCbns!G!05h^3KijSjv1eNJ#=PJRV*;b_{1(8ULI* zMc@AYXhKkP^e9u~tsnJvA|wym+@;ktDV4bEI7LT+LL zXClFaa2Pc*f@fd=y8zIpr-|OVLoS)b6^)V`8Nsu1B~^g{JvVNcp~=bH9q^3~&;eKL zQYke$Hnwry=FQHWVUP(1(T0Z5L!lznE|^nFa=pD|M@A^EtfVp!;7)I^`RCocf7tMP zCs;+T=zyym(`h+6K3?yyuXpB>NwV>H5vJyt%PK2bSzF8Rot@eKv9Vumc(Vnvv(&8v zuGM8S=4ddu$sY(fbD0d;bQ*LWrR$(+sDhPORk7Uf=h`p7WQJm~A8mNM1+1s(u@hMG zF??3z^L_Z%h7Bdo`STHFW%=SSXtI(L<@M5e{=C^8kN@^19I_z-gn{&v;8I{Y@I0`r z33j{+ZvaB&_X!0; -Steven Garrity -Lapo Calamandrei -Ryan Collier -Rodney Dawes -Andreas Nilsson -Tuomas Kuosmanen -Garrett LeSage -Jakub Steiner " -} diff --git a/tests/quicknanobrowser/icons/3rdparty/view-refresh.png b/tests/quicknanobrowser/icons/3rdparty/view-refresh.png deleted file mode 100644 index cab4d02c756502f922bbff34df34c0056406bd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1364 zcmV-a1*`grP)b zm1#^AXBfx-?>jR)yR%CSkD4Z}F=^Tmf|{770@hEqO%szQ{n9is zHEGgX6eKmafTT2OwXsKHJW8z!1VLK`LOl=`0dax7=XjrfU?CiS@JlE8XOfv`e)F4W zo|%^s5&n;jKTAy&;^&>EBHBBo`5EO|sKj&=J z5_Cb3Xb}|nqocOcn7QVqeWz0dr@u@KTRZD39?SzX23GoBb3MSyUw(0^ZDmff>~gB$ zoI%$O1VRQLJess_^m+m#;{k~=9QJeN3zwvG=)Bz$Vg)gg)ls`=U>nzH zUSF+63=0$fFk&_?ZmD@ zc?Mck^<7DVOM82J@iOh}mUc1b4RX!_VG$97nd)|hN(wTZg)gK^L_o+OY+avgFUrrb z_dk3R^J-BR>*^ggbs>p)FV8M3)z7(9XZ@K@nhF@qVOPSI5Z_;`t>7V!6wio%`?=P> zA3pu2HQ3fOOioq8(0B+>0w&hyr!z(7uq*-D9-a>d!)pV>lgu3#<6WMedPCPuFCab# zfSWZH-uC*6wktK|<%Vu;{QXK_`-vYrg7FTH%p?t$ZjC~bI4mJpWT7z$sG36^%FIZv zjn(W8V7$*Fn|I;FwAEE~>4te|Dxga-4h2KwAqW6=g~PIlDMA(iFxz8Gh+v}2@nwv| z{_|(`Ig88U z%-%Ny0HAWkqWLbWYDiTyjEIJ7LTO$Sn$F*e42=4Y zwjJNqu+UBx&J;-%$5e;!r^&ELn(+IpY_e?4oS!pp)0T!Qkdf#F1JK<+Mx3!##qTsP zUG&@%p0g~mVbT}eef!?vhrU2Kn{nKoz45Fth%o?ba^f&J9>kEBT0b&DOv1B6Yh(lH4dhQNwwkZ<1V>QD&5vpGVo|a|^hIHgFiABV;(0R{` zR|+$w;{0^28<*3^uZbcVE|zw(r3W-b^98;e$VZ)-gBS*1HciDJ$>!YH7P5%l`C5O zT5zU1RmBKKOo<2(5#OJqeXYj^t~PZ82t^YlqTmdet=@g?&6^GTF9WaxQ0GL6Mv|Ov zB_X3AA?O|U21fh50QBfwN1{+4fCv%MqNRy3Ce4A(LT%lQu} WX -typedef QApplication Application; -#else -#include -typedef QGuiApplication Application; -#endif -#include -#include -#include - -static QUrl startupUrl() -{ - QUrl ret; - QStringList args(qApp->arguments()); - args.takeFirst(); - for (const QString &arg : qAsConst(args)) { - if (arg.startsWith(QLatin1Char('-'))) - continue; - ret = Utils::fromUserInput(arg); - if (ret.isValid()) - return ret; - } - return QUrl(QStringLiteral("https://www.qt.io")); -} - -int main(int argc, char **argv) -{ - QCoreApplication::setOrganizationName("QtExamples"); - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - - Application app(argc, argv); - - QtWebEngine::initialize(); - - QQmlApplicationEngine appEngine; - Utils utils; - appEngine.rootContext()->setContextProperty("utils", &utils); - appEngine.load(QUrl("qrc:/ApplicationRoot.qml")); - if (!appEngine.rootObjects().isEmpty()) - QMetaObject::invokeMethod(appEngine.rootObjects().first(), "load", Q_ARG(QVariant, startupUrl())); - else - qFatal("Failed to load sources"); - - return app.exec(); -} diff --git a/tests/quicknanobrowser/quicknanobrowser.pro b/tests/quicknanobrowser/quicknanobrowser.pro deleted file mode 100644 index a9d64c76..00000000 --- a/tests/quicknanobrowser/quicknanobrowser.pro +++ /dev/null @@ -1,25 +0,0 @@ -requires(qtConfig(accessibility)) -CONFIG += release - -TEMPLATE = app -TARGET = quicknanobrowser - -HEADERS = utils.h -SOURCES = main.cpp - -OTHER_FILES += ApplicationRoot.qml \ - BrowserDialog.qml \ - BrowserWindow.qml \ - DownloadView.qml \ - FullScreenNotification.qml - -RESOURCES += resources.qrc - -QT += qml quick webengine - -qtHaveModule(widgets) { - QT += widgets # QApplication is required to get native styling with QtQuickControls -} - - -DESTDIR="$$PWD/../build" diff --git a/tests/quicknanobrowser/resources.qrc b/tests/quicknanobrowser/resources.qrc deleted file mode 100644 index af52c47e..00000000 --- a/tests/quicknanobrowser/resources.qrc +++ /dev/null @@ -1,15 +0,0 @@ - - - ApplicationRoot.qml - BrowserDialog.qml - BrowserWindow.qml - DownloadView.qml - FullScreenNotification.qml - - - icons/3rdparty/go-next.png - icons/3rdparty/go-previous.png - icons/3rdparty/process-stop.png - icons/3rdparty/view-refresh.png - - diff --git a/tests/quicknanobrowser/utils.h b/tests/quicknanobrowser/utils.h deleted file mode 100644 index 260a0c93..00000000 --- a/tests/quicknanobrowser/utils.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef UTILS_H -#define UTILS_H - -#include -#include - -class Utils : public QObject { - Q_OBJECT -public: - Q_INVOKABLE static QUrl fromUserInput(const QString& userInput); -}; - -inline QUrl Utils::fromUserInput(const QString& userInput) -{ - QFileInfo fileInfo(userInput); - if (fileInfo.exists()) - return QUrl::fromLocalFile(fileInfo.absoluteFilePath()); - return QUrl::fromUserInput(userInput); -} - -#endif // UTILS_H diff --git a/UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/control b/tests/testRes/DEBCustomTemplate/chrome/DEBIAN/control similarity index 100% rename from UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/control rename to tests/testRes/DEBCustomTemplate/chrome/DEBIAN/control diff --git a/UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/postinst b/tests/testRes/DEBCustomTemplate/chrome/DEBIAN/postinst similarity index 100% rename from UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/postinst rename to tests/testRes/DEBCustomTemplate/chrome/DEBIAN/postinst diff --git a/UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/postrm b/tests/testRes/DEBCustomTemplate/chrome/DEBIAN/postrm similarity index 100% rename from UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/postrm rename to tests/testRes/DEBCustomTemplate/chrome/DEBIAN/postrm diff --git a/UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/prerm b/tests/testRes/DEBCustomTemplate/chrome/DEBIAN/prerm similarity index 100% rename from UnitTests/testRes/DEBCustomTemplate/chrome/DEBIAN/prerm rename to tests/testRes/DEBCustomTemplate/chrome/DEBIAN/prerm diff --git a/UnitTests/testRes/QIFCustomTemplate/config/config.xml b/tests/testRes/QIFCustomTemplate/config/config.xml similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/config/config.xml rename to tests/testRes/QIFCustomTemplate/config/config.xml diff --git a/UnitTests/testRes/QIFCustomTemplate/config/style.qss b/tests/testRes/QIFCustomTemplate/config/style.qss similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/config/style.qss rename to tests/testRes/QIFCustomTemplate/config/style.qss diff --git a/UnitTests/testRes/QIFCustomTemplate/customRes.qrc b/tests/testRes/QIFCustomTemplate/customRes.qrc similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/customRes.qrc rename to tests/testRes/QIFCustomTemplate/customRes.qrc diff --git a/UnitTests/testRes/QIFCustomTemplate/customconfig.xml b/tests/testRes/QIFCustomTemplate/customconfig.xml similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/customconfig.xml rename to tests/testRes/QIFCustomTemplate/customconfig.xml diff --git a/UnitTests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs b/tests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs rename to tests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs diff --git a/UnitTests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/package.xml b/tests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/package.xml similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/package.xml rename to tests/testRes/QIFCustomTemplate/custompackages/org.qtproject.ifw.example.stylesheet/meta/package.xml diff --git a/UnitTests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs b/tests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs rename to tests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/installscript.qs diff --git a/UnitTests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/package.xml b/tests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/package.xml similarity index 100% rename from UnitTests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/package.xml rename to tests/testRes/QIFCustomTemplate/packages/org.qtproject.ifw.example.stylesheet/meta/package.xml diff --git a/UnitTests/testRes/TestIcon.png b/tests/testRes/TestIcon.png similarity index 100% rename from UnitTests/testRes/TestIcon.png rename to tests/testRes/TestIcon.png diff --git a/UnitTests/testRes/TestQMLWidgets.sh b/tests/testRes/TestQMLWidgets.sh similarity index 100% rename from UnitTests/testRes/TestQMLWidgets.sh rename to tests/testRes/TestQMLWidgets.sh diff --git a/UnitTests/testRes/Unix/Start b/tests/testRes/Unix/Start similarity index 100% rename from UnitTests/testRes/Unix/Start rename to tests/testRes/Unix/Start diff --git a/UnitTests/testRes/Unix/lib.so.1 b/tests/testRes/Unix/lib.so.1 similarity index 100% rename from UnitTests/testRes/Unix/lib.so.1 rename to tests/testRes/Unix/lib.so.1 diff --git a/UnitTests/testRes/customRunScript.sh b/tests/testRes/customRunScript.sh similarity index 100% rename from UnitTests/testRes/customRunScript.sh rename to tests/testRes/customRunScript.sh diff --git a/UnitTests/testRes/debugLibData b/tests/testRes/debugLibData similarity index 100% rename from UnitTests/testRes/debugLibData rename to tests/testRes/debugLibData diff --git a/UnitTests/testRes/qml/Scene b/tests/testRes/qml/Scene similarity index 100% rename from UnitTests/testRes/qml/Scene rename to tests/testRes/qml/Scene diff --git a/UnitTests/testRes/qml/SceneQt6 b/tests/testRes/qml/SceneQt6 similarity index 100% rename from UnitTests/testRes/qml/SceneQt6 rename to tests/testRes/qml/SceneQt6 diff --git a/UnitTests/testRes/qml/qmldir b/tests/testRes/qml/qmldir similarity index 100% rename from UnitTests/testRes/qml/qmldir rename to tests/testRes/qml/qmldir diff --git a/UnitTests/testRes/testMultiPackageConfig.json b/tests/testRes/testMultiPackageConfig.json similarity index 100% rename from UnitTests/testRes/testMultiPackageConfig.json rename to tests/testRes/testMultiPackageConfig.json diff --git a/UnitTests/testRes/win32/mingw/hanoi-towers.exe b/tests/testRes/win32/mingw/hanoi-towers.exe similarity index 100% rename from UnitTests/testRes/win32/mingw/hanoi-towers.exe rename to tests/testRes/win32/mingw/hanoi-towers.exe diff --git a/UnitTests/testRes/win32/msvc/TestStart.exe b/tests/testRes/win32/msvc/TestStart.exe similarity index 100% rename from UnitTests/testRes/win32/msvc/TestStart.exe rename to tests/testRes/win32/msvc/TestStart.exe diff --git a/UnitTests/testRes/win64/mingw/cqtdeployer.exe b/tests/testRes/win64/mingw/cqtdeployer.exe similarity index 100% rename from UnitTests/testRes/win64/mingw/cqtdeployer.exe rename to tests/testRes/win64/mingw/cqtdeployer.exe diff --git a/UnitTests/testRes/win64/msvc/exe.exe b/tests/testRes/win64/msvc/exe.exe similarity index 100% rename from UnitTests/testRes/win64/msvc/exe.exe rename to tests/testRes/win64/msvc/exe.exe diff --git a/tests/tstMain.cpp b/tests/tstMain.cpp new file mode 100644 index 00000000..ba33bb01 --- /dev/null +++ b/tests/tstMain.cpp @@ -0,0 +1,86 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + +#include +#include "exampletest.h" + +// Use This macros for initialize your own test classes. +// Check exampletests +#define TestCase(name, testClass) \ + void name() { \ + initTest(new testClass()); \ + } + +/** + * @brief The tstMain class - this is main test class + */ +class tstMain : public QObject +{ + Q_OBJECT + + +public: + tstMain(); + + ~tstMain(); + +private slots: + + + // BEGIN TESTS CASES + TestCase(exampleTest, ExampleTest) + // END TEST CASES + +private: + + /** + * @brief initTest This method prepare @a test for run in the QApplication loop. + * @param test are input test case class. + */ + void initTest(Test* test); + + QCoreApplication *_app = nullptr; +}; + +/** + * @brief tstMain::tstMain + * init all availabel units for testsing + */ +tstMain::tstMain() { + + // init xample unit test + int argc =0; + char * argv[] = {nullptr}; + + _app = new QCoreApplication(argc, argv); + QCoreApplication::setApplicationName("testCQtDeployer"); + QCoreApplication::setOrganizationName("QuasarApp"); + + auto path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + + QDir(path).removeRecursively(); + +} + +tstMain::~tstMain() { + _app->exit(0); + delete _app; +} + +void tstMain::initTest(Test *test) { + QTimer::singleShot(0, this, [this, test]() { + test->test(); + delete test; + _app->exit(0); + }); + + _app->exec(); +} + +QTEST_APPLESS_MAIN(tstMain) + +#include "tstMain.moc" diff --git a/UnitTests/libcreator.cpp b/tests/units/libcreator.cpp similarity index 100% rename from UnitTests/libcreator.cpp rename to tests/units/libcreator.cpp diff --git a/UnitTests/libcreator.h b/tests/units/libcreator.h similarity index 100% rename from UnitTests/libcreator.h rename to tests/units/libcreator.h diff --git a/UnitTests/modules.cpp b/tests/units/modules.cpp similarity index 100% rename from UnitTests/modules.cpp rename to tests/units/modules.cpp diff --git a/UnitTests/modules.h b/tests/units/modules.h similarity index 100% rename from UnitTests/modules.h rename to tests/units/modules.h diff --git a/UnitTests/modulesqt513.cpp b/tests/units/modulesqt513.cpp similarity index 100% rename from UnitTests/modulesqt513.cpp rename to tests/units/modulesqt513.cpp diff --git a/UnitTests/modulesqt513.h b/tests/units/modulesqt513.h similarity index 100% rename from UnitTests/modulesqt513.h rename to tests/units/modulesqt513.h diff --git a/UnitTests/modulesqt514.cpp b/tests/units/modulesqt514.cpp similarity index 100% rename from UnitTests/modulesqt514.cpp rename to tests/units/modulesqt514.cpp diff --git a/UnitTests/modulesqt514.h b/tests/units/modulesqt514.h similarity index 100% rename from UnitTests/modulesqt514.h rename to tests/units/modulesqt514.h diff --git a/UnitTests/modulesqt515.cpp b/tests/units/modulesqt515.cpp similarity index 100% rename from UnitTests/modulesqt515.cpp rename to tests/units/modulesqt515.cpp diff --git a/UnitTests/modulesqt515.h b/tests/units/modulesqt515.h similarity index 100% rename from UnitTests/modulesqt515.h rename to tests/units/modulesqt515.h diff --git a/UnitTests/modulesqt5152.cpp b/tests/units/modulesqt5152.cpp similarity index 100% rename from UnitTests/modulesqt5152.cpp rename to tests/units/modulesqt5152.cpp diff --git a/UnitTests/modulesqt5152.h b/tests/units/modulesqt5152.h similarity index 100% rename from UnitTests/modulesqt5152.h rename to tests/units/modulesqt5152.h diff --git a/UnitTests/qmlcreator.cpp b/tests/units/qmlcreator.cpp similarity index 100% rename from UnitTests/qmlcreator.cpp rename to tests/units/qmlcreator.cpp diff --git a/UnitTests/qmlcreator.h b/tests/units/qmlcreator.h similarity index 100% rename from UnitTests/qmlcreator.h rename to tests/units/qmlcreator.h diff --git a/tests/units/test.cpp b/tests/units/test.cpp new file mode 100644 index 00000000..b5439b30 --- /dev/null +++ b/tests/units/test.cpp @@ -0,0 +1,9 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "test.h" diff --git a/tests/units/test.h b/tests/units/test.h new file mode 100644 index 00000000..d4ccf078 --- /dev/null +++ b/tests/units/test.h @@ -0,0 +1,20 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef TEST_H +#define TEST_H + +class Test +{ +public: + Test() = default; + virtual ~Test() = default; + virtual void test() = 0; +}; + +#endif // TEST_H diff --git a/UnitTests/testutils.cpp b/tests/units/testutils.cpp similarity index 100% rename from UnitTests/testutils.cpp rename to tests/units/testutils.cpp diff --git a/UnitTests/testutils.h b/tests/units/testutils.h similarity index 100% rename from UnitTests/testutils.h rename to tests/units/testutils.h diff --git a/UnitTests/tst_deploytest.cpp b/tests/units/tst_deploytest.cpp similarity index 100% rename from UnitTests/tst_deploytest.cpp rename to tests/units/tst_deploytest.cpp diff --git a/tests/virtualkeyboard/basic/Basic.qml b/tests/virtualkeyboard/basic/Basic.qml deleted file mode 100644 index 465b7837..00000000 --- a/tests/virtualkeyboard/basic/Basic.qml +++ /dev/null @@ -1,146 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.10 -import QtQuick.Controls 2.3 -import QtQuick.VirtualKeyboard 2.1 -import "content" - -Rectangle { - width: 1280 - height: 720 - color: "#F6F6F6" - - // Only set with CONFIG+=disable-desktop. - property bool handwritingInputPanelActive: false - - Flickable { - id: flickable - anchors.fill: parent - contentWidth: content.width - contentHeight: content.height - interactive: contentHeight > height - flickableDirection: Flickable.VerticalFlick - - property real scrollMarginVertical: 20 - - ScrollBar.vertical: ScrollBar {} - - MouseArea { - id: content - width: flickable.width - height: textEditors.height + 24 - - onClicked: focus = true - - Column { - id: textEditors - spacing: 15 - x: 12 - y: 12 - width: parent.width - 26 - - Label { - color: "#565758" - text: "Tap fields to enter text" - anchors.horizontalCenter: parent.horizontalCenter - font.pixelSize: 22 - } - TextField { - width: parent.width - placeholderText: "One line field" - enterKeyAction: EnterKeyAction.Next - onAccepted: passwordField.focus = true - } - TextField { - id: passwordField - width: parent.width - echoMode: TextInput.Password - placeholderText: "Password field" - inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText - enterKeyAction: EnterKeyAction.Next - onAccepted: upperCaseField.focus = true - } - TextField { - id: upperCaseField - width: parent.width - placeholderText: "Upper case field" - inputMethodHints: Qt.ImhUppercaseOnly - enterKeyAction: EnterKeyAction.Next - onAccepted: lowerCaseField.focus = true - } - TextField { - id: lowerCaseField - width: parent.width - placeholderText: "Lower case field" - inputMethodHints: Qt.ImhLowercaseOnly - enterKeyAction: EnterKeyAction.Next - onAccepted: phoneNumberField.focus = true - } - TextField { - id: phoneNumberField - validator: RegExpValidator { regExp: /^[0-9\+\-\#\*\ ]{6,}$/ } - width: parent.width - placeholderText: "Phone number field" - inputMethodHints: Qt.ImhDialableCharactersOnly - enterKeyAction: EnterKeyAction.Next - onAccepted: formattedNumberField.focus = true - } - TextField { - id: formattedNumberField - width: parent.width - placeholderText: "Formatted number field" - inputMethodHints: Qt.ImhFormattedNumbersOnly - enterKeyAction: EnterKeyAction.Next - onAccepted: digitsField.focus = true - } - TextField { - id: digitsField - width: parent.width - placeholderText: "Digits only field" - inputMethodHints: Qt.ImhDigitsOnly - enterKeyAction: EnterKeyAction.Next - onAccepted: textArea.focus = true - } - TextArea { - id: textArea - width: parent.width - placeholderText: "Multiple line field" - height: Math.max(206, implicitHeight) - } - } - } - } - - // Hide the text fields' cursors when fullscreen handwriting is active. - MouseArea { - anchors.fill: parent - visible: handwritingInputPanelActive - } -} diff --git a/tests/virtualkeyboard/basic/basic-b2qt.qml b/tests/virtualkeyboard/basic/basic-b2qt.qml deleted file mode 100644 index b189416e..00000000 --- a/tests/virtualkeyboard/basic/basic-b2qt.qml +++ /dev/null @@ -1,174 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -// Deliberately imported after QtQuick to avoid missing restoreMode property in Binding. Fix in Qt 6. -import QtQml 2.14 -import QtQuick.Window 2.2 -import QtQuick.VirtualKeyboard 2.2 -import QtQuick.VirtualKeyboard.Settings 2.2 -import "content" - -Item { - width: 1280 - height: 720 - - Item { - id: appContainer - width: Screen.orientation === Qt.LandscapeOrientation ? parent.width : parent.height - height: Screen.orientation === Qt.LandscapeOrientation ? parent.height : parent.width - anchors.centerIn: parent - Basic { - id: virtualKeyboard - anchors.left: parent.left - anchors.top: parent.top - anchors.right: parent.right - anchors.bottom: parent.bottom - handwritingInputPanelActive: handwritingInputPanel.available && handwritingInputPanel.active - } - - /* Handwriting input panel for full screen handwriting input. - - This component is an optional add-on for the InputPanel component, that - is, its use does not affect the operation of the InputPanel component, - but it also can not be used as a standalone component. - - The handwriting input panel is positioned to cover the entire area of - application. The panel itself is transparent, but once it is active the - user can draw handwriting on it. - */ - HandwritingInputPanel { - z: 79 - id: handwritingInputPanel - anchors.fill: parent - inputPanel: inputPanel - Rectangle { - z: -1 - anchors.fill: parent - color: "black" - opacity: 0.10 - } - } - - /* Container area for the handwriting mode button. - - Handwriting mode button can be moved freely within the container area. - In this example, a single click changes the handwriting mode and a - double-click changes the availability of the full screen handwriting input. - */ - Item { - z: 99 - visible: handwritingInputPanel.enabled && Qt.inputMethod.visible - anchors { left: parent.left; top: parent.top; right: parent.right; bottom: inputPanel.top; } - HandwritingModeButton { - id: handwritingModeButton - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: 10 - floating: true - flipable: true - width: 76 - height: width - state: handwritingInputPanel.state - onClicked: handwritingInputPanel.active = !handwritingInputPanel.active - onDoubleClicked: handwritingInputPanel.available = !handwritingInputPanel.available - } - } - - /* Keyboard input panel. - - The keyboard is anchored to the bottom of the application. - */ - InputPanel { - id: inputPanel - z: 89 - y: yPositionWhenHidden - x: Screen.orientation === Qt.LandscapeOrientation ? 0 : (parent.width-parent.height) / 2 - width: Screen.orientation === Qt.LandscapeOrientation ? parent.width : parent.height - - keyboard.shadowInputControl.height: (Screen.orientation === Qt.LandscapeOrientation ? parent.height : parent.width) - keyboard.height - - property real yPositionWhenHidden: Screen.orientation === Qt.LandscapeOrientation ? parent.height : parent.width + (parent.height-parent.width) / 2 - - states: State { - name: "visible" - /* The visibility of the InputPanel can be bound to the Qt.inputMethod.visible property, - but then the handwriting input panel and the keyboard input panel can be visible - at the same time. Here the visibility is bound to InputPanel.active property instead, - which allows the handwriting panel to control the visibility when necessary. - */ - when: inputPanel.active - PropertyChanges { - target: inputPanel - y: inputPanel.yPositionWhenHidden - inputPanel.height - } - } - transitions: Transition { - id: inputPanelTransition - from: "" - to: "visible" - reversible: true - enabled: !VirtualKeyboardSettings.fullScreenMode - ParallelAnimation { - NumberAnimation { - properties: "y" - duration: 250 - easing.type: Easing.InOutQuad - } - } - } - Binding { - target: InputContext - property: "animating" - value: inputPanelTransition.running - restoreMode: Binding.RestoreBinding - - } - AutoScroller {} - } - - Binding { - target: VirtualKeyboardSettings - property: "fullScreenMode" - value: appContainer.height > 0 && (appContainer.width / appContainer.height) > (16.0 / 9.0) - restoreMode: Binding.RestoreBinding - } - - } - - property bool inLandscapeOrientation: Screen.orientation === Qt.LandscapeOrientation - - Screen.orientationUpdateMask: Qt.LandscapeOrientation | Qt.PortraitOrientation - - Binding { - target: appContainer.Window.window !== null ? appContainer.Window.window.contentItem : null - property: "rotation" - value: inLandscapeOrientation ? 0 : 90 - } -} diff --git a/tests/virtualkeyboard/basic/basic.pro b/tests/virtualkeyboard/basic/basic.pro deleted file mode 100644 index 5a2e9201..00000000 --- a/tests/virtualkeyboard/basic/basic.pro +++ /dev/null @@ -1,35 +0,0 @@ -TEMPLATE = app -TARGET = basic -QT += qml quick -SOURCES += main.cpp -CONFIG += link_pkgconfig -static { - QT += svg - QTPLUGIN += qtvirtualkeyboardplugin -} - -target.path = $$[QT_INSTALL_EXAMPLES]/virtualkeyboard/basic -INSTALLS += target - -RESOURCES += \ - demo.qrc - -OTHER_FILES += \ - Basic.qml \ - basic-b2qt.qml \ - content/AutoScroller.qml \ - content/HandwritingModeButton.qml \ - content/TextArea.qml \ - content/TextField.qml \ - -disable-xcb { - message("The disable-xcb option has been deprecated. Please use disable-desktop instead.") - CONFIG += disable-desktop -} - -disable-desktop|android-embedded|!isEmpty(CROSS_COMPILE)|qnx { - DEFINES += MAIN_QML=\\\"basic-b2qt.qml\\\" -} else { - DEFINES += MAIN_QML=\\\"Basic.qml\\\" -} -DESTDIR="$$PWD/../../build" diff --git a/tests/virtualkeyboard/basic/content/AutoScroller.qml b/tests/virtualkeyboard/basic/content/AutoScroller.qml deleted file mode 100644 index 9e837ba5..00000000 --- a/tests/virtualkeyboard/basic/content/AutoScroller.qml +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import QtQuick.VirtualKeyboard 2.1 - -Item { - - property var innerFlickable - property var outerFlickable - property var inputItem: InputContext.priv.inputItem - - onInputItemChanged: { - innerFlickable = null - outerFlickable = null - if (inputItem !== null) { - var parent_ = inputItem.parent - while (parent_) { - if (parent_.maximumFlickVelocity) { - if (innerFlickable) { - outerFlickable = parent_ - break - } else { - innerFlickable = parent_ - } - } - parent_ = parent_.parent - } - delayedLoading.restart() - } - } - - function ensureVisible(flickable) { - if (Qt.inputMethod.visible && inputItem && flickable && flickable.visible && flickable.interactive) { - - var verticallyFlickable = (flickable.flickableDirection === Flickable.HorizontalAndVerticalFlick || flickable.flickableDirection === Flickable.VerticalFlick - || (flickable.flickableDirection === Flickable.AutoFlickDirection && flickable.contentHeight > flickable.height)) - var horizontallyFlickable = (flickable.flickableDirection === Flickable.HorizontalAndVerticalFlick || flickable.flickableDirection === Flickable.HorizontalFlick - || (flickable.flickableDirection === Flickable.AutoFlickDirection && flickable.contentWidth > flickable.width)) - - if ((!verticallyFlickable && !horizontallyFlickable) || !inputItem.hasOwnProperty("cursorRectangle")) - return - - var cursorRectangle = flickable.contentItem.mapFromItem(inputItem, inputItem.cursorRectangle.x, inputItem.cursorRectangle.y) - - var oldContentY = flickable.contentY - if (verticallyFlickable) { - var scrollMarginVertical = (flickable && flickable.scrollMarginVertical) ? flickable.scrollMarginVertical : 10 - if (flickable.contentY >= cursorRectangle.y - scrollMarginVertical) - flickable.contentY = Math.max(0, cursorRectangle.y - scrollMarginVertical) - else if (flickable.contentY + flickable.height <= cursorRectangle.y + inputItem.cursorRectangle.height + scrollMarginVertical) - flickable.contentY = Math.min(flickable.contentHeight - flickable.height, cursorRectangle.y + inputItem.cursorRectangle.height - flickable.height + scrollMarginVertical) - } - if (horizontallyFlickable) { - var scrollMarginHorizontal = (flickable && flickable.scrollMarginHorizontal) ? flickable.scrollMarginHorizontal : 10 - if (flickable.contentX >= cursorRectangle.x - scrollMarginHorizontal) - flickable.contentX = Math.max(0, cursorRectangle.x - scrollMarginHorizontal) - else if (flickable.contentX + flickable.width <= cursorRectangle.x + inputItem.cursorRectangle.width + scrollMarginHorizontal) - flickable.contentX = Math.min(flickable.contentWidth - flickable.width, cursorRectangle.x + inputItem.cursorRectangle.width - flickable.width + scrollMarginHorizontal) - } - } - } - Timer { - id: delayedLoading - interval: 10 - onTriggered: { - ensureVisible(innerFlickable) - ensureVisible(outerFlickable) - } - } - Connections { - ignoreUnknownSignals: true - target: Qt.inputMethod - function onAnimatingChanged() { if (inputItem && !Qt.inputMethod.animating) delayedLoading.restart() } - function onKeyboardRectangleChanged() { if (inputItem) delayedLoading.restart() } - function onCursorRectangleChanged() { if (inputItem && inputItem.activeFocus) delayedLoading.restart() } - } -} diff --git a/tests/virtualkeyboard/basic/content/FloatingButton_Active.svg b/tests/virtualkeyboard/basic/content/FloatingButton_Active.svg deleted file mode 100644 index c9c234e6..00000000 --- a/tests/virtualkeyboard/basic/content/FloatingButton_Active.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/virtualkeyboard/basic/content/FloatingButton_Available.svg b/tests/virtualkeyboard/basic/content/FloatingButton_Available.svg deleted file mode 100644 index d5edc3c1..00000000 --- a/tests/virtualkeyboard/basic/content/FloatingButton_Available.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg b/tests/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg deleted file mode 100644 index 4ce6b3aa..00000000 --- a/tests/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/virtualkeyboard/basic/content/HandwritingModeButton.qml b/tests/virtualkeyboard/basic/content/HandwritingModeButton.qml deleted file mode 100644 index d2a543b3..00000000 --- a/tests/virtualkeyboard/basic/content/HandwritingModeButton.qml +++ /dev/null @@ -1,165 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 - -Item { - id: handwritingModeButton - state: "unavailable" - property bool floating - property bool flipable - readonly property real __minWidthHeight: Math.min(width, height) - - signal clicked() - signal doubleClicked() - - Flipable { - id: flipableImage - anchors.fill: parent - - property bool flipped - - front: Image { - sourceSize.width: handwritingModeButton.__minWidthHeight - sourceSize.height: handwritingModeButton.__minWidthHeight - smooth: false - source: "qrc:/content/FloatingButton_Unavailable.svg" - } - - back: Image { - id: buttonImage - sourceSize.width: handwritingModeButton.__minWidthHeight - sourceSize.height: handwritingModeButton.__minWidthHeight - smooth: false - source: "qrc:/content/FloatingButton_Available.svg" - } - - states: State { - PropertyChanges { target: rotation; angle: 180 } - when: flipableImage.flipped - } - - transform: Rotation { - id: rotation - origin.x: flipableImage.width / 2 - origin.y: flipableImage.height / 2 - axis { x: 0; y: 1; z: 0 } - angle: 0 - } - - transitions: Transition { - enabled: handwritingModeButton.flipable - NumberAnimation { target: rotation; property: "angle"; duration: 400 } - } - } - - states: [ - State { - name: "available" - PropertyChanges { target: flipableImage; flipped: true } - }, - State { - name: "active" - PropertyChanges { target: flipableImage; flipped: true } - PropertyChanges { target: buttonImage; source: "qrc:/content/FloatingButton_Active.svg" } - } - ] - - function snapHorizontal() { - if (!floating) - return - if (mouseArea.drag.maximumX > mouseArea.drag.minimumX) { - if (x + 20 >= mouseArea.drag.maximumX) { - anchors.left = undefined - anchors.right = parent.right - } else if (x - 20 <= mouseArea.drag.minimumX) { - anchors.right = undefined - anchors.left = parent.left - } - } - } - - function snapVertical() { - if (!floating) - return - if (mouseArea.drag.maximumY > mouseArea.drag.minimumY) { - if (y + 20 >= mouseArea.drag.maximumY) { - anchors.top = undefined - anchors.bottom = parent.bottom - } else if (y - 20 <= mouseArea.drag.minimumY) { - anchors.bottom = undefined - anchors.top = parent.top - } - } - } - - MouseArea { - id: mouseArea - anchors.fill: parent - drag { - target: handwritingModeButton.floating ? handwritingModeButton : undefined - axis: Drag.XAxis | Drag.YAxis - minimumX: 0 - maximumX: handwritingModeButton.parent.width - handwritingModeButton.width - onMaximumXChanged: !mouseArea.drag.active && handwritingModeButton.snapHorizontal() - minimumY: 0 - maximumY: handwritingModeButton.parent.height - handwritingModeButton.height - onMaximumYChanged: !mouseArea.drag.active && handwritingModeButton.snapVertical() - } - onPressed: { - if (!handwritingModeButton.floating) - return - handwritingModeButton.anchors.left = undefined - handwritingModeButton.anchors.top = undefined - handwritingModeButton.anchors.right = undefined - handwritingModeButton.anchors.bottom = undefined - } - onReleased: { - handwritingModeButton.snapHorizontal() - handwritingModeButton.snapVertical() - } - onClicked: { - handwritingModeButton.snapHorizontal() - handwritingModeButton.snapVertical() - clickTimer.restart() - } - onDoubleClicked: { - clickTimer.stop() - handwritingModeButton.snapHorizontal() - handwritingModeButton.snapVertical() - handwritingModeButton.doubleClicked() - } - Timer { - id: clickTimer - interval: Qt.styleHints ? Qt.styleHints.mouseDoubleClickInterval / 3 : 0 - repeat: false - onTriggered: handwritingModeButton.clicked() - } - } -} diff --git a/tests/virtualkeyboard/basic/content/TextArea.qml b/tests/virtualkeyboard/basic/content/TextArea.qml deleted file mode 100644 index 9fed65a6..00000000 --- a/tests/virtualkeyboard/basic/content/TextArea.qml +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.10 -import QtQuick.Controls 2.3 as Controls -import QtQuick.VirtualKeyboard 2.3 - -Controls.TextArea { - id: control - color: "#2B2C2E" - selectionColor: Qt.rgba(0.0, 0.0, 0.0, 0.15) - selectedTextColor: color - selectByMouse: true - font.pixelSize: Qt.application.font.pixelSize * 2 - - property int enterKeyAction: EnterKeyAction.None - readonly property bool enterKeyEnabled: enterKeyAction === EnterKeyAction.None || text.length > 0 || inputMethodComposing - - EnterKeyAction.actionId: control.enterKeyAction - EnterKeyAction.enabled: control.enterKeyEnabled - - background: Rectangle { - color: "#FFFFFF" - border.width: 1 - border.color: control.activeFocus ? "#5CAA15" : "#BDBEBF" - } -} diff --git a/tests/virtualkeyboard/basic/content/TextField.qml b/tests/virtualkeyboard/basic/content/TextField.qml deleted file mode 100644 index 960afcaf..00000000 --- a/tests/virtualkeyboard/basic/content/TextField.qml +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.10 -import QtQuick.Controls 2.3 as Controls -import QtQuick.VirtualKeyboard 2.3 - -Controls.TextField { - id: control - color: "#2B2C2E" - selectionColor: Qt.rgba(0.0, 0.0, 0.0, 0.15) - selectedTextColor: color - selectByMouse: true - font.pixelSize: Qt.application.font.pixelSize * 2 - - property int enterKeyAction: EnterKeyAction.None - readonly property bool enterKeyEnabled: enterKeyAction === EnterKeyAction.None || acceptableInput || inputMethodComposing - - EnterKeyAction.actionId: control.enterKeyAction - EnterKeyAction.enabled: control.enterKeyEnabled - - background: Rectangle { - color: "#FFFFFF" - border.width: 1 - border.color: control.activeFocus ? "#5CAA15" : "#BDBEBF" - } -} diff --git a/tests/virtualkeyboard/basic/demo.qrc b/tests/virtualkeyboard/basic/demo.qrc deleted file mode 100644 index 8b71cb3e..00000000 --- a/tests/virtualkeyboard/basic/demo.qrc +++ /dev/null @@ -1,13 +0,0 @@ - - - content/AutoScroller.qml - content/TextArea.qml - content/TextField.qml - content/HandwritingModeButton.qml - content/FloatingButton_Active.svg - content/FloatingButton_Available.svg - content/FloatingButton_Unavailable.svg - Basic.qml - basic-b2qt.qml - - diff --git a/tests/virtualkeyboard/basic/main.cpp b/tests/virtualkeyboard/basic/main.cpp deleted file mode 100644 index 34802fd1..00000000 --- a/tests/virtualkeyboard/basic/main.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include - -int main(int argc, char *argv[]) -{ - qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); - - QGuiApplication app(argc, argv); - QQuickView view(QString("qrc:/%2").arg(MAIN_QML)); - if (view.status() == QQuickView::Error) - return -1; - view.setResizeMode(QQuickView::SizeRootObjectToView); - - view.show(); - - return app.exec(); -} diff --git a/tests/virtualkeyboard/virtualkeyboard.pro b/tests/virtualkeyboard/virtualkeyboard.pro deleted file mode 100644 index 6c0f2ea7..00000000 --- a/tests/virtualkeyboard/virtualkeyboard.pro +++ /dev/null @@ -1,3 +0,0 @@ -TEMPLATE = subdirs - -qtHaveModule(quickcontrols2): SUBDIRS += basic diff --git a/tests/webui/about.html b/tests/webui/about.html deleted file mode 100644 index 475b5668..00000000 --- a/tests/webui/about.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - Qt WebEngine WebUI Example - - - -
- -

WebEngine Widgets
WebUI Example

-
-
-

- Aside from the built-in schemes, such as http and - qrc, Qt WebEngine may be extended with custom - schemes by creating custom scheme handlers. -

- -

- This is a simple HTML page loaded from a custom scheme and - displayed by a QWebEngineView. Even the Quit button - below is a standard HTML <button> element. -

- -

- Read the documentation to find out -

-
    -
  • -

    - How to create a custom scheme handler which serves HTML - and handles HTML form submissions. -

    -
  • -
  • -

    - How to prevent ordinary web content from accessing the - custom scheme. -

    -
  • -
  • -

    - How to prevent any other scheme from submitting HTML - form data. -

    -
  • -
-
-
-
- -
-
- - diff --git a/tests/webui/doc/images/webui-example.png b/tests/webui/doc/images/webui-example.png deleted file mode 100644 index 84e2c7fc32fa600f4df768455519b7341d439f5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28862 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 diff --git a/tests/webui/main.cpp b/tests/webui/main.cpp deleted file mode 100644 index bc5a851a..00000000 --- a/tests/webui/main.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "webuihandler.h" - -#include -#include -#include -#include - -int main(int argc, char *argv[]) -{ - QCoreApplication::setOrganizationName("QtExamples"); - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - - WebUiHandler::registerUrlScheme(); - - QApplication app(argc, argv); - - QWebEngineProfile profile; - - WebUiHandler handler; - profile.installUrlSchemeHandler(WebUiHandler::schemeName, &handler); - - QWebEnginePage page(&profile); - page.load(WebUiHandler::aboutUrl); - - QWebEngineView view; - view.setPage(&page); - view.setContextMenuPolicy(Qt::NoContextMenu); - view.resize(500, 600); - view.show(); - - return app.exec(); -} diff --git a/tests/webui/webui.pro b/tests/webui/webui.pro deleted file mode 100644 index 1186aec5..00000000 --- a/tests/webui/webui.pro +++ /dev/null @@ -1,15 +0,0 @@ -TEMPLATE = app - -QT += webenginewidgets - -HEADERS += \ - webuihandler.h - -SOURCES += \ - main.cpp \ - webuihandler.cpp - -RESOURCES += \ - webui.qrc - -DESTDIR="$$PWD/../build" diff --git a/tests/webui/webui.qrc b/tests/webui/webui.qrc deleted file mode 100644 index fecdc947..00000000 --- a/tests/webui/webui.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - about.html - - diff --git a/tests/webui/webuihandler.cpp b/tests/webui/webuihandler.cpp deleted file mode 100644 index 139bfd1e..00000000 --- a/tests/webui/webuihandler.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "webuihandler.h" - -#include -#include -#include -#include - -#define SCHEMENAME "webui" - -const QByteArray WebUiHandler::schemeName = QByteArrayLiteral(SCHEMENAME); -const QUrl WebUiHandler::aboutUrl = QUrl(QStringLiteral(SCHEMENAME ":about")); - -WebUiHandler::WebUiHandler(QObject *parent) - : QWebEngineUrlSchemeHandler(parent) -{ -} - -void WebUiHandler::requestStarted(QWebEngineUrlRequestJob *job) -{ - static const QUrl webUiOrigin(QStringLiteral(SCHEMENAME ":")); - static const QByteArray GET(QByteArrayLiteral("GET")); - static const QByteArray POST(QByteArrayLiteral("POST")); - - QByteArray method = job->requestMethod(); - QUrl url = job->requestUrl(); - QUrl initiator = job->initiator(); - - if (method == GET && url == aboutUrl) { - QFile *file = new QFile(QStringLiteral(":/about.html"), job); - file->open(QIODevice::ReadOnly); - job->reply(QByteArrayLiteral("text/html"), file); - } else if (method == POST && url == aboutUrl && initiator == webUiOrigin) { - job->fail(QWebEngineUrlRequestJob::RequestAborted); - QApplication::exit(); - } else { - job->fail(QWebEngineUrlRequestJob::UrlNotFound); - } -} - -// static -void WebUiHandler::registerUrlScheme() -{ - QWebEngineUrlScheme webUiScheme(schemeName); - webUiScheme.setFlags(QWebEngineUrlScheme::SecureScheme | - QWebEngineUrlScheme::LocalScheme | - QWebEngineUrlScheme::LocalAccessAllowed); - QWebEngineUrlScheme::registerScheme(webUiScheme); -} diff --git a/tests/webui/webuihandler.h b/tests/webui/webuihandler.h deleted file mode 100644 index 045ffefd..00000000 --- a/tests/webui/webuihandler.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef WEBUIHANDLER_H -#define WEBUIHANDLER_H - -#include - -class WebUiHandler : public QWebEngineUrlSchemeHandler -{ - Q_OBJECT -public: - explicit WebUiHandler(QObject *parent = nullptr); - - void requestStarted(QWebEngineUrlRequestJob *job) override; - - static void registerUrlScheme(); - - const static QByteArray schemeName; - const static QUrl aboutUrl; -}; - -#endif // !WEBUIHANDLER_H From 8d688d1c1c9f18605d499a94efae93d05f552dbe Mon Sep 17 00:00:00 2001 From: EndrII Date: Mon, 8 Aug 2022 23:00:37 +0300 Subject: [PATCH 03/76] added depends --- .gitmodules | 12 ++++++++++++ submodules/QuasarAppLib | 1 + submodules/pe-parse | 1 + submodules/qttools | 1 + submodules/zip | 1 + 5 files changed, 16 insertions(+) create mode 160000 submodules/QuasarAppLib create mode 160000 submodules/pe-parse create mode 160000 submodules/qttools create mode 160000 submodules/zip diff --git a/.gitmodules b/.gitmodules index e69de29b..5566fa3c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "submodules/QuasarAppLib"] + path = submodules/QuasarAppLib + url = git@github.com:QuasarApp/QuasarAppLib.git +[submodule "submodules/pe-parse"] + path = submodules/pe-parse + url = https://github.com/QuasarApp/pe-parse.git +[submodule "submodules/zip"] + path = submodules/zip + url = https://github.com/QuasarApp/zip.git +[submodule "submodules/qttools"] + path = submodules/qttools + url = https://github.com/qt/qttools.git diff --git a/submodules/QuasarAppLib b/submodules/QuasarAppLib new file mode 160000 index 00000000..6f8308db --- /dev/null +++ b/submodules/QuasarAppLib @@ -0,0 +1 @@ +Subproject commit 6f8308db6d31b7bd3b3e7eed390de81dc676ca91 diff --git a/submodules/pe-parse b/submodules/pe-parse new file mode 160000 index 00000000..29220c94 --- /dev/null +++ b/submodules/pe-parse @@ -0,0 +1 @@ +Subproject commit 29220c9435d6e5b7ce08f237350d1d221390c59b diff --git a/submodules/qttools b/submodules/qttools new file mode 160000 index 00000000..caa44f8b --- /dev/null +++ b/submodules/qttools @@ -0,0 +1 @@ +Subproject commit caa44f8ba104aeb6ba92533dce324d0376586337 diff --git a/submodules/zip b/submodules/zip new file mode 160000 index 00000000..114d9d46 --- /dev/null +++ b/submodules/zip @@ -0,0 +1 @@ +Subproject commit 114d9d46fdbdad55b37705190a8625f4ab5fa81a From 650fba8709b552c01b09e9c5aed2c48388de9a39 Mon Sep 17 00:00:00 2001 From: EndrII Date: Tue, 9 Aug 2022 00:03:17 +0300 Subject: [PATCH 04/76] begin to move tests classes --- .gitignore | 1 + CMakeLists.txt | 23 +- src/CQtDeployer/CMakeLists.txt | 75 +---- src/CQtDeployer/Deploy/CQtDeployer.json | 12 +- src/{Deploy => LibDeploy}/CMakeLists.txt | 26 +- src/{Deploy => LibDeploy}/CQtDeployer.qrc | 0 src/{Deploy => LibDeploy}/languages/en.ts | 0 .../src/DeployResources.qrc | 0 .../src/Distributions/Templates/Icon.ico | Bin .../src/Distributions/Templates/Icon.png | Bin .../Templates/deb/DEBIAN/control | 0 .../Templates/deb/DEBIAN/postinst | 0 .../Distributions/Templates/deb/DEBIAN/prerm | 0 .../Templates/qif/Styles/quasar.css | 0 .../Templates/qif/Styles/quasarDark.css | 0 .../qif/config custom designe/config.xml | 0 .../config custom designe/controlScript.qs | 0 .../qif/config custom designe/style.css | 0 .../Templates/qif/config/config.xml | 0 .../Templates/qif/config/controlScript.qs | 0 .../packages/default/meta/installscript.qs | 0 .../qif/packages/default/meta/package.xml | 0 .../Init multiPackage configuration.json | 0 .../configures/Init single configuration.json | 0 .../src/Distributions/configures/Init.json | 0 .../src/Distributions/deb.cpp | 0 .../src/Distributions/deb.h | 0 .../src/Distributions/defaultdistro.cpp | 0 .../src/Distributions/defaultdistro.h | 0 .../src/Distributions/idistribution.cpp | 0 .../src/Distributions/idistribution.h | 0 .../src/Distributions/qif.cpp | 0 .../src/Distributions/qif.h | 0 .../src/Distributions/templateinfo.cpp | 0 .../src/Distributions/templateinfo.h | 0 .../src/Distributions/ziparhive.cpp | 0 .../src/Distributions/ziparhive.h | 0 .../src/ScriptsTemplates/linux.sh | 0 .../src/ScriptsTemplates/windows.bat | 0 .../src/configparser.cpp | 0 src/{Deploy => LibDeploy}/src/configparser.h | 7 +- src/{Deploy => LibDeploy}/src/defines.h | 0 .../src/dependenciesscanner.cpp | 0 .../src/dependenciesscanner.h | 0 .../src/dependencymap.cpp | 0 src/{Deploy => LibDeploy}/src/dependencymap.h | 0 src/{Deploy => LibDeploy}/src/deploy.cpp | 0 src/{Deploy => LibDeploy}/src/deploy.h | 0 .../src/deploy_global.h.in} | 3 +- .../src/deployconfig.cpp | 0 src/{Deploy => LibDeploy}/src/deployconfig.h | 0 src/{Deploy => LibDeploy}/src/deploycore.cpp | 0 src/{Deploy => LibDeploy}/src/deploycore.h | 3 +- .../src/distromodule.cpp | 0 src/{Deploy => LibDeploy}/src/distromodule.h | 0 .../src/distrostruct.cpp | 0 src/{Deploy => LibDeploy}/src/distrostruct.h | 0 src/{Deploy => LibDeploy}/src/elf_type.cpp | 0 src/{Deploy => LibDeploy}/src/elf_type.h | 0 src/{Deploy => LibDeploy}/src/envirement.cpp | 0 src/{Deploy => LibDeploy}/src/envirement.h | 0 src/{Deploy => LibDeploy}/src/extra.cpp | 0 src/{Deploy => LibDeploy}/src/extra.h | 0 src/{Deploy => LibDeploy}/src/extracter.cpp | 0 src/{Deploy => LibDeploy}/src/extracter.h | 0 src/{Deploy => LibDeploy}/src/filemanager.cpp | 0 src/{Deploy => LibDeploy}/src/filemanager.h | 0 .../src/generalfiles_type.cpp | 0 .../src/generalfiles_type.h | 0 src/{Deploy => LibDeploy}/src/igetlibinfo.cpp | 0 src/{Deploy => LibDeploy}/src/igetlibinfo.h | 0 src/{Deploy => LibDeploy}/src/ignorerule.cpp | 0 src/{Deploy => LibDeploy}/src/ignorerule.h | 0 src/{Deploy => LibDeploy}/src/libinfo.cpp | 0 src/{Deploy => LibDeploy}/src/libinfo.h | 0 .../src/metafilemanager.cpp | 0 .../src/metafilemanager.h | 0 .../src/packagecontrol.cpp | 0 .../src/packagecontrol.h | 0 src/{Deploy => LibDeploy}/src/packing.cpp | 0 src/{Deploy => LibDeploy}/src/packing.h | 0 src/{Deploy => LibDeploy}/src/pathutils.cpp | 0 src/{Deploy => LibDeploy}/src/pathutils.h | 0 src/{Deploy => LibDeploy}/src/pe_type.cpp | 0 src/{Deploy => LibDeploy}/src/pe_type.h | 0 .../src/pluginsparser.cpp | 0 src/{Deploy => LibDeploy}/src/pluginsparser.h | 0 src/{Deploy => LibDeploy}/src/qml.cpp | 0 src/{Deploy => LibDeploy}/src/qml.h | 0 src/{Deploy => LibDeploy}/src/qtdir.cpp | 0 src/{Deploy => LibDeploy}/src/qtdir.h | 0 src/{Deploy => LibDeploy}/src/targetdata.cpp | 0 src/{Deploy => LibDeploy}/src/targetdata.h | 0 src/{Deploy => LibDeploy}/src/targetinfo.cpp | 0 src/{Deploy => LibDeploy}/src/targetinfo.h | 0 .../src/zipcompresser.cpp | 0 src/{Deploy => LibDeploy}/src/zipcompresser.h | 0 tests/CMakeLists.txt | 6 +- tests/units/deploytargettest.cpp | 71 +++++ tests/units/deploytargettest.h | 26 ++ .../{tst_deploytest.cpp => deploytest.cpp} | 1 + tests/units/deploytest.h | 184 ++++++++++++ tests/units/testbase.cpp | 275 ++++++++++++++++++ tests/units/testbase.h | 41 +++ 104 files changed, 639 insertions(+), 115 deletions(-) rename src/{Deploy => LibDeploy}/CMakeLists.txt (63%) rename src/{Deploy => LibDeploy}/CQtDeployer.qrc (100%) rename src/{Deploy => LibDeploy}/languages/en.ts (100%) rename src/{Deploy => LibDeploy}/src/DeployResources.qrc (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/Icon.ico (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/Icon.png (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/deb/DEBIAN/control (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/deb/DEBIAN/postinst (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/deb/DEBIAN/prerm (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/Styles/quasar.css (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/Styles/quasarDark.css (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/config custom designe/config.xml (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/config custom designe/controlScript.qs (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/config custom designe/style.css (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/config/config.xml (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/config/controlScript.qs (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/packages/default/meta/installscript.qs (100%) rename src/{Deploy => LibDeploy}/src/Distributions/Templates/qif/packages/default/meta/package.xml (100%) rename src/{Deploy => LibDeploy}/src/Distributions/configures/Init multiPackage configuration.json (100%) rename src/{Deploy => LibDeploy}/src/Distributions/configures/Init single configuration.json (100%) rename src/{Deploy => LibDeploy}/src/Distributions/configures/Init.json (100%) rename src/{Deploy => LibDeploy}/src/Distributions/deb.cpp (100%) rename src/{Deploy => LibDeploy}/src/Distributions/deb.h (100%) rename src/{Deploy => LibDeploy}/src/Distributions/defaultdistro.cpp (100%) rename src/{Deploy => LibDeploy}/src/Distributions/defaultdistro.h (100%) rename src/{Deploy => LibDeploy}/src/Distributions/idistribution.cpp (100%) rename src/{Deploy => LibDeploy}/src/Distributions/idistribution.h (100%) rename src/{Deploy => LibDeploy}/src/Distributions/qif.cpp (100%) rename src/{Deploy => LibDeploy}/src/Distributions/qif.h (100%) rename src/{Deploy => LibDeploy}/src/Distributions/templateinfo.cpp (100%) rename src/{Deploy => LibDeploy}/src/Distributions/templateinfo.h (100%) rename src/{Deploy => LibDeploy}/src/Distributions/ziparhive.cpp (100%) rename src/{Deploy => LibDeploy}/src/Distributions/ziparhive.h (100%) rename src/{Deploy => LibDeploy}/src/ScriptsTemplates/linux.sh (100%) rename src/{Deploy => LibDeploy}/src/ScriptsTemplates/windows.bat (100%) rename src/{Deploy => LibDeploy}/src/configparser.cpp (100%) rename src/{Deploy => LibDeploy}/src/configparser.h (95%) rename src/{Deploy => LibDeploy}/src/defines.h (100%) rename src/{Deploy => LibDeploy}/src/dependenciesscanner.cpp (100%) rename src/{Deploy => LibDeploy}/src/dependenciesscanner.h (100%) rename src/{Deploy => LibDeploy}/src/dependencymap.cpp (100%) rename src/{Deploy => LibDeploy}/src/dependencymap.h (100%) rename src/{Deploy => LibDeploy}/src/deploy.cpp (100%) rename src/{Deploy => LibDeploy}/src/deploy.h (100%) rename src/{Deploy/src/deploy_global.h => LibDeploy/src/deploy_global.h.in} (87%) rename src/{Deploy => LibDeploy}/src/deployconfig.cpp (100%) rename src/{Deploy => LibDeploy}/src/deployconfig.h (100%) rename src/{Deploy => LibDeploy}/src/deploycore.cpp (100%) rename src/{Deploy => LibDeploy}/src/deploycore.h (99%) rename src/{Deploy => LibDeploy}/src/distromodule.cpp (100%) rename src/{Deploy => LibDeploy}/src/distromodule.h (100%) rename src/{Deploy => LibDeploy}/src/distrostruct.cpp (100%) rename src/{Deploy => LibDeploy}/src/distrostruct.h (100%) rename src/{Deploy => LibDeploy}/src/elf_type.cpp (100%) rename src/{Deploy => LibDeploy}/src/elf_type.h (100%) rename src/{Deploy => LibDeploy}/src/envirement.cpp (100%) rename src/{Deploy => LibDeploy}/src/envirement.h (100%) rename src/{Deploy => LibDeploy}/src/extra.cpp (100%) rename src/{Deploy => LibDeploy}/src/extra.h (100%) rename src/{Deploy => LibDeploy}/src/extracter.cpp (100%) rename src/{Deploy => LibDeploy}/src/extracter.h (100%) rename src/{Deploy => LibDeploy}/src/filemanager.cpp (100%) rename src/{Deploy => LibDeploy}/src/filemanager.h (100%) rename src/{Deploy => LibDeploy}/src/generalfiles_type.cpp (100%) rename src/{Deploy => LibDeploy}/src/generalfiles_type.h (100%) rename src/{Deploy => LibDeploy}/src/igetlibinfo.cpp (100%) rename src/{Deploy => LibDeploy}/src/igetlibinfo.h (100%) rename src/{Deploy => LibDeploy}/src/ignorerule.cpp (100%) rename src/{Deploy => LibDeploy}/src/ignorerule.h (100%) rename src/{Deploy => LibDeploy}/src/libinfo.cpp (100%) rename src/{Deploy => LibDeploy}/src/libinfo.h (100%) rename src/{Deploy => LibDeploy}/src/metafilemanager.cpp (100%) rename src/{Deploy => LibDeploy}/src/metafilemanager.h (100%) rename src/{Deploy => LibDeploy}/src/packagecontrol.cpp (100%) rename src/{Deploy => LibDeploy}/src/packagecontrol.h (100%) rename src/{Deploy => LibDeploy}/src/packing.cpp (100%) rename src/{Deploy => LibDeploy}/src/packing.h (100%) rename src/{Deploy => LibDeploy}/src/pathutils.cpp (100%) rename src/{Deploy => LibDeploy}/src/pathutils.h (100%) rename src/{Deploy => LibDeploy}/src/pe_type.cpp (100%) rename src/{Deploy => LibDeploy}/src/pe_type.h (100%) rename src/{Deploy => LibDeploy}/src/pluginsparser.cpp (100%) rename src/{Deploy => LibDeploy}/src/pluginsparser.h (100%) rename src/{Deploy => LibDeploy}/src/qml.cpp (100%) rename src/{Deploy => LibDeploy}/src/qml.h (100%) rename src/{Deploy => LibDeploy}/src/qtdir.cpp (100%) rename src/{Deploy => LibDeploy}/src/qtdir.h (100%) rename src/{Deploy => LibDeploy}/src/targetdata.cpp (100%) rename src/{Deploy => LibDeploy}/src/targetdata.h (100%) rename src/{Deploy => LibDeploy}/src/targetinfo.cpp (100%) rename src/{Deploy => LibDeploy}/src/targetinfo.h (100%) rename src/{Deploy => LibDeploy}/src/zipcompresser.cpp (100%) rename src/{Deploy => LibDeploy}/src/zipcompresser.h (100%) create mode 100644 tests/units/deploytargettest.cpp create mode 100644 tests/units/deploytargettest.h rename tests/units/{tst_deploytest.cpp => deploytest.cpp} (99%) create mode 100644 tests/units/deploytest.h create mode 100644 tests/units/testbase.cpp create mode 100644 tests/units/testbase.h diff --git a/.gitignore b/.gitignore index 79be2204..83aacf24 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,4 @@ install_manifest.txt compile_commands.json CTestTestfile.cmake _deps +src/LibDeploy/src/deploy_global.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b3502c8..f1b66c8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,34 +29,35 @@ if (NOT QT_VERSION_MAJOR) endif() find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test QUIET) -include(submodules/CMake/QuasarApp.cmake) +include(submodules/QuasarAppLib/CMake/QuasarApp.cmake) updateGitVars() -set(CQtDeployer_VERSION "0.${GIT_COMMIT_COUNT}.${GIT_COMMIT_HASH}") -set(CQtDeployer_PACKAGE_ID "quasarapp.core.CQtDeployer") +set(CQT_DEPLOYER_VERSION "1.6.${GIT_COMMIT_COUNT}.${GIT_COMMIT_HASH}") -option(CQtDeployer_TESTS "This option disables or enables tests of the ${PROJECT_NAME} project" ON) -option(CQtDeployer_EXAMPLE "This option disables or enables example app of the ${PROJECT_NAME} project" ON) +option(CQT_DEPLOYER_TESTS "This option disables or enables tests of the ${PROJECT_NAME} project" ON) +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) - set(CQtDeployer_TESTS OFF CACHE BOOL "This option force disbled for ANDROID IOS QA_WASM32 and Not Qt projects" FORCE) + set(CQT_DEPLOYER_TESTS OFF CACHE BOOL "This option force disbled for ANDROID IOS QA_WASM32 and Not Qt projects" FORCE) endif() if (NOT QT_VERSION_MAJOR) - set(CQtDeployer_EXAMPLE OFF CACHE BOOL "This option force disbled for Not Qt projects" FORCE) + set(CQT_DEPLOYER_TOOL OFF CACHE BOOL "This option force disbled for Not Qt projects" FORCE) endif() make_directory(Distro) initAll() -add_subdirectory(src/Library) +add_subdirectory(submodules/QuasarAppLib) -if (DEFINED CQtDeployer_EXAMPLE) - add_subdirectory(src/Example) +add_subdirectory(src/LibDeploy) + +if (DEFINED CQT_DEPLOYER_TOOL) + add_subdirectory(src/CQtDeployer) endif() -if (CQtDeployer_TESTS) +if (CQT_DEPLOYER_TESTS) add_subdirectory(tests) else() message("The ${PROJECT_NAME} tests is disabled.") diff --git a/src/CQtDeployer/CMakeLists.txt b/src/CQtDeployer/CMakeLists.txt index 9ab9beb5..ee013e06 100644 --- a/src/CQtDeployer/CMakeLists.txt +++ b/src/CQtDeployer/CMakeLists.txt @@ -43,7 +43,7 @@ else() endif() -target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Library) +target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}LibDeploy) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) @@ -51,79 +51,6 @@ target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) SET(TARGET_DIR "${CMAKE_SOURCE_DIR}/Distro") file(MAKE_DIRECTORY ${TARGET_DIR}) -if (ANDROID) - - set(ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android CACHE INTERNAL "") - set(ENV{ANDROID_API_VERSION} 31) - set(ANDROID_API_VERSION $ENV{ANDROID_API_VERSION}) - set(OPENSSL_ROOT_PATH "$ENV{OPENSSL_ROOT_DIR}") - - set(CQtDeployer_EXTRA_LIBS - ${PROJECT_NAME}Library -# libName - ) - -# find_package(Qt${QT_VERSION_MAJOR} COMPONENTS AndroidExtras REQUIRED) -# target_link_libraries(${CURRENT_PROJECT} PRIVATE Qt${QT_VERSION_MAJOR}::AndroidExtras) - - if (SIGN_APP) - message("SIGN_APP") - addDeploySignedAPK(${CURRENT_PROJECT} - "${CMAKE_CURRENT_LIST_DIR}/android" - "QuasarAppProject" - "${SIGPATH}/quasarapp.keystore" - "${SIGPASS_QUASARAPP}" - "${TARGET_DIR}" - "${CQtDeployer_EXTRA_LIBS}") - - else() - message("NO_SIGN_APP") - - addDeployAPK(${CURRENT_PROJECT} - "${CMAKE_CURRENT_LIST_DIR}/android" - "${TARGET_DIR}" - "${CQtDeployer_EXTRA_LIBS}") - - endif() - set(manifest_file "${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml") - configure_file("${manifest_file}.in" ${manifest_file} @ONLY) - - set(gradle_file "${CMAKE_CURRENT_SOURCE_DIR}/android/build.gradle") - configure_file("${gradle_file}.in" ${gradle_file} @ONLY) - - file(GLOB java_files - "android/src/com/quasarapp/androidtools/*.java" - "android/*.xml" - "android/*.gradle" - "android/gradlew" - "android/gradle.*" - - ) - - add_custom_target(${name}Android - SOURCES ${java_files} - ) - -elseif(IOS) -# set_xcode_property(${CURRENT_PROJECT} PRODUCT_BUNDLE_IDENTIFIER ${CHEATCARD_PACKAGE_ID} All) - - set_target_properties(${CURRENT_PROJECT} PROPERTIES - MACOSX_BUNDLE_GUI_IDENTIFIER ${CQtDeployer_PACKAGE_ID} - MACOSX_BUNDLE_BUNDLE_VERSION ${CQtDeployer_VERSION} - MACOSX_BUNDLE_SHORT_VERSION_STRING ${CQtDeployer_VERSION} - ) -else() - # Desctop deploying - - message(GIT_COMMIT_COUNT = ${GIT_COMMIT_COUNT}) - - set(DeployFile "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") - configure_file("${DeployFile}.in" ${DeployFile} @ONLY) - - addDeployFromCustomFile("CQtDeployer" ${DeployFile}) - -endif() - if(QT_VERSION_MAJOR EQUAL 6) # Add This line if your project use the Quick module # qt_import_qml_plugins(${CURRENT_PROJECT}) diff --git a/src/CQtDeployer/Deploy/CQtDeployer.json b/src/CQtDeployer/Deploy/CQtDeployer.json index 1cd88b0e..c12e5c2c 100644 --- a/src/CQtDeployer/Deploy/CQtDeployer.json +++ b/src/CQtDeployer/Deploy/CQtDeployer.json @@ -4,11 +4,11 @@ "src/build/Debug/CQtDeployerEaxample.exe" ], "clear": true, - "binPrefix": "/media/D/builds/build-CMakeProject-Desktop_Qt_6_1_3_GCC_64bit-Debug", + "binPrefix": "/media/D/builds/build-CQtDeployerCmakePort-Desktop_Qt_5_15_2_GCC_64bit-Debug", "libDir": [ - "/media/D/builds/CMakeProject", + "/media/D/builds/CQtDeployerCmakePort", "/home/andrei/Qt/5.15.2/gcc_64", - "/media/D/builds/build-CMakeProject-Desktop_Qt_6_1_3_GCC_64bit-Debug" + "/media/D/builds/build-CQtDeployerCmakePort-Desktop_Qt_5_15_2_GCC_64bit-Debug" ], "recursiveDepth": "10", "deploySystem": false, @@ -17,11 +17,11 @@ "qif": true, "zip": true, "ignoreEnv": [ - "/media/D/builds/CMakeProject/Distro" + "/media/D/builds/CQtDeployerCmakePort/Distro" ], "extraLib": "crypto", - "targetDir": "/media/D/builds/CMakeProject/Distro", - "deployVersion": "0.84.1a139e7", + "targetDir": "/media/D/builds/CQtDeployerCmakePort/Distro", + "deployVersion": "", } diff --git a/src/Deploy/CMakeLists.txt b/src/LibDeploy/CMakeLists.txt similarity index 63% rename from src/Deploy/CMakeLists.txt rename to src/LibDeploy/CMakeLists.txt index 5f18653d..c6731ec9 100644 --- a/src/Deploy/CMakeLists.txt +++ b/src/LibDeploy/CMakeLists.txt @@ -10,33 +10,31 @@ cmake_minimum_required(VERSION 3.18) get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) set(CURRENT_PROJECT "${PROJECT_NAME}${CURRENT_PROJECT_DIR}") -add_definitions(-DCQtDeployer_LIBRARY) +add_definitions(-DCQT_DEPLOYER_LIBRARY) file(GLOB_RECURSE SOURCE_CPP "src/*.cpp" "src/*.h" -) -if (${QT_VERSION_MAJOR}) - file(GLOB_RECURSE SOURCE_QRC - "*.qrc" - ) + "src/Distributions/*.cpp" + "src/Distributions/*.h" + +) -endif() +file(GLOB_RECURSE SOURCE_QRC + "*.qrc" + "src/*.qrc" +) -set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/public") -set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/private") +set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") add_library(${CURRENT_PROJECT} ${SOURCE_CPP} ${SOURCE_QRC}) -if (${QT_VERSION_MAJOR}) - target_link_libraries(${CURRENT_PROJECT} PUBLIC Qt${QT_VERSION_MAJOR}::Core ) -endif() +target_link_libraries(${CURRENT_PROJECT} PUBLIC QuasarApp ) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) -target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts) @@ -45,5 +43,5 @@ prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR} "${LANGS}") set(QML_IMPORT_PATH ${QML_IMPORT_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/src" CACHE STRING "" FORCE) -set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/src/public/CQtDeployer/global.h") +set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/src/deploy_global.h") configure_file("${global_file}.in" ${global_file} @ONLY) diff --git a/src/Deploy/CQtDeployer.qrc b/src/LibDeploy/CQtDeployer.qrc similarity index 100% rename from src/Deploy/CQtDeployer.qrc rename to src/LibDeploy/CQtDeployer.qrc diff --git a/src/Deploy/languages/en.ts b/src/LibDeploy/languages/en.ts similarity index 100% rename from src/Deploy/languages/en.ts rename to src/LibDeploy/languages/en.ts diff --git a/src/Deploy/src/DeployResources.qrc b/src/LibDeploy/src/DeployResources.qrc similarity index 100% rename from src/Deploy/src/DeployResources.qrc rename to src/LibDeploy/src/DeployResources.qrc diff --git a/src/Deploy/src/Distributions/Templates/Icon.ico b/src/LibDeploy/src/Distributions/Templates/Icon.ico similarity index 100% rename from src/Deploy/src/Distributions/Templates/Icon.ico rename to src/LibDeploy/src/Distributions/Templates/Icon.ico diff --git a/src/Deploy/src/Distributions/Templates/Icon.png b/src/LibDeploy/src/Distributions/Templates/Icon.png similarity index 100% rename from src/Deploy/src/Distributions/Templates/Icon.png rename to src/LibDeploy/src/Distributions/Templates/Icon.png diff --git a/src/Deploy/src/Distributions/Templates/deb/DEBIAN/control b/src/LibDeploy/src/Distributions/Templates/deb/DEBIAN/control similarity index 100% rename from src/Deploy/src/Distributions/Templates/deb/DEBIAN/control rename to src/LibDeploy/src/Distributions/Templates/deb/DEBIAN/control diff --git a/src/Deploy/src/Distributions/Templates/deb/DEBIAN/postinst b/src/LibDeploy/src/Distributions/Templates/deb/DEBIAN/postinst similarity index 100% rename from src/Deploy/src/Distributions/Templates/deb/DEBIAN/postinst rename to src/LibDeploy/src/Distributions/Templates/deb/DEBIAN/postinst diff --git a/src/Deploy/src/Distributions/Templates/deb/DEBIAN/prerm b/src/LibDeploy/src/Distributions/Templates/deb/DEBIAN/prerm similarity index 100% rename from src/Deploy/src/Distributions/Templates/deb/DEBIAN/prerm rename to src/LibDeploy/src/Distributions/Templates/deb/DEBIAN/prerm diff --git a/src/Deploy/src/Distributions/Templates/qif/Styles/quasar.css b/src/LibDeploy/src/Distributions/Templates/qif/Styles/quasar.css similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/Styles/quasar.css rename to src/LibDeploy/src/Distributions/Templates/qif/Styles/quasar.css diff --git a/src/Deploy/src/Distributions/Templates/qif/Styles/quasarDark.css b/src/LibDeploy/src/Distributions/Templates/qif/Styles/quasarDark.css similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/Styles/quasarDark.css rename to src/LibDeploy/src/Distributions/Templates/qif/Styles/quasarDark.css diff --git a/src/Deploy/src/Distributions/Templates/qif/config custom designe/config.xml b/src/LibDeploy/src/Distributions/Templates/qif/config custom designe/config.xml similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/config custom designe/config.xml rename to src/LibDeploy/src/Distributions/Templates/qif/config custom designe/config.xml diff --git a/src/Deploy/src/Distributions/Templates/qif/config custom designe/controlScript.qs b/src/LibDeploy/src/Distributions/Templates/qif/config custom designe/controlScript.qs similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/config custom designe/controlScript.qs rename to src/LibDeploy/src/Distributions/Templates/qif/config custom designe/controlScript.qs diff --git a/src/Deploy/src/Distributions/Templates/qif/config custom designe/style.css b/src/LibDeploy/src/Distributions/Templates/qif/config custom designe/style.css similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/config custom designe/style.css rename to src/LibDeploy/src/Distributions/Templates/qif/config custom designe/style.css diff --git a/src/Deploy/src/Distributions/Templates/qif/config/config.xml b/src/LibDeploy/src/Distributions/Templates/qif/config/config.xml similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/config/config.xml rename to src/LibDeploy/src/Distributions/Templates/qif/config/config.xml diff --git a/src/Deploy/src/Distributions/Templates/qif/config/controlScript.qs b/src/LibDeploy/src/Distributions/Templates/qif/config/controlScript.qs similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/config/controlScript.qs rename to src/LibDeploy/src/Distributions/Templates/qif/config/controlScript.qs diff --git a/src/Deploy/src/Distributions/Templates/qif/packages/default/meta/installscript.qs b/src/LibDeploy/src/Distributions/Templates/qif/packages/default/meta/installscript.qs similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/packages/default/meta/installscript.qs rename to src/LibDeploy/src/Distributions/Templates/qif/packages/default/meta/installscript.qs diff --git a/src/Deploy/src/Distributions/Templates/qif/packages/default/meta/package.xml b/src/LibDeploy/src/Distributions/Templates/qif/packages/default/meta/package.xml similarity index 100% rename from src/Deploy/src/Distributions/Templates/qif/packages/default/meta/package.xml rename to src/LibDeploy/src/Distributions/Templates/qif/packages/default/meta/package.xml diff --git a/src/Deploy/src/Distributions/configures/Init multiPackage configuration.json b/src/LibDeploy/src/Distributions/configures/Init multiPackage configuration.json similarity index 100% rename from src/Deploy/src/Distributions/configures/Init multiPackage configuration.json rename to src/LibDeploy/src/Distributions/configures/Init multiPackage configuration.json diff --git a/src/Deploy/src/Distributions/configures/Init single configuration.json b/src/LibDeploy/src/Distributions/configures/Init single configuration.json similarity index 100% rename from src/Deploy/src/Distributions/configures/Init single configuration.json rename to src/LibDeploy/src/Distributions/configures/Init single configuration.json diff --git a/src/Deploy/src/Distributions/configures/Init.json b/src/LibDeploy/src/Distributions/configures/Init.json similarity index 100% rename from src/Deploy/src/Distributions/configures/Init.json rename to src/LibDeploy/src/Distributions/configures/Init.json diff --git a/src/Deploy/src/Distributions/deb.cpp b/src/LibDeploy/src/Distributions/deb.cpp similarity index 100% rename from src/Deploy/src/Distributions/deb.cpp rename to src/LibDeploy/src/Distributions/deb.cpp diff --git a/src/Deploy/src/Distributions/deb.h b/src/LibDeploy/src/Distributions/deb.h similarity index 100% rename from src/Deploy/src/Distributions/deb.h rename to src/LibDeploy/src/Distributions/deb.h diff --git a/src/Deploy/src/Distributions/defaultdistro.cpp b/src/LibDeploy/src/Distributions/defaultdistro.cpp similarity index 100% rename from src/Deploy/src/Distributions/defaultdistro.cpp rename to src/LibDeploy/src/Distributions/defaultdistro.cpp diff --git a/src/Deploy/src/Distributions/defaultdistro.h b/src/LibDeploy/src/Distributions/defaultdistro.h similarity index 100% rename from src/Deploy/src/Distributions/defaultdistro.h rename to src/LibDeploy/src/Distributions/defaultdistro.h diff --git a/src/Deploy/src/Distributions/idistribution.cpp b/src/LibDeploy/src/Distributions/idistribution.cpp similarity index 100% rename from src/Deploy/src/Distributions/idistribution.cpp rename to src/LibDeploy/src/Distributions/idistribution.cpp diff --git a/src/Deploy/src/Distributions/idistribution.h b/src/LibDeploy/src/Distributions/idistribution.h similarity index 100% rename from src/Deploy/src/Distributions/idistribution.h rename to src/LibDeploy/src/Distributions/idistribution.h diff --git a/src/Deploy/src/Distributions/qif.cpp b/src/LibDeploy/src/Distributions/qif.cpp similarity index 100% rename from src/Deploy/src/Distributions/qif.cpp rename to src/LibDeploy/src/Distributions/qif.cpp diff --git a/src/Deploy/src/Distributions/qif.h b/src/LibDeploy/src/Distributions/qif.h similarity index 100% rename from src/Deploy/src/Distributions/qif.h rename to src/LibDeploy/src/Distributions/qif.h diff --git a/src/Deploy/src/Distributions/templateinfo.cpp b/src/LibDeploy/src/Distributions/templateinfo.cpp similarity index 100% rename from src/Deploy/src/Distributions/templateinfo.cpp rename to src/LibDeploy/src/Distributions/templateinfo.cpp diff --git a/src/Deploy/src/Distributions/templateinfo.h b/src/LibDeploy/src/Distributions/templateinfo.h similarity index 100% rename from src/Deploy/src/Distributions/templateinfo.h rename to src/LibDeploy/src/Distributions/templateinfo.h diff --git a/src/Deploy/src/Distributions/ziparhive.cpp b/src/LibDeploy/src/Distributions/ziparhive.cpp similarity index 100% rename from src/Deploy/src/Distributions/ziparhive.cpp rename to src/LibDeploy/src/Distributions/ziparhive.cpp diff --git a/src/Deploy/src/Distributions/ziparhive.h b/src/LibDeploy/src/Distributions/ziparhive.h similarity index 100% rename from src/Deploy/src/Distributions/ziparhive.h rename to src/LibDeploy/src/Distributions/ziparhive.h diff --git a/src/Deploy/src/ScriptsTemplates/linux.sh b/src/LibDeploy/src/ScriptsTemplates/linux.sh similarity index 100% rename from src/Deploy/src/ScriptsTemplates/linux.sh rename to src/LibDeploy/src/ScriptsTemplates/linux.sh diff --git a/src/Deploy/src/ScriptsTemplates/windows.bat b/src/LibDeploy/src/ScriptsTemplates/windows.bat similarity index 100% rename from src/Deploy/src/ScriptsTemplates/windows.bat rename to src/LibDeploy/src/ScriptsTemplates/windows.bat diff --git a/src/Deploy/src/configparser.cpp b/src/LibDeploy/src/configparser.cpp similarity index 100% rename from src/Deploy/src/configparser.cpp rename to src/LibDeploy/src/configparser.cpp diff --git a/src/Deploy/src/configparser.h b/src/LibDeploy/src/configparser.h similarity index 95% rename from src/Deploy/src/configparser.h rename to src/LibDeploy/src/configparser.h index 8abf05ad..f278a437 100644 --- a/src/Deploy/src/configparser.h +++ b/src/LibDeploy/src/configparser.h @@ -7,12 +7,7 @@ #ifndef CQT_H #define CQT_H -#include "deployconfig.h" #include "distrostruct.h" -#include "envirement.h" -#include "ignorerule.h" -#include "targetdata.h" -#include "targetinfo.h" #include #include @@ -36,7 +31,7 @@ class DEPLOYSHARED_EXPORT ConfigParser bool smartMoveTargets(); const DeployConfig* config() const; - friend class deploytest; + friend class DeployTargetTest; private: diff --git a/src/Deploy/src/defines.h b/src/LibDeploy/src/defines.h similarity index 100% rename from src/Deploy/src/defines.h rename to src/LibDeploy/src/defines.h diff --git a/src/Deploy/src/dependenciesscanner.cpp b/src/LibDeploy/src/dependenciesscanner.cpp similarity index 100% rename from src/Deploy/src/dependenciesscanner.cpp rename to src/LibDeploy/src/dependenciesscanner.cpp diff --git a/src/Deploy/src/dependenciesscanner.h b/src/LibDeploy/src/dependenciesscanner.h similarity index 100% rename from src/Deploy/src/dependenciesscanner.h rename to src/LibDeploy/src/dependenciesscanner.h diff --git a/src/Deploy/src/dependencymap.cpp b/src/LibDeploy/src/dependencymap.cpp similarity index 100% rename from src/Deploy/src/dependencymap.cpp rename to src/LibDeploy/src/dependencymap.cpp diff --git a/src/Deploy/src/dependencymap.h b/src/LibDeploy/src/dependencymap.h similarity index 100% rename from src/Deploy/src/dependencymap.h rename to src/LibDeploy/src/dependencymap.h diff --git a/src/Deploy/src/deploy.cpp b/src/LibDeploy/src/deploy.cpp similarity index 100% rename from src/Deploy/src/deploy.cpp rename to src/LibDeploy/src/deploy.cpp diff --git a/src/Deploy/src/deploy.h b/src/LibDeploy/src/deploy.h similarity index 100% rename from src/Deploy/src/deploy.h rename to src/LibDeploy/src/deploy.h diff --git a/src/Deploy/src/deploy_global.h b/src/LibDeploy/src/deploy_global.h.in similarity index 87% rename from src/Deploy/src/deploy_global.h rename to src/LibDeploy/src/deploy_global.h.in index c3cb5276..feac3fb9 100644 --- a/src/Deploy/src/deploy_global.h +++ b/src/LibDeploy/src/deploy_global.h.in @@ -12,9 +12,10 @@ #define DEFAULT_COFIGURATION_FILE QString("CQtDeployer.json") #define DISTRO_DIR QString("DistributionKit") +#define CQT_DEPLOYER_VERSION "@CQT_DEPLOYER_VERSION@" -#if defined(DEPLOY_LIBRARY) +#if defined(CQT_DEPLOYER_LIBRARY) # define DEPLOYSHARED_EXPORT Q_DECL_EXPORT #else # define DEPLOYSHARED_EXPORT Q_DECL_IMPORT diff --git a/src/Deploy/src/deployconfig.cpp b/src/LibDeploy/src/deployconfig.cpp similarity index 100% rename from src/Deploy/src/deployconfig.cpp rename to src/LibDeploy/src/deployconfig.cpp diff --git a/src/Deploy/src/deployconfig.h b/src/LibDeploy/src/deployconfig.h similarity index 100% rename from src/Deploy/src/deployconfig.h rename to src/LibDeploy/src/deployconfig.h diff --git a/src/Deploy/src/deploycore.cpp b/src/LibDeploy/src/deploycore.cpp similarity index 100% rename from src/Deploy/src/deploycore.cpp rename to src/LibDeploy/src/deploycore.cpp diff --git a/src/Deploy/src/deploycore.h b/src/LibDeploy/src/deploycore.h similarity index 99% rename from src/Deploy/src/deploycore.h rename to src/LibDeploy/src/deploycore.h index d0fd2eaf..79cb8720 100644 --- a/src/Deploy/src/deploycore.h +++ b/src/LibDeploy/src/deploycore.h @@ -12,8 +12,7 @@ #include #include #include "deploy_global.h" -#include "defines.h" -#include "quasarapp.h" +#include enum MSVCVersion: int { MSVC_Unknown = 0x0, diff --git a/src/Deploy/src/distromodule.cpp b/src/LibDeploy/src/distromodule.cpp similarity index 100% rename from src/Deploy/src/distromodule.cpp rename to src/LibDeploy/src/distromodule.cpp diff --git a/src/Deploy/src/distromodule.h b/src/LibDeploy/src/distromodule.h similarity index 100% rename from src/Deploy/src/distromodule.h rename to src/LibDeploy/src/distromodule.h diff --git a/src/Deploy/src/distrostruct.cpp b/src/LibDeploy/src/distrostruct.cpp similarity index 100% rename from src/Deploy/src/distrostruct.cpp rename to src/LibDeploy/src/distrostruct.cpp diff --git a/src/Deploy/src/distrostruct.h b/src/LibDeploy/src/distrostruct.h similarity index 100% rename from src/Deploy/src/distrostruct.h rename to src/LibDeploy/src/distrostruct.h diff --git a/src/Deploy/src/elf_type.cpp b/src/LibDeploy/src/elf_type.cpp similarity index 100% rename from src/Deploy/src/elf_type.cpp rename to src/LibDeploy/src/elf_type.cpp diff --git a/src/Deploy/src/elf_type.h b/src/LibDeploy/src/elf_type.h similarity index 100% rename from src/Deploy/src/elf_type.h rename to src/LibDeploy/src/elf_type.h diff --git a/src/Deploy/src/envirement.cpp b/src/LibDeploy/src/envirement.cpp similarity index 100% rename from src/Deploy/src/envirement.cpp rename to src/LibDeploy/src/envirement.cpp diff --git a/src/Deploy/src/envirement.h b/src/LibDeploy/src/envirement.h similarity index 100% rename from src/Deploy/src/envirement.h rename to src/LibDeploy/src/envirement.h diff --git a/src/Deploy/src/extra.cpp b/src/LibDeploy/src/extra.cpp similarity index 100% rename from src/Deploy/src/extra.cpp rename to src/LibDeploy/src/extra.cpp diff --git a/src/Deploy/src/extra.h b/src/LibDeploy/src/extra.h similarity index 100% rename from src/Deploy/src/extra.h rename to src/LibDeploy/src/extra.h diff --git a/src/Deploy/src/extracter.cpp b/src/LibDeploy/src/extracter.cpp similarity index 100% rename from src/Deploy/src/extracter.cpp rename to src/LibDeploy/src/extracter.cpp diff --git a/src/Deploy/src/extracter.h b/src/LibDeploy/src/extracter.h similarity index 100% rename from src/Deploy/src/extracter.h rename to src/LibDeploy/src/extracter.h diff --git a/src/Deploy/src/filemanager.cpp b/src/LibDeploy/src/filemanager.cpp similarity index 100% rename from src/Deploy/src/filemanager.cpp rename to src/LibDeploy/src/filemanager.cpp diff --git a/src/Deploy/src/filemanager.h b/src/LibDeploy/src/filemanager.h similarity index 100% rename from src/Deploy/src/filemanager.h rename to src/LibDeploy/src/filemanager.h diff --git a/src/Deploy/src/generalfiles_type.cpp b/src/LibDeploy/src/generalfiles_type.cpp similarity index 100% rename from src/Deploy/src/generalfiles_type.cpp rename to src/LibDeploy/src/generalfiles_type.cpp diff --git a/src/Deploy/src/generalfiles_type.h b/src/LibDeploy/src/generalfiles_type.h similarity index 100% rename from src/Deploy/src/generalfiles_type.h rename to src/LibDeploy/src/generalfiles_type.h diff --git a/src/Deploy/src/igetlibinfo.cpp b/src/LibDeploy/src/igetlibinfo.cpp similarity index 100% rename from src/Deploy/src/igetlibinfo.cpp rename to src/LibDeploy/src/igetlibinfo.cpp diff --git a/src/Deploy/src/igetlibinfo.h b/src/LibDeploy/src/igetlibinfo.h similarity index 100% rename from src/Deploy/src/igetlibinfo.h rename to src/LibDeploy/src/igetlibinfo.h diff --git a/src/Deploy/src/ignorerule.cpp b/src/LibDeploy/src/ignorerule.cpp similarity index 100% rename from src/Deploy/src/ignorerule.cpp rename to src/LibDeploy/src/ignorerule.cpp diff --git a/src/Deploy/src/ignorerule.h b/src/LibDeploy/src/ignorerule.h similarity index 100% rename from src/Deploy/src/ignorerule.h rename to src/LibDeploy/src/ignorerule.h diff --git a/src/Deploy/src/libinfo.cpp b/src/LibDeploy/src/libinfo.cpp similarity index 100% rename from src/Deploy/src/libinfo.cpp rename to src/LibDeploy/src/libinfo.cpp diff --git a/src/Deploy/src/libinfo.h b/src/LibDeploy/src/libinfo.h similarity index 100% rename from src/Deploy/src/libinfo.h rename to src/LibDeploy/src/libinfo.h diff --git a/src/Deploy/src/metafilemanager.cpp b/src/LibDeploy/src/metafilemanager.cpp similarity index 100% rename from src/Deploy/src/metafilemanager.cpp rename to src/LibDeploy/src/metafilemanager.cpp diff --git a/src/Deploy/src/metafilemanager.h b/src/LibDeploy/src/metafilemanager.h similarity index 100% rename from src/Deploy/src/metafilemanager.h rename to src/LibDeploy/src/metafilemanager.h diff --git a/src/Deploy/src/packagecontrol.cpp b/src/LibDeploy/src/packagecontrol.cpp similarity index 100% rename from src/Deploy/src/packagecontrol.cpp rename to src/LibDeploy/src/packagecontrol.cpp diff --git a/src/Deploy/src/packagecontrol.h b/src/LibDeploy/src/packagecontrol.h similarity index 100% rename from src/Deploy/src/packagecontrol.h rename to src/LibDeploy/src/packagecontrol.h diff --git a/src/Deploy/src/packing.cpp b/src/LibDeploy/src/packing.cpp similarity index 100% rename from src/Deploy/src/packing.cpp rename to src/LibDeploy/src/packing.cpp diff --git a/src/Deploy/src/packing.h b/src/LibDeploy/src/packing.h similarity index 100% rename from src/Deploy/src/packing.h rename to src/LibDeploy/src/packing.h diff --git a/src/Deploy/src/pathutils.cpp b/src/LibDeploy/src/pathutils.cpp similarity index 100% rename from src/Deploy/src/pathutils.cpp rename to src/LibDeploy/src/pathutils.cpp diff --git a/src/Deploy/src/pathutils.h b/src/LibDeploy/src/pathutils.h similarity index 100% rename from src/Deploy/src/pathutils.h rename to src/LibDeploy/src/pathutils.h diff --git a/src/Deploy/src/pe_type.cpp b/src/LibDeploy/src/pe_type.cpp similarity index 100% rename from src/Deploy/src/pe_type.cpp rename to src/LibDeploy/src/pe_type.cpp diff --git a/src/Deploy/src/pe_type.h b/src/LibDeploy/src/pe_type.h similarity index 100% rename from src/Deploy/src/pe_type.h rename to src/LibDeploy/src/pe_type.h diff --git a/src/Deploy/src/pluginsparser.cpp b/src/LibDeploy/src/pluginsparser.cpp similarity index 100% rename from src/Deploy/src/pluginsparser.cpp rename to src/LibDeploy/src/pluginsparser.cpp diff --git a/src/Deploy/src/pluginsparser.h b/src/LibDeploy/src/pluginsparser.h similarity index 100% rename from src/Deploy/src/pluginsparser.h rename to src/LibDeploy/src/pluginsparser.h diff --git a/src/Deploy/src/qml.cpp b/src/LibDeploy/src/qml.cpp similarity index 100% rename from src/Deploy/src/qml.cpp rename to src/LibDeploy/src/qml.cpp diff --git a/src/Deploy/src/qml.h b/src/LibDeploy/src/qml.h similarity index 100% rename from src/Deploy/src/qml.h rename to src/LibDeploy/src/qml.h diff --git a/src/Deploy/src/qtdir.cpp b/src/LibDeploy/src/qtdir.cpp similarity index 100% rename from src/Deploy/src/qtdir.cpp rename to src/LibDeploy/src/qtdir.cpp diff --git a/src/Deploy/src/qtdir.h b/src/LibDeploy/src/qtdir.h similarity index 100% rename from src/Deploy/src/qtdir.h rename to src/LibDeploy/src/qtdir.h diff --git a/src/Deploy/src/targetdata.cpp b/src/LibDeploy/src/targetdata.cpp similarity index 100% rename from src/Deploy/src/targetdata.cpp rename to src/LibDeploy/src/targetdata.cpp diff --git a/src/Deploy/src/targetdata.h b/src/LibDeploy/src/targetdata.h similarity index 100% rename from src/Deploy/src/targetdata.h rename to src/LibDeploy/src/targetdata.h diff --git a/src/Deploy/src/targetinfo.cpp b/src/LibDeploy/src/targetinfo.cpp similarity index 100% rename from src/Deploy/src/targetinfo.cpp rename to src/LibDeploy/src/targetinfo.cpp diff --git a/src/Deploy/src/targetinfo.h b/src/LibDeploy/src/targetinfo.h similarity index 100% rename from src/Deploy/src/targetinfo.h rename to src/LibDeploy/src/targetinfo.h diff --git a/src/Deploy/src/zipcompresser.cpp b/src/LibDeploy/src/zipcompresser.cpp similarity index 100% rename from src/Deploy/src/zipcompresser.cpp rename to src/LibDeploy/src/zipcompresser.cpp diff --git a/src/Deploy/src/zipcompresser.h b/src/LibDeploy/src/zipcompresser.h similarity index 100% rename from src/Deploy/src/zipcompresser.h rename to src/LibDeploy/src/zipcompresser.h diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0a2cbb0e..d42ab424 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -18,9 +18,13 @@ file(GLOB_RECURSE SOURCE_CPP set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(PUBLIC_INCUDE_DIR ${PUBLIC_INCUDE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/units") +get_filename_component(QT_QT_ROOT "${Qt${QT_VERSION_MAJOR}Core_DIR}/../../.." ABSOLUTE) + +add_definitions(-DQT_BASE_DIR="${QT_QT_ROOT}") +add_definitions(-DTEST_BIN_DIR="${CMAKE_CURRENT_LIST_DIR}") add_executable(${CURRENT_PROJECT} ${SOURCE_CPP}) -target_link_libraries(${CURRENT_PROJECT} PRIVATE Qt${QT_VERSION_MAJOR}::Test ${PROJECT_NAME}Library) +target_link_libraries(${CURRENT_PROJECT} PRIVATE Qt${QT_VERSION_MAJOR}::Test ${PROJECT_NAME}LibDeploy) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) diff --git a/tests/units/deploytargettest.cpp b/tests/units/deploytargettest.cpp new file mode 100644 index 00000000..2c90dc10 --- /dev/null +++ b/tests/units/deploytargettest.cpp @@ -0,0 +1,71 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "deploytargettest.h" + +#include +#include +#include +#include +#include + + +DeployTargetTest::DeployTargetTest() { + +} + +DeployTargetTest::~DeployTargetTest() { + +} + + +void DeployTargetTest::test() { + FileManager file; + DependenciesScanner scan; + Packing pac(&file); + PluginsParser _pluginParser; + + ConfigParser *deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + + QStringList targets; + targets << "./test/bins/execTarget.exe"; + QVERIFY(deploy->setTargets(targets)); + delete deploy; + targets.clear(); + + deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + targets << "./test/bins/execTarget"; + QVERIFY(deploy->setTargets(targets)); + delete deploy; + targets.clear(); + + deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + targets << "./test/bins/execTarget.exe" << "./test/bins/execTarget"; + QVERIFY(deploy->setTargets(targets)); + delete deploy; + targets.clear(); + + deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + targets << "./test/bns/execTarget.exe"; + QVERIFY(!deploy->setTargets(targets)); + delete deploy; + targets.clear(); + + deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + targets << "./test/bins/"; + QVERIFY(deploy->setTargets(targets)); + delete deploy; + targets.clear(); + + deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + targets << "./test/bins/" << "./test/warning/"; + QVERIFY(deploy->setTargets(targets)); + + delete deploy; + targets.clear(); +} diff --git a/tests/units/deploytargettest.h b/tests/units/deploytargettest.h new file mode 100644 index 00000000..91b9298e --- /dev/null +++ b/tests/units/deploytargettest.h @@ -0,0 +1,26 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DeployTarget_TEST_H +#define DeployTarget_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DeployTargetTest: public TestBase, protected TestUtils +{ +public: + DeployTargetTest(); + ~DeployTargetTest(); + + void test(); + +}; + +#endif // DeployTarget_TEST_H diff --git a/tests/units/tst_deploytest.cpp b/tests/units/deploytest.cpp similarity index 99% rename from tests/units/tst_deploytest.cpp rename to tests/units/deploytest.cpp index 37ebdac1..b3f4bb4b 100644 --- a/tests/units/tst_deploytest.cpp +++ b/tests/units/deploytest.cpp @@ -5,6 +5,7 @@ * of this license document, but changing it is not allowed. */ +#include "deploytest.h" #include #include #include diff --git a/tests/units/deploytest.h b/tests/units/deploytest.h new file mode 100644 index 00000000..787c9a0f --- /dev/null +++ b/tests/units/deploytest.h @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2018-2022 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 +#include +#include + + +#include +#include +#include +#include + +// add necessary includes here + + +static const QString TestBinDir = TEST_BIN_DIR; +static const QString TestQtDir = QT_BASE_DIR; + +class deploytest : public QObject +{ + Q_OBJECT + +private: + QSet filesTree; + + void runTestParams(QStringList list, + QSet *tree = nullptr, + bool noWarnings = false, + bool onlySize = false, + exitCodes exitCode = exitCodes::Good, + const std::function &cb = {}); + + void checkResults(const QSet &tree, + bool noWarnings, + bool onlySize = false); + + void createTree(const QStringList& tree); + +public: + deploytest(); + /** + * @brief generateLib + * @param paath + * @return size of lib + */ + int generateLib(const QString& paath); + void deleteLib(const QString& paath); + + ~deploytest(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + + // old tests (not valid) + void testDeployTarget(); + void testStrip(); + void testExtractLib(); + void testRelativeLink(); + void testCheckQt(); + + void testQmlExtrct(); + void testSetTargetDir(); + + // void mainTests(); + + // end old tests + + // tested flags customScript + + void testZip(); + void costomScript(); + void testDistroStruct(); + + // tested flags clear noOvervrite + void testOverwrite(); + void testOverwriteWithPacking(); + + // tested flags binDir + void testextraData(); + + // tested flags qmlDir qmake + void testQt(); + + + void testWebEngine(); + + // tested flags confFile + void testConfFile(); + + // tested flags targetPackage + void testPackages(); + + // tested clear force clear in clear mode + void testClear(); + + // tested flags ignore + void testIgnore(); + + // tested flags ignore ignoreEnv + void testIgnoreEnv(); + + // tested flags libDir recursiveDepth + void testLibDir(); + + // tested flag extraPlugin + void testExtraPlugins(); + + // tested flag targetDir + void testTargetDir(); + + // tested flag noLibc deploySystem + void testSystemLib(); + + // tested flag qmlOut libOut trOut pluginOut binOut + void testOutDirs(); + + void testMSVC(); + + // qif flags + void testQIF(); + void testQIFMulti(); + void testQIFCustom(); + + // zip flags + void testZIP(); + void testZIPMulti(); + + // deb flags + void testDEB(); + void testDEBMulti(); + void testDEBCustom(); + + // qif and zip flags + void testMultiPacking(); + + // init flags + void testInit(); + + void testDependencyMap(); + + void testQmlScaner(); + + void testPrefix(); + // test configure empty packages + void testallowEmptyPackages(); + // test skip empty packages + void testEmptyPackages(); + + void testRunScripts(); + void testOverridingDefaultTemplateQIF(); + void testOverridingDefaultTemplateDEB(); + + void testDeployGeneralFiles(); + void testTr(); + void testVirtualKeyBoard(); + // Attention! This test only covers 40% of icon functions + void testIcons(); + void testPathUtils(); + void testBinPrefix(); + + void testMd5(); + + void testDisableShortcuts(); + void testDisableRunScripts(); + void testQifOut(); + void testIgnoreEnvWithLibDir(); + + // note: this test checking in manual mode only. + void testInstallDirsOptions(); + + void testQIFResources(); + + void testCustomPlatform(); + void testQifArchiveFormat(); + void testQifBinaryCreator(); + + void customTest(); +}; diff --git a/tests/units/testbase.cpp b/tests/units/testbase.cpp new file mode 100644 index 00000000..4cb1907e --- /dev/null +++ b/tests/units/testbase.cpp @@ -0,0 +1,275 @@ +#include "testbase.h" +#include +#include "testutils.h" +#include +#include +#include + +static const QString TestBinDir = TEST_BIN_DIR; +static const QString TestQtDir = QT_BASE_DIR; + +TestBase::TestBase() +{ + +} + +void TestBase::deploytest() { + + qputenv("QTEST_FUNCTION_TIMEOUT", "1800000"); + QString qifwPath = qgetenv("PATH") + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.0/bin/"; + qifwPath += qifwPath + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.1/bin/"; + qifwPath += qifwPath + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.2/bin/"; + qifwPath += qifwPath + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.3/bin/"; + + qputenv("PATH", qifwPath.toLatin1().data()); + TestUtils utils; + + QStringList pathList = QProcessEnvironment::systemEnvironment(). + value("PATH").split(DeployCore::getEnvSeparator()); + + for (const auto& path: qAsConst(pathList)) { + filesTree += utils.getFilesSet(path, 1); + } + + filesTree += utils.getFilesSet(TestQtDir); + +} + +int TestBase::generateLib(const QString &paath) { + QDir dir; + dir.mkpath(QFileInfo(paath).absolutePath()); + QFile testLib (paath); + + int size = 0; + + if (testLib.open(QIODevice::ReadWrite| QIODevice::Truncate)) { + QFile resData(":/debugLib"); + if (resData.open(QIODevice::ReadOnly)) { + QByteArray tempData = resData.readAll(); + size = tempData.size(); + testLib.write(tempData.data(), tempData.size()); + resData.close(); + } + + testLib.close(); + } + + return size; +} + +void TestBase::deleteLib(const QString &paath) { + QFileInfo info(paath); + if (info.isDir()) { + QFile::remove(info.absoluteFilePath()); + } else { + QDir qt(info.absoluteFilePath()); + qt.removeRecursively(); + } +} + +void TestBase::initTestCase() { + QDir qt; + + QDir("./" + DISTRO_DIR).removeRecursively(); + + qt.mkpath("./test/Qt/5.12/"); + qt.mkpath("./test/extraPath/"); + qt.mkpath("./test/extra/"); + qt.mkpath("./test/warning/"); + qt.mkpath("./test/bins/"); + + QFile f( "./test/Qt/5.12/generalLib.so"); + if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { + f.write("lib", 3); + f.close(); + } + + f.setFileName("./test/extraPath/ExtraLib.so"); + if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { + f.write("lib", 3); + f.close(); + } + + f.setFileName("./test/extra/ExtraLib.so"); + if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { + f.write("lib", 3); + f.close(); + } + + f.setFileName("./test/warning/WarningLib.so"); + if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { + f.write("lib", 3); + f.close(); + } + + f.setFileName("./test/bins/execTarget.exe"); + if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { + f.write("exec", 3); + f.close(); + } + + f.setFileName("./test/bins/execTarget"); + if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { + f.write("exec", 3); + f.close(); + } +} + +void TestBase::cleanupTestCase() { + QDir qt("./test"); + qt.removeRecursively(); + +} + +void TestBase::checkResults(const QSet &tree, bool noWarnings, bool onlySize) { + TestUtils utils; + + QVERIFY(DeployCore::_config); + QVERIFY(!DeployCore::_config->getTargetDir().isEmpty()); + + auto resultTree = utils.getTree(DeployCore::_config->getTargetDir()); + +#ifdef Q_OS_WIN + // Remove all API-MS-Win libs, because each OS Windows have a own bundle of this api libs. + // See the https://github.com/QuasarApp/CQtDeployer/issues/481#issuecomment-755156875 post for more information. + resultTree = TestModule.ignoreFilter(resultTree, "API-MS-Win"); + +#endif + + + auto comapre = utils.compareTree(resultTree, tree); + + if (onlySize) { + QVERIFY(resultTree.size() > tree.size()); + return; + } + + if (comapre.size() != 0) { + + bool bug = false; + QJsonObject comapreResult; + + for (auto i = comapre.begin(); i != comapre.end(); ++i) { + + if (i.value() == 1) { + comapreResult[ i.key()] = "Added unnecessary file"; + qCritical() << "added unnecessary file : " + i.key(); + bug = true; + } else if (filesTree.contains(QFileInfo(i.key()).fileName())) { + comapreResult[ i.key()] = "Missing"; + qCritical() << "Missing file : " + i.key(); + bug = true; + } else if (noWarnings) { + comapreResult[ i.key()] = " not exits in qt Dir"; + + qCritical() << "File : " + i.key() + " not exits in qt Dir"; + bug = true; + } else { + comapreResult[ i.key()] = " not exits in qt Dir"; + qWarning() << "File : " + i.key() + " not exits in qt Dir"; + } + } + + if (!bug) { + return; + } + + QJsonObject obj; + for (const auto &i : qAsConst(resultTree)) { + obj[i]; + } + + QJsonDocument doc(obj); + + QFile lasttree("./LastTree.json"); + lasttree.open(QIODevice::WriteOnly| QIODevice::Truncate); + + lasttree.write(doc.toJson()); + lasttree.close(); + + lasttree.setFileName("./CompareTree.json"); + lasttree.open(QIODevice::WriteOnly| QIODevice::Truncate); + + lasttree.write(QJsonDocument(comapreResult).toJson()); + lasttree.close(); + + QVERIFY2(false, "runTestParams fail"); + + + } + +} + +void TestBase::costomScript() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/TestOnlyC.sh"}); + QString bin = TestBinDir + "TestOnlyC"; + QString scriptPath = "./" + DISTRO_DIR + "/TestOnlyC.sh"; + +#else + QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + "./" + DISTRO_DIR + "/qt.conf"}); + QString bin = TestBinDir + "TestOnlyC.exe"; + QString scriptPath = "./" + DISTRO_DIR + "/TestOnlyC.bat"; + + +#endif + + runTestParams({"-bin", bin, "force-clear", "noOverwrite", "-libOut", "lib"}, &comapareTree); + + QFile script(scriptPath); + QVERIFY(script.open(QIODevice::ReadOnly)); + auto scriptText = script.readAll(); + + QVERIFY(!scriptText.contains("Begin Custom Script")); + + script.close(); + + runTestParams({"-bin", bin, "force-clear", "noOverwrite", + "-libOut", "lib", + "-customScript", "echo 'this is test script'"}, &comapareTree); + + QVERIFY(script.open(QIODevice::ReadOnly)); + + scriptText = script.readAll(); + + QVERIFY(scriptText.contains("Begin Custom Script")); + QVERIFY(scriptText.contains("echo 'this is test script'")); + QVERIFY(scriptText.contains("End Custom Script")); + + script.close(); + + + + +} + +void TestBase::runTestParams(QStringList list, QSet *tree, bool noWarnings, bool onlySize, exitCodes exitCode, const std::function &cb) { + + QuasarAppUtils::Params::parseParams(list); + + Deploy deploy; + int code = deploy.run(); + if (code != exitCode) { + qDebug() << "Needed exit Code = " << exitCode; + qDebug() << "Exit Code = " << code; + + QVERIFY(false && "exit code not valid"); + } + + if (tree) { + checkResults(*tree, noWarnings, onlySize); + } + + if (cb) + cb(DeployCore::_config); +} diff --git a/tests/units/testbase.h b/tests/units/testbase.h new file mode 100644 index 00000000..da79a612 --- /dev/null +++ b/tests/units/testbase.h @@ -0,0 +1,41 @@ +#ifndef TESTBASE_H +#define TESTBASE_H + +#include "deploy.h" +#include "test.h" +#include +#include + + + +class TestBase: public Test +{ +public: + TestBase(); + + void deploytest(); + int generateLib(const QString &paath); + void deleteLib(const QString &paath); + void initTestCase(); + + void cleanupTestCase(); + + void checkResults(const QSet &tree, + bool noWarnings, + bool onlySize); + + void costomScript(); + + void runTestParams(QStringList list, + QSet *tree = nullptr, + bool noWarnings = false, + bool onlySize = false, + exitCodes exitCode = exitCodes::Good, + const std::function &cb = {}); + +private: + QSet filesTree; + +}; + +#endif // TESTBASE_H From 617f03cc0dc9161b2532d6cf823245cf5fac7aa9 Mon Sep 17 00:00:00 2001 From: EndrII Date: Tue, 9 Aug 2022 22:25:49 +0300 Subject: [PATCH 05/76] second commit with port tests to cmake --- tests/units/MSVCtest.cpp | 41 +++++++++ tests/units/MSVCtest.h | 26 ++++++ tests/units/QIFWtest.cpp | 45 ++++++++++ tests/units/QIFWtest.h | 23 +++++ tests/units/QIFWtestcustom.cpp | 46 ++++++++++ tests/units/QIFWtestcustom.h | 23 +++++ tests/units/QIFWtestmulti.cpp | 47 +++++++++++ tests/units/QIFWtestmulti.h | 23 +++++ tests/units/allowemptypackagestest.cpp | 32 +++++++ tests/units/allowemptypackagestest.h | 23 +++++ tests/units/debcustomtest.cpp | 35 ++++++++ tests/units/debcustomtest.h | 23 +++++ tests/units/debmultitest.cpp | 41 +++++++++ tests/units/debmultitest.h | 23 +++++ tests/units/debtest.cpp | 36 ++++++++ tests/units/debtest.h | 23 +++++ tests/units/dependencymaptest.cpp | 53 ++++++++++++ tests/units/dependencymaptest.h | 23 +++++ tests/units/extractlibtest.cpp | 54 ++++++++++++ tests/units/extractlibtest.h | 26 ++++++ tests/units/inittest.cpp | 33 ++++++++ tests/units/inittest.h | 23 +++++ tests/units/multipackingtest.cpp | 55 ++++++++++++ tests/units/multipackingtest.h | 23 +++++ tests/units/prefixtest.cpp | 46 ++++++++++ tests/units/prefixtest.h | 23 +++++ tests/units/qmlscanertest.cpp | 111 +++++++++++++++++++++++++ tests/units/qmlscanertest.h | 23 +++++ tests/units/striptest.cpp | 86 +++++++++++++++++++ tests/units/striptest.h | 26 ++++++ tests/units/webenginetest.cpp | 41 +++++++++ tests/units/webenginetest.h | 23 +++++ tests/units/ziptest.cpp | 68 +++++++++++++++ tests/units/ziptest.h | 23 +++++ 34 files changed, 1270 insertions(+) create mode 100644 tests/units/MSVCtest.cpp create mode 100644 tests/units/MSVCtest.h create mode 100644 tests/units/QIFWtest.cpp create mode 100644 tests/units/QIFWtest.h create mode 100644 tests/units/QIFWtestcustom.cpp create mode 100644 tests/units/QIFWtestcustom.h create mode 100644 tests/units/QIFWtestmulti.cpp create mode 100644 tests/units/QIFWtestmulti.h create mode 100644 tests/units/allowemptypackagestest.cpp create mode 100644 tests/units/allowemptypackagestest.h create mode 100644 tests/units/debcustomtest.cpp create mode 100644 tests/units/debcustomtest.h create mode 100644 tests/units/debmultitest.cpp create mode 100644 tests/units/debmultitest.h create mode 100644 tests/units/debtest.cpp create mode 100644 tests/units/debtest.h create mode 100644 tests/units/dependencymaptest.cpp create mode 100644 tests/units/dependencymaptest.h create mode 100644 tests/units/extractlibtest.cpp create mode 100644 tests/units/extractlibtest.h create mode 100644 tests/units/inittest.cpp create mode 100644 tests/units/inittest.h create mode 100644 tests/units/multipackingtest.cpp create mode 100644 tests/units/multipackingtest.h create mode 100644 tests/units/prefixtest.cpp create mode 100644 tests/units/prefixtest.h create mode 100644 tests/units/qmlscanertest.cpp create mode 100644 tests/units/qmlscanertest.h create mode 100644 tests/units/striptest.cpp create mode 100644 tests/units/striptest.h create mode 100644 tests/units/webenginetest.cpp create mode 100644 tests/units/webenginetest.h create mode 100644 tests/units/ziptest.cpp create mode 100644 tests/units/ziptest.h diff --git a/tests/units/MSVCtest.cpp b/tests/units/MSVCtest.cpp new file mode 100644 index 00000000..c0c2e0df --- /dev/null +++ b/tests/units/MSVCtest.cpp @@ -0,0 +1,41 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "MSVCtest.h" +#include +#include +#include +#include +#include + + +MSVCTest::MSVCTest() { + +} + +MSVCTest::~MSVCTest() { + +} + +void MSVCTest::test() { + QString testPath = "./Qt/5.11.2/msvc2017_64/bin/"; + + QDir d; + QDir oldDir("./Qt"); + oldDir.removeRecursively(); + QVERIFY(d.mkpath(testPath)); + + + auto msvc = DeployCore::getMSVC(testPath); + + QVERIFY(msvc & MSVCVersion::MSVC_17); + QVERIFY(msvc & MSVCVersion::MSVC_x64); + + QDir dir("./Qt"); + dir.removeRecursively(); +} diff --git a/tests/units/MSVCtest.h b/tests/units/MSVCtest.h new file mode 100644 index 00000000..03ba5a59 --- /dev/null +++ b/tests/units/MSVCtest.h @@ -0,0 +1,26 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef MSVC_TEST_H +#define MSVC_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class MSVCTest: public TestBase, protected TestUtils +{ +public: + MSVCTest(); + ~MSVCTest(); + + void test(); + +}; + +#endif // MSVC_TEST_H diff --git a/tests/units/QIFWtest.cpp b/tests/units/QIFWtest.cpp new file mode 100644 index 00000000..4e437f60 --- /dev/null +++ b/tests/units/QIFWtest.cpp @@ -0,0 +1,45 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "QIFWtest.h" +#include +#include +#include +#include +#include + + +void QIFWTest::test() { + TestUtils utils; +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + + QString qmake = TestQtDir + "bin/qmake"; + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/InstallerTestOnlyC.run", + "./" + DISTRO_DIR + "/InstallerTestOnlyC.run.md5", + }); + +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + + QString qmake = TestQtDir + "bin/qmake.exe"; + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe", + "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe.md5", + + }); + +#endif + + runTestParams({"-bin", bin, "clear" , + "qif", "qifFromSystem", + "-qifStyle", "quasar", + "-qifBanner", TestBinDir + "/../../res/CQtDeployer_banner_web.png", + "-qifLogo", TestBinDir + "/../../res/CQtDeployer defaultIcon_web.png"}, &comapareTree, true); +} diff --git a/tests/units/QIFWtest.h b/tests/units/QIFWtest.h new file mode 100644 index 00000000..cca77239 --- /dev/null +++ b/tests/units/QIFWtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QIFW_TEST_H +#define QIFW_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QIFWTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QIFW_TEST_H diff --git a/tests/units/QIFWtestcustom.cpp b/tests/units/QIFWtestcustom.cpp new file mode 100644 index 00000000..a2da795b --- /dev/null +++ b/tests/units/QIFWtestcustom.cpp @@ -0,0 +1,46 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "QIFWtestcustom.h" +#include +#include +#include +#include +#include + + +void QIFWCustomTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestCPPOnly" + "," + TestBinDir + "TestOnlyC"; + + QString qmake = TestQtDir + "bin/qmake"; + + auto comapareTreeCustom = utils.createTree({ + "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.run", + "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.run.md5", + + }); +#else + QString bin = TestBinDir + "TestCPPOnly.exe" + "," + TestBinDir + "TestOnlyC.exe"; + + QString qmake = TestQtDir + "bin/qmake.exe"; + auto comapareTreeCustom = utils.createTree({ + "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.exe", + "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.exe.md5", + }); + +#endif + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-qif", TestBinDir + "/../../UnitTests/testRes/QIFCustomTemplate", + "-name", "org.qtproject.ifw.example.stylesheet", + "qifFromSystem"}, &comapareTreeCustom, true); +} diff --git a/tests/units/QIFWtestcustom.h b/tests/units/QIFWtestcustom.h new file mode 100644 index 00000000..8fe4ef7b --- /dev/null +++ b/tests/units/QIFWtestcustom.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QIFW_CUSTOM_TEST_H +#define QIFW_CUSTOM_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QIFWCustomTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QIFW_CUSTOM_TEST_H diff --git a/tests/units/QIFWtestmulti.cpp b/tests/units/QIFWtestmulti.cpp new file mode 100644 index 00000000..fb2814f0 --- /dev/null +++ b/tests/units/QIFWtestmulti.cpp @@ -0,0 +1,47 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "QIFWtestmulti.h" +#include +#include +#include +#include +#include + + +void QIFWMultiTest::test() { + TestUtils utils; +#ifdef Q_OS_UNIX + QString target1 = TestBinDir + "TestCPPOnly"; + QString target2 = TestBinDir + "TestOnlyC"; + + auto comapareTreeMulti = utils.createTree({ + "./" + DISTRO_DIR + "/InstallerApplication.run", + "./" + DISTRO_DIR + "/InstallerApplication.run.md5", + + }); + +#else + QString target1 = TestBinDir + "TestCPPOnly.exe"; + QString target2 = TestBinDir + "TestOnlyC.exe"; + + auto comapareTreeMulti = utils.createTree({ + "./" + DISTRO_DIR + "/InstallerApplication.exe", + "./" + DISTRO_DIR + "/InstallerApplication.exe.md5", + + }); + +#endif + QString bin = target1; + bin += "," + target2; + + auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", packageString, + "qif", "qifFromSystem"}, &comapareTreeMulti, true); +} diff --git a/tests/units/QIFWtestmulti.h b/tests/units/QIFWtestmulti.h new file mode 100644 index 00000000..f75514cf --- /dev/null +++ b/tests/units/QIFWtestmulti.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QIFW_MULTI_TEST_H +#define QIFW_MULTI_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QIFWMultiTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QIFW_MULTI_TEST_H diff --git a/tests/units/allowemptypackagestest.cpp b/tests/units/allowemptypackagestest.cpp new file mode 100644 index 00000000..7ea2abdb --- /dev/null +++ b/tests/units/allowemptypackagestest.cpp @@ -0,0 +1,32 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "allowemptypackagestest.h" +#include +#include +#include +#include +#include + + +void AllowEmptyPackagesTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + runTestParams({"-bin", bin, "force-clear", + "-prefix", "package;prefix"}, nullptr, false, false, + exitCodes::PrepareError); + + runTestParams({"-bin", bin, "force-clear", + "-prefix", "package;prefix", + "allowEmptyPackages"}); +} diff --git a/tests/units/allowemptypackagestest.h b/tests/units/allowemptypackagestest.h new file mode 100644 index 00000000..cb18467f --- /dev/null +++ b/tests/units/allowemptypackagestest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef ALLOW_EMPTY_PACKAGES_TEST_H +#define ALLOW_EMPTY_PACKAGES_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class AllowEmptyPackagesTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // ALLOW_EMPTY_PACKAGES_TEST_H diff --git a/tests/units/debcustomtest.cpp b/tests/units/debcustomtest.cpp new file mode 100644 index 00000000..27ef3fbb --- /dev/null +++ b/tests/units/debcustomtest.cpp @@ -0,0 +1,35 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "debcustomtest.h" +#include +#include +#include +#include +#include + + +void DEBCustomTest::test() { +#ifdef Q_OS_UNIX + + TestUtils utils; + + QString bin = TestBinDir + "TestOnlyC"; + + auto comapareTreeCustom = utils.createTree({ + "./" + DISTRO_DIR + "/chrome.deb", + "./" + DISTRO_DIR + "/chrome.deb.md5", + + }); + + runTestParams({"-bin", bin, "clear" , + "-deb", TestBinDir + "/../../UnitTests/testRes/DEBCustomTemplate", + "-name", "chrome"}, + &comapareTreeCustom, true); +#endif +} diff --git a/tests/units/debcustomtest.h b/tests/units/debcustomtest.h new file mode 100644 index 00000000..93ada0c6 --- /dev/null +++ b/tests/units/debcustomtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DEB_CUSTOM_TEST_H +#define DEB_CUSTOM_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DEBCustomTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DEB_CUSTOM_TEST_H diff --git a/tests/units/debmultitest.cpp b/tests/units/debmultitest.cpp new file mode 100644 index 00000000..305c8318 --- /dev/null +++ b/tests/units/debmultitest.cpp @@ -0,0 +1,41 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "debmultitest.h" +#include +#include +#include +#include +#include + + +void DEBMultiTest::test() { +#ifdef Q_OS_UNIX + TestUtils utils; + + auto comapareTreeMulti = utils.createTree({ + "./" + DISTRO_DIR + "/package1.deb", + "./" + DISTRO_DIR + "/package2.deb", + "./" + DISTRO_DIR + "/package1.deb.md5", + "./" + DISTRO_DIR + "/package2.deb.md5", + + }); + + QString target1 = TestBinDir + "TestCPPOnly"; + + QString target2 = TestBinDir + "TestOnlyC"; + + QString bin = target1; + bin += "," + target2; + + auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", packageString, + "deb"}, &comapareTreeMulti, true); +#endif +} diff --git a/tests/units/debmultitest.h b/tests/units/debmultitest.h new file mode 100644 index 00000000..69869773 --- /dev/null +++ b/tests/units/debmultitest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DEB_MULTI_TEST_H +#define DEB_MULTI_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DEBMultiTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DEB_MULTI_TEST_H diff --git a/tests/units/debtest.cpp b/tests/units/debtest.cpp new file mode 100644 index 00000000..e0eb827a --- /dev/null +++ b/tests/units/debtest.cpp @@ -0,0 +1,36 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "debtest.h" +#include +#include +#include +#include +#include + + +void DEBTest::test() { +#ifdef Q_OS_UNIX + TestUtils utils; + + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/TestOnlyC.deb", + "./" + DISTRO_DIR + "/TestOnlyC.deb.md5", + + }); + + QString bin = TestBinDir + "TestOnlyC"; + + runTestParams({"-bin", bin, "clear" , + "deb", "verbose"}, &comapareTree, true); + + // test clear for deb + runTestParams({"clear", "verbose"}, nullptr, true); + +#endif +} diff --git a/tests/units/debtest.h b/tests/units/debtest.h new file mode 100644 index 00000000..da53e2a2 --- /dev/null +++ b/tests/units/debtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DEB_TEST_H +#define DEB_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DEBTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DEB_TEST_H diff --git a/tests/units/dependencymaptest.cpp b/tests/units/dependencymaptest.cpp new file mode 100644 index 00000000..44d31c37 --- /dev/null +++ b/tests/units/dependencymaptest.cpp @@ -0,0 +1,53 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "dependencymaptest.h" +#include +#include +#include +#include +#include + + +void DependencyMapTest::test() { + DependencyMap dep1, dep2, dep3; + + QVERIFY(dep1.qtModules() == 0); + QVERIFY(dep2.qtModules() == 0); + QVERIFY(dep3.qtModules() == 0); + + QVERIFY(dep1.systemLibs().isEmpty()); + QVERIFY(dep2.systemLibs().isEmpty()); + QVERIFY(dep3.systemLibs().isEmpty()); + + + QVERIFY(dep1.neadedLibs().isEmpty()); + QVERIFY(dep2.neadedLibs().isEmpty()); + QVERIFY(dep3.neadedLibs().isEmpty()); + + dep1.addModule(DeployCore::QtModule::QtGuiModule); + + QVERIFY(dep1.qtModules() == DeployCore::QtModule::QtGuiModule); + dep1.addModule(DeployCore::QtModule::QtHelpModule); + + QVERIFY(dep1.qtModules() == (DeployCore::QtModule::QtGuiModule | + DeployCore::QtModule::QtHelpModule)); + + dep1.removeModule(DeployCore::QtModule::QtGuiModule); + + QVERIFY(dep1.qtModules() == DeployCore::QtModule::QtHelpModule); + + dep2.addModule(DeployCore::QtModule::QtGuiModule); + + dep1 += dep2; + + QVERIFY(dep1.qtModules() == (DeployCore::QtModule::QtGuiModule | + DeployCore::QtModule::QtHelpModule)); + + +} diff --git a/tests/units/dependencymaptest.h b/tests/units/dependencymaptest.h new file mode 100644 index 00000000..f0ac8630 --- /dev/null +++ b/tests/units/dependencymaptest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DEPENDENCY_MAP_TEST_H +#define DEPENDENCY_MAP_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DependencyMapTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DEPENDENCY_MAP_TEST_H diff --git a/tests/units/extractlibtest.cpp b/tests/units/extractlibtest.cpp new file mode 100644 index 00000000..c2004894 --- /dev/null +++ b/tests/units/extractlibtest.cpp @@ -0,0 +1,54 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "extractlibtest.h" +#include +#include +#include +#include +#include + + +ExtractLibTest::ExtractLibTest() { + +} + +ExtractLibTest::~ExtractLibTest() { + +} + +void ExtractLibTest::test() { + LibCreator creator("./"); + auto libs = creator.getLibs(); + auto deb = creator.getLibsDep(); + auto platforms = creator.getLibplatform(); + + DependenciesScanner scaner; + + LibInfo info; + + for (const auto &lib : libs) { + QVERIFY(scaner.fillLibInfo(info, lib)); + QVERIFY(info.getName() == QFileInfo(lib).fileName()); + QVERIFY(info.getPath() == QFileInfo(lib).absolutePath()); + QVERIFY(info.fullPath() == QFileInfo(lib).absoluteFilePath()); + QVERIFY(info.getPlatform() == platforms.value(lib)); + + for (const auto &dep : deb.value(lib)) { + QString depName = dep; + if (info.getPlatform() & Platform::Win) { + depName = dep.toUpper(); + } + + bool test = info.getDependncies().contains(depName); + QVERIFY(test); + } + + } + +} diff --git a/tests/units/extractlibtest.h b/tests/units/extractlibtest.h new file mode 100644 index 00000000..f2c626d9 --- /dev/null +++ b/tests/units/extractlibtest.h @@ -0,0 +1,26 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef EXTRACTLIB_TEST_H +#define EXTRACTLIB_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ExtractLibTest: public TestBase, protected TestUtils +{ +public: + ExtractLibTest(); + ~ExtractLibTest(); + + void test(); + +}; + +#endif // EXTRACTLIB_TEST_H diff --git a/tests/units/inittest.cpp b/tests/units/inittest.cpp new file mode 100644 index 00000000..121a031e --- /dev/null +++ b/tests/units/inittest.cpp @@ -0,0 +1,33 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "inittest.h" +#include +#include +#include +#include +#include + + +void InitTest::test() { + TestUtils utils; + + runTestParams({"init"}); + + QVERIFY(QFile(DEFAULT_COFIGURATION_FILE).remove()); + + runTestParams({"-init", "multi"}); + + + QVERIFY(QFile(DEFAULT_COFIGURATION_FILE).remove()); + + runTestParams({"-init", "single"}); + + QVERIFY(QFile(DEFAULT_COFIGURATION_FILE).remove()); + +} diff --git a/tests/units/inittest.h b/tests/units/inittest.h new file mode 100644 index 00000000..85aba397 --- /dev/null +++ b/tests/units/inittest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef INIT_TEST_H +#define INIT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class InitTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // INIT_TEST_H diff --git a/tests/units/multipackingtest.cpp b/tests/units/multipackingtest.cpp new file mode 100644 index 00000000..cc8f5c15 --- /dev/null +++ b/tests/units/multipackingtest.cpp @@ -0,0 +1,55 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "multipackingtest.h" +#include +#include +#include +#include +#include + + +void MultiPackingTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/TestOnlyC.zip", + "./" + DISTRO_DIR + "/TestOnlyC.deb", + "./" + DISTRO_DIR + "/InstallerTestOnlyC.run", + "./" + DISTRO_DIR + "/InstallerTestOnlyC.run.md5", + "./" + DISTRO_DIR + "/TestOnlyC.zip.md5", + "./" + DISTRO_DIR + "/TestOnlyC.deb.md5", + + }); + + QString bin = TestBinDir + "TestOnlyC"; + + runTestParams({"-bin", bin, "clear" , + "zip", + "qif", "qifFromSystem", + "deb", + "verbose"}, &comapareTree, true); + +#else + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/TestOnlyC.zip", + "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.zip.md5", + "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe.md5", + }); + QString bin = TestBinDir + "TestOnlyC.exe"; + + runTestParams({"-bin", bin, "clear" , + "zip", + "qif", "qifFromSystem", + "verbose"}, &comapareTree, true); + +#endif +} diff --git a/tests/units/multipackingtest.h b/tests/units/multipackingtest.h new file mode 100644 index 00000000..834acf23 --- /dev/null +++ b/tests/units/multipackingtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef MULTI_PACKING_TEST_H +#define MULTI_PACKING_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class MultiPackingTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // MULTI_PACKING_TEST_H diff --git a/tests/units/prefixtest.cpp b/tests/units/prefixtest.cpp new file mode 100644 index 00000000..c8018e33 --- /dev/null +++ b/tests/units/prefixtest.cpp @@ -0,0 +1,46 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "prefixtest.h" +#include +#include +#include +#include +#include + + +void PrefixTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/package/TestOnlyC.sh", + "./" + DISTRO_DIR + "/package/bin/TestOnlyC", + "./" + DISTRO_DIR + "/package/bin/qt.conf" + }); + QString target1 = TestBinDir + "TestOnlyC"; + +#else + QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/package/TestOnlyC.exe", + "./" + DISTRO_DIR + "/package/TestOnlyC.bat", + "./" + DISTRO_DIR + "/package/qt.conf"}); + QString target1 = TestBinDir + "TestOnlyC.exe"; + +#endif + QString bin = target1; + + comapareTree = TestModule.replace(comapareTree, {{"package","prefix"}}); + + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", "/package/;TestOn", + "-prefix", "package;prefix"}, &comapareTree); +} diff --git a/tests/units/prefixtest.h b/tests/units/prefixtest.h new file mode 100644 index 00000000..c641b1ff --- /dev/null +++ b/tests/units/prefixtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef PREFIX_TEST_H +#define PREFIX_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class PrefixTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // PREFIX_TEST_H diff --git a/tests/units/qmlscanertest.cpp b/tests/units/qmlscanertest.cpp new file mode 100644 index 00000000..f959f7e5 --- /dev/null +++ b/tests/units/qmlscanertest.cpp @@ -0,0 +1,111 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "qmlscanertest.h" +#include +#include +#include +#include +#include + + +void QmlScanerTest::test() { + // qt5 + auto qmlRoot = QFileInfo(TestQtDir + "/qml").absoluteFilePath(); + QML *scaner = new QML(qmlRoot, QtMajorVersion::Qt5); + auto imports = scaner->extractImportsFromFile(":/qmlFile.qml"); + + scaner->scanQmlTree(qmlRoot); + + QSet results = { + {qmlRoot + "/QtQuick.2/"}, + {qmlRoot + "/QtQuick/Controls.2/"}, + {qmlRoot + "/QtQuick/Controls.2/Material/"}, + {qmlRoot + "/QtQuick/Layouts/"}, + }; + + QVERIFY(results.size() == imports.size()); + + for (const auto &import: qAsConst(imports)) { + auto path = scaner->getPathFromImport(import); + QVERIFY(results.contains(path)); + } + + + scaner->setQtVersion(QtMajorVersion::Qt6); + + // qt6 + + results = { + {qmlRoot + "/QtQuick"}, + {qmlRoot + "/QtQuick/Controls"}, + {qmlRoot + "/QtQuick/Controls/Material"}, + {qmlRoot + "/QtQuick/Layouts"}, + }; + + imports = scaner->extractImportsFromFile(":/qmlFileQt6.qml"); + + QVERIFY(results.size() == imports.size()); + + for (const auto &import: qAsConst(imports)) { + auto path = scaner->getPathFromImport(import); + QVERIFY(results.contains(path)); + } + + imports = scaner->extractImportsFromFile(":/qmlFile.qml"); + + QVERIFY(results.size() == imports.size()); + + for (const auto & import: qAsConst(imports)) { + auto path = scaner->getPathFromImport(import); + QVERIFY(results.contains(path)); + } + + // qt5 + scaner->setQtVersion(QtMajorVersion::Qt5); + + results = { + {qmlRoot + "/QtQuick.2/"}, + {qmlRoot + "/QtQuick/Window.2/"}, + {qmlRoot + "/QtQuick/Layouts/"}, + {qmlRoot + "/Qt/labs/folderlistmodel/"}, + {qmlRoot + "/QtQuick/VirtualKeyboard/Settings/"}, + {qmlRoot + "/QtQuick/VirtualKeyboard/Styles/"}, + }; + + imports = scaner->extractImportsFromQmlModule(":/qmlDir"); + + QVERIFY(results.size() == imports.size()); + + for (const auto &import: qAsConst(imports)) { + auto path = scaner->getPathFromImport(import); + QVERIFY(results.contains(path)); + } + + // qt6 + scaner->setQtVersion(QtMajorVersion::Qt6); + + results = { + {qmlRoot + "/QtQuick"}, + {qmlRoot + "/QtQuick/Window"}, + {qmlRoot + "/QtQuick/Layouts"}, + {qmlRoot + "/Qt/labs/folderlistmodel"}, + {qmlRoot + "/QtQuick/VirtualKeyboard/Settings"}, + {qmlRoot + "/QtQuick/VirtualKeyboard/Styles"}, + }; + + imports = scaner->extractImportsFromQmlModule(":/qmlDir"); + + QVERIFY(results.size() == imports.size()); + + for (const auto &import: qAsConst(imports)) { + auto path = scaner->getPathFromImport(import); + QVERIFY(results.contains(path)); + } + +} diff --git a/tests/units/qmlscanertest.h b/tests/units/qmlscanertest.h new file mode 100644 index 00000000..8cb2886a --- /dev/null +++ b/tests/units/qmlscanertest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QML_SCANER_TEST_H +#define QML_SCANER_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QmlScanerTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QML_SCANER_TEST_H diff --git a/tests/units/striptest.cpp b/tests/units/striptest.cpp new file mode 100644 index 00000000..0dd42310 --- /dev/null +++ b/tests/units/striptest.cpp @@ -0,0 +1,86 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "striptest.h" +#include +#include +#include +#include +#include + + +StripTest::StripTest() { + +} + +StripTest::~StripTest() { + +} + +void StripTest::test() { +#ifdef Q_OS_UNIX + //for one lib + qint64 sizeBefor = generateLib("./test/binTargetDir/debugLib.so"); + qint64 sizeAfter = 0; + + FileManager *deploy = new FileManager(); + QVERIFY(deploy->strip("./test/binTargetDir/debugLib.so")); + + QFile testLib ("./test/binTargetDir/debugLib.so"); + if (testLib.open(QIODevice::ReadOnly)) { + sizeAfter = testLib.size(); + testLib.close(); + } + + deleteLib("./test/binTargetDir"); + delete deploy; + + QVERIFY(sizeBefor > sizeAfter); + + + //for folder + QStringList libList = { + ("./test/binTargetDir/debugLib1.so"), + ("./test/binTargetDir/debugLib2.so.1.2"), + ("./test/binTargetDir/debugLib3.so.1"), + ("./test/binTargetDir/debugLib4.so.1.0.0"), + ("./test/binTargetDir/debugLib.dll"), + ("./test/binTargetDir/debugLib1.dll") + }; + QList sizeBeforList = {}; + + for (const auto & i: libList) { + sizeBeforList.push_back(generateLib(i)); + } + + QList sizeAfterList; + + deploy = new FileManager(); + QVERIFY(deploy->strip("./test/binTargetDir")); + + for(const auto &i: libList) { + QFile testLib (i); + if (testLib.open(QIODevice::ReadOnly)) { + sizeAfterList.push_back(testLib.size()); + testLib.close(); + } + } + + deleteLib("./test/binTargetDir"); + + QVERIFY(sizeBeforList.size() == sizeAfterList.size()); + + for (int i = 0; i < sizeAfterList.size(); ++i) { + QVERIFY2(sizeBeforList[i] > sizeAfterList[i], + QString("index %0, lib: %1 size befor:%2, sizeAfter:%3"). + arg(i).arg(libList[i]).arg(sizeBeforList[i]).arg(sizeAfterList[i]). + toLatin1()); + } + +#endif +} diff --git a/tests/units/striptest.h b/tests/units/striptest.h new file mode 100644 index 00000000..3d25e4a2 --- /dev/null +++ b/tests/units/striptest.h @@ -0,0 +1,26 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef STRIP_TEST_H +#define STRIP_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class StripTest: public TestBase, protected TestUtils +{ +public: + StripTest(); + ~StripTest(); + + void test(); + +}; + +#endif // DeployTarget_TEST_H diff --git a/tests/units/webenginetest.cpp b/tests/units/webenginetest.cpp new file mode 100644 index 00000000..f43d6e8c --- /dev/null +++ b/tests/units/webenginetest.cpp @@ -0,0 +1,41 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "webenginetest.h" +#include +#include +#include +#include +#include + + +void WebEngineTest::test() { +#ifdef Q_OS_UNIX + TestUtils utils; + + QString bin = TestBinDir + "quicknanobrowser"; + QString qmake = TestQtDir + "bin/qmake"; + + auto comapareTree = TestModule.qtWebEngine(); + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-qmlDir", TestBinDir + "/../quicknanobrowser"}, &comapareTree); + + + bin = TestBinDir + "webui"; + qmake = TestQtDir + "bin/qmake"; + + comapareTree = TestModule.qtWebEngineWidgets(); + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake}, &comapareTree); + + +#endif +} diff --git a/tests/units/webenginetest.h b/tests/units/webenginetest.h new file mode 100644 index 00000000..5c8b55f0 --- /dev/null +++ b/tests/units/webenginetest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef WEBENGINE_TEST_H +#define WEBENGINE_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class WebEngineTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // WEBENGINE_TEST_H diff --git a/tests/units/ziptest.cpp b/tests/units/ziptest.cpp new file mode 100644 index 00000000..451d4e81 --- /dev/null +++ b/tests/units/ziptest.cpp @@ -0,0 +1,68 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "ziptest.h" +#include +#include +#include +#include +#include + + +void ZIPTest::test() { + + TestUtils utils; + + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/TestOnlyC.zip", + "./" + DISTRO_DIR + "/TestOnlyC.zip.md5", + }); + + + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + + runTestParams({"-bin", bin, "clear" , + "zip", "verbose"}, &comapareTree, true); + + // test clear for zip + runTestParams({"clear", "verbose"}, nullptr, true); + +} + +void deploytest::testZIPMulti() { + TestUtils utils; + + auto comapareTreeMulti = utils.createTree({ + "./" + DISTRO_DIR + "/package1.zip", + "./" + DISTRO_DIR + "/package2.zip", + "./" + DISTRO_DIR + "/package1.zip.md5", + "./" + DISTRO_DIR + "/package2.zip.md5", + + }); + +#ifdef Q_OS_UNIX + QString target1 = TestBinDir + "TestCPPOnly"; + QString target2 = TestBinDir + "TestOnlyC"; + +#else + QString target1 = TestBinDir + "TestCPPOnly.exe"; + QString target2 = TestBinDir + "TestOnlyC.exe"; +#endif + QString bin = target1; + bin += "," + target2; + + auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", packageString, + "zip"}, &comapareTreeMulti, true); +} diff --git a/tests/units/ziptest.h b/tests/units/ziptest.h new file mode 100644 index 00000000..18fbf1d8 --- /dev/null +++ b/tests/units/ziptest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef ZIP_TEST_H +#define ZIP_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ZIPTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // ZIP_TEST_H From ba8baf2d75d651130600ad3efe84b8bf6619d8f8 Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 10 Aug 2022 16:46:14 +0300 Subject: [PATCH 06/76] addee more ported tests --- tests/units/binprefixtest.cpp | 45 +++++++ tests/units/binprefixtest.h | 23 ++++ tests/units/deploygeneralfilestest.cpp | 35 ++++++ tests/units/deploygeneralfilestest.h | 23 ++++ tests/units/disablerunscripttest.cpp | 64 ++++++++++ tests/units/disablerunscripttest.h | 23 ++++ tests/units/disableshortcutstest.cpp | 46 +++++++ tests/units/disableshortcutstest.h | 23 ++++ tests/units/emptypackagestest.cpp | 37 ++++++ tests/units/emptypackagestest.h | 23 ++++ tests/units/iconstest.cpp | 136 +++++++++++++++++++++ tests/units/iconstest.h | 23 ++++ tests/units/md5test.cpp | 69 +++++++++++ tests/units/md5test.h | 23 ++++ tests/units/overridingtemplatedebtest.cpp | 78 ++++++++++++ tests/units/overridingtemplatedebtest.h | 26 ++++ tests/units/overridingtemplateqifwtest.cpp | 100 +++++++++++++++ tests/units/overridingtemplateqifwtest.h | 24 ++++ tests/units/pathutilstest.cpp | 85 +++++++++++++ tests/units/pathutilstest.h | 23 ++++ tests/units/runscriptstest.cpp | 60 +++++++++ tests/units/runscriptstest.h | 23 ++++ tests/units/trtest.cpp | 36 ++++++ tests/units/trtest.h | 23 ++++ tests/units/virtualkeybordtest.cpp | 32 +++++ tests/units/virtualkeybordtest.h | 23 ++++ 26 files changed, 1126 insertions(+) create mode 100644 tests/units/binprefixtest.cpp create mode 100644 tests/units/binprefixtest.h create mode 100644 tests/units/deploygeneralfilestest.cpp create mode 100644 tests/units/deploygeneralfilestest.h create mode 100644 tests/units/disablerunscripttest.cpp create mode 100644 tests/units/disablerunscripttest.h create mode 100644 tests/units/disableshortcutstest.cpp create mode 100644 tests/units/disableshortcutstest.h create mode 100644 tests/units/emptypackagestest.cpp create mode 100644 tests/units/emptypackagestest.h create mode 100644 tests/units/iconstest.cpp create mode 100644 tests/units/iconstest.h create mode 100644 tests/units/md5test.cpp create mode 100644 tests/units/md5test.h create mode 100644 tests/units/overridingtemplatedebtest.cpp create mode 100644 tests/units/overridingtemplatedebtest.h create mode 100644 tests/units/overridingtemplateqifwtest.cpp create mode 100644 tests/units/overridingtemplateqifwtest.h create mode 100644 tests/units/pathutilstest.cpp create mode 100644 tests/units/pathutilstest.h create mode 100644 tests/units/runscriptstest.cpp create mode 100644 tests/units/runscriptstest.h create mode 100644 tests/units/trtest.cpp create mode 100644 tests/units/trtest.h create mode 100644 tests/units/virtualkeybordtest.cpp create mode 100644 tests/units/virtualkeybordtest.h diff --git a/tests/units/binprefixtest.cpp b/tests/units/binprefixtest.cpp new file mode 100644 index 00000000..c9c2fc3b --- /dev/null +++ b/tests/units/binprefixtest.cpp @@ -0,0 +1,45 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "binprefixtest.h" +#include +#include +#include +#include +#include + + +void BinPrefixTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.sh", + "./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/bin/qt.conf" + }); + QString target = TestBinDir + "TestOnlyC"; + QString targetWithoutPrefix = "TestOnlyC"; + +#else + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + "./" + DISTRO_DIR + "/qt.conf"}); + QString target = TestBinDir + "TestOnlyC.exe"; + QString targetWithoutPrefix = "TestOnlyC.exe"; + +#endif + + runTestParams({"-bin", target, "force-clear"}, &comapareTree); + + runTestParams({"-bin", targetWithoutPrefix, + "-binPrefix", TestBinDir, + "force-clear"}, &comapareTree); +} diff --git a/tests/units/binprefixtest.h b/tests/units/binprefixtest.h new file mode 100644 index 00000000..ff886d48 --- /dev/null +++ b/tests/units/binprefixtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef BIN_PREFIX_TEST_H +#define BIN_PREFIX_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class BinPrefixTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // BIN_PREFIX_TEST_H diff --git a/tests/units/deploygeneralfilestest.cpp b/tests/units/deploygeneralfilestest.cpp new file mode 100644 index 00000000..86ad3f17 --- /dev/null +++ b/tests/units/deploygeneralfilestest.cpp @@ -0,0 +1,35 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "deploygeneralfilestest.h" +#include +#include +#include +#include +#include + + +void DeployGeneralFilesTest::test() { + TestUtils utils; + + QString bin = TestBinDir + "/../../CMakeLists.txt"; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/bin/CMakeLists.txt", + "./" + DISTRO_DIR + "/bin/qt.conf", + + }); + + runTestParams( + {"-bin", bin, + "-binOut", "bin", + "force-clear" + }, &comapareTree); + +} diff --git a/tests/units/deploygeneralfilestest.h b/tests/units/deploygeneralfilestest.h new file mode 100644 index 00000000..30f256b2 --- /dev/null +++ b/tests/units/deploygeneralfilestest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DEPLOY_GENERAL_FILES_TEST_H +#define DEPLOY_GENERAL_FILES_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DeployGeneralFilesTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DEPLOY_GENERAL_FILES_TEST_H diff --git a/tests/units/disablerunscripttest.cpp b/tests/units/disablerunscripttest.cpp new file mode 100644 index 00000000..dfae9b41 --- /dev/null +++ b/tests/units/disablerunscripttest.cpp @@ -0,0 +1,64 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "disablerunscripttest.h" +#include +#include +#include +#include +#include + + +void DisableRunScriptTest::test() { + + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + + auto comapareTreeqif = TestModule.onlyC(); + comapareTreeqif -= utils.createTree({DISTRO_DIR + "/TestOnlyC.sh", + DISTRO_DIR + "/TestOnlyC.bat"}); + // Run deploy installer + runTestParams({"-bin", bin, "clear", "-libDir", TestQtDir + "/bin", + "-disableRunScript", "TestOnlyC"}, &comapareTreeqif); +} + +void deploytest::testQifOut() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + +#ifdef Q_OS_UNIX + auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, + {DISTRO_DIR + "/DEB_OUT.deb"}, {DISTRO_DIR + "/DEB_OUT.deb.md5"}, + {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); + + // Run deploy installer + runTestParams({"-bin", bin, "clear", + "qif", "-qifOut", "QIF_OUT.exe", + "deb", "-debOut", "DEB_OUT.deb", + "zip", "-zipOut", "ZIP_OUT.zip"}, &result); +#else + auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, + {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); + + // Run deploy installer + runTestParams({"-bin", bin, "clear", + "qif", "-qifOut", "QIF_OUT.exe", + "zip", "-zipOut", "ZIP_OUT.zip"}, &result); +#endif + +} diff --git a/tests/units/disablerunscripttest.h b/tests/units/disablerunscripttest.h new file mode 100644 index 00000000..1c220eaa --- /dev/null +++ b/tests/units/disablerunscripttest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DIABLE_RUN_SCRIPT_TEST_H +#define DIABLE_RUN_SCRIPT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DisableRunScriptTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DIABLE_RUN_SCRIPT_TEST_H diff --git a/tests/units/disableshortcutstest.cpp b/tests/units/disableshortcutstest.cpp new file mode 100644 index 00000000..38afed04 --- /dev/null +++ b/tests/units/disableshortcutstest.cpp @@ -0,0 +1,46 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "disableshortcutstest.h" +#include +#include +#include +#include +#include + + +void DisableShortcutsTest::test() { + + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + + auto cb = [](const DeployConfig * config){ + const auto list = config->getTargetsListByFilter("TestOnlyC"); + // Check shrtcut option. all targets should be return false. + for (auto target: list) { + QVERIFY(!target->getShortCut()); + } + }; + + // Run deploy installer + runTestParams({"-bin", bin, "clear", + "-disableShortCut", "TestOnlyC", + "qif", "qifFromSystem"}, + nullptr, + false, + false, + exitCodes::Good, + cb); + + +} diff --git a/tests/units/disableshortcutstest.h b/tests/units/disableshortcutstest.h new file mode 100644 index 00000000..48ee4719 --- /dev/null +++ b/tests/units/disableshortcutstest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DIABLE_SHORTCUTS_TEST_H +#define DIABLE_SHORTCUTS_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DisableShortcutsTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DIABLE_SHORTCUTS_TEST_H diff --git a/tests/units/emptypackagestest.cpp b/tests/units/emptypackagestest.cpp new file mode 100644 index 00000000..af1c43cb --- /dev/null +++ b/tests/units/emptypackagestest.cpp @@ -0,0 +1,37 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "emptypackagestest.h" +#include +#include +#include +#include +#include + + +void EmptyPackagesTest::test() { + + TestUtils utils; + auto comapareTree = TestModule.onlyC(); + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + + runTestParams({"-bin", bin, "force-clear", + "-prefix", "package;prefix"}, nullptr, false, false, + exitCodes::PrepareError); + + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", "/package/;NONE", + "-libDir", TestQtDir + "bin", + "-prefix", "package;prefix", + "allowEmptyPackages"}, &comapareTree); +} diff --git a/tests/units/emptypackagestest.h b/tests/units/emptypackagestest.h new file mode 100644 index 00000000..a3fd40af --- /dev/null +++ b/tests/units/emptypackagestest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef EMPTY_PACKAGES_TEST_H +#define EMPTY_PACKAGES_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class EmptyPackagesTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // EMPTY_PACKAGES_TEST_H diff --git a/tests/units/iconstest.cpp b/tests/units/iconstest.cpp new file mode 100644 index 00000000..c65864f2 --- /dev/null +++ b/tests/units/iconstest.cpp @@ -0,0 +1,136 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "iconstest.h" +#include +#include +#include +#include +#include + + +void IconsTest::test() { + TestUtils utils; + + auto initTargets = [](ConfigParser * deploy, const QStringList& params) { + QVERIFY(QuasarAppUtils::Params::parseParams(params)); + + auto bin = QuasarAppUtils::Params::getArg("bin"). + split(DeployCore::getSeparator(0), splitbehavior); + + + QVERIFY(deploy->setTargets(bin)); + + deploy->configureTargets(); + }; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + QStringList binMulti = {TestBinDir + "TestOnlyC" , TestBinDir + "TestCPPOnly"}; + +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + QStringList binMulti = {TestBinDir + "TestOnlyC.exe" , TestBinDir + "TestCPPOnly.exe"}; + +#endif + + FileManager file; + DependenciesScanner scan; + Packing pac(&file); + PluginsParser _pluginParser; + + + // Test default icons + ConfigParser *deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + + initTargets(deploy, {"-bin", bin, + "force-clear", + }); + + auto targetsMap = deploy->_config.getTargetsListByFilter("TestOnlyC"); + auto targetinfo = targetsMap.begin().value(); + QVERIFY(targetinfo->getName().contains("TestOnlyC")); + auto icon = QFileInfo(targetinfo->getIcon()); + +#ifdef Q_OS_UNIX + QVERIFY(icon.fileName() == "Icon.png"); +#else + QVERIFY(icon.fileName() == "Icon.ico"); + +#endif + delete deploy; + + // Test multiple targets icons (sets for all targets on icon) + deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + + initTargets(deploy, {"-bin", binMulti.join(","), + "force-clear", + "-icon", ":/testResurces/testRes/TestIcon.png", + }); + + for (const auto &target : qAsConst(binMulti)) { + QFileInfo tarInfo(target); + + targetsMap = deploy->_config.getTargetsListByFilter(tarInfo.baseName()); + targetinfo = targetsMap.begin().value(); + QVERIFY(targetinfo->getName().contains(tarInfo.baseName())); + icon = QFileInfo(targetinfo->getIcon()); + + QVERIFY(icon.fileName() == "TestIcon.png"); + } + + delete deploy; + + + // Test multiple targets icons (sets only one icon) + deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); + + initTargets(deploy, {"-bin", binMulti.join(","), + "force-clear", + "-icon", "TestOnlyC;:/testResurces/testRes/TestIcon.png", + }); + + + targetsMap = deploy->_config.getTargetsListByFilter("TestOnlyC"); + targetinfo = targetsMap.begin().value(); + QVERIFY(targetinfo->getName().contains("TestOnlyC")); + icon = QFileInfo(targetinfo->getIcon()); + + QVERIFY(icon.fileName() == "TestIcon.png"); + + + delete deploy; + + // manual tests +#ifdef QT_DEBUG +#ifdef Q_OS_UNIX + bin = TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly"; + + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/InstallerTest.run", + "./" + DISTRO_DIR + "/InstallerTest.run.md5", + }); + +#else + bin = TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe"; + + auto comapareTree = utils.createTree({ + "./" + DISTRO_DIR + "/InstallerTest.exe", + "./" + DISTRO_DIR + "/InstallerTest.exe.md5", + + }); + +#endif + + runTestParams({"-bin", bin, "clear" , + "qif", "qifFromSystem", "-name", "Test", + "-targetPackage", "testPackage;TestOnlyC;TestCPPOnly", + "-icon", "TestOnlyC;:/testResurces/testRes/TestIcon.png,TestCPPOnly;:/testResurces/testRes/TestTr.qm"}, &comapareTree, true); + +#endif +} diff --git a/tests/units/iconstest.h b/tests/units/iconstest.h new file mode 100644 index 00000000..a12591d6 --- /dev/null +++ b/tests/units/iconstest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef ICONS_TEST_H +#define ICONS_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class IconsTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // ICONS_TEST_H diff --git a/tests/units/md5test.cpp b/tests/units/md5test.cpp new file mode 100644 index 00000000..a028c243 --- /dev/null +++ b/tests/units/md5test.cpp @@ -0,0 +1,69 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "md5test.h" +#include +#include +#include +#include +#include + + +void MD5Test::test() { + // This test will check hashes + + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + auto outFile = "./" + DISTRO_DIR + "/InstallerTestOnlyC.run"; + +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + auto outFile = "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe"; + +#endif + + auto comapareTreeqif = utils.createTree( + { + outFile, + outFile + ".md5" + }); + + // Run deploy installer + runTestParams({"-bin", bin, + "force-clear", + "qif", + "qifFromSystem"}, &comapareTreeqif); + + QFile file(outFile); + QVERIFY(file.open(QIODevice::ReadOnly)); + auto binaryData = file.readAll(); + file.close(); + + file.setFileName(outFile + ".md5"); + QVERIFY(file.open(QIODevice::ReadOnly)); + auto hash = file.readAll(); + file.close(); + + // Compare hash sum of the installer with realy hash sum of the object. + QVERIFY(QCryptographicHash::hash(binaryData, QCryptographicHash::Md5).toHex() == hash); + + + comapareTreeqif = utils.createTree( + { + outFile, + }); + + // Check noHashSum option. CQtDeployer must be skip calculating a hash sum of an installer. + runTestParams({"-bin", bin, + "force-clear", + "noHashSum", + "qif", + "qifFromSystem"}, &comapareTreeqif); +} diff --git a/tests/units/md5test.h b/tests/units/md5test.h new file mode 100644 index 00000000..664d4fb1 --- /dev/null +++ b/tests/units/md5test.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef MD5_TEST_H +#define MD5_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class MD5Test: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // MD5_TEST_H diff --git a/tests/units/overridingtemplatedebtest.cpp b/tests/units/overridingtemplatedebtest.cpp new file mode 100644 index 00000000..594b82c4 --- /dev/null +++ b/tests/units/overridingtemplatedebtest.cpp @@ -0,0 +1,78 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "overridingtemplatedebtest.h" +#include +#include +#include +#include +#include + + +void OverridingDefaultTemplateDEBTest::test() { + TestUtils utils; + + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC" + "," + TestBinDir + "TestCPPOnly"; + QString qmake = TestQtDir + "bin/qmake"; + + QDir tempalteDir("temaplate"); + if (!tempalteDir.isEmpty()) { + tempalteDir.removeRecursively(); + }; + + auto comapareTree = utils.createTree( + { + "temaplate/defaultDEBTemplate/Test/DEBIAN/control", + "temaplate/defaultDEBTemplate/Test/DEBIAN/postinst", + "temaplate/defaultDEBTemplate/Test/DEBIAN/prerm" + }); + QFile appScript("temaplate/defaultDEBTemplate/Test/DEBIAN/control"); + appScript.remove(); + + runTestParams( + {"force-clear", + "getDefaultTemplate", + "-name", "Test", + "deb", + "-targetDir", "temaplate", + "-targetPackage", "MyApp" + }, &comapareTree); + + comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/Test.deb", + "./" + DISTRO_DIR + "/Test.deb.md5", + + }); + + runTestParams( + {"force-clear", + "-deb", "temaplate/defaultDEBTemplate", + "-targetPackage", "MyApp", + "-name", "Test", + "-qmake", qmake + }, &comapareTree, false, false); + + + QVERIFY(appScript.open(QIODevice::WriteOnly)); + QVERIFY(appScript.write(QByteArray{"ERROR"})); + appScript.close(); + + runTestParams( + {"-bin", bin, + "force-clear", + "-deb", "temaplate/defaultDEBTemplate", + "-targetPackage", "MyApp", + "-name", "Test", + "-qmake", qmake + }, nullptr, false, false, exitCodes::PackingError); +#endif + +} diff --git a/tests/units/overridingtemplatedebtest.h b/tests/units/overridingtemplatedebtest.h new file mode 100644 index 00000000..09497cb4 --- /dev/null +++ b/tests/units/overridingtemplatedebtest.h @@ -0,0 +1,26 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef OVERRIDE_TEMPLATE_DEB_TEST_H +#define OVERRIDE_TEMPLATE_DEB_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class OverridingDefaultTemplateDEBTest: public TestBase, protected TestUtils +{ +public: + StripTest(); + ~StripTest(); + + void test(); + +}; + +#endif // OVERRIDE_TEMPLATE_DEB_TEST_H diff --git a/tests/units/overridingtemplateqifwtest.cpp b/tests/units/overridingtemplateqifwtest.cpp new file mode 100644 index 00000000..55859f57 --- /dev/null +++ b/tests/units/overridingtemplateqifwtest.cpp @@ -0,0 +1,100 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "overridingtemplateqifwtest.h" +#include +#include +#include +#include +#include + + +void OverridingDefaultTemplateQIFWTest::test() { + TestUtils utils; + // Prepare bin and qmake values +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC" + "," + TestBinDir + "TestCPPOnly"; + QString qmake = TestQtDir + "bin/qmake"; + +#else + QString bin = TestBinDir + "TestOnlyC.exe" + "," + TestBinDir + "TestCPPOnly.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; + +#endif + QDir tempalteDir("temaplate"); + if (!tempalteDir.isEmpty()) { + tempalteDir.removeRecursively(); + }; + + // QIF case. prepare default template. + auto comapareTree = utils.createTree( + { + "temaplate/defaultQIFWTemplate/config/config.xml", + "temaplate/defaultQIFWTemplate/config/controlScript.qs", + "temaplate/defaultQIFWTemplate/packages/MyApp/meta/installscript.qs", + "temaplate/defaultQIFWTemplate/packages/MyApp/meta/package.xml" + }); + QFile appScript("temaplate/defaultQIFWTemplate/packages/MyApp/meta/installscript.qs"); + appScript.remove(); + + // This command shold be deploy default template in the template folder + runTestParams( + {"-bin", bin, + "force-clear", + "getDefaultTemplate", + "-name", "Test", + "qif", + "-targetDir", "temaplate", + "-targetPackage", "MyApp" + }, &comapareTree); + +#ifdef Q_OS_UNIX + comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/InstallerTest.run", + "./" + DISTRO_DIR + "/InstallerTest.run.md5", + }); + +#else + comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/InstallerTest.exe", + "./" + DISTRO_DIR + "/InstallerTest.exe.md5", + }); + +#endif + + // check deploy application with custom template + runTestParams( + {"-bin", bin, + "force-clear", + "-qif", "temaplate/defaultQIFWTemplate", + "-targetPackage", "MyApp", + "-name", "Test", + "-qmake", qmake, + "qifFromSystem" + }, &comapareTree, false, false); + + QVERIFY(appScript.open(QIODevice::WriteOnly)); + QVERIFY(appScript.write(QByteArray{"ERROR"})); + appScript.close(); + + // Shold be failde because we added error string into template files. + runTestParams( + {"-bin", bin, + "force-clear", + "-qif", "temaplate/defaultQIFWTemplate", + "-targetPackage", "MyApp", + "-name", "Test", + "-qmake", qmake, + "qifFromSystem" + }, nullptr, false, false, exitCodes::PackingError); + + + +} diff --git a/tests/units/overridingtemplateqifwtest.h b/tests/units/overridingtemplateqifwtest.h new file mode 100644 index 00000000..6833195e --- /dev/null +++ b/tests/units/overridingtemplateqifwtest.h @@ -0,0 +1,24 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef OVERRIDE_TEMPLATE_QIFW_TEST_H +#define OVERRIDE_TEMPLATE_QIFW_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class OverridingDefaultTemplateQIFWTest: public TestBase, protected TestUtils +{ +public: + + void test(); + +}; + +#endif // OVERRIDE_TEMPLATE_QIFW_TEST_H diff --git a/tests/units/pathutilstest.cpp b/tests/units/pathutilstest.cpp new file mode 100644 index 00000000..17c22219 --- /dev/null +++ b/tests/units/pathutilstest.cpp @@ -0,0 +1,85 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "pathutilstest.h" +#include +#include +#include +#include +#include + + +void PathUtilsTest::test() { + + // test getName + QMap cases = { + {"",""}, + {"test","test"}, + {"t","t"}, + {"/","/"}, + {"/test","test"}, + {"/t","t"}, + {"/test/","test"}, + {"/t/","t"}, + + {"/check/test","test"}, + {"/check/t","t"}, + {"/check/test/","test"}, + {"/check/t/","t"}, + + {"C:\\","C:"}, + {"\\","/"}, + {"\\test","test"}, + {"\\t","t"}, + {"\\test\\","test"}, + {"\\t\\","t"}, + + }; + + for (auto it = cases.begin(); it != cases.end(); ++it) { + if (PathUtils::getName(it.key()) != it.value()) + QVERIFY(false); + } + + struct Result { + QString result; + QString newPath; + }; + + // test popItem + QMap popItemCases = { + {"", {"", ""}}, + {"test", {"test", ""}}, + {"t", {"t", ""}}, + {"/", {"/", ""}}, + {"/test", {"test", "/"}}, + {"/t", {"t", "/"}}, + {"/test/", {"test", "/"}}, + {"/t/", {"t", "/"} }, + + {"/check/test", {"test", "/check/"}}, + {"/check/t", {"t", "/check/"}}, + {"/check/test/", {"test", "/check/"}}, + {"/check/t/", {"t", "/check/"}}, + + {"C:\\", {"C:", ""}}, + {"\\", {"/", ""}}, + {"\\test", {"test", "/"}}, + {"\\t", {"t", "/"}}, + {"\\test\\", {"test", "/"}}, + {"\\t\\", {"t", "/"}}, + + }; + + for (auto it = popItemCases.begin(); it != popItemCases.end(); ++it) { + QString path = it.key(); + QString result = PathUtils::popItem(path); + if (path != it.value().newPath || result != it.value().result) + QVERIFY(false); + } +} diff --git a/tests/units/pathutilstest.h b/tests/units/pathutilstest.h new file mode 100644 index 00000000..eb7c8d7c --- /dev/null +++ b/tests/units/pathutilstest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef PATH_UTILS_TEST_H +#define PATH_UTILS_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class PathUtilsTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // PATH_UTILS_TEST_H diff --git a/tests/units/runscriptstest.cpp b/tests/units/runscriptstest.cpp new file mode 100644 index 00000000..d3030fab --- /dev/null +++ b/tests/units/runscriptstest.cpp @@ -0,0 +1,60 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "runscriptstest.h" +#include +#include +#include +#include +#include + + +void RunScriptsTest::test() { + + TestUtils utils; + auto comapareTree = TestModule.onlyC(); + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + + QFile f(":/testResurces/testRes/customRunScript.sh"); + QVERIFY(f.open(QIODevice::ReadOnly)); + auto etalonData = f.readAll(); + f.close(); + + runTestParams({"-bin", bin, + "force-clear", + "-libOut", "lib", + "-runScript", "TestOnlyC;:/testResurces/testRes/customRunScript.sh"}, &comapareTree); + + f.setFileName(DISTRO_DIR + "/TestOnlyC.sh"); + QVERIFY(f.open(QIODevice::ReadOnly)); + auto deployData = f.readAll(); + + QVERIFY(deployData == etalonData); +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + + QFile f(":/testResurces/testRes/customRunScript.sh"); + QVERIFY(f.open(QIODevice::ReadOnly)); + auto etalonData = f.readAll(); + f.close(); + + runTestParams({"-bin", bin, + "force-clear", + "-libOut", "lib", + "-runScript", "TestOnlyC.exe;:/testResurces/testRes/customRunScript.sh"}, nullptr); + + f.setFileName(DISTRO_DIR + "/TestOnlyC.bat"); + QVERIFY(f.open(QIODevice::ReadOnly)); + auto deployData = f.readAll(); + + QVERIFY(deployData == etalonData); +#endif + +} diff --git a/tests/units/runscriptstest.h b/tests/units/runscriptstest.h new file mode 100644 index 00000000..c7096f9b --- /dev/null +++ b/tests/units/runscriptstest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef RUN_SCRIPTS_TEST_H +#define RUN_SCRIPTS_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class RunScriptsTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // RUN_SCRIPTS_TEST_H diff --git a/tests/units/trtest.cpp b/tests/units/trtest.cpp new file mode 100644 index 00000000..37e5087b --- /dev/null +++ b/tests/units/trtest.cpp @@ -0,0 +1,36 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "trtest.h" +#include +#include +#include +#include +#include + + +void TrTest::test() { + TestUtils utils; +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + +#endif + + runTestParams({"-bin", bin, "clear" , + "-tr", ":/testResurces/testRes/TestTr.qm",}); + + QVERIFY(QFile::exists("./" + DISTRO_DIR + "/translations/TestTr.qm")); + + runTestParams({"-bin", bin, "clear" , + "-tr", ":/testResurces/testRes/"}); + + QVERIFY(QFile::exists("./" + DISTRO_DIR + "/translations/TestTr.qm")); +} diff --git a/tests/units/trtest.h b/tests/units/trtest.h new file mode 100644 index 00000000..e549816e --- /dev/null +++ b/tests/units/trtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef TR_TEST_H +#define TR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class TrTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // TR_TEST_H diff --git a/tests/units/virtualkeybordtest.cpp b/tests/units/virtualkeybordtest.cpp new file mode 100644 index 00000000..bdb2a7c5 --- /dev/null +++ b/tests/units/virtualkeybordtest.cpp @@ -0,0 +1,32 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "virtualkeybordtest.h" +#include +#include +#include +#include +#include + + +void VirtualKeyBoardTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "basic"; + QString qmake = TestQtDir + "bin/qmake"; +#else + QString bin = TestBinDir + "basic.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; +#endif + auto comapareTree = TestModule.qmlVirtualKeyBoadrLibs(); + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-qmlDir", TestBinDir + "/../virtualkeyboard"}, &comapareTree); +} diff --git a/tests/units/virtualkeybordtest.h b/tests/units/virtualkeybordtest.h new file mode 100644 index 00000000..39bc09ce --- /dev/null +++ b/tests/units/virtualkeybordtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef VIRTUAL_KEYBORD_TEST_H +#define VIRTUAL_KEYBORD_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class VirtualKeyBoardTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // VIRTUAL_KEYBORD_TEST_H From 9a3fac28613cacba252401ff3d304efff7c8ff8d Mon Sep 17 00:00:00 2001 From: EndrII Date: Sat, 13 Aug 2022 12:36:41 +0300 Subject: [PATCH 07/76] separate all tests to multiple files --- tests/units/checkqttest.cpp | 119 +++++++++++ tests/units/checkqttest.h | 23 +++ tests/units/cleartest.cpp | 25 +++ tests/units/cleartest.h | 23 +++ tests/units/confifiletest.cpp | 242 +++++++++++++++++++++++ tests/units/confifiletest.h | 23 +++ tests/units/customplatformtest.cpp | 56 ++++++ tests/units/customplatformtest.h | 23 +++ tests/units/customscripttest.cpp | 69 +++++++ tests/units/customscripttest.h | 23 +++ tests/units/customtest.cpp | 20 ++ tests/units/customtest.h | 23 +++ tests/units/distrostructtest.cpp | 62 ++++++ tests/units/distrostructtest.h | 23 +++ tests/units/extradatatest.cpp | 51 +++++ tests/units/extradatatest.h | 23 +++ tests/units/extrapluginstest.cpp | 84 ++++++++ tests/units/extrapluginstest.h | 23 +++ tests/units/ignoreenvtest.cpp | 59 ++++++ tests/units/ignoreenvtest.h | 23 +++ tests/units/ignoreenvwithlibdirtest.cpp | 33 ++++ tests/units/ignoreenvwithlibdirtest.h | 23 +++ tests/units/ignoretest.cpp | 104 ++++++++++ tests/units/ignoretest.h | 23 +++ tests/units/installdiroptionstest.cpp | 35 ++++ tests/units/installdiroptionstest.h | 23 +++ tests/units/libdirstest.cpp | 158 +++++++++++++++ tests/units/libdirstest.h | 23 +++ tests/units/outdirtest.cpp | 103 ++++++++++ tests/units/outdirtest.h | 23 +++ tests/units/overwritetest.cpp | 71 +++++++ tests/units/overwritetest.h | 23 +++ tests/units/overwritewithpackingtest.cpp | 50 +++++ tests/units/overwritewithpackingtest.h | 23 +++ tests/units/packagestest.cpp | 87 ++++++++ tests/units/packagestest.h | 23 +++ tests/units/qifwachiveformattest.cpp | 41 ++++ tests/units/qifwachiveformattest.h | 23 +++ tests/units/qifwbinarycreatortest.cpp | 63 ++++++ tests/units/qifwbinarycreatortest.h | 24 +++ tests/units/qifwouttest.cpp | 45 +++++ tests/units/qifwouttest.h | 23 +++ tests/units/qifwresourcestest.cpp | 44 +++++ tests/units/qifwresourcestest.h | 23 +++ tests/units/qmlextracttest.cpp | 37 ++++ tests/units/qmlextracttest.h | 23 +++ tests/units/qttest.cpp | 74 +++++++ tests/units/qttest.h | 23 +++ tests/units/releativelinktest.cpp | 50 +++++ tests/units/releativelinktest.h | 23 +++ tests/units/settargetdirtest.cpp | 40 ++++ tests/units/settargetdirtest.h | 23 +++ tests/units/targetdirtest.cpp | 143 ++++++++++++++ tests/units/targetdirtest.h | 23 +++ tests/units/ziparrchivetest.cpp | 31 +++ tests/units/ziparrchivetest.h | 23 +++ tests/units/zipmultitest.cpp | 44 +++++ tests/units/zipmultitest.h | 23 +++ tests/units/ziptest.cpp | 27 --- 59 files changed, 2708 insertions(+), 27 deletions(-) create mode 100644 tests/units/checkqttest.cpp create mode 100644 tests/units/checkqttest.h create mode 100644 tests/units/cleartest.cpp create mode 100644 tests/units/cleartest.h create mode 100644 tests/units/confifiletest.cpp create mode 100644 tests/units/confifiletest.h create mode 100644 tests/units/customplatformtest.cpp create mode 100644 tests/units/customplatformtest.h create mode 100644 tests/units/customscripttest.cpp create mode 100644 tests/units/customscripttest.h create mode 100644 tests/units/customtest.cpp create mode 100644 tests/units/customtest.h create mode 100644 tests/units/distrostructtest.cpp create mode 100644 tests/units/distrostructtest.h create mode 100644 tests/units/extradatatest.cpp create mode 100644 tests/units/extradatatest.h create mode 100644 tests/units/extrapluginstest.cpp create mode 100644 tests/units/extrapluginstest.h create mode 100644 tests/units/ignoreenvtest.cpp create mode 100644 tests/units/ignoreenvtest.h create mode 100644 tests/units/ignoreenvwithlibdirtest.cpp create mode 100644 tests/units/ignoreenvwithlibdirtest.h create mode 100644 tests/units/ignoretest.cpp create mode 100644 tests/units/ignoretest.h create mode 100644 tests/units/installdiroptionstest.cpp create mode 100644 tests/units/installdiroptionstest.h create mode 100644 tests/units/libdirstest.cpp create mode 100644 tests/units/libdirstest.h create mode 100644 tests/units/outdirtest.cpp create mode 100644 tests/units/outdirtest.h create mode 100644 tests/units/overwritetest.cpp create mode 100644 tests/units/overwritetest.h create mode 100644 tests/units/overwritewithpackingtest.cpp create mode 100644 tests/units/overwritewithpackingtest.h create mode 100644 tests/units/packagestest.cpp create mode 100644 tests/units/packagestest.h create mode 100644 tests/units/qifwachiveformattest.cpp create mode 100644 tests/units/qifwachiveformattest.h create mode 100644 tests/units/qifwbinarycreatortest.cpp create mode 100644 tests/units/qifwbinarycreatortest.h create mode 100644 tests/units/qifwouttest.cpp create mode 100644 tests/units/qifwouttest.h create mode 100644 tests/units/qifwresourcestest.cpp create mode 100644 tests/units/qifwresourcestest.h create mode 100644 tests/units/qmlextracttest.cpp create mode 100644 tests/units/qmlextracttest.h create mode 100644 tests/units/qttest.cpp create mode 100644 tests/units/qttest.h create mode 100644 tests/units/releativelinktest.cpp create mode 100644 tests/units/releativelinktest.h create mode 100644 tests/units/settargetdirtest.cpp create mode 100644 tests/units/settargetdirtest.h create mode 100644 tests/units/targetdirtest.cpp create mode 100644 tests/units/targetdirtest.h create mode 100644 tests/units/ziparrchivetest.cpp create mode 100644 tests/units/ziparrchivetest.h create mode 100644 tests/units/zipmultitest.cpp create mode 100644 tests/units/zipmultitest.h diff --git a/tests/units/checkqttest.cpp b/tests/units/checkqttest.cpp new file mode 100644 index 00000000..1f3946a1 --- /dev/null +++ b/tests/units/checkqttest.cpp @@ -0,0 +1,119 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "checkqttest.h" +#include +#include +#include +#include +#include + + +void CheckQtTest::test() { + + Deploy *deployer = new Deploy(); + QuasarAppUtils::Params::parseParams({"-bin", TestBinDir, "clear", + "noCheckRPATH", "noCheckPATH", "noQt"}); + QVERIFY(deployer->prepare()); + + + auto cases = QList>{ + {TestQtDir + "/", QtMajorVersion::NoQt}, + {TestQtDir + "", QtMajorVersion::NoQt}, + {TestQtDir + "/bin/file1", QtMajorVersion::NoQt}, + {TestQtDir + "/lib/file12.so", QtMajorVersion::NoQt}, + {TestQtDir + "/resurces/file13.dll", QtMajorVersion::NoQt}, + {TestQtDir + "/libexec/f", QtMajorVersion::NoQt}, + {TestQtDir + "/mkspecs", QtMajorVersion::NoQt}, + {TestQtDir + "/qml", QtMajorVersion::NoQt}, + {TestQtDir + "/plugins", QtMajorVersion::NoQt}, + {TestQtDir + "/file", QtMajorVersion::NoQt}, + + {TestQtDir + "\\", QtMajorVersion::NoQt}, + {TestQtDir + "", QtMajorVersion::NoQt}, + {TestQtDir + "\\bin\\file1", QtMajorVersion::NoQt}, + {TestQtDir + "\\lib\\file12", QtMajorVersion::NoQt}, + {TestQtDir + "\\resurces\\file13", QtMajorVersion::NoQt}, + {TestQtDir + "\\libexec\\f.so", QtMajorVersion::NoQt}, + {TestQtDir + "\\mkspecs.dll", QtMajorVersion::NoQt}, + {TestQtDir + "\\qml", QtMajorVersion::NoQt}, + {TestQtDir + "\\plugins", QtMajorVersion::NoQt}, + {TestQtDir + "\\file", QtMajorVersion::NoQt}, + + }; + + for (const auto &i: qAsConst(cases)) { + QVERIFY(DeployCore::isQtLib(i.first) == i.second); + } + delete deployer; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestQMLWidgets"; + QString qmake = TestQtDir + "bin/qmake"; + +#else + QString bin = TestBinDir + "TestQMLWidgets.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; +#endif + + deployer = new Deploy(); + QuasarAppUtils::Params::parseParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-qmlDir", TestBinDir + "/../TestQMLWidgets"}); + QVERIFY(deployer->prepare()); + + + cases = QList>{ + {TestQtDir + "/", QtMajorVersion::NoQt}, + {TestQtDir + "", QtMajorVersion::NoQt}, + {TestQtDir + "/bin/file1", QtMajorVersion::NoQt}, + {TestQtDir + "/lib/file12", QtMajorVersion::NoQt}, + {TestQtDir + "/lib/file12", QtMajorVersion::NoQt}, + + {TestQtDir + "/mkspecs", QtMajorVersion::NoQt}, + {TestQtDir + "/qml", QtMajorVersion::NoQt}, + {TestQtDir + "/plugins", QtMajorVersion::NoQt}, + {TestQtDir + "/file", QtMajorVersion::NoQt}, + + {TestQtDir + "\\", QtMajorVersion::NoQt}, + {TestQtDir + "", QtMajorVersion::NoQt}, + {TestQtDir + "\\lib\\file12", QtMajorVersion::NoQt}, + {TestQtDir + "\\libexec\\fQt", QtMajorVersion::NoQt}, + {TestQtDir + "\\mkspecs", QtMajorVersion::NoQt}, + {TestQtDir + "\\qml", QtMajorVersion::NoQt}, + {TestQtDir + "\\plugins", QtMajorVersion::NoQt}, + {TestQtDir + "\\file", QtMajorVersion::NoQt}, + + {TestQtDir + "/bin/file1Qt4.so", QtMajorVersion::Qt4}, + {TestQtDir + "/resources/Qt4file13.so", QtMajorVersion::Qt4}, + {TestQtDir + "/libexec/Qt4f.dll", QtMajorVersion::Qt4}, + {TestQtDir + "\\bin\\Qt4file1.dll", QtMajorVersion::Qt4}, + {TestQtDir + "\\resources\\fileQt413.dll", QtMajorVersion::Qt4}, + + {TestQtDir + "/bin/file1Qt5.so", QtMajorVersion::Qt5}, + {TestQtDir + "/resources/Qt5file13.so", QtMajorVersion::Qt5}, + {TestQtDir + "/libexec/Qt5f.dll", QtMajorVersion::Qt5}, + {TestQtDir + "\\bin\\Qt5file1.dll", QtMajorVersion::Qt5}, + {TestQtDir + "\\resources\\fileQt513.dll", QtMajorVersion::Qt5}, + + {TestQtDir + "/bin/file1Qt6.so", QtMajorVersion::Qt6}, + {TestQtDir + "/resources/Qt6file13.so", QtMajorVersion::Qt6}, + {TestQtDir + "/libexec/Qt6f.dll", QtMajorVersion::Qt6}, + {TestQtDir + "\\bin\\Qt6file1.dll", QtMajorVersion::Qt6}, + {TestQtDir + "\\resources\\fileQt613.dll", QtMajorVersion::Qt6}, + + }; + + for (const auto &i: qAsConst(cases)) { + auto dexription = QString("The isQtLib(%0) function should be return %1").arg( + i.first).arg(i.second); + QVERIFY2(DeployCore::isQtLib(i.first) == i.second, dexription.toLatin1().data()); + } + + delete deployer; +} diff --git a/tests/units/checkqttest.h b/tests/units/checkqttest.h new file mode 100644 index 00000000..c8986119 --- /dev/null +++ b/tests/units/checkqttest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef CHECK_QT_TEST_H +#define CHECK_QT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class CheckQtTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // CHECK_QT_TEST_H diff --git a/tests/units/cleartest.cpp b/tests/units/cleartest.cpp new file mode 100644 index 00000000..421cb0ff --- /dev/null +++ b/tests/units/cleartest.cpp @@ -0,0 +1,25 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "cleartest.h" +#include +#include +#include +#include +#include + + +void ClearTest::test() { + TestUtils utils; + + + auto compareTree = QSet{}; + + runTestParams({"clear"}, &compareTree); + +} diff --git a/tests/units/cleartest.h b/tests/units/cleartest.h new file mode 100644 index 00000000..299d57b3 --- /dev/null +++ b/tests/units/cleartest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef CLEAR_TEST_H +#define CLEAR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ClearTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // CLEAR_TEST_H diff --git a/tests/units/confifiletest.cpp b/tests/units/confifiletest.cpp new file mode 100644 index 00000000..b3763116 --- /dev/null +++ b/tests/units/confifiletest.cpp @@ -0,0 +1,242 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "confifiletest.h" +#include +#include +#include +#include +#include + + +void ConfFileTest::test() { + TestUtils utils; + + + QFile::remove(TestBinDir + "/TestConf.json"); + QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); + +#ifdef Q_OS_UNIX + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/TestOnlyC.sh"}); +#else + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + "./" + DISTRO_DIR + "/qt.conf"}); +#endif + +#ifdef Q_OS_UNIX + runTestParams({"-bin", TestBinDir + "TestOnlyC", "clear" , "noCheckRPATH", "noCheckPATH", "noQt", + "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); +#else + runTestParams({"-bin", TestBinDir + "TestOnlyC.exe", "clear" , "noCheckRPATH", "noCheckPATH", "noQt", + "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); +#endif + + + QVERIFY(QFile::exists(TestBinDir + "/TestConf.json")); + QFile::remove(TestBinDir + "/TestConf.json"); + + + +#ifdef Q_OS_UNIX + comapareTree += utils.createTree( + {"./" + DISTRO_DIR + "/bin/TestCPPOnly", + "./" + DISTRO_DIR + "/TestCPPOnly.sh"}); +#else + comapareTree += utils.createTree( + {"./" + DISTRO_DIR + "/TestCPPOnly.exe", + "./" + DISTRO_DIR + "/TestCPPOnly.bat"}); +#endif + +#ifdef Q_OS_UNIX + runTestParams({"-bin", TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly", + "clear", "noCheckRPATH", "noCheckPATH", "noQt", + "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); +#else + runTestParams({"-bin", TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe", + "clear" , "-libDir", "L:/never/absalut/path", "noCheckPATH", "noQt", + "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); +#endif + + QFile confFile(TestBinDir + "/TestConf.json"); + QVERIFY(confFile.open(QIODevice::ReadOnly)); + + auto data = confFile.readAll(); + confFile.close(); + + QJsonDocument doc; + doc = doc.fromJson(data); + QVERIFY(!doc.isNull()); + +#ifdef Q_OS_UNIX + + QVERIFY(data.contains("\"bin\": [")); + QVERIFY(data.contains("./TestOnlyC")); + QVERIFY(data.contains("./TestCPPOnly")); + + QVERIFY(data.contains("\"clear\": true")); + + data.insert(data.size() - 2, QString(",\"libDir\": \"/never/absalut/path/\"").toLatin1()); + + QVERIFY(confFile.open(QIODevice::WriteOnly | QIODevice::Truncate)); + confFile.write(data); + confFile.close(); + + runTestParams({"-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); +#else + + QVERIFY(data.contains("\"bin\": [")); + QVERIFY(data.contains("./TestOnlyC.exe")); + QVERIFY(data.contains("./TestCPPOnly.exe")); + QVERIFY(data.contains("\"libDir\": \"L:/never/absalut/path\"")); + + QVERIFY(data.contains("\"clear\": true")); + + runTestParams({"-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); + +#endif + + QVERIFY(QuasarAppUtils::Params::isEndable("clear")); + QVERIFY(QuasarAppUtils::Params::isEndable("bin")); + QVERIFY(QuasarAppUtils::Params::isEndable("libDir")); +#ifdef Q_OS_UNIX + QVERIFY(QuasarAppUtils::Params::getArg("libDir") == "/never/absalut/path/"); +#else + QVERIFY(QuasarAppUtils::Params::getArg("libDir") == "L:/never/absalut/path"); +#endif + QFile::remove(TestBinDir + "/TestConf.json"); + + +#ifdef Q_OS_UNIX + runTestParams({"-bin", TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly", + "clear" , "noCheckRPATH", "noCheckPATH", "noQt", + "-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); +#else + runTestParams({"-bin", TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe", + "clear" , "noCheckPATH", "noQt", + "-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); +#endif + + confFile.setFileName(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); + QVERIFY(confFile.open(QIODevice::ReadOnly)); + + data = confFile.readAll(); + confFile.close(); + + doc = doc.fromJson(data); + QVERIFY(!doc.isNull()); + +#ifdef Q_OS_UNIX + + QVERIFY(data.contains("\"bin\": [")); + QVERIFY(data.contains("./../../../../../build/TestOnlyC")); + QVERIFY(data.contains("./../../../../../build/TestCPPOnly")); + + QVERIFY(data.contains("\"clear\": true")); + QString qmake = TestQtDir + "bin/qmake"; + +#else + + QVERIFY(data.contains("\"bin\": [")); + QVERIFY(data.contains("./../../../../../build/TestOnlyC.exe")); + QVERIFY(data.contains("./../../../../../build/TestCPPOnly.exe")); + + QVERIFY(data.contains("\"clear\": true")); + QString qmake = TestQtDir + "bin/qmake.exe"; + +#endif + runTestParams({"-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); + + QVERIFY(QuasarAppUtils::Params::isEndable("clear")); + QVERIFY(QuasarAppUtils::Params::isEndable("bin")); + + QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); + + // Test generar string in confFile + comapareTree = TestModule.qtLibs(); + + comapareTree = TestModule.ignoreFilter(comapareTree, "/plugins/p"); +#ifdef Q_OS_UNIX + comapareTree -= utils.createTree( + { + "./" + DISTRO_DIR + "/lib/libQt5EglFSDeviceIntegration.so", + }); + auto bin = TestBinDir + "QtWidgetsProject"; +#else + comapareTree -= utils.createTree( + { + "./" + DISTRO_DIR + "/Qt5DBus.dll" + + }); + auto bin = TestBinDir + "QtWidgetsProject.exe"; +#endif + + runTestParams({"-bin", bin, + "-qmake", qmake, + "clear", + "-ignore", "/plugins/p", + "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); + + + runTestParams({"-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); + QFile::remove(TestBinDir + "/TestConf.json"); + +#ifdef Q_OS_UNIX + QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); + comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/package/TestOnlyC.sh", + "./" + DISTRO_DIR + "/package/bin/TestOnlyC", + "./" + DISTRO_DIR + "/package/bin/qt.conf" + }); + QString target1 = TestBinDir + "TestOnlyC"; + +#else + QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); + comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/package/TestOnlyC.exe", + "./" + DISTRO_DIR + "/package/TestOnlyC.bat", + "./" + DISTRO_DIR + "/package/qt.conf"}); + QString target1 = TestBinDir + "TestOnlyC.exe"; + +#endif + bin = target1; + + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", "package;TestOn", + "-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); + + runTestParams({"-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, + &comapareTree); + QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); + + auto file = "testCase.json"; +#ifdef Q_OS_UNIX + bin = TestBinDir + "QtWidgetsProject," + TestBinDir + "TestOnlyC"; +#else + bin = TestBinDir + "QtWidgetsProject.exe," + TestBinDir + "TestOnlyC.exe"; +#endif + QVERIFY(utils.deployFile(":/testResurces/testRes/testMultiPackageConfig.json", file, + {{"$BIN_DIR", bin.toLatin1()}})); + + comapareTree = TestModule.onlyC(DISTRO_DIR + "/Dstro1") + + TestModule.qtLibs(DISTRO_DIR + "/Dstro2"); + + + runTestParams({"-confFile", file}, + &comapareTree); + + QFile::remove(TestBinDir + "/TestConf.json"); + QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); + + +} diff --git a/tests/units/confifiletest.h b/tests/units/confifiletest.h new file mode 100644 index 00000000..c048e3c5 --- /dev/null +++ b/tests/units/confifiletest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef CONF_FILE_TEST_H +#define CONF_FILE_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ConfFileTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // CONF_FILE_TEST_H diff --git a/tests/units/customplatformtest.cpp b/tests/units/customplatformtest.cpp new file mode 100644 index 00000000..070a3013 --- /dev/null +++ b/tests/units/customplatformtest.cpp @@ -0,0 +1,56 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "customplatformtest.h" +#include +#include +#include +#include +#include + + +void CustomPlatformTest::test() { + TestUtils utils; + + auto compareTree = TestModule.onlyC(); + +#ifdef Q_OS_UNIX + QString bin = {TestBinDir + "TestOnlyC"}; + QString platform = "linux_x86_64"; + +#else + QString bin = {TestBinDir + "TestOnlyC.exe"}; + QString platform = "win_x86_64"; + + compareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + "./" + DISTRO_DIR + "/qt.conf" + } + ); + +#endif + + runTestParams({ + "-bin", bin, + "clear", + "-platform", platform, + }, &compareTree + ); + + + + runTestParams({ + "-bin", bin, + "clear", + "-platform", "GeneralFile", + }, nullptr, false, false, exitCodes::PrepareError + ); + +} diff --git a/tests/units/customplatformtest.h b/tests/units/customplatformtest.h new file mode 100644 index 00000000..34119f65 --- /dev/null +++ b/tests/units/customplatformtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef CUSTOM_PLATFORM_TEST_H +#define CUSTOM_PLATFORM_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class CustomPlatformTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // CUSTOM_PLATFORM_TEST_H diff --git a/tests/units/customscripttest.cpp b/tests/units/customscripttest.cpp new file mode 100644 index 00000000..bb26e4be --- /dev/null +++ b/tests/units/customscripttest.cpp @@ -0,0 +1,69 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "customscripttest.h" +#include +#include +#include +#include +#include + + +void CustomScriptTest::test() { + + TestUtils utils; + +#ifdef Q_OS_UNIX + QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/TestOnlyC.sh"}); + QString bin = TestBinDir + "TestOnlyC"; + QString scriptPath = "./" + DISTRO_DIR + "/TestOnlyC.sh"; + +#else + QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + "./" + DISTRO_DIR + "/qt.conf"}); + QString bin = TestBinDir + "TestOnlyC.exe"; + QString scriptPath = "./" + DISTRO_DIR + "/TestOnlyC.bat"; + + +#endif + + runTestParams({"-bin", bin, "force-clear", "noOverwrite", "-libOut", "lib"}, &comapareTree); + + QFile script(scriptPath); + QVERIFY(script.open(QIODevice::ReadOnly)); + auto scriptText = script.readAll(); + + QVERIFY(!scriptText.contains("Begin Custom Script")); + + script.close(); + + runTestParams({"-bin", bin, "force-clear", "noOverwrite", + "-libOut", "lib", + "-customScript", "echo 'this is test script'"}, &comapareTree); + + QVERIFY(script.open(QIODevice::ReadOnly)); + + scriptText = script.readAll(); + + QVERIFY(scriptText.contains("Begin Custom Script")); + QVERIFY(scriptText.contains("echo 'this is test script'")); + QVERIFY(scriptText.contains("End Custom Script")); + + script.close(); + + + +} + diff --git a/tests/units/customscripttest.h b/tests/units/customscripttest.h new file mode 100644 index 00000000..349d1a66 --- /dev/null +++ b/tests/units/customscripttest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef CUSTOM_SCRIPT_TEST_H +#define CUSTOM_SCRIPT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class CustomScriptTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // CUSTOM_SCRIPT_TEST_H diff --git a/tests/units/customtest.cpp b/tests/units/customtest.cpp new file mode 100644 index 00000000..27f649aa --- /dev/null +++ b/tests/units/customtest.cpp @@ -0,0 +1,20 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "customtest.h" +#include +#include +#include +#include +#include + + +void CustomTest::test() { + //runTestParams({"-confFile", "", + // "qifFromSystem"}); +} diff --git a/tests/units/customtest.h b/tests/units/customtest.h new file mode 100644 index 00000000..22a7bf96 --- /dev/null +++ b/tests/units/customtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef CUSTOM_TEST_H +#define CUSTOM_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class CustomTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // CUSTOM_TEST_H diff --git a/tests/units/distrostructtest.cpp b/tests/units/distrostructtest.cpp new file mode 100644 index 00000000..6025bcb8 --- /dev/null +++ b/tests/units/distrostructtest.cpp @@ -0,0 +1,62 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "distrostructtest.h" +#include +#include +#include +#include +#include + + +void DistroStructTest::test() { + DistroStruct distro; + + auto cases = QList>{ + {"", "/"}, + {"/", "/"}, + {"/res","/../"}, + {"/res/","/../"}, + {"/res/type","/../../"}, + {"/res/type/","/../../"}, + {"res/type","../../"}, + {"res/type/","../../"}, + {"res//type/","../../"}, + {"res////type/","../../"}, + {"//res///type/////","/../../"}, + {"\\", "/"}, + {"\\res","/../"}, + {"\\res\\","/../"}, + {"\\res\\type","/../../"}, + {"\\res\\type\\","/../../"}, + {"res\\type","../../"}, + {"res\\type\\","../../"}, + {"res\\\\type\\","../../"}, + {"res\\\\\\\\type\\","../../"}, + {"\\\\res\\\\\\type\\\\\\\\\\","/../../"}, + }; + + for (const auto &i: qAsConst(cases)) { + if (distro.getRelativePath(i.first) != i.second) + QVERIFY(false); + } + + distro = DistroStruct(); + + distro.setTrOutDir("/tr/"); + QVERIFY(distro.getTrOutDir() == "/tr/"); + + + distro.setTrOutDir("/tr"); + QVERIFY(distro.getTrOutDir() == "/tr/"); + + distro.setTrOutDir("tr"); + QVERIFY(distro.getTrOutDir() == "/tr/"); + + +} diff --git a/tests/units/distrostructtest.h b/tests/units/distrostructtest.h new file mode 100644 index 00000000..8709d4eb --- /dev/null +++ b/tests/units/distrostructtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef DISTRO_STRUCT_TEST_H +#define DISTRO_STRUCT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class DistroStructTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // DISTRO_STRUCT_TEST_H diff --git a/tests/units/extradatatest.cpp b/tests/units/extradatatest.cpp new file mode 100644 index 00000000..b890779f --- /dev/null +++ b/tests/units/extradatatest.cpp @@ -0,0 +1,51 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "extradatatest.h" +#include +#include +#include +#include +#include + + +void ExtraDataTest::test() { + TestUtils utils; + + +#ifdef Q_OS_UNIX + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/build/TestOnlyC", + "./" + DISTRO_DIR + "/build/TestCPPOnly", + "./" + DISTRO_DIR + "/build/QtWidgetsProject", + "./" + DISTRO_DIR + "/build/TestQMLWidgets", + "./" + DISTRO_DIR + "/build/basic", + "./" + DISTRO_DIR + "/build/quicknanobrowser", + "./" + DISTRO_DIR + "/build/webui"}); +#else + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/build/TestOnlyC.exe", + "./" + DISTRO_DIR + "/build/TestCPPOnly.exe", + "./" + DISTRO_DIR + "/build/QtWidgetsProject.exe", + "./" + DISTRO_DIR + "/build/TestQMLWidgets.exe", + "./" + DISTRO_DIR + "/build/basic.exe"}); +#endif + + + runTestParams({"-extraData", TestBinDir, "clear", + "noCheckRPATH", "noCheckPATH", "noQt"}, &comapareTree); + + + comapareTree = TestModule.replace(comapareTree, { + {"DistributionKit/build", + "DistributionKit/myExtraData/build"}}); + + runTestParams({"-extraData", TestBinDir, "clear", + "noCheckRPATH", "noCheckPATH", "noQt", + "-extraDataOut", "myExtraData"}, &comapareTree); +} diff --git a/tests/units/extradatatest.h b/tests/units/extradatatest.h new file mode 100644 index 00000000..7302cf8a --- /dev/null +++ b/tests/units/extradatatest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef EXTRA_DATA_TEST_H +#define EXTRA_DATA_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ExtraDataTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // EXTRA_DATA_TEST_H diff --git a/tests/units/extrapluginstest.cpp b/tests/units/extrapluginstest.cpp new file mode 100644 index 00000000..a22924a2 --- /dev/null +++ b/tests/units/extrapluginstest.cpp @@ -0,0 +1,84 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "extrapluginstest.h" +#include +#include +#include +#include +#include + + +void ExtraPluginTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "QtWidgetsProject"; + QString qmake = TestQtDir + "bin/qmake"; + + auto pluginTree = utils.createTree( + { + "./" + DISTRO_DIR + "/plugins/sqldrivers/libqsqlodbc.so", + "./" + DISTRO_DIR + "/plugins/sqldrivers/libqsqlpsql.so", + "./" + DISTRO_DIR + "/plugins/sqldrivers/libqsqlite.so", + "./" + DISTRO_DIR + "/lib/libQt5Sql.so", + "./" + DISTRO_DIR + "/lib/libpq.so", + "./" + DISTRO_DIR + "/lib/libcrypto.so", + "./" + DISTRO_DIR + "/lib/libssl.so", + + }); +#else + QString bin = TestBinDir + "QtWidgetsProject.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; + + auto pluginTree = utils.createTree( + { + "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlmysql.dll", + "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlodbc.dll", + "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlite.dll", + "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlpsql.dll", + "./" + DISTRO_DIR + "/Qt5Sql.dll", + "./" + DISTRO_DIR + "/libpq.dll", + + }); +#endif + + auto comapareTree = TestModule.qtLibs(); + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + }, &comapareTree); + + + comapareTree = comapareTree + pluginTree; + + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-enablePlugins", "sqldrivers"}, &comapareTree); + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-extraPlugin", TestQtDir + "/plugins/sqldrivers"}, &comapareTree); + + comapareTree -= pluginTree; + comapareTree -= utils.createTree( + { + "./" + DISTRO_DIR + "/plugins/platforms/libqxcb.so", + "./" + DISTRO_DIR + "/lib/libxcb-xinerama.so.0", + "./" + DISTRO_DIR + "/plugins/xcbglintegrations/libqxcb-egl-integration.so", + "./" + DISTRO_DIR + "/plugins/xcbglintegrations/libqxcb-glx-integration.so", + "./" + DISTRO_DIR + "/lib/libQt5XcbQpa.so", + + }); + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-disablePlugins", "qxcb,xcbglintegrations"}, &comapareTree); + +} diff --git a/tests/units/extrapluginstest.h b/tests/units/extrapluginstest.h new file mode 100644 index 00000000..b454a43b --- /dev/null +++ b/tests/units/extrapluginstest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef EXTRA_PLUGIN_TEST_H +#define EXTRA_PLUGIN_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ExtraPluginTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // EXTRA_PLUGIN_TEST_H diff --git a/tests/units/ignoreenvtest.cpp b/tests/units/ignoreenvtest.cpp new file mode 100644 index 00000000..9208f9d7 --- /dev/null +++ b/tests/units/ignoreenvtest.cpp @@ -0,0 +1,59 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "ignoreenvtest.h" +#include +#include +#include +#include +#include + + +void IgnoreEnvTest::test() { + + + + Envirement env; + QDir("./testTree").removeRecursively(); + + QStringList ignoreTree = { + "./testTree/test", + "./testTree/", + "./testTree/test1/1", + "./testTree/test2/1/", + }; + + QStringList testTree = { + "./testTree/test/z", + "./testTree/z", + "./testTree/test1/1z", + "./testTree/test2/1/z", + }; + + createTree(ignoreTree); + createTree(testTree); + + env.setIgnoreEnvList(ignoreTree); + env.addEnv(ignoreTree); + + // must be empty becouse all pathes is ignored + QVERIFY(env.size() == 0); + + env.addEnv(testTree); + + // must be equals 4 becouse all pathes is not ignored + QVERIFY(env.size() == 4); + + // try add dublicate + env.addEnv(testTree); + + // must be equals 4 becouse all dublicates must be ignored + QVERIFY(env.size() == 4); + + QVERIFY(QDir("./testTree").removeRecursively()); +} diff --git a/tests/units/ignoreenvtest.h b/tests/units/ignoreenvtest.h new file mode 100644 index 00000000..4f8f4a46 --- /dev/null +++ b/tests/units/ignoreenvtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef IGNORE_ENV_TEST_H +#define IGNORE_ENV_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class IgnoreEnvTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // IGNORE_ENV_TEST_H diff --git a/tests/units/ignoreenvwithlibdirtest.cpp b/tests/units/ignoreenvwithlibdirtest.cpp new file mode 100644 index 00000000..85f809a1 --- /dev/null +++ b/tests/units/ignoreenvwithlibdirtest.cpp @@ -0,0 +1,33 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "ignoreenvwithlibdirtest.h" +#include +#include +#include +#include +#include + + +void IgnoreEnvWithLibDirTest::test() { +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + + QVERIFY(QDir().mkdir("libDirtest")); + + // Run deploy installer + runTestParams({"-bin", bin, "clear", + "-targetDir", "./libDirtest", + "-libDir", "./libDirtest"}, nullptr, false, false, + exitCodes::PrepareError); + + QVERIFY(QDir().rmdir("libDirtest")); +} diff --git a/tests/units/ignoreenvwithlibdirtest.h b/tests/units/ignoreenvwithlibdirtest.h new file mode 100644 index 00000000..a6de64be --- /dev/null +++ b/tests/units/ignoreenvwithlibdirtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef IGNORE_ENV_WITH_LIB_DIR_TEST_H +#define IGNORE_ENV_WITH_LIB_DIR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class IgnoreEnvWithLibDirTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // IGNORE_ENV_WITH_LIB_DIR_TEST_H diff --git a/tests/units/ignoretest.cpp b/tests/units/ignoretest.cpp new file mode 100644 index 00000000..7eb51d95 --- /dev/null +++ b/tests/units/ignoretest.cpp @@ -0,0 +1,104 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "ignoretest.h" +#include +#include +#include +#include +#include + + +void IgnoreTest::test() { + TestUtils utils; + + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "QtWidgetsProject"; + QString qmake = TestQtDir + "bin/qmake"; + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/QtWidgetsProject.sh", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/bin/QtWidgetsProject", + }); + +#else + QString bin = TestBinDir + "QtWidgetsProject.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/qt.conf", + "./" + DISTRO_DIR + "/QtWidgetsProject.exe", + "./" + DISTRO_DIR + "/QtWidgetsProject.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "/libstdc++-6.dll", + "./" + DISTRO_DIR + "/libwinpthread-1.dll" + + }); + +#endif + + + if (!TestQtDir.contains("Qt5")) { + +#ifdef Q_OS_UNIX + bin = TestBinDir + "QtWidgetsProject"; + qmake = TestQtDir + "bin/qmake"; + +#else + bin = TestBinDir + "QtWidgetsProject.exe"; + qmake = TestQtDir + "bin/qmake.exe"; + +#endif + } + + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-ignore", "Qt5"}, &comapareTree); + + + +#ifdef Q_OS_UNIX + auto removeTree = utils.createTree({ + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_hangul.so", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_openwnn.so", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_pinyin.so", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_tcime.so", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_thai.so", + "./" + DISTRO_DIR + "/plugins/platforminputcontexts/libqtvirtualkeyboardplugin.so", + "./" + DISTRO_DIR + "/lib/libQt5VirtualKeyboard.so", + + }); +#else + auto removeTree = utils.createTree({ + "./" + DISTRO_DIR + "/Qt5VirtualKeyboard.dll", + "./" + DISTRO_DIR + "/plugins/platforminputcontexts/qtvirtualkeyboardplugin.dll", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_hangul.dll", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_openwnn.dll", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_pinyin.dll", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_tcime.dll", + "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_thai.dll" + }); + +#endif + + comapareTree = TestModule.qtLibs() - removeTree; + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-ignore", "VirtualKeyboard"}, &comapareTree); + + +} diff --git a/tests/units/ignoretest.h b/tests/units/ignoretest.h new file mode 100644 index 00000000..97c3df9a --- /dev/null +++ b/tests/units/ignoretest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef IGNORE_TEST_H +#define IGNORE_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class IgnoreTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // IGNORE_TEST_H diff --git a/tests/units/installdiroptionstest.cpp b/tests/units/installdiroptionstest.cpp new file mode 100644 index 00000000..89029f12 --- /dev/null +++ b/tests/units/installdiroptionstest.cpp @@ -0,0 +1,35 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "installdiroptionstest.h" +#include +#include +#include +#include +#include + + +void InstallDirsOptionsTest::test() { +#ifdef QT_DEBUG +#ifdef Q_OS_UNIX + QStringList binMulti = {TestBinDir + "TestOnlyC" , TestBinDir + "TestCPPOnly"}; + +#else + QStringList binMulti = {TestBinDir + "TestOnlyC.exe" , TestBinDir + "TestCPPOnly.exe"}; + +#endif + + + runTestParams({"-bin", binMulti.join(","), "clear", + "qif", "deb", + "-targetPackage", "pkg;TestCPPOnly", + "-installDirDeb", "pkg;/var", + "-installDirQIFW", "/opt"}); + +#endif +} diff --git a/tests/units/installdiroptionstest.h b/tests/units/installdiroptionstest.h new file mode 100644 index 00000000..1cb8766b --- /dev/null +++ b/tests/units/installdiroptionstest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef INSTALL_DIR_OPTIONS_TEST_H +#define INSTALL_DIR_OPTIONS_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class InstallDirsOptionsTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // INSTALL_DIR_OPTIONS_TEST_H diff --git a/tests/units/libdirstest.cpp b/tests/units/libdirstest.cpp new file mode 100644 index 00000000..da2f15b5 --- /dev/null +++ b/tests/units/libdirstest.cpp @@ -0,0 +1,158 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "libdirstest.h" +#include +#include +#include +#include +#include + + +void LibDirTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + QString extraPath = "/usr/lib,/lib"; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.sh", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/bin/TestOnlyC" + }); + +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + QString extraPath = TestQtDir; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/qt.conf", + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + + }); + +#endif + + + + + runTestParams({"-bin", bin, "clear" , + "-libDir", extraPath, + }, &comapareTree); + + +#ifdef Q_OS_UNIX + comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.sh", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/lib/libstdc++.so", + "./" + DISTRO_DIR + "/lib/libgcc_s.so", + "./" + DISTRO_DIR + "/lib/ld-linux-x86-64.so", + "./" + DISTRO_DIR + "/lib/libc.so", + "./" + DISTRO_DIR + "/lib/libm.so", + }); + + auto comapareTreeExtraLib = utils.createTree( + { + "./" + DISTRO_DIR + "2/TestOnlyC.sh", + "./" + DISTRO_DIR + "2/bin/qt.conf", + "./" + DISTRO_DIR + "2/bin/TestOnlyC", + "./" + DISTRO_DIR + "2/lib/libstdc++.so", + "./" + DISTRO_DIR + "2/lib/libgcc_s.so" + }); + +#else + comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/qt.conf", + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "/libwinpthread-1.dll", + "./" + DISTRO_DIR + "/libstdc++-6.dll", + + }); + + auto comapareTreeExtraLib = utils.createTree( + { + "./" + DISTRO_DIR + "2/qt.conf", + "./" + DISTRO_DIR + "2/TestOnlyC.exe", + "./" + DISTRO_DIR + "2/TestOnlyC.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "2/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "2/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "2/libstdc++-6.dll", + + }); + +#endif + + + runTestParams({"-bin", bin, "clear" , + "-libDir", extraPath, + "-recursiveDepth", "5", + "noCheckRPATH, noCheckPATH", "noQt"}, &comapareTree, true); + + runTestParams({"-bin", bin, "clear" , + "-targetDir", "./" + DISTRO_DIR + "2", + "-extraLibs", "stdc,gcc", + "noCheckRPATH, noCheckPATH", "noQt"}, &comapareTreeExtraLib, true); + + //task #258 + //https://github.com/QuasarApp/CQtDeployer/issues/258 + + +#ifdef Q_OS_UNIX + comapareTreeExtraLib = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.sh", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/lib/libstdc++.so", + "./" + DISTRO_DIR + "/lib/libgcc_s.so" + }); + extraPath = "./" + DISTRO_DIR + "2/lib"; + + +#else + + comapareTreeExtraLib = utils.createTree( + { + "./" + DISTRO_DIR + "/qt.conf", + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "/libstdc++-6.dll", + + }); + extraPath = "./" + DISTRO_DIR + "2"; + +#endif + runTestParams({"-bin", bin, "clear" , + "-libDir", extraPath, + "noCheckRPATH, noCheckPATH", "noQt"}, &comapareTreeExtraLib, true); + + QDir(extraPath).removeRecursively(); + +} diff --git a/tests/units/libdirstest.h b/tests/units/libdirstest.h new file mode 100644 index 00000000..47061c79 --- /dev/null +++ b/tests/units/libdirstest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef LIB_DIR_TEST_H +#define LIB_DIR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class LibDirTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // LIB_DIR_TEST_H diff --git a/tests/units/outdirtest.cpp b/tests/units/outdirtest.cpp new file mode 100644 index 00000000..70e8172c --- /dev/null +++ b/tests/units/outdirtest.cpp @@ -0,0 +1,103 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "outdirtest.h" +#include +#include +#include +#include +#include + + +void OutDirTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestQMLWidgets"; + QString qmake = TestQtDir + "bin/qmake"; + +#else + QString bin = TestBinDir + "TestQMLWidgets.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; + + +#endif + + auto comapareTree = TestModule.testOutLibs(); + + runTestParams({"-bin", bin, "clear" , + "-binOut", "/lol", + "-libOut", "/lolLib", + "-trOut", "/lolTr", + "-pluginOut", "/p", + "-qmlOut", "/q", + "-qmake", qmake, + "-qmlDir", TestBinDir + "/../TestQMLWidgets" + }, &comapareTree); + + QFile file; + + file.setFileName("./" + DISTRO_DIR + "/lol/qt.conf"); + + QVERIFY(file.open(QIODevice::ReadOnly)); + + auto runScript = file.readAll(); + file.close(); + + QVERIFY(runScript.contains("Prefix= ./../")); + QVERIFY(runScript.contains("Libraries= ./lolLib/")); + QVERIFY(runScript.contains("Plugins= ./p/")); + QVERIFY(runScript.contains("Imports= ./q/")); + QVERIFY(runScript.contains("Translations= ./lolTr/")); + QVERIFY(runScript.contains("Qml2Imports= ./q/")); + +#ifdef Q_OS_WIN + + + runTestParams({"-bin", bin, "clear" , + "-binOut", "/lol", + "-libOut", "/lolLib", + "-trOut", "/lolTr", + "-pluginOut", "/p", + "-qmlOut", "/q", + "-qmake", qmake, + "-qmlDir", TestBinDir + "/../TestQMLWidgets" + }, &comapareTree); + + + + file.setFileName( "./" + DISTRO_DIR + "/TestQMLWidgets.bat"); + + QVERIFY(file.open(QIODevice::ReadOnly)); + + runScript = file.readAll(); + file.close(); + + qDebug() << "runScript =" << runScript; + + QVERIFY(runScript.contains("SET BASE_DIR=%~dp0")); + QVERIFY(runScript.contains("SET PATH=%BASE_DIR%\\lol\\;%BASE_DIR%\\lolLib\\;%PATH%")); + QVERIFY(runScript.contains("start \"TestQMLWidgets\" /B \"%BASE_DIR%\\lol\\TestQMLWidgets.exe\" %*")); + + runTestParams({"-bin", TestBinDir + "TestOnlyC.exe", "clear", + }, nullptr); + + file.setFileName( "./" + DISTRO_DIR + "/TestOnlyC.bat"); + + QVERIFY(file.open(QIODevice::ReadOnly)); + + runScript = file.readAll(); + file.close(); + + qDebug() << "runScript =" << runScript; + + QVERIFY(runScript.contains("call \"%BASE_DIR%\\TestOnlyC.exe\" %*")); + +#endif + +} diff --git a/tests/units/outdirtest.h b/tests/units/outdirtest.h new file mode 100644 index 00000000..6025dd55 --- /dev/null +++ b/tests/units/outdirtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef OUT_DIR_TEST_H +#define OUT_DIR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class OutDirTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // OUT_DIR_TEST_H diff --git a/tests/units/overwritetest.cpp b/tests/units/overwritetest.cpp new file mode 100644 index 00000000..59adbe9e --- /dev/null +++ b/tests/units/overwritetest.cpp @@ -0,0 +1,71 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "overwritetest.h" +#include +#include +#include +#include +#include + + +void OverwiriteTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/TestOnlyC.sh"}); + QString bin = TestBinDir + "TestOnlyC"; + +#else + QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + "./" + DISTRO_DIR + "/qt.conf"}); + QString bin = TestBinDir + "TestOnlyC.exe"; + +#endif + + runTestParams({"-bin", bin, "force-clear", "noOverwrite"}, &comapareTree); + + QVERIFY(f.open(QIODevice::ReadOnly)); + auto hashBefor = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); + f.close(); + + QVERIFY(f.open(QIODevice::WriteOnly | QIODevice::Append)); + f.write(QByteArray(10, '1')); + f.close(); + + QVERIFY(f.open(QIODevice::ReadOnly)); + auto hashAfter = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); + f.close(); + + QVERIFY(hashAfter != hashBefor); + + runTestParams({"-bin", bin, "noOverwrite"}, &comapareTree); + + QVERIFY(f.open(QIODevice::ReadOnly)); + hashAfter = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); + f.close(); + + QVERIFY(hashAfter != hashBefor); + + + runTestParams({"-bin", bin}, &comapareTree); + + QVERIFY(f.open(QIODevice::ReadOnly)); + hashAfter = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); + f.close(); + + QVERIFY(hashAfter == hashBefor); + +} diff --git a/tests/units/overwritetest.h b/tests/units/overwritetest.h new file mode 100644 index 00000000..1febec52 --- /dev/null +++ b/tests/units/overwritetest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef OVERWRITE_TEST_H +#define OVERWRITE_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class OverwiriteTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // OVERWRITE_TEST_H diff --git a/tests/units/overwritewithpackingtest.cpp b/tests/units/overwritewithpackingtest.cpp new file mode 100644 index 00000000..4659e1d5 --- /dev/null +++ b/tests/units/overwritewithpackingtest.cpp @@ -0,0 +1,50 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "overwritewithpackingtest.h" +#include +#include +#include +#include +#include + + +void OverwiriteWithPackingTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly"; + +#else + QString bin = TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe"; + +#endif +#ifdef Q_OS_UNIX + auto comapareTreeqif = utils.createTree( + { + "./" + DISTRO_DIR + "/InstallerTest.run", + "./" + DISTRO_DIR + "/InstallerTest.run.md5", + }); +#else + auto comapareTreeqif = utils.createTree( + { + "./" + DISTRO_DIR + "/InstallerTest.exe", + "./" + DISTRO_DIR + "/InstallerTest.exe.md5", + + }); + +#endif + + runTestParams({"-bin", bin, + "force-clear", + "noOverwrite", + "qif", + "qifFromSystem", + "-name", "Test"}, &comapareTreeqif); + +} diff --git a/tests/units/overwritewithpackingtest.h b/tests/units/overwritewithpackingtest.h new file mode 100644 index 00000000..a2bf39a4 --- /dev/null +++ b/tests/units/overwritewithpackingtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef OVERWRITE_WITH_PACKING_TEST_H +#define OVERWRITE_WITH_PACKING_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class OverwiriteWithPackingTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // OVERWRITE_WITH_PACKING_TEST_H diff --git a/tests/units/packagestest.cpp b/tests/units/packagestest.cpp new file mode 100644 index 00000000..4836c9c9 --- /dev/null +++ b/tests/units/packagestest.cpp @@ -0,0 +1,87 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "packagestest.h" +#include +#include +#include +#include +#include + + +void PacakgesTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/package/TestOnlyC.sh", + "./" + DISTRO_DIR + "/package/bin/TestOnlyC", + "./" + DISTRO_DIR + "/package/bin/qt.conf" + }); + QString target1 = TestBinDir + "TestOnlyC"; + +#else + QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "/package/TestOnlyC.exe", + "./" + DISTRO_DIR + "/package/TestOnlyC.bat", + "./" + DISTRO_DIR + "/package/qt.conf"}); + QString target1 = TestBinDir + "TestOnlyC.exe"; + +#endif + QString bin = target1; + + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", "/package/;TestOn"}, &comapareTree); + + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", "/package/;" + QFileInfo(target1).absoluteFilePath()}, &comapareTree); + +#ifdef Q_OS_UNIX + QString target2 = TestBinDir + "TestQMLWidgets"; + QString target3 = TestBinDir + "QtWidgetsProject"; + +#else + QString target2 = TestBinDir + "TestQMLWidgets.exe"; + QString target3 = TestBinDir + "QtWidgetsProject.exe"; + +#endif + bin += "," + target2; + bin += "," + target3; + + auto packageString = "package1;" + QFileInfo(target1).absoluteFilePath() + ",package2/ZzZ;" + QFileInfo(target2).absoluteFilePath(); + + comapareTree = TestModule.testDistroLibs(DISTRO_DIR); + + runTestParams({"-bin", bin, "force-clear", + "-binOut", "/lol", + "-libOut", "/lolLib", + "-trOut", "/lolTr", + "-pluginOut", "/p", + "-qmlOut", "package2/ZzZ;/q/and/q,/q", + "-qmlDir", "package2/ZzZ;" + TestBinDir + "/../TestQMLWidgets", + "-targetPackage", packageString}, &comapareTree); + + +#ifdef Q_OS_UNIX + + // test a wrapers source + QFile wraper("./" + DISTRO_DIR + "/package2/ZzZ/TestQMLWidgets.sh"); + + QVERIFY(wraper.open(QIODevice::ReadOnly)); + auto data = wraper.readAll(); + wraper.close(); + + wraper.setFileName(":/testResurces/testRes/TestQMLWidgets.sh"); + QVERIFY(wraper.open(QIODevice::ReadOnly)); + QVERIFY(wraper.readAll() == data); + wraper.close(); +#endif +} diff --git a/tests/units/packagestest.h b/tests/units/packagestest.h new file mode 100644 index 00000000..9e9cf6db --- /dev/null +++ b/tests/units/packagestest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef PACKAGES_TEST_H +#define PACKAGES_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class PacakgesTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // PACKAGES_TEST_H diff --git a/tests/units/qifwachiveformattest.cpp b/tests/units/qifwachiveformattest.cpp new file mode 100644 index 00000000..68eaaba8 --- /dev/null +++ b/tests/units/qifwachiveformattest.cpp @@ -0,0 +1,41 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "qifwachiveformattest.h" +#include +#include +#include +#include +#include + + +void QIFWArchiveFormatTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = {TestBinDir + "TestOnlyC"}; + + auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.run"}, + {DISTRO_DIR + "/InstallerTestOnlyC.run.md5"}}); +#else + QString bin = {TestBinDir + "TestOnlyC.exe"}; + + auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.exe"}, + {DISTRO_DIR + "/InstallerTestOnlyC.exe.md5"}}); +#endif + + + runTestParams({ + "-bin", bin, + "qifFromSystem", + "clear", + "qif", + "-qifArchiveFormat", "zip" + }, &result + ); +} diff --git a/tests/units/qifwachiveformattest.h b/tests/units/qifwachiveformattest.h new file mode 100644 index 00000000..d0dff0e7 --- /dev/null +++ b/tests/units/qifwachiveformattest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QIFW_ARCHIVE_FORMAT_TEST_H +#define QIFW_ARCHIVE_FORMAT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QIFWArchiveFormatTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QIFW_ARCHIVE_FORMAT_TEST_H diff --git a/tests/units/qifwbinarycreatortest.cpp b/tests/units/qifwbinarycreatortest.cpp new file mode 100644 index 00000000..73f9f1c2 --- /dev/null +++ b/tests/units/qifwbinarycreatortest.cpp @@ -0,0 +1,63 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "qifwbinarycreatortest.h" +#include +#include +#include +#include +#include + + +void QIFWBinaryCreatorTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = {TestBinDir + "TestOnlyC"}; +#else + QString bin = {TestBinDir + "TestOnlyC.exe"}; +#endif + + { + QuasarAppUtils::Params::parseParams({ + "-bin", bin, + "qifFromSystem", + "clear", + "qif", + "-binarycreator", "test testValue" + }); + Deploy deploy; + QVERIFY(deploy.prepare()); + FileManager fm; + QIF qif(&fm); + + auto command = qif.runCmd(); + QVERIFY(command.size() == 1); + QVERIFY(command.first().command == "test"); + QVERIFY(command.first().arguments.contains("testValue")); + } + + { + QuasarAppUtils::Params::parseParams({ + "-bin", bin, + "qifFromSystem", + "clear", + "qif", + "-binarycreator", "test" + }); + Deploy deploy; + QVERIFY(deploy.prepare()); + FileManager fm; + QIF qif(&fm); + + auto command = qif.runCmd(); + QVERIFY(command.size() == 1); + QVERIFY(command.first().command == "test"); + } + +} diff --git a/tests/units/qifwbinarycreatortest.h b/tests/units/qifwbinarycreatortest.h new file mode 100644 index 00000000..41991232 --- /dev/null +++ b/tests/units/qifwbinarycreatortest.h @@ -0,0 +1,24 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QIFW_BINARY_CREATOR_TEST_H +#define QIFW_BINARY_CREATOR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QIFWBinaryCreatorTest: public TestBase, protected TestUtils +{ +public: + + void test(); + +}; + +#endif // QIFW_BINARY_CREATOR_TEST_H diff --git a/tests/units/qifwouttest.cpp b/tests/units/qifwouttest.cpp new file mode 100644 index 00000000..c2edf82e --- /dev/null +++ b/tests/units/qifwouttest.cpp @@ -0,0 +1,45 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "qifwouttest.h" +#include +#include +#include +#include +#include + + +void QIFWOutTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; +#else + QString bin = TestBinDir + "TestOnlyC.exe"; +#endif + +#ifdef Q_OS_UNIX + auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, + {DISTRO_DIR + "/DEB_OUT.deb"}, {DISTRO_DIR + "/DEB_OUT.deb.md5"}, + {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); + + // Run deploy installer + runTestParams({"-bin", bin, "clear", + "qif", "-qifOut", "QIF_OUT.exe", + "deb", "-debOut", "DEB_OUT.deb", + "zip", "-zipOut", "ZIP_OUT.zip"}, &result); +#else + auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, + {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); + + // Run deploy installer + runTestParams({"-bin", bin, "clear", + "qif", "-qifOut", "QIF_OUT.exe", + "zip", "-zipOut", "ZIP_OUT.zip"}, &result); +#endif +} diff --git a/tests/units/qifwouttest.h b/tests/units/qifwouttest.h new file mode 100644 index 00000000..5aa6361b --- /dev/null +++ b/tests/units/qifwouttest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QIFW_QUT_TEST_H +#define QIFW_QUT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QIFWOutTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QIFW_QUT_TEST_H diff --git a/tests/units/qifwresourcestest.cpp b/tests/units/qifwresourcestest.cpp new file mode 100644 index 00000000..121b6cc0 --- /dev/null +++ b/tests/units/qifwresourcestest.cpp @@ -0,0 +1,44 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "qifwresourcestest.h" +#include +#include +#include +#include +#include + + +void QIFWResourcesTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = {TestBinDir + "TestOnlyC"}; + + auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.run"}, + {DISTRO_DIR + "/InstallerTestOnlyC.run.md5"}}); +#else + QString bin = {TestBinDir + "TestOnlyC.exe"}; + + auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.exe"}, + {DISTRO_DIR + "/InstallerTestOnlyC.exe.md5"}}); +#endif + + + auto templateDir = TestBinDir + "/../../UnitTests/testRes/QIFCustomTemplate"; + runTestParams({ + "-bin", bin, + "clear", + "qif", + "-qifConfig", templateDir + "/customconfig.xml", + "-qifPackages", templateDir + "/custompackages", + "-qifResources", templateDir + "customRes.qrc" + }, &result + ); + +} diff --git a/tests/units/qifwresourcestest.h b/tests/units/qifwresourcestest.h new file mode 100644 index 00000000..05ac55b7 --- /dev/null +++ b/tests/units/qifwresourcestest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QIFW_RSOURCES_TEST_H +#define QIFW_RSOURCES_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QIFWResourcesTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QIFW_RSOURCES_TEST_H diff --git a/tests/units/qmlextracttest.cpp b/tests/units/qmlextracttest.cpp new file mode 100644 index 00000000..d91dc803 --- /dev/null +++ b/tests/units/qmlextracttest.cpp @@ -0,0 +1,37 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "qmlextracttest.h" +#include +#include +#include +#include +#include + + +void QMLExtractTest::test() { + QmlCreator creator("./"); + auto imports = creator.getQmlImports(); + + auto qmlFiles = creator.getCopyedQml(); + + + QML scaner("./", QtMajorVersion::Qt5); + + + for (const auto &file : qAsConst(qmlFiles)) { + + + auto fileImports = scaner.extractImportsFromFile(file); + + for (const auto &fil : imports.value(file)) { + QVERIFY(fileImports.contains(fil, Qt::CaseInsensitive)); + } + + } +} diff --git a/tests/units/qmlextracttest.h b/tests/units/qmlextracttest.h new file mode 100644 index 00000000..de1dfd7a --- /dev/null +++ b/tests/units/qmlextracttest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QML_EXTRACT_TEST_H +#define QML_EXTRACT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QMLExtractTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QML_EXTRACT_TEST_H diff --git a/tests/units/qttest.cpp b/tests/units/qttest.cpp new file mode 100644 index 00000000..63af68f5 --- /dev/null +++ b/tests/units/qttest.cpp @@ -0,0 +1,74 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "qttest.h" +#include +#include +#include +#include +#include + + +void QtTest::test() { + TestUtils utils; + + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "QtWidgetsProject"; + QString qmake = TestQtDir + "bin/qmake"; + +#else + QString bin = TestBinDir + "QtWidgetsProject.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; + +#endif + + + auto comapareTree = TestModule.qtLibs(); + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake}, &comapareTree); + + // test auto detection of detection qmake from PATH + runTestParams({"-bin", bin, "clear", "noCheckRPATH"}, &comapareTree); + +#ifdef Q_OS_UNIX + // test auto detection of detection qmake from RPATH + runTestParams({"-bin", bin, "clear", "noCheckPATH"}, &comapareTree); +#endif + + + comapareTree = TestModule.qtWithoutTr(); + + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, "noTranslations"}, &comapareTree); + + + comapareTree = TestModule.qmlLibs(); + +#ifdef Q_OS_UNIX + bin = TestBinDir + "TestQMLWidgets"; +#else + bin = TestBinDir + "TestQMLWidgets.exe"; + +#endif + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "-qmlDir", TestBinDir + "/../TestQMLWidgets"}, &comapareTree); + + +#ifdef Q_OS_UNIX + + runTestParams({"-bin", bin, "clear" , + "-qmlDir", TestBinDir + "/../TestQMLWidgets"}, &comapareTree); + +#endif + +} diff --git a/tests/units/qttest.h b/tests/units/qttest.h new file mode 100644 index 00000000..e38ff694 --- /dev/null +++ b/tests/units/qttest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef QT_TEST_H +#define QT_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class QtTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // QT_TEST_H diff --git a/tests/units/releativelinktest.cpp b/tests/units/releativelinktest.cpp new file mode 100644 index 00000000..ad4b2ca5 --- /dev/null +++ b/tests/units/releativelinktest.cpp @@ -0,0 +1,50 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "releativelinktest.h" +#include +#include +#include +#include +#include + + +void ReleativeLinkTest::test() { + auto cases = QList>{ + {"", "", "./"}, + {"/media", "/etc", "./../etc/"}, + {"/media///", "/etc///", "./../etc/"}, + {"/media/etc/usr", "/media/etc", "./../"}, + {"/media/etc", "/media/etc/usr", "./usr/"}, + + {"C:/", "C:/", "./"}, + {"C:\\", "C:/", "./"}, + {"C:/", "C:\\", "./"}, + + {"C:/media", "C:/etc", "./../etc/"}, + {"C:/media//\\", "C:/etc///", "./../etc/"}, + {"C:/media/etc/usr", "C:/media/etc", "./../"}, + {"C:/media\\etc", "C:/media/etc/usr", "./usr/"}, + {"C:/media/etc", "D:/media/etc/usr", "D:/media/etc/usr"}, + +}; + + for (const auto &i: qAsConst(cases)) { + if (PathUtils::getRelativeLink(i[0], i[1]) != i[2]) + QVERIFY(false); + } + + for (int i = 1; i < cases.size() - 1; i++) { + if (!PathUtils::isAbsalutPath(cases[i][0])) + QVERIFY(false); + if (PathUtils::isAbsalutPath(cases[i][2])) + QVERIFY(false); + + } + +} diff --git a/tests/units/releativelinktest.h b/tests/units/releativelinktest.h new file mode 100644 index 00000000..515e75f6 --- /dev/null +++ b/tests/units/releativelinktest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef RELEATIVE_LINK_TEST_H +#define RELEATIVE_LINK_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ReleativeLinkTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // RELEATIVE_LINK_TEST_H diff --git a/tests/units/settargetdirtest.cpp b/tests/units/settargetdirtest.cpp new file mode 100644 index 00000000..af9ef89e --- /dev/null +++ b/tests/units/settargetdirtest.cpp @@ -0,0 +1,40 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "settargetdirtest.h" +#include +#include +#include +#include +#include + + +void SetTargetDirTest::test() { + + FileManager file; + DependenciesScanner scan; + Packing pac(&file); + PluginsParser _plugins; + ConfigParser dep(&file, &_plugins, &scan, &pac); + + dep.setTargetDir(); + + QVERIFY(dep.config()->getTargetDir() == QFileInfo("./" + DISTRO_DIR + "").absoluteFilePath()); + dep.setTargetDir("./ff"); + QVERIFY(dep.config()->getTargetDir() == QFileInfo("./ff").absoluteFilePath()); + + QStringList argv = {"-targetDir", "./" + DISTRO_DIR + "2"}; + + QuasarAppUtils::Params::parseParams(argv); + + dep.setTargetDir(); + QVERIFY(dep.config()->getTargetDir() == QFileInfo("./" + DISTRO_DIR + "2").absoluteFilePath()); + dep.setTargetDir("./ff"); + QVERIFY(dep.config()->getTargetDir() == QFileInfo("./" + DISTRO_DIR + "2").absoluteFilePath()); + +} diff --git a/tests/units/settargetdirtest.h b/tests/units/settargetdirtest.h new file mode 100644 index 00000000..2a351447 --- /dev/null +++ b/tests/units/settargetdirtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef SET_TARGET_DIR_TEST_H +#define SET_TARGET_DIR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class SetTargetDirTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // SET_TARGET_DIR_TEST_H diff --git a/tests/units/targetdirtest.cpp b/tests/units/targetdirtest.cpp new file mode 100644 index 00000000..1b993f14 --- /dev/null +++ b/tests/units/targetdirtest.cpp @@ -0,0 +1,143 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "targetdirtest.h" +#include +#include +#include +#include +#include + + +void TargetDirTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "Z/bin/TestOnlyC", + "./" + DISTRO_DIR + "Z/bin/qt.conf", + "./" + DISTRO_DIR + "Z/TestOnlyC.sh"}); +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + + auto comapareTree = utils.createTree( + {"./" + DISTRO_DIR + "Z/TestOnlyC.exe", + "./" + DISTRO_DIR + "Z/TestOnlyC.bat", + "./" + DISTRO_DIR + "Z/qt.conf"}); +#endif + + runTestParams({"-bin", bin, "clear" , + "-targetDir", "./" + DISTRO_DIR + "Z" + }, &comapareTree); +} + +void deploytest::testSystemLib() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + QString qmake = TestQtDir + "bin/qmake"; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.sh", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/lib/systemLibs/libgcc_s.so", + "./" + DISTRO_DIR + "/lib/systemLibs/libstdc++.so" + }); + +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", + "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", + "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", + "./" + DISTRO_DIR + "/qt.conf" + }); + +#endif + + runTestParams({"-bin", bin, "clear" , + "deploySystem", + "-qmake", qmake, + }, &comapareTree); + +#ifdef Q_OS_WIN + bin = TestBinDir + "QtWidgetsProject.exe"; + + comapareTree += TestModule.qtLibs(); + + comapareTree -= utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", + "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", + + }); + + comapareTree += utils.createTree( + { + "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", + "./" + DISTRO_DIR + "/qt.conf", + "./" + DISTRO_DIR + "/systemLibs/mpr.dll", + "./" + DISTRO_DIR + "/systemLibs/profapi.dll", + "./" + DISTRO_DIR + "/systemLibs/rpcrt4.dll", + "./" + DISTRO_DIR + "/systemLibs/shell32.dll", + "./" + DISTRO_DIR + "/systemLibs/userenv.dll", + "./" + DISTRO_DIR + "/systemLibs/uxtheme.dll", + "./" + DISTRO_DIR + "/systemLibs/version.dll", + "./" + DISTRO_DIR + "/systemLibs/ucrtbase.dll", + "./" + DISTRO_DIR + "/systemLibs/oleaut32.dll", + "./" + DISTRO_DIR + "/systemLibs/bcryptprimitives.dll", + "./" + DISTRO_DIR + "/systemLibs/msvcp_win.dll", + "./" + DISTRO_DIR + "/systemLibs/wtsapi32.dll", + "./" + DISTRO_DIR + "/systemLibs/combase.dll", + #if !defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/systemLibs/sspicli.dll", + "./" + DISTRO_DIR + "/systemLibs/cryptbase.dll", + #endif + + }); + + +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + comapareTree += utils.createTree( + { + "./" + DISTRO_DIR + "/systemLibs/d3d11.dll", + "./" + DISTRO_DIR + "/systemLibs/dxgi.dll", + "./" + DISTRO_DIR + "/systemLibs/win32u.dll", + }); +#endif + + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "deploySystem" + }, &comapareTree); + + +#endif +} diff --git a/tests/units/targetdirtest.h b/tests/units/targetdirtest.h new file mode 100644 index 00000000..d5260ec0 --- /dev/null +++ b/tests/units/targetdirtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef TARGET_DIR_TEST_H +#define TARGET_DIR_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class TargetDirTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // TARGET_DIR_TEST_H diff --git a/tests/units/ziparrchivetest.cpp b/tests/units/ziparrchivetest.cpp new file mode 100644 index 00000000..434c6f6c --- /dev/null +++ b/tests/units/ziparrchivetest.cpp @@ -0,0 +1,31 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "ziparrchivetest.h" +#include +#include +#include +#include +#include + + +void ZIPArchiveTest::test() { + TestUtils utils; + + ZipCompresser zip; + auto befor = utils.getTree("./test"); + + QVERIFY(zip.compress("./test", "./arr.zip")); + QVERIFY(QDir("./test").removeRecursively()); + QVERIFY(zip.extract("./arr.zip", "./test")); + + auto after = utils.getTree("./test"); + + QVERIFY(utils.compareTree(befor, after).size() == 0); + +} diff --git a/tests/units/ziparrchivetest.h b/tests/units/ziparrchivetest.h new file mode 100644 index 00000000..b08d78df --- /dev/null +++ b/tests/units/ziparrchivetest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef ZIP_ARCHIVE_TEST_H +#define ZIP_ARCHIVE_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ZIPArchiveTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // ZIP_ARCHIVE_TEST_H diff --git a/tests/units/zipmultitest.cpp b/tests/units/zipmultitest.cpp new file mode 100644 index 00000000..09784b9c --- /dev/null +++ b/tests/units/zipmultitest.cpp @@ -0,0 +1,44 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "zipmultitest.h" +#include +#include +#include +#include +#include + + +void ZIPMultiTest::test() { + + TestUtils utils; + + auto comapareTreeMulti = utils.createTree({ + "./" + DISTRO_DIR + "/package1.zip", + "./" + DISTRO_DIR + "/package2.zip", + "./" + DISTRO_DIR + "/package1.zip.md5", + "./" + DISTRO_DIR + "/package2.zip.md5", + + }); + +#ifdef Q_OS_UNIX + QString target1 = TestBinDir + "TestCPPOnly"; + QString target2 = TestBinDir + "TestOnlyC"; + +#else + QString target1 = TestBinDir + "TestCPPOnly.exe"; + QString target2 = TestBinDir + "TestOnlyC.exe"; +#endif + QString bin = target1; + bin += "," + target2; + + auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); + runTestParams({"-bin", bin, "force-clear", + "-targetPackage", packageString, + "zip"}, &comapareTreeMulti, true); +} diff --git a/tests/units/zipmultitest.h b/tests/units/zipmultitest.h new file mode 100644 index 00000000..573251fe --- /dev/null +++ b/tests/units/zipmultitest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef ZIP_MULTI_TEST_H +#define ZIP_MULTI_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class ZIPMultiTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // ZIP_MULTI_TEST_H diff --git a/tests/units/ziptest.cpp b/tests/units/ziptest.cpp index 451d4e81..1a986ea5 100644 --- a/tests/units/ziptest.cpp +++ b/tests/units/ziptest.cpp @@ -39,30 +39,3 @@ void ZIPTest::test() { } -void deploytest::testZIPMulti() { - TestUtils utils; - - auto comapareTreeMulti = utils.createTree({ - "./" + DISTRO_DIR + "/package1.zip", - "./" + DISTRO_DIR + "/package2.zip", - "./" + DISTRO_DIR + "/package1.zip.md5", - "./" + DISTRO_DIR + "/package2.zip.md5", - - }); - -#ifdef Q_OS_UNIX - QString target1 = TestBinDir + "TestCPPOnly"; - QString target2 = TestBinDir + "TestOnlyC"; - -#else - QString target1 = TestBinDir + "TestCPPOnly.exe"; - QString target2 = TestBinDir + "TestOnlyC.exe"; -#endif - QString bin = target1; - bin += "," + target2; - - auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", packageString, - "zip"}, &comapareTreeMulti, true); -} From 4e561ecd260d44c4c0a235e48eb47bc7b8acd61a Mon Sep 17 00:00:00 2001 From: EndrII Date: Sat, 13 Aug 2022 20:34:51 +0300 Subject: [PATCH 08/76] fix build for linux --- .gitignore | 2 + .gitmodules | 6 +- CMakeLists.txt | 6 + src/CQtDeployer/main.cpp | 2 - src/LibDeploy/CMakeLists.txt | 2 +- src/LibDeploy/CQtDeployer.qrc | 4 - src/LibDeploy/src/configparser.cpp | 5 +- src/LibDeploy/src/configparser.h | 4 + src/LibDeploy/src/dependenciesscanner.cpp | 5 +- src/LibDeploy/src/dependencymap.cpp | 2 +- src/LibDeploy/src/deploy.h | 2 + src/LibDeploy/src/deployconfig.cpp | 2 +- src/LibDeploy/src/deploycore.cpp | 19 +- src/LibDeploy/src/distrostruct.h | 1 + src/LibDeploy/src/elf_type.h | 2 +- src/LibDeploy/src/extracter.cpp | 2 +- src/LibDeploy/src/filemanager.cpp | 1 + src/LibDeploy/src/pluginsparser.cpp | 2 +- src/LibDeploy/src/qml.cpp | 1 + src/LibDeploy/src/qml.h | 2 + src/LibDeploy/src/zipcompresser.cpp | 2 +- src/QtELFReader/CMakeLists.txt | 37 + src/QtELFReader/src/elfreader.cpp | 440 +++ src/QtELFReader/src/elfreader.h | 177 ++ src/QtELFReader/src/elfreader_global.h.in | 19 + submodules/QuasarAppLib | 2 +- submodules/qttools | 1 - tests/tstMain.cpp | 119 +- tests/units/confifiletest.cpp | 1 + tests/units/customplatformtest.cpp | 2 +- tests/units/dependencymaptest.cpp | 1 + tests/units/deploytest.cpp | 3247 --------------------- tests/units/deploytest.h | 184 -- tests/units/disablerunscripttest.cpp | 32 +- tests/units/emptypackagestest.cpp | 1 + tests/units/extractlibtest.cpp | 1 + tests/units/extradatatest.cpp | 1 + tests/units/extrapluginstest.cpp | 1 + tests/units/iconstest.cpp | 1 + tests/units/ignoretest.cpp | 1 + tests/units/outdirtest.cpp | 1 + tests/units/overridingtemplatedebtest.h | 3 - tests/units/packagestest.cpp | 1 + tests/units/pathutilstest.cpp | 1 + tests/units/prefixtest.cpp | 1 + tests/units/qifwbinarycreatortest.cpp | 1 + tests/units/qmlextracttest.cpp | 2 + tests/units/qmlscanertest.cpp | 1 + tests/units/qttest.cpp | 1 + tests/units/releativelinktest.cpp | 1 + tests/units/runscriptstest.cpp | 1 + tests/units/systemlibtest.cpp | 121 + tests/units/systemlibtest.h | 23 + tests/units/targetdirtest.cpp | 105 - tests/units/testbase.cpp | 4 +- tests/units/testbase.h | 5 +- tests/units/virtualkeybordtest.cpp | 1 + tests/units/webenginetest.cpp | 1 + tests/units/ziparrchivetest.cpp | 1 + 59 files changed, 1006 insertions(+), 3611 deletions(-) create mode 100644 src/QtELFReader/CMakeLists.txt create mode 100644 src/QtELFReader/src/elfreader.cpp create mode 100644 src/QtELFReader/src/elfreader.h create mode 100644 src/QtELFReader/src/elfreader_global.h.in delete mode 160000 submodules/qttools delete mode 100644 tests/units/deploytest.cpp delete mode 100644 tests/units/deploytest.h create mode 100644 tests/units/systemlibtest.cpp create mode 100644 tests/units/systemlibtest.h diff --git a/.gitignore b/.gitignore index 83aacf24..9d42563e 100644 --- a/.gitignore +++ b/.gitignore @@ -86,3 +86,5 @@ compile_commands.json CTestTestfile.cmake _deps src/LibDeploy/src/deploy_global.h +src/QtELFReader/src/elfreader_global.h + diff --git a/.gitmodules b/.gitmodules index 5566fa3c..47813c4b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,10 @@ [submodule "submodules/QuasarAppLib"] path = submodules/QuasarAppLib - url = git@github.com:QuasarApp/QuasarAppLib.git + url = https://github.com/QuasarApp/QuasarAppLib.git [submodule "submodules/pe-parse"] path = submodules/pe-parse url = https://github.com/QuasarApp/pe-parse.git [submodule "submodules/zip"] path = submodules/zip url = https://github.com/QuasarApp/zip.git -[submodule "submodules/qttools"] - path = submodules/qttools - url = https://github.com/qt/qttools.git + diff --git a/CMakeLists.txt b/CMakeLists.txt index f1b66c8d..069e0608 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,12 @@ initAll() add_subdirectory(submodules/QuasarAppLib) +add_subdirectory(src/QtELFReader) + +option(BUILD_COMMAND_LINE_TOOLS "Build Command Line Tools" OFF) +add_subdirectory(submodules/pe-parse) +add_subdirectory(submodules/zip) + add_subdirectory(src/LibDeploy) if (DEFINED CQT_DEPLOYER_TOOL) diff --git a/src/CQtDeployer/main.cpp b/src/CQtDeployer/main.cpp index cc2425aa..b5179ef3 100644 --- a/src/CQtDeployer/main.cpp +++ b/src/CQtDeployer/main.cpp @@ -5,8 +5,6 @@ * of this license document, but changing it is not allowed. */ -#include "extracter.h" -#include "quasarapp.h" #include "deploycore.h" #include #include diff --git a/src/LibDeploy/CMakeLists.txt b/src/LibDeploy/CMakeLists.txt index c6731ec9..e0ccc8af 100644 --- a/src/LibDeploy/CMakeLists.txt +++ b/src/LibDeploy/CMakeLists.txt @@ -32,7 +32,7 @@ set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") add_library(${CURRENT_PROJECT} ${SOURCE_CPP} ${SOURCE_QRC}) -target_link_libraries(${CURRENT_PROJECT} PUBLIC QuasarApp ) +target_link_libraries(${CURRENT_PROJECT} PUBLIC QuasarApp QtELFReader pe-parse zip) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) diff --git a/src/LibDeploy/CQtDeployer.qrc b/src/LibDeploy/CQtDeployer.qrc index 00c90b7c..ef011b79 100644 --- a/src/LibDeploy/CQtDeployer.qrc +++ b/src/LibDeploy/CQtDeployer.qrc @@ -1,8 +1,4 @@ - - src/CQtDeployerModule/qmldir - src/CQtDeployerModule/CQtDeployer.qml - languages/en.qm diff --git a/src/LibDeploy/src/configparser.cpp b/src/LibDeploy/src/configparser.cpp index bf371d4a..f7dcc774 100644 --- a/src/LibDeploy/src/configparser.cpp +++ b/src/LibDeploy/src/configparser.cpp @@ -16,10 +16,9 @@ #include "packing.h" #include "pathutils.h" #include "pluginsparser.h" -#include "quasarapp.h" - +#include "defines.h" #include - +#include #include #include #include diff --git a/src/LibDeploy/src/configparser.h b/src/LibDeploy/src/configparser.h index f278a437..5fc6ace7 100644 --- a/src/LibDeploy/src/configparser.h +++ b/src/LibDeploy/src/configparser.h @@ -7,6 +7,7 @@ #ifndef CQT_H #define CQT_H +#include "deployconfig.h" #include "distrostruct.h" #include @@ -16,6 +17,7 @@ #include #include #include "deploy_global.h" +#include "targetdata.h" class FileManager; class DependenciesScanner; @@ -32,6 +34,8 @@ class DEPLOYSHARED_EXPORT ConfigParser const DeployConfig* config() const; friend class DeployTargetTest; + friend class IconsTest; + friend class SetTargetDirTest; private: diff --git a/src/LibDeploy/src/dependenciesscanner.cpp b/src/LibDeploy/src/dependenciesscanner.cpp index 996276fe..21521fad 100644 --- a/src/LibDeploy/src/dependenciesscanner.cpp +++ b/src/LibDeploy/src/dependenciesscanner.cpp @@ -6,13 +6,12 @@ */ #include "dependenciesscanner.h" +#include "deployconfig.h" #include "deploycore.h" -#include "quasarapp.h" -#include "configparser.h" +#include "qaglobalutils.h" #include #include #include -#include "pathutils.h" DependenciesScanner::DependenciesScanner() { diff --git a/src/LibDeploy/src/dependencymap.cpp b/src/LibDeploy/src/dependencymap.cpp index 5e13506f..6c4f117e 100644 --- a/src/LibDeploy/src/dependencymap.cpp +++ b/src/LibDeploy/src/dependencymap.cpp @@ -7,7 +7,7 @@ #include "dependencymap.h" #include "deploycore.h" -#include "quasarapp.h" +#include "qaglobalutils.h" DependencyMap::DependencyMap() { _qtModules = DeployCore::QtModule::NONE; diff --git a/src/LibDeploy/src/deploy.h b/src/LibDeploy/src/deploy.h index 96ab3b51..8a2c41cf 100644 --- a/src/LibDeploy/src/deploy.h +++ b/src/LibDeploy/src/deploy.h @@ -63,6 +63,8 @@ class DEPLOYSHARED_EXPORT Deploy */ static QString codeString(int code); friend class deploytest; + friend class CheckQtTest; + friend class QIFWBinaryCreatorTest; }; #endif // DEPLOY_H diff --git a/src/LibDeploy/src/deployconfig.cpp b/src/LibDeploy/src/deployconfig.cpp index 948dcb0c..7d9407ae 100644 --- a/src/LibDeploy/src/deployconfig.cpp +++ b/src/LibDeploy/src/deployconfig.cpp @@ -6,7 +6,7 @@ */ #include "deployconfig.h" -#include "quasarapp.h" +#include "qaglobalutils.h" void DeployConfig::reset() { *this = DeployConfig{}; diff --git a/src/LibDeploy/src/deploycore.cpp b/src/LibDeploy/src/deploycore.cpp index b13c063b..56ecba96 100644 --- a/src/LibDeploy/src/deploycore.cpp +++ b/src/LibDeploy/src/deploycore.cpp @@ -5,9 +5,8 @@ * of this license document, but changing it is not allowed. */ -#include "extracter.h" #include "deploycore.h" -#include "pathutils.h" +#include "defines.h" #include "pluginsparser.h" #include @@ -600,11 +599,11 @@ QStringList DeployCore::extractTranslation(const QSet &libs) { } QString DeployCore::getAppVersion() { - return APP_VERSION; + return CQT_DEPLOYER_VERSION; } QString DeployCore::getAppVersionName() { - return "*** Binary Box ***"; + return "*** Cool Core ***"; } QString DeployCore::getQtVersion() { @@ -755,13 +754,13 @@ QString DeployCore::getVCredist(const QString &_qtbinDir) { } QString DeployCore::getMSVCName(MSVCVersion msvc) { - if (msvc | MSVCVersion::MSVC_13) { + if (msvc & MSVCVersion::MSVC_13) { return "msvc2013"; - } else if (msvc | MSVCVersion::MSVC_15) { + } else if (msvc & MSVCVersion::MSVC_15) { return "msvc2015"; - } else if (msvc | MSVCVersion::MSVC_17) { + } else if (msvc & MSVCVersion::MSVC_17) { return "msvc2017"; - } else if (msvc | MSVCVersion::MSVC_19) { + } else if (msvc & MSVCVersion::MSVC_19) { return "msvc2019"; } @@ -769,9 +768,9 @@ QString DeployCore::getMSVCName(MSVCVersion msvc) { } QString DeployCore::getMSVCVersion(MSVCVersion msvc) { - if (msvc | MSVCVersion::MSVC_x32) { + if (msvc & MSVCVersion::MSVC_x32) { return "x86"; - } else if (msvc | MSVCVersion::MSVC_x64) { + } else if (msvc & MSVCVersion::MSVC_x64) { return "x64"; } diff --git a/src/LibDeploy/src/distrostruct.h b/src/LibDeploy/src/distrostruct.h index 782c7daa..73ba4fb6 100644 --- a/src/LibDeploy/src/distrostruct.h +++ b/src/LibDeploy/src/distrostruct.h @@ -54,6 +54,7 @@ class DEPLOYSHARED_EXPORT DistroStruct bool isEmpty(); friend class deploytest; + friend class DistroStructTest; }; diff --git a/src/LibDeploy/src/elf_type.h b/src/LibDeploy/src/elf_type.h index 217861f2..f15b4800 100644 --- a/src/LibDeploy/src/elf_type.h +++ b/src/LibDeploy/src/elf_type.h @@ -7,7 +7,7 @@ #ifndef ELF_H #define ELF_H -#include "../qtTools/src/shared/winutils/elfreader.h" +#include "elfreader.h" #include "igetlibinfo.h" diff --git a/src/LibDeploy/src/extracter.cpp b/src/LibDeploy/src/extracter.cpp index ac617101..8e5cd343 100644 --- a/src/LibDeploy/src/extracter.cpp +++ b/src/LibDeploy/src/extracter.cpp @@ -20,7 +20,7 @@ #include #include #include - +#include #include #include diff --git a/src/LibDeploy/src/filemanager.cpp b/src/LibDeploy/src/filemanager.cpp index b2992c70..73eef4c5 100644 --- a/src/LibDeploy/src/filemanager.cpp +++ b/src/LibDeploy/src/filemanager.cpp @@ -11,6 +11,7 @@ #include #include #include "configparser.h" +#include "defines.h" #include "deploycore.h" #include #include diff --git a/src/LibDeploy/src/pluginsparser.cpp b/src/LibDeploy/src/pluginsparser.cpp index 3e3562d5..e5e5f915 100644 --- a/src/LibDeploy/src/pluginsparser.cpp +++ b/src/LibDeploy/src/pluginsparser.cpp @@ -9,7 +9,7 @@ #include "pluginsparser.h" #include #include -#include +#include PluginsParser::PluginsParser(){ } diff --git a/src/LibDeploy/src/qml.cpp b/src/LibDeploy/src/qml.cpp index c0fbb92f..a9669c45 100644 --- a/src/LibDeploy/src/qml.cpp +++ b/src/LibDeploy/src/qml.cpp @@ -9,6 +9,7 @@ #include #include +#include "defines.h" #include "quasarapp.h" #include "deploycore.h" #include "deployconfig.h" diff --git a/src/LibDeploy/src/qml.h b/src/LibDeploy/src/qml.h index 31d3a0bb..eac9dbac 100644 --- a/src/LibDeploy/src/qml.h +++ b/src/LibDeploy/src/qml.h @@ -39,6 +39,8 @@ class DEPLOYSHARED_EXPORT QML { void setQtVersion(const QtMajorVersion &qtVersion); friend class deploytest; + friend class QmlScanerTest; + friend class QMLExtractTest; }; #endif // QML_DEPLY_H diff --git a/src/LibDeploy/src/zipcompresser.cpp b/src/LibDeploy/src/zipcompresser.cpp index 1bfbaf40..eb0f8ef3 100644 --- a/src/LibDeploy/src/zipcompresser.cpp +++ b/src/LibDeploy/src/zipcompresser.cpp @@ -8,7 +8,7 @@ #include "zipcompresser.h" #include -#include "zip.h" +#include ZipCompresser::ZipCompresser() { diff --git a/src/QtELFReader/CMakeLists.txt b/src/QtELFReader/CMakeLists.txt new file mode 100644 index 00000000..2c5dcc1d --- /dev/null +++ b/src/QtELFReader/CMakeLists.txt @@ -0,0 +1,37 @@ +# +# Copyright (C) 2020-2022 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. +# + +cmake_minimum_required(VERSION 3.18) + +get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +set(CURRENT_PROJECT "${CURRENT_PROJECT_DIR}") +add_definitions(-DQT_ELFREADER_LIBRARY) + + +file(GLOB_RECURSE SOURCE_CPP + "src/*.cpp" + "src/*.h" +) + +set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") + +if (NOT QT_VERSION_MAJOR) + find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +endif() + +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_PROJECT} ${SOURCE_CPP}) + +target_link_libraries(${CURRENT_PROJECT} PUBLIC Qt::Core ) + +target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) + + +set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/src/elfreader_global.h") +configure_file("${global_file}.in" ${global_file} @ONLY) diff --git a/src/QtELFReader/src/elfreader.cpp b/src/QtELFReader/src/elfreader.cpp new file mode 100644 index 00000000..ab224261 --- /dev/null +++ b/src/QtELFReader/src/elfreader.cpp @@ -0,0 +1,440 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "elfreader.h" + +#include + +QT_BEGIN_NAMESPACE + +/* This is a copy of the ELF reader contained in Qt Creator (src/libs/utils), + * extended by the dependencies() function to read out the dependencies of a dynamic executable. */ + +quint16 getHalfWord(const unsigned char *&s, const ElfData &context) +{ + quint16 res; + if (context.endian == Elf_ELFDATA2MSB) + res = qFromBigEndian(s); + else + res = qFromLittleEndian(s); + s += 2; + return res; +} + +quint32 getWord(const unsigned char *&s, const ElfData &context) +{ + quint32 res; + if (context.endian == Elf_ELFDATA2MSB) + res = qFromBigEndian(s); + else + res = qFromLittleEndian(s); + s += 4; + return res; +} + +quint64 getAddress(const unsigned char *&s, const ElfData &context) +{ + quint64 res; + if (context.elfclass == Elf_ELFCLASS32) { + if (context.endian == Elf_ELFDATA2MSB) + res = qFromBigEndian(s); + else + res = qFromLittleEndian(s); + s += 4; + } else { + if (context.endian == Elf_ELFDATA2MSB) + res = qFromBigEndian(s); + else + res = qFromLittleEndian(s); + s += 8; + } + return res; +} + +quint64 getOffset(const unsigned char *&s, const ElfData &context) +{ + return getAddress(s, context); +} + +static void parseSectionHeader(const uchar *s, ElfSectionHeader *sh, const ElfData &context) +{ + sh->index = getWord(s, context); + sh->type = getWord(s, context); + sh->flags = quint32(getOffset(s, context)); + sh->addr = getAddress(s, context); + sh->offset = getOffset(s, context); + sh->size = getOffset(s, context); +} + +static void parseProgramHeader(const uchar *s, ElfProgramHeader *sh, const ElfData &context) +{ + sh->type = getWord(s, context); + sh->offset = getOffset(s, context); + /* p_vaddr = */ getAddress(s, context); + /* p_paddr = */ getAddress(s, context); + sh->filesz = getWord(s, context); + sh->memsz = getWord(s, context); +} + +class ElfMapper +{ +public: + ElfMapper(const ElfReader *reader) : file(reader->m_binary) {} + + bool map() + { + if (!file.open(QIODevice::ReadOnly)) + return false; + + fdlen = quint64(file.size()); + ustart = file.map(0, qint64(fdlen)); + if (ustart == 0) { + // Try reading the data into memory instead. + raw = file.readAll(); + start = raw.constData(); + fdlen = quint64(raw.size()); + } + return true; + } + +public: + QFile file; + QByteArray raw; + union { const char *start; const uchar *ustart; }; + quint64 fdlen; +}; + +ElfReader::ElfReader(const QString &binary) + : m_binary(binary) +{ +} + +ElfData ElfReader::readHeaders() +{ + readIt(); + return m_elfData; +} + +static inline QString msgInvalidElfObject(const QString &binary, const QString &why) +{ + return QStringLiteral("'%1' is an invalid ELF object (%2)") + .arg(QDir::toNativeSeparators(binary), why); +} + +ElfReader::Result ElfReader::readIt() +{ + if (!m_elfData.sectionHeaders.isEmpty()) + return Ok; + if (!m_elfData.programHeaders.isEmpty()) + return Ok; + + ElfMapper mapper(this); + if (!mapper.map()) + return Corrupt; + + const quint64 fdlen = mapper.fdlen; + + if (fdlen < 64) { + m_errorString = QStringLiteral("'%1' is not an ELF object (file too small)").arg(QDir::toNativeSeparators(m_binary)); + return NotElf; + } + + if (strncmp(mapper.start, "\177ELF", 4) != 0) { + m_errorString = QStringLiteral("'%1' is not an ELF object").arg(QDir::toNativeSeparators(m_binary)); + return NotElf; + } + + // 32 or 64 bit + m_elfData.elfclass = ElfClass(mapper.start[4]); + const bool is64Bit = m_elfData.elfclass == Elf_ELFCLASS64; + if (m_elfData.elfclass != Elf_ELFCLASS32 && m_elfData.elfclass != Elf_ELFCLASS64) { + m_errorString = msgInvalidElfObject(m_binary, QStringLiteral("odd cpu architecture")); + return Corrupt; + } + + // int bits = (data[4] << 5); + // If you remove this check to read ELF objects of a different arch, + // please make sure you modify the typedefs + // to match the _plugin_ architecture. + // if ((sizeof(void*) == 4 && bits != 32) + // || (sizeof(void*) == 8 && bits != 64)) { + // if (errorString) + // *errorString = QLibrary::QStringLiteral("'%1' is an invalid ELF object (%2)") + // .arg(m_binary).arg(QLatin1String("wrong cpu architecture")); + // return Corrupt; + // } + + // Read Endianhness. + m_elfData.endian = ElfEndian(mapper.ustart[5]); + if (m_elfData.endian != Elf_ELFDATA2LSB && m_elfData.endian != Elf_ELFDATA2MSB) { + m_errorString = msgInvalidElfObject(m_binary, QStringLiteral("odd endianness")); + return Corrupt; + } + + const uchar *data = mapper.ustart + 16; // e_ident + m_elfData.elftype = ElfType(getHalfWord(data, m_elfData)); + m_elfData.elfmachine = ElfMachine(getHalfWord(data, m_elfData)); + /* e_version = */ getWord(data, m_elfData); + m_elfData.entryPoint = getAddress(data, m_elfData); + + quint64 e_phoff = getOffset(data, m_elfData); + quint64 e_shoff = getOffset(data, m_elfData); + /* e_flags = */ getWord(data, m_elfData); + + quint32 e_shsize = getHalfWord(data, m_elfData); + + if (e_shsize > fdlen) { + m_errorString = msgInvalidElfObject(m_binary, QStringLiteral("unexpected e_shsize")); + return Corrupt; + } + + quint32 e_phentsize = getHalfWord(data, m_elfData); + if (e_phentsize != (is64Bit ? 56 : 32)) { + m_errorString = msgInvalidElfObject(m_binary, QStringLiteral("invalid structure")); + return ElfReader::Corrupt; + } + quint32 e_phnum = getHalfWord(data, m_elfData); + + quint32 e_shentsize = getHalfWord(data, m_elfData); + + if (e_shentsize % 4) { + m_errorString = msgInvalidElfObject(m_binary, QStringLiteral("unexpected e_shentsize")); + return Corrupt; + } + + quint32 e_shnum = getHalfWord(data, m_elfData); + quint32 e_shtrndx = getHalfWord(data, m_elfData); + if (data != mapper.ustart + (is64Bit ? 64 : 52)) { + m_errorString = msgInvalidElfObject(m_binary, QStringLiteral("unexpected e_phentsize")); + return ElfReader::Corrupt; + } + + if (quint64(e_shnum) * e_shentsize > fdlen) { + const QString reason = QStringLiteral("announced %1 sections, each %2 bytes, exceed file size").arg(e_shnum).arg(e_shentsize); + m_errorString = msgInvalidElfObject(m_binary, reason); + return Corrupt; + } + + quint64 soff = e_shoff + e_shentsize * e_shtrndx; + +// if ((soff + e_shentsize) > fdlen || soff % 4 || soff == 0) { +// m_errorString = QLibrary::QStringLiteral("'%1' is an invalid ELF object (%2)") +// .arg(m_binary) +// .arg(QLatin1String("shstrtab section header seems to be at %1")) +// .arg(QString::number(soff, 16)); +// return Corrupt; +// } + + if (e_shoff) { + ElfSectionHeader strtab; + parseSectionHeader(mapper.ustart + soff, &strtab, m_elfData); + const quint64 stringTableFileOffset = strtab.offset; + if (quint32(stringTableFileOffset + e_shentsize) >= fdlen + || stringTableFileOffset == 0) { + const QString reason = QStringLiteral("string table seems to be at 0x%1").arg(soff, 0, 16); + m_errorString = msgInvalidElfObject(m_binary, reason); + return Corrupt; + } + + for (quint32 i = 0; i < e_shnum; ++i) { + const uchar *s = mapper.ustart + e_shoff + i * e_shentsize; + ElfSectionHeader sh; + parseSectionHeader(s, &sh, m_elfData); + + if (stringTableFileOffset + sh.index > fdlen) { + const QString reason = QStringLiteral("section name %1 of %2 behind end of file") + .arg(i).arg(e_shnum); + m_errorString = msgInvalidElfObject(m_binary, reason); + return Corrupt; + } + + sh.name = mapper.start + stringTableFileOffset + sh.index; + if (sh.name == ".gdb_index") { + m_elfData.symbolsType = FastSymbols; + } else if (sh.name == ".debug_info") { + m_elfData.symbolsType = PlainSymbols; + } else if (sh.name == ".gnu_debuglink") { + m_elfData.debugLink = QByteArray(mapper.start + sh.offset); + m_elfData.symbolsType = LinkedSymbols; + } else if (sh.name == ".note.gnu.build-id") { + m_elfData.symbolsType = BuildIdSymbols; + if (sh.size > 16) + m_elfData.buildId = QByteArray(mapper.start + sh.offset + 16, + int(sh.size) - 16).toHex(); + } + m_elfData.sectionHeaders.append(sh); + } + } + + if (e_phoff) { + for (quint32 i = 0; i < e_phnum; ++i) { + const uchar *s = mapper.ustart + e_phoff + i * e_phentsize; + ElfProgramHeader ph; + parseProgramHeader(s, &ph, m_elfData); + m_elfData.programHeaders.append(ph); + } + } + return Ok; +} + +QByteArray ElfReader::readSection(const QByteArray &name) +{ + readIt(); + int i = m_elfData.indexOf(name); + if (i == -1) + return QByteArray(); + + ElfMapper mapper(this); + if (!mapper.map()) + return QByteArray(); + + const ElfSectionHeader §ion = m_elfData.sectionHeaders.at(i); + return QByteArray(mapper.start + section.offset, int(section.size)); +} + +static QByteArray cutout(const char *s) +{ + QByteArray res(s, 80); + const int pos = res.indexOf('\0'); + if (pos != -1) + res.resize(pos - 1); + return res; +} + +QByteArray ElfReader::readCoreName(bool *isCore) +{ + *isCore = false; + + readIt(); + + ElfMapper mapper(this); + if (!mapper.map()) + return QByteArray(); + + if (m_elfData.elftype != Elf_ET_CORE) + return QByteArray(); + + *isCore = true; + + for (int i = 0, n = m_elfData.sectionHeaders.size(); i != n; ++i) + if (m_elfData.sectionHeaders.at(i).type == Elf_SHT_NOTE) { + const ElfSectionHeader &header = m_elfData.sectionHeaders.at(i); + return cutout(mapper.start + header.offset + 0x40); + } + + for (int i = 0, n = m_elfData.programHeaders.size(); i != n; ++i) + if (m_elfData.programHeaders.at(i).type == Elf_PT_NOTE) { + const ElfProgramHeader &header = m_elfData.programHeaders.at(i); + return cutout(mapper.start + header.offset + 0xec); + } + + return QByteArray(); +} + +int ElfData::indexOf(const QByteArray &name) const +{ + for (int i = 0, n = sectionHeaders.size(); i != n; ++i) + if (sectionHeaders.at(i).name == name) + return i; + return -1; +} + +/* Helpers for reading out the .dynamic section containing the dependencies. + * The ".dynamic" section is an array of + * typedef struct { + * Elf32_Sword d_tag; + * union { + * Elf32_Word d_val; + * dElf32_Addr d_ptr; + * } d_un; + * } Elf32_Dyn + * with entries where a tag DT_NEEDED indicates that m_val is an offset into + * the string table ".dynstr". The documentation states that entries with the + * tag DT_STRTAB contain an offset for the string table to be used, but that + * has been found not to contain valid entries. */ + +enum DynamicSectionTags { + DT_NULL = 0, + DT_NEEDED = 1, + DT_STRTAB = 5, + DT_SONAME = 14, + DT_RPATH = 15 +}; + +QList ElfReader::dependencies() +{ + QList result; + + ElfMapper mapper(this); + if (!mapper.map()) { + m_errorString = QStringLiteral("Mapper failure"); + return result; + } + quint64 dynStrOffset = 0; + quint64 dynamicOffset = 0; + quint64 dynamicSize = 0; + + const QVector &headers = readHeaders().sectionHeaders; + for (const ElfSectionHeader &eh : headers) { + if (eh.name == QByteArrayLiteral(".dynstr")) { + dynStrOffset = eh.offset; + } else if (eh.name == QByteArrayLiteral(".dynamic")) { + dynamicOffset = eh.offset; + dynamicSize = eh.size; + } + if (dynStrOffset && dynamicOffset) + break; + } + + if (!dynStrOffset || !dynamicOffset) { + m_errorString = QStringLiteral("Not a dynamically linked executable."); + return result; + } + + const unsigned char *dynamicData = mapper.ustart + dynamicOffset; + const unsigned char *dynamicDataEnd = dynamicData + dynamicSize; + while (dynamicData < dynamicDataEnd) { + const quint32 tag = getWord(dynamicData, m_elfData); + if (tag == DT_NULL) + break; + if (m_elfData.elfclass == Elf_ELFCLASS64) + dynamicData += sizeof(quint32); // padding to d_val/d_ptr. + if (tag == DT_NEEDED) { + const quint32 offset = getWord(dynamicData, m_elfData); + if (m_elfData.elfclass == Elf_ELFCLASS64) + dynamicData += sizeof(quint32); // past d_ptr. + const char *name = mapper.start + dynStrOffset + offset; + result.push_back(name); + } else { + dynamicData += m_elfData.elfclass == Elf_ELFCLASS64 ? 8 : 4; + } + } + return result; +} + +QT_END_NAMESPACE diff --git a/src/QtELFReader/src/elfreader.h b/src/QtELFReader/src/elfreader.h new file mode 100644 index 00000000..3beb2f94 --- /dev/null +++ b/src/QtELFReader/src/elfreader.h @@ -0,0 +1,177 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ELFREADER_H +#define ELFREADER_H + +#include +#include +#include +#include "elfreader_global.h" + +QT_BEGIN_NAMESPACE + +enum ELFREADER_SHARED_EXPORT ElfProgramHeaderType +{ + Elf_PT_NULL = 0, + Elf_PT_LOAD = 1, + Elf_PT_DYNAMIC = 2, + Elf_PT_INTERP = 3, + Elf_PT_NOTE = 4, + Elf_PT_SHLIB = 5, + Elf_PT_PHDR = 6, + Elf_PT_TLS = 7, + Elf_PT_NUM = 8 +}; + +enum ELFREADER_SHARED_EXPORT ElfSectionHeaderType +{ + Elf_SHT_NULL = 0, + Elf_SHT_PROGBITS = 1, + Elf_SHT_SYMTAB = 2, + Elf_SHT_STRTAB = 3, + Elf_SHT_RELA = 4, + Elf_SHT_HASH = 5, + Elf_SHT_DYNAMIC = 6, + Elf_SHT_NOTE = 7, + Elf_SHT_NOBITS = 8, + Elf_SHT_REL = 9, + Elf_SHT_SHLIB = 10, + Elf_SHT_DYNSYM = 11, + Elf_SHT_INIT_ARRAY = 14, + Elf_SHT_FINI_ARRAY = 15, + Elf_SHT_PREINIT_ARRAY = 16, + Elf_SHT_GROUP = 17, + Elf_SHT_SYMTAB_SHNDX = 18 +}; + +enum ELFREADER_SHARED_EXPORT ElfEndian +{ + Elf_ELFDATANONE = 0, + Elf_ELFDATA2LSB = 1, + Elf_ELFDATA2MSB = 2, + Elf_ELFDATANUM = 3 +}; + +enum ELFREADER_SHARED_EXPORT ElfClass +{ + Elf_ELFCLASS32 = 1, + Elf_ELFCLASS64 = 2 +}; + +enum ELFREADER_SHARED_EXPORT ElfType +{ + Elf_ET_NONE = 0, + Elf_ET_REL = 1, + Elf_ET_EXEC = 2, + Elf_ET_DYN = 3, + Elf_ET_CORE = 4 +}; + +enum ELFREADER_SHARED_EXPORT ElfMachine +{ + Elf_EM_386 = 3, + Elf_EM_ARM = 40, + Elf_EM_X86_64 = 62 +}; + +enum ELFREADER_SHARED_EXPORT DebugSymbolsType +{ + UnknownSymbols = 0, // Unknown. + NoSymbols = 1, // No usable symbols. + LinkedSymbols = 2, // Link to symols available. + BuildIdSymbols = 4, // BuildId available. + PlainSymbols = 8, // Ordinary symbols available. + FastSymbols = 16 // Dwarf index available. +}; + +class ELFREADER_SHARED_EXPORT ElfSectionHeader +{ +public: + QByteArray name; + quint32 index; + quint32 type; + quint32 flags; + quint64 offset; + quint64 size; + quint64 addr; +}; + +class ELFREADER_SHARED_EXPORT ElfProgramHeader +{ +public: + quint32 name; + quint32 type; + quint64 offset; + quint64 filesz; + quint64 memsz; +}; + +class ELFREADER_SHARED_EXPORT ElfData +{ +public: + ElfData() : symbolsType(UnknownSymbols) {} + int indexOf(const QByteArray &name) const; + +public: + ElfEndian endian; + ElfType elftype; + ElfMachine elfmachine; + ElfClass elfclass; + quint64 entryPoint; + QByteArray debugLink; + QByteArray buildId; + DebugSymbolsType symbolsType; + QVector sectionHeaders; + QVector programHeaders; +}; + +class ELFREADER_SHARED_EXPORT ElfReader +{ +public: + explicit ElfReader(const QString &binary); + enum Result { Ok, NotElf, Corrupt }; + + ElfData readHeaders(); + QByteArray readSection(const QByteArray §ionName); + QString errorString() const { return m_errorString; } + QByteArray readCoreName(bool *isCore); + QList dependencies(); + +private: + friend class ElfMapper; + Result readIt(); + + QString m_binary; + QString m_errorString; + ElfData m_elfData; +}; + +QT_END_NAMESPACE + +#endif // ELFREADER_H diff --git a/src/QtELFReader/src/elfreader_global.h.in b/src/QtELFReader/src/elfreader_global.h.in new file mode 100644 index 00000000..dd9e07f6 --- /dev/null +++ b/src/QtELFReader/src/elfreader_global.h.in @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2018-2022 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 ELF_READER_GLOBAL_H +#define ELF_READER_GLOBAL_H + +#include + +#if defined(QT_ELFREADER_LIBRARY) +# define ELFREADER_SHARED_EXPORT Q_DECL_EXPORT +#else +# define ELFREADER_SHARED_EXPORT Q_DECL_IMPORT +#endif + +#endif // ELF_READER_GLOBAL_H diff --git a/submodules/QuasarAppLib b/submodules/QuasarAppLib index 6f8308db..00cdfae2 160000 --- a/submodules/QuasarAppLib +++ b/submodules/QuasarAppLib @@ -1 +1 @@ -Subproject commit 6f8308db6d31b7bd3b3e7eed390de81dc676ca91 +Subproject commit 00cdfae297832196ef1d4268c7bfcdbbb20eaf19 diff --git a/submodules/qttools b/submodules/qttools deleted file mode 160000 index caa44f8b..00000000 --- a/submodules/qttools +++ /dev/null @@ -1 +0,0 @@ -Subproject commit caa44f8ba104aeb6ba92533dce324d0376586337 diff --git a/tests/tstMain.cpp b/tests/tstMain.cpp index ba33bb01..bc047d74 100644 --- a/tests/tstMain.cpp +++ b/tests/tstMain.cpp @@ -6,7 +6,64 @@ //# #include -#include "exampletest.h" +#include "allowemptypackagestest.h" +#include "binprefixtest.h" +#include "checkqttest.h" +#include "cleartest.h" +#include "confifiletest.h" +#include "customplatformtest.h" +#include "customscripttest.h" +#include "customtest.h" +#include "debcustomtest.h" +#include "debmultitest.h" +#include "debtest.h" +#include "dependencymaptest.h" +#include "deploygeneralfilestest.h" +#include "deploytargettest.h" +#include "disablerunscripttest.h" +#include "disableshortcutstest.h" +#include "distrostructtest.h" +#include "emptypackagestest.h" +#include "extractlibtest.h" +#include "extradatatest.h" +#include "extrapluginstest.h" +#include "iconstest.h" +#include "ignoreenvtest.h" +#include "ignoreenvwithlibdirtest.h" +#include "ignoretest.h" +#include "inittest.h" +#include "installdiroptionstest.h" +#include "libdirstest.h" +#include "md5test.h" +#include "MSVCtest.h" +#include "multipackingtest.h" +#include "outdirtest.h" +#include "overridingtemplatedebtest.h" +#include "overwritetest.h" +#include "overwritewithpackingtest.h" +#include "packagestest.h" +#include "pathutilstest.h" +#include "prefixtest.h" +#include "qifwachiveformattest.h" +#include "qifwbinarycreatortest.h" +#include "qifwouttest.h" +#include "qifwresourcestest.h" +#include "QIFWtest.h" +#include "qmlextracttest.h" +#include "qmlscanertest.h" +#include "qttest.h" +#include "releativelinktest.h" +#include "runscriptstest.h" +#include "settargetdirtest.h" +#include "striptest.h" +#include "targetdirtest.h" +#include "trtest.h" +#include "virtualkeybordtest.h" +#include "webenginetest.h" +#include "ziparrchivetest.h" +#include "zipmultitest.h" +#include "ziptest.h" +#include "systemlibtest.h" // Use This macros for initialize your own test classes. // Check exampletests @@ -32,7 +89,65 @@ private slots: // BEGIN TESTS CASES - TestCase(exampleTest, ExampleTest) + TestCase(allowemptypackagestest, AllowEmptyPackagesTest ) + TestCase(binprefixtest, BinPrefixTest) + TestCase(checkqttest, CheckQtTest) + TestCase(cleartest, ClearTest ) + TestCase(confifiletest, ConfFileTest) + TestCase(customplatformtest, CustomPlatformTest) + TestCase(customscripttest, CustomScriptTest) + TestCase(customtest, CustomTest) + TestCase(debcustomtest, DEBCustomTest) + TestCase(debmultitest, DEBMultiTest) + TestCase(debtest, DEBTest) + TestCase(dependencymaptest, DependencyMapTest) + TestCase(deploygeneralfilestest, DeployGeneralFilesTest) + TestCase(deploytargettest, DeployTargetTest) + TestCase(disablerunscripttest, DisableRunScriptTest ) + TestCase(disableshortcutstest, DisableShortcutsTest) + TestCase(distrostructtest, DistroStructTest ) + TestCase(emptypackagestest, EmptyPackagesTest) + TestCase(extractlibtest, ExtractLibTest) + TestCase(extradatatest, ExtraDataTest ) + TestCase(extrapluginstest, ExtraPluginTest) + TestCase(iconstest, IconsTest ) + TestCase(ignoreenvtest, IgnoreEnvTest ) + TestCase(ignoreenvwithlibdirtest, IgnoreEnvWithLibDirTest ) + TestCase(ignoretest, IgnoreTest ) + TestCase(inittest, InitTest ) + TestCase(installdiroptionstest, InstallDirsOptionsTest ) + TestCase(libdirstest, LibDirTest ) + TestCase(md5test, MD5Test ) + TestCase(MSVCtest, MSVCTest ) + TestCase(multipackingtest, MultiPackingTest ) + TestCase(outdirtest, OutDirTest ) + TestCase(overridingtemplatedebtest, OverridingDefaultTemplateDEBTest ) + TestCase(overridingtemplateqifwtest, OverridingDefaultTemplateDEBTest ) + TestCase(overwritetest, OverwiriteTest ) + TestCase(overwritewithpackingtest, OverwiriteWithPackingTest ) + TestCase(packagestest, PacakgesTest ) + TestCase(pathutilstest, PathUtilsTest ) + TestCase(prefixtest, PrefixTest ) + TestCase(qifwachiveformattest, QIFWArchiveFormatTest ) + TestCase(qifwbinarycreatortest, QIFWBinaryCreatorTest ) + TestCase(qifwouttest, QIFWOutTest ) + TestCase(qifwresourcestest, QIFWResourcesTest ) + TestCase(QIFWtest, QIFWTest ) + TestCase(qmlextracttest, QMLExtractTest ) + TestCase(qmlscanertest, QmlScanerTest ) + TestCase(qttest, QtTest ) + TestCase(releativelinktest, ReleativeLinkTest ) + TestCase(runscriptstest, RunScriptsTest ) + TestCase(settargetdirtest, SetTargetDirTest ) + TestCase(striptest, StripTest ) + TestCase(targetdirtest, TargetDirTest ) + TestCase(trtest, TrTest ) + TestCase(virtualkeybordtest, VirtualKeyBoardTest ) + TestCase(webenginetest, WebEngineTest ) + TestCase(ziparrchivetest, ZIPArchiveTest ) + TestCase(zipmultitest, ZIPMultiTest ) + TestCase(ziptest, ZIPTest ) + TestCase(systemLibTest, SystemLibTest) // END TEST CASES private: diff --git a/tests/units/confifiletest.cpp b/tests/units/confifiletest.cpp index b3763116..adecde29 100644 --- a/tests/units/confifiletest.cpp +++ b/tests/units/confifiletest.cpp @@ -12,6 +12,7 @@ #include #include #include +#include "modules.h" void ConfFileTest::test() { diff --git a/tests/units/customplatformtest.cpp b/tests/units/customplatformtest.cpp index 070a3013..5a0006ce 100644 --- a/tests/units/customplatformtest.cpp +++ b/tests/units/customplatformtest.cpp @@ -12,7 +12,7 @@ #include #include #include - +#include void CustomPlatformTest::test() { TestUtils utils; diff --git a/tests/units/dependencymaptest.cpp b/tests/units/dependencymaptest.cpp index 44d31c37..76ddf98e 100644 --- a/tests/units/dependencymaptest.cpp +++ b/tests/units/dependencymaptest.cpp @@ -7,6 +7,7 @@ #include "dependencymaptest.h" +#include "dependencymap.h" #include #include #include diff --git a/tests/units/deploytest.cpp b/tests/units/deploytest.cpp deleted file mode 100644 index b3f4bb4b..00000000 --- a/tests/units/deploytest.cpp +++ /dev/null @@ -1,3247 +0,0 @@ -/* - * Copyright (C) 2018-2022 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 "deploytest.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include "libcreator.h" -#include "modules.h" -#include "qmlcreator.h" -#include "testutils.h" - -// add necessary includes here - - -static const QString TestBinDir = TEST_BIN_DIR; -static const QString TestQtDir = QT_BASE_DIR; - -class deploytest : public QObject -{ - Q_OBJECT - -private: - QSet filesTree; - - void runTestParams(QStringList list, - QSet *tree = nullptr, - bool noWarnings = false, - bool onlySize = false, - exitCodes exitCode = exitCodes::Good, - const std::function &cb = {}); - - void checkResults(const QSet &tree, - bool noWarnings, - bool onlySize = false); - - void createTree(const QStringList& tree); - -public: - deploytest(); - /** - * @brief generateLib - * @param paath - * @return size of lib - */ - int generateLib(const QString& paath); - void deleteLib(const QString& paath); - - ~deploytest(); - -private slots: - void initTestCase(); - void cleanupTestCase(); - - // old tests (not valid) - void testDeployTarget(); - void testStrip(); - void testExtractLib(); - void testRelativeLink(); - void testCheckQt(); - - void testQmlExtrct(); - void testSetTargetDir(); - - // void mainTests(); - - // end old tests - - // tested flags customScript - - void testZip(); - void costomScript(); - void testDistroStruct(); - - // tested flags clear noOvervrite - void testOverwrite(); - void testOverwriteWithPacking(); - - // tested flags binDir - void testextraData(); - - // tested flags qmlDir qmake - void testQt(); - - - void testWebEngine(); - - // tested flags confFile - void testConfFile(); - - // tested flags targetPackage - void testPackages(); - - // tested clear force clear in clear mode - void testClear(); - - // tested flags ignore - void testIgnore(); - - // tested flags ignore ignoreEnv - void testIgnoreEnv(); - - // tested flags libDir recursiveDepth - void testLibDir(); - - // tested flag extraPlugin - void testExtraPlugins(); - - // tested flag targetDir - void testTargetDir(); - - // tested flag noLibc deploySystem - void testSystemLib(); - - // tested flag qmlOut libOut trOut pluginOut binOut - void testOutDirs(); - - void testMSVC(); - - // qif flags - void testQIF(); - void testQIFMulti(); - void testQIFCustom(); - - // zip flags - void testZIP(); - void testZIPMulti(); - - // deb flags - void testDEB(); - void testDEBMulti(); - void testDEBCustom(); - - // qif and zip flags - void testMultiPacking(); - - // init flags - void testInit(); - - void testDependencyMap(); - - void testQmlScaner(); - - void testPrefix(); - // test configure empty packages - void testallowEmptyPackages(); - // test skip empty packages - void testEmptyPackages(); - - void testRunScripts(); - void testOverridingDefaultTemplateQIF(); - void testOverridingDefaultTemplateDEB(); - - void testDeployGeneralFiles(); - void testTr(); - void testVirtualKeyBoard(); - // Attention! This test only covers 40% of icon functions - void testIcons(); - void testPathUtils(); - void testBinPrefix(); - - void testMd5(); - - void testDisableShortcuts(); - void testDisableRunScripts(); - void testQifOut(); - void testIgnoreEnvWithLibDir(); - - // note: this test checking in manual mode only. - void testInstallDirsOptions(); - - void testQIFResources(); - - void testCustomPlatform(); - void testQifArchiveFormat(); - void testQifBinaryCreator(); - - void customTest(); -}; - -deploytest::deploytest() { - - qputenv("QTEST_FUNCTION_TIMEOUT", "1800000"); - QString qifwPath = qgetenv("PATH") + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.0/bin/"; - qifwPath += qifwPath + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.1/bin/"; - qifwPath += qifwPath + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.2/bin/"; - qifwPath += qifwPath + DeployCore::getEnvSeparator() + TestQtDir + "../../Tools/QtInstallerFramework/4.3/bin/"; - - qputenv("PATH", qifwPath.toLatin1().data()); - TestUtils utils; - - QStringList pathList = QProcessEnvironment::systemEnvironment(). - value("PATH").split(DeployCore::getEnvSeparator()); - - for (const auto& path: qAsConst(pathList)) { - filesTree += utils.getFilesSet(path, 1); - } - - filesTree += utils.getFilesSet(TestQtDir); - -} - -int deploytest::generateLib(const QString &paath) -{ - QDir dir; - dir.mkpath(QFileInfo(paath).absolutePath()); - QFile testLib (paath); - - int size = 0; - - if (testLib.open(QIODevice::ReadWrite| QIODevice::Truncate)) { - QFile resData(":/debugLib"); - if (resData.open(QIODevice::ReadOnly)) { - QByteArray tempData = resData.readAll(); - size = tempData.size(); - testLib.write(tempData.data(), tempData.size()); - resData.close(); - } - - testLib.close(); - } - - return size; -} - -void deploytest::deleteLib(const QString &paath) -{ - QFileInfo info(paath); - if (info.isDir()) { - QFile::remove(info.absoluteFilePath()); - } else { - QDir qt(info.absoluteFilePath()); - qt.removeRecursively(); - } -} - -deploytest::~deploytest(){} - -void deploytest::initTestCase() { - QDir qt; - - QDir("./" + DISTRO_DIR).removeRecursively(); - - qt.mkpath("./test/Qt/5.12/"); - qt.mkpath("./test/extraPath/"); - qt.mkpath("./test/extra/"); - qt.mkpath("./test/warning/"); - qt.mkpath("./test/bins/"); - - QFile f( "./test/Qt/5.12/generalLib.so"); - if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { - f.write("lib", 3); - f.close(); - } - - f.setFileName("./test/extraPath/ExtraLib.so"); - if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { - f.write("lib", 3); - f.close(); - } - - f.setFileName("./test/extra/ExtraLib.so"); - if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { - f.write("lib", 3); - f.close(); - } - - f.setFileName("./test/warning/WarningLib.so"); - if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { - f.write("lib", 3); - f.close(); - } - - f.setFileName("./test/bins/execTarget.exe"); - if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { - f.write("exec", 3); - f.close(); - } - - f.setFileName("./test/bins/execTarget"); - if (f.open(QIODevice::WriteOnly| QIODevice::Truncate)) { - f.write("exec", 3); - f.close(); - } -} - -void deploytest::cleanupTestCase() { - QDir qt("./test"); - qt.removeRecursively(); - -} - -void deploytest::testDeployTarget() { - - FileManager file; - DependenciesScanner scan; - Packing pac(&file); - PluginsParser _pluginParser; - - ConfigParser *deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - - QStringList targets; - targets << "./test/bins/execTarget.exe"; - QVERIFY(deploy->setTargets(targets)); - delete deploy; - targets.clear(); - - deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - targets << "./test/bins/execTarget"; - QVERIFY(deploy->setTargets(targets)); - delete deploy; - targets.clear(); - - deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - targets << "./test/bins/execTarget.exe" << "./test/bins/execTarget"; - QVERIFY(deploy->setTargets(targets)); - delete deploy; - targets.clear(); - - deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - targets << "./test/bns/execTarget.exe"; - QVERIFY(!deploy->setTargets(targets)); - delete deploy; - targets.clear(); - - deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - targets << "./test/bins/"; - QVERIFY(deploy->setTargets(targets)); - delete deploy; - targets.clear(); - - deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - targets << "./test/bins/" << "./test/warning/"; - QVERIFY(deploy->setTargets(targets)); - - delete deploy; - targets.clear(); -} - -void deploytest::testStrip() { - -#ifdef Q_OS_UNIX - //for one lib - qint64 sizeBefor = generateLib("./test/binTargetDir/debugLib.so"); - qint64 sizeAfter = 0; - - FileManager *deploy = new FileManager(); - QVERIFY(deploy->strip("./test/binTargetDir/debugLib.so")); - - QFile testLib ("./test/binTargetDir/debugLib.so"); - if (testLib.open(QIODevice::ReadOnly)) { - sizeAfter = testLib.size(); - testLib.close(); - } - - deleteLib("./test/binTargetDir"); - delete deploy; - - QVERIFY(sizeBefor > sizeAfter); - - - //for folder - QStringList libList = { - ("./test/binTargetDir/debugLib1.so"), - ("./test/binTargetDir/debugLib2.so.1.2"), - ("./test/binTargetDir/debugLib3.so.1"), - ("./test/binTargetDir/debugLib4.so.1.0.0"), - ("./test/binTargetDir/debugLib.dll"), - ("./test/binTargetDir/debugLib1.dll") - }; - QList sizeBeforList = {}; - - for (const auto & i: libList) { - sizeBeforList.push_back(generateLib(i)); - } - - QList sizeAfterList; - - deploy = new FileManager(); - QVERIFY(deploy->strip("./test/binTargetDir")); - - for(const auto &i: libList) { - QFile testLib (i); - if (testLib.open(QIODevice::ReadOnly)) { - sizeAfterList.push_back(testLib.size()); - testLib.close(); - } - } - - deleteLib("./test/binTargetDir"); - - QVERIFY(sizeBeforList.size() == sizeAfterList.size()); - - for (int i = 0; i < sizeAfterList.size(); ++i) { - QVERIFY2(sizeBeforList[i] > sizeAfterList[i], - QString("index %0, lib: %1 size befor:%2, sizeAfter:%3"). - arg(i).arg(libList[i]).arg(sizeBeforList[i]).arg(sizeAfterList[i]). - toLatin1()); - } - -#endif -} - -void deploytest::testExtractLib() { - LibCreator creator("./"); - auto libs = creator.getLibs(); - auto deb = creator.getLibsDep(); - auto platforms = creator.getLibplatform(); - - DependenciesScanner scaner; - - LibInfo info; - - for (const auto &lib : libs) { - QVERIFY(scaner.fillLibInfo(info, lib)); - QVERIFY(info.getName() == QFileInfo(lib).fileName()); - QVERIFY(info.getPath() == QFileInfo(lib).absolutePath()); - QVERIFY(info.fullPath() == QFileInfo(lib).absoluteFilePath()); - QVERIFY(info.getPlatform() == platforms.value(lib)); - - for (const auto &dep : deb.value(lib)) { - QString depName = dep; - if (info.getPlatform() & Platform::Win) { - depName = dep.toUpper(); - } - - bool test = info.getDependncies().contains(depName); - QVERIFY(test); - } - - } - -} - -void deploytest::testMSVC() { - QString testPath = "./Qt/5.11.2/msvc2017_64/bin/"; - - QDir d; - QDir oldDir("./Qt"); - oldDir.removeRecursively(); - QVERIFY(d.mkpath(testPath)); - - - auto msvc = DeployCore::getMSVC(testPath); - - QVERIFY(msvc & MSVCVersion::MSVC_17); - QVERIFY(msvc & MSVCVersion::MSVC_x64); - - QDir dir("./Qt"); - dir.removeRecursively(); - - -} - -void deploytest::testWebEngine() { -#ifdef Q_OS_UNIX - TestUtils utils; - - QString bin = TestBinDir + "quicknanobrowser"; - QString qmake = TestQtDir + "bin/qmake"; - - auto comapareTree = TestModule.qtWebEngine(); - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-qmlDir", TestBinDir + "/../quicknanobrowser"}, &comapareTree); - - - bin = TestBinDir + "webui"; - qmake = TestQtDir + "bin/qmake"; - - comapareTree = TestModule.qtWebEngineWidgets(); - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake}, &comapareTree); - - -#endif -} - -void deploytest::testQIF() { - TestUtils utils; -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - - QString qmake = TestQtDir + "bin/qmake"; - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/InstallerTestOnlyC.run", - "./" + DISTRO_DIR + "/InstallerTestOnlyC.run.md5", - }); - -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - - QString qmake = TestQtDir + "bin/qmake.exe"; - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe", - "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe.md5", - - }); - -#endif - - runTestParams({"-bin", bin, "clear" , - "qif", "qifFromSystem", - "-qifStyle", "quasar", - "-qifBanner", TestBinDir + "/../../res/CQtDeployer_banner_web.png", - "-qifLogo", TestBinDir + "/../../res/CQtDeployer defaultIcon_web.png"}, &comapareTree, true); - -} - -void deploytest::testQIFMulti() { - TestUtils utils; -#ifdef Q_OS_UNIX - QString target1 = TestBinDir + "TestCPPOnly"; - QString target2 = TestBinDir + "TestOnlyC"; - - auto comapareTreeMulti = utils.createTree({ - "./" + DISTRO_DIR + "/InstallerApplication.run", - "./" + DISTRO_DIR + "/InstallerApplication.run.md5", - - }); - -#else - QString target1 = TestBinDir + "TestCPPOnly.exe"; - QString target2 = TestBinDir + "TestOnlyC.exe"; - - auto comapareTreeMulti = utils.createTree({ - "./" + DISTRO_DIR + "/InstallerApplication.exe", - "./" + DISTRO_DIR + "/InstallerApplication.exe.md5", - - }); - -#endif - QString bin = target1; - bin += "," + target2; - - auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", packageString, - "qif", "qifFromSystem"}, &comapareTreeMulti, true); -} - -void deploytest::testQIFCustom() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestCPPOnly" + "," + TestBinDir + "TestOnlyC"; - - QString qmake = TestQtDir + "bin/qmake"; - - auto comapareTreeCustom = utils.createTree({ - "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.run", - "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.run.md5", - - }); -#else - QString bin = TestBinDir + "TestCPPOnly.exe" + "," + TestBinDir + "TestOnlyC.exe"; - - QString qmake = TestQtDir + "bin/qmake.exe"; - auto comapareTreeCustom = utils.createTree({ - "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.exe", - "./" + DISTRO_DIR + "/Installerorg.qtproject.ifw.example.stylesheet.exe.md5", - }); - -#endif - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-qif", TestBinDir + "/../../UnitTests/testRes/QIFCustomTemplate", - "-name", "org.qtproject.ifw.example.stylesheet", - "qifFromSystem"}, &comapareTreeCustom, true); - -} - -void deploytest::testZIP() { - - TestUtils utils; - - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/TestOnlyC.zip", - "./" + DISTRO_DIR + "/TestOnlyC.zip.md5", - }); - - - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - - runTestParams({"-bin", bin, "clear" , - "zip", "verbose"}, &comapareTree, true); - - // test clear for zip - runTestParams({"clear", "verbose"}, nullptr, true); - -} - -void deploytest::testZIPMulti() { - TestUtils utils; - - auto comapareTreeMulti = utils.createTree({ - "./" + DISTRO_DIR + "/package1.zip", - "./" + DISTRO_DIR + "/package2.zip", - "./" + DISTRO_DIR + "/package1.zip.md5", - "./" + DISTRO_DIR + "/package2.zip.md5", - - }); - -#ifdef Q_OS_UNIX - QString target1 = TestBinDir + "TestCPPOnly"; - QString target2 = TestBinDir + "TestOnlyC"; - -#else - QString target1 = TestBinDir + "TestCPPOnly.exe"; - QString target2 = TestBinDir + "TestOnlyC.exe"; -#endif - QString bin = target1; - bin += "," + target2; - - auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", packageString, - "zip"}, &comapareTreeMulti, true); -} - -void deploytest::testDEB() { - -#ifdef Q_OS_UNIX - TestUtils utils; - - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/TestOnlyC.deb", - "./" + DISTRO_DIR + "/TestOnlyC.deb.md5", - - }); - - QString bin = TestBinDir + "TestOnlyC"; - - runTestParams({"-bin", bin, "clear" , - "deb", "verbose"}, &comapareTree, true); - - // test clear for deb - runTestParams({"clear", "verbose"}, nullptr, true); - -#endif - -} - -void deploytest::testDEBMulti() { -#ifdef Q_OS_UNIX - TestUtils utils; - - auto comapareTreeMulti = utils.createTree({ - "./" + DISTRO_DIR + "/package1.deb", - "./" + DISTRO_DIR + "/package2.deb", - "./" + DISTRO_DIR + "/package1.deb.md5", - "./" + DISTRO_DIR + "/package2.deb.md5", - - }); - - QString target1 = TestBinDir + "TestCPPOnly"; - - QString target2 = TestBinDir + "TestOnlyC"; - - QString bin = target1; - bin += "," + target2; - - auto packageString = "/package1/;" + QFileInfo(target1).absoluteFilePath() + ",/package2/;" + QFileInfo(target2).absoluteFilePath(); - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", packageString, - "deb"}, &comapareTreeMulti, true); -#endif -} - -void deploytest::testDEBCustom() { -#ifdef Q_OS_UNIX - - TestUtils utils; - - QString bin = TestBinDir + "TestOnlyC"; - - auto comapareTreeCustom = utils.createTree({ - "./" + DISTRO_DIR + "/chrome.deb", - "./" + DISTRO_DIR + "/chrome.deb.md5", - - }); - - runTestParams({"-bin", bin, "clear" , - "-deb", TestBinDir + "/../../UnitTests/testRes/DEBCustomTemplate", - "-name", "chrome"}, - &comapareTreeCustom, true); -#endif -} - -void deploytest::testMultiPacking() { - TestUtils utils; - -#ifdef Q_OS_UNIX - - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/TestOnlyC.zip", - "./" + DISTRO_DIR + "/TestOnlyC.deb", - "./" + DISTRO_DIR + "/InstallerTestOnlyC.run", - "./" + DISTRO_DIR + "/InstallerTestOnlyC.run.md5", - "./" + DISTRO_DIR + "/TestOnlyC.zip.md5", - "./" + DISTRO_DIR + "/TestOnlyC.deb.md5", - - }); - - QString bin = TestBinDir + "TestOnlyC"; - - runTestParams({"-bin", bin, "clear" , - "zip", - "qif", "qifFromSystem", - "deb", - "verbose"}, &comapareTree, true); - -#else - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/TestOnlyC.zip", - "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.zip.md5", - "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe.md5", - }); - QString bin = TestBinDir + "TestOnlyC.exe"; - - runTestParams({"-bin", bin, "clear" , - "zip", - "qif", "qifFromSystem", - "verbose"}, &comapareTree, true); - -#endif -} - -void deploytest::testInit() -{ - - TestUtils utils; - - runTestParams({"init"}); - - QVERIFY(QFile(DEFAULT_COFIGURATION_FILE).remove()); - - runTestParams({"-init", "multi"}); - - - QVERIFY(QFile(DEFAULT_COFIGURATION_FILE).remove()); - - runTestParams({"-init", "single"}); - - QVERIFY(QFile(DEFAULT_COFIGURATION_FILE).remove()); - -} - -void deploytest::testDependencyMap() { - DependencyMap dep1, dep2, dep3; - - QVERIFY(dep1.qtModules() == 0); - QVERIFY(dep2.qtModules() == 0); - QVERIFY(dep3.qtModules() == 0); - - QVERIFY(dep1.systemLibs().isEmpty()); - QVERIFY(dep2.systemLibs().isEmpty()); - QVERIFY(dep3.systemLibs().isEmpty()); - - - QVERIFY(dep1.neadedLibs().isEmpty()); - QVERIFY(dep2.neadedLibs().isEmpty()); - QVERIFY(dep3.neadedLibs().isEmpty()); - - dep1.addModule(DeployCore::QtModule::QtGuiModule); - - QVERIFY(dep1.qtModules() == DeployCore::QtModule::QtGuiModule); - dep1.addModule(DeployCore::QtModule::QtHelpModule); - - QVERIFY(dep1.qtModules() == (DeployCore::QtModule::QtGuiModule | - DeployCore::QtModule::QtHelpModule)); - - dep1.removeModule(DeployCore::QtModule::QtGuiModule); - - QVERIFY(dep1.qtModules() == DeployCore::QtModule::QtHelpModule); - - dep2.addModule(DeployCore::QtModule::QtGuiModule); - - dep1 += dep2; - - QVERIFY(dep1.qtModules() == (DeployCore::QtModule::QtGuiModule | - DeployCore::QtModule::QtHelpModule)); - - - -} - -void deploytest::testQmlScaner() { - - // qt5 - auto qmlRoot = QFileInfo(TestQtDir + "/qml").absoluteFilePath(); - QML *scaner = new QML(qmlRoot, QtMajorVersion::Qt5); - auto imports = scaner->extractImportsFromFile(":/qmlFile.qml"); - - scaner->scanQmlTree(qmlRoot); - - QSet results = { - {qmlRoot + "/QtQuick.2/"}, - {qmlRoot + "/QtQuick/Controls.2/"}, - {qmlRoot + "/QtQuick/Controls.2/Material/"}, - {qmlRoot + "/QtQuick/Layouts/"}, - }; - - QVERIFY(results.size() == imports.size()); - - for (const auto &import: qAsConst(imports)) { - auto path = scaner->getPathFromImport(import); - QVERIFY(results.contains(path)); - } - - - scaner->setQtVersion(QtMajorVersion::Qt6); - - // qt6 - - results = { - {qmlRoot + "/QtQuick"}, - {qmlRoot + "/QtQuick/Controls"}, - {qmlRoot + "/QtQuick/Controls/Material"}, - {qmlRoot + "/QtQuick/Layouts"}, - }; - - imports = scaner->extractImportsFromFile(":/qmlFileQt6.qml"); - - QVERIFY(results.size() == imports.size()); - - for (const auto &import: qAsConst(imports)) { - auto path = scaner->getPathFromImport(import); - QVERIFY(results.contains(path)); - } - - imports = scaner->extractImportsFromFile(":/qmlFile.qml"); - - QVERIFY(results.size() == imports.size()); - - for (const auto & import: qAsConst(imports)) { - auto path = scaner->getPathFromImport(import); - QVERIFY(results.contains(path)); - } - - // qt5 - scaner->setQtVersion(QtMajorVersion::Qt5); - - results = { - {qmlRoot + "/QtQuick.2/"}, - {qmlRoot + "/QtQuick/Window.2/"}, - {qmlRoot + "/QtQuick/Layouts/"}, - {qmlRoot + "/Qt/labs/folderlistmodel/"}, - {qmlRoot + "/QtQuick/VirtualKeyboard/Settings/"}, - {qmlRoot + "/QtQuick/VirtualKeyboard/Styles/"}, - }; - - imports = scaner->extractImportsFromQmlModule(":/qmlDir"); - - QVERIFY(results.size() == imports.size()); - - for (const auto &import: qAsConst(imports)) { - auto path = scaner->getPathFromImport(import); - QVERIFY(results.contains(path)); - } - - // qt6 - scaner->setQtVersion(QtMajorVersion::Qt6); - - results = { - {qmlRoot + "/QtQuick"}, - {qmlRoot + "/QtQuick/Window"}, - {qmlRoot + "/QtQuick/Layouts"}, - {qmlRoot + "/Qt/labs/folderlistmodel"}, - {qmlRoot + "/QtQuick/VirtualKeyboard/Settings"}, - {qmlRoot + "/QtQuick/VirtualKeyboard/Styles"}, - }; - - imports = scaner->extractImportsFromQmlModule(":/qmlDir"); - - QVERIFY(results.size() == imports.size()); - - for (const auto &import: qAsConst(imports)) { - auto path = scaner->getPathFromImport(import); - QVERIFY(results.contains(path)); - } - -} - -void deploytest::testPrefix() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/package/TestOnlyC.sh", - "./" + DISTRO_DIR + "/package/bin/TestOnlyC", - "./" + DISTRO_DIR + "/package/bin/qt.conf" - }); - QString target1 = TestBinDir + "TestOnlyC"; - -#else - QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/package/TestOnlyC.exe", - "./" + DISTRO_DIR + "/package/TestOnlyC.bat", - "./" + DISTRO_DIR + "/package/qt.conf"}); - QString target1 = TestBinDir + "TestOnlyC.exe"; - -#endif - QString bin = target1; - - comapareTree = TestModule.replace(comapareTree, {{"package","prefix"}}); - - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", "/package/;TestOn", - "-prefix", "package;prefix"}, &comapareTree); -} - -void deploytest::testallowEmptyPackages() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - runTestParams({"-bin", bin, "force-clear", - "-prefix", "package;prefix"}, nullptr, false, false, - exitCodes::PrepareError); - - runTestParams({"-bin", bin, "force-clear", - "-prefix", "package;prefix", - "allowEmptyPackages"}); -} - -void deploytest::testEmptyPackages() { - TestUtils utils; - auto comapareTree = TestModule.onlyC(); - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - - runTestParams({"-bin", bin, "force-clear", - "-prefix", "package;prefix"}, nullptr, false, false, - exitCodes::PrepareError); - - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", "/package/;NONE", - "-libDir", TestQtDir + "bin", - "-prefix", "package;prefix", - "allowEmptyPackages"}, &comapareTree); -} - -void deploytest::testRunScripts() { - TestUtils utils; - auto comapareTree = TestModule.onlyC(); - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - - QFile f(":/testResurces/testRes/customRunScript.sh"); - QVERIFY(f.open(QIODevice::ReadOnly)); - auto etalonData = f.readAll(); - f.close(); - - runTestParams({"-bin", bin, - "force-clear", - "-libOut", "lib", - "-runScript", "TestOnlyC;:/testResurces/testRes/customRunScript.sh"}, &comapareTree); - - f.setFileName(DISTRO_DIR + "/TestOnlyC.sh"); - QVERIFY(f.open(QIODevice::ReadOnly)); - auto deployData = f.readAll(); - - QVERIFY(deployData == etalonData); -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - - QFile f(":/testResurces/testRes/customRunScript.sh"); - QVERIFY(f.open(QIODevice::ReadOnly)); - auto etalonData = f.readAll(); - f.close(); - - runTestParams({"-bin", bin, - "force-clear", - "-libOut", "lib", - "-runScript", "TestOnlyC.exe;:/testResurces/testRes/customRunScript.sh"}, nullptr); - - f.setFileName(DISTRO_DIR + "/TestOnlyC.bat"); - QVERIFY(f.open(QIODevice::ReadOnly)); - auto deployData = f.readAll(); - - QVERIFY(deployData == etalonData); -#endif - -} - -void deploytest::testOverridingDefaultTemplateDEB() -{ - TestUtils utils; - - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC" + "," + TestBinDir + "TestCPPOnly"; - QString qmake = TestQtDir + "bin/qmake"; - - QDir tempalteDir("temaplate"); - if (!tempalteDir.isEmpty()) { - tempalteDir.removeRecursively(); - }; - - auto comapareTree = utils.createTree( - { - "temaplate/defaultDEBTemplate/Test/DEBIAN/control", - "temaplate/defaultDEBTemplate/Test/DEBIAN/postinst", - "temaplate/defaultDEBTemplate/Test/DEBIAN/prerm" - }); - QFile appScript("temaplate/defaultDEBTemplate/Test/DEBIAN/control"); - appScript.remove(); - - runTestParams( - {"force-clear", - "getDefaultTemplate", - "-name", "Test", - "deb", - "-targetDir", "temaplate", - "-targetPackage", "MyApp" - }, &comapareTree); - - comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/Test.deb", - "./" + DISTRO_DIR + "/Test.deb.md5", - - }); - - runTestParams( - {"force-clear", - "-deb", "temaplate/defaultDEBTemplate", - "-targetPackage", "MyApp", - "-name", "Test", - "-qmake", qmake - }, &comapareTree, false, false); - - - QVERIFY(appScript.open(QIODevice::WriteOnly)); - QVERIFY(appScript.write(QByteArray{"ERROR"})); - appScript.close(); - - runTestParams( - {"-bin", bin, - "force-clear", - "-deb", "temaplate/defaultDEBTemplate", - "-targetPackage", "MyApp", - "-name", "Test", - "-qmake", qmake - }, nullptr, false, false, exitCodes::PackingError); -#endif - -} - -void deploytest::testOverridingDefaultTemplateQIF() { - TestUtils utils; - // Prepare bin and qmake values -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC" + "," + TestBinDir + "TestCPPOnly"; - QString qmake = TestQtDir + "bin/qmake"; - -#else - QString bin = TestBinDir + "TestOnlyC.exe" + "," + TestBinDir + "TestCPPOnly.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; - -#endif - QDir tempalteDir("temaplate"); - if (!tempalteDir.isEmpty()) { - tempalteDir.removeRecursively(); - }; - - // QIF case. prepare default template. - auto comapareTree = utils.createTree( - { - "temaplate/defaultQIFWTemplate/config/config.xml", - "temaplate/defaultQIFWTemplate/config/controlScript.qs", - "temaplate/defaultQIFWTemplate/packages/MyApp/meta/installscript.qs", - "temaplate/defaultQIFWTemplate/packages/MyApp/meta/package.xml" - }); - QFile appScript("temaplate/defaultQIFWTemplate/packages/MyApp/meta/installscript.qs"); - appScript.remove(); - - // This command shold be deploy default template in the template folder - runTestParams( - {"-bin", bin, - "force-clear", - "getDefaultTemplate", - "-name", "Test", - "qif", - "-targetDir", "temaplate", - "-targetPackage", "MyApp" - }, &comapareTree); - -#ifdef Q_OS_UNIX - comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/InstallerTest.run", - "./" + DISTRO_DIR + "/InstallerTest.run.md5", - }); - -#else - comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/InstallerTest.exe", - "./" + DISTRO_DIR + "/InstallerTest.exe.md5", - }); - -#endif - - // check deploy application with custom template - runTestParams( - {"-bin", bin, - "force-clear", - "-qif", "temaplate/defaultQIFWTemplate", - "-targetPackage", "MyApp", - "-name", "Test", - "-qmake", qmake, - "qifFromSystem" - }, &comapareTree, false, false); - - QVERIFY(appScript.open(QIODevice::WriteOnly)); - QVERIFY(appScript.write(QByteArray{"ERROR"})); - appScript.close(); - - // Shold be failde because we added error string into template files. - runTestParams( - {"-bin", bin, - "force-clear", - "-qif", "temaplate/defaultQIFWTemplate", - "-targetPackage", "MyApp", - "-name", "Test", - "-qmake", qmake, - "qifFromSystem" - }, nullptr, false, false, exitCodes::PackingError); - - - -} - -void deploytest::testDeployGeneralFiles() { - TestUtils utils; - - QString bin = TestBinDir + "/../../CMakeLists.txt"; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/bin/CMakeLists.txt", - "./" + DISTRO_DIR + "/bin/qt.conf", - - }); - - runTestParams( - {"-bin", bin, - "-binOut", "bin", - "force-clear" - }, &comapareTree); -} - -void deploytest::testTr() { - TestUtils utils; -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - -#endif - - runTestParams({"-bin", bin, "clear" , - "-tr", ":/testResurces/testRes/TestTr.qm",}); - - QVERIFY(QFile::exists("./" + DISTRO_DIR + "/translations/TestTr.qm")); - - runTestParams({"-bin", bin, "clear" , - "-tr", ":/testResurces/testRes/"}); - - QVERIFY(QFile::exists("./" + DISTRO_DIR + "/translations/TestTr.qm")); -} - -void deploytest::testVirtualKeyBoard() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "basic"; - QString qmake = TestQtDir + "bin/qmake"; -#else - QString bin = TestBinDir + "basic.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; -#endif - auto comapareTree = TestModule.qmlVirtualKeyBoadrLibs(); - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-qmlDir", TestBinDir + "/../virtualkeyboard"}, &comapareTree); -} - -void deploytest::testIcons() { - TestUtils utils; - - auto initTargets = [](ConfigParser * deploy, const QStringList& params) { - QVERIFY(QuasarAppUtils::Params::parseParams(params)); - - auto bin = QuasarAppUtils::Params::getArg("bin"). - split(DeployCore::getSeparator(0), splitbehavior); - - - QVERIFY(deploy->setTargets(bin)); - - deploy->configureTargets(); - }; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - QStringList binMulti = {TestBinDir + "TestOnlyC" , TestBinDir + "TestCPPOnly"}; - -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - QStringList binMulti = {TestBinDir + "TestOnlyC.exe" , TestBinDir + "TestCPPOnly.exe"}; - -#endif - - FileManager file; - DependenciesScanner scan; - Packing pac(&file); - PluginsParser _pluginParser; - - - // Test default icons - ConfigParser *deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - - initTargets(deploy, {"-bin", bin, - "force-clear", - }); - - auto targetsMap = deploy->_config.getTargetsListByFilter("TestOnlyC"); - auto targetinfo = targetsMap.begin().value(); - QVERIFY(targetinfo->getName().contains("TestOnlyC")); - auto icon = QFileInfo(targetinfo->getIcon()); - -#ifdef Q_OS_UNIX - QVERIFY(icon.fileName() == "Icon.png"); -#else - QVERIFY(icon.fileName() == "Icon.ico"); - -#endif - delete deploy; - - // Test multiple targets icons (sets for all targets on icon) - deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - - initTargets(deploy, {"-bin", binMulti.join(","), - "force-clear", - "-icon", ":/testResurces/testRes/TestIcon.png", - }); - - for (const auto &target : qAsConst(binMulti)) { - QFileInfo tarInfo(target); - - targetsMap = deploy->_config.getTargetsListByFilter(tarInfo.baseName()); - targetinfo = targetsMap.begin().value(); - QVERIFY(targetinfo->getName().contains(tarInfo.baseName())); - icon = QFileInfo(targetinfo->getIcon()); - - QVERIFY(icon.fileName() == "TestIcon.png"); - } - - delete deploy; - - - // Test multiple targets icons (sets only one icon) - deploy = new ConfigParser(&file, &_pluginParser, &scan, &pac); - - initTargets(deploy, {"-bin", binMulti.join(","), - "force-clear", - "-icon", "TestOnlyC;:/testResurces/testRes/TestIcon.png", - }); - - - targetsMap = deploy->_config.getTargetsListByFilter("TestOnlyC"); - targetinfo = targetsMap.begin().value(); - QVERIFY(targetinfo->getName().contains("TestOnlyC")); - icon = QFileInfo(targetinfo->getIcon()); - - QVERIFY(icon.fileName() == "TestIcon.png"); - - - delete deploy; - - // manual tests -#ifdef QT_DEBUG -#ifdef Q_OS_UNIX - bin = TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly"; - - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/InstallerTest.run", - "./" + DISTRO_DIR + "/InstallerTest.run.md5", - }); - -#else - bin = TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe"; - - auto comapareTree = utils.createTree({ - "./" + DISTRO_DIR + "/InstallerTest.exe", - "./" + DISTRO_DIR + "/InstallerTest.exe.md5", - - }); - -#endif - - runTestParams({"-bin", bin, "clear" , - "qif", "qifFromSystem", "-name", "Test", - "-targetPackage", "testPackage;TestOnlyC;TestCPPOnly", - "-icon", "TestOnlyC;:/testResurces/testRes/TestIcon.png,TestCPPOnly;:/testResurces/testRes/TestTr.qm"}, &comapareTree, true); - -#endif -} - -void deploytest::testPathUtils() { - - // test getName - QMap cases = { - {"",""}, - {"test","test"}, - {"t","t"}, - {"/","/"}, - {"/test","test"}, - {"/t","t"}, - {"/test/","test"}, - {"/t/","t"}, - - {"/check/test","test"}, - {"/check/t","t"}, - {"/check/test/","test"}, - {"/check/t/","t"}, - - {"C:\\","C:"}, - {"\\","/"}, - {"\\test","test"}, - {"\\t","t"}, - {"\\test\\","test"}, - {"\\t\\","t"}, - - }; - - for (auto it = cases.begin(); it != cases.end(); ++it) { - if (PathUtils::getName(it.key()) != it.value()) - QVERIFY(false); - } - - struct Result { - QString result; - QString newPath; - }; - - // test popItem - QMap popItemCases = { - {"", {"", ""}}, - {"test", {"test", ""}}, - {"t", {"t", ""}}, - {"/", {"/", ""}}, - {"/test", {"test", "/"}}, - {"/t", {"t", "/"}}, - {"/test/", {"test", "/"}}, - {"/t/", {"t", "/"} }, - - {"/check/test", {"test", "/check/"}}, - {"/check/t", {"t", "/check/"}}, - {"/check/test/", {"test", "/check/"}}, - {"/check/t/", {"t", "/check/"}}, - - {"C:\\", {"C:", ""}}, - {"\\", {"/", ""}}, - {"\\test", {"test", "/"}}, - {"\\t", {"t", "/"}}, - {"\\test\\", {"test", "/"}}, - {"\\t\\", {"t", "/"}}, - - }; - - for (auto it = popItemCases.begin(); it != popItemCases.end(); ++it) { - QString path = it.key(); - QString result = PathUtils::popItem(path); - if (path != it.value().newPath || result != it.value().result) - QVERIFY(false); - } -} - -void deploytest::testBinPrefix() { - TestUtils utils; - -#ifdef Q_OS_UNIX - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.sh", - "./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/bin/qt.conf" - }); - QString target = TestBinDir + "TestOnlyC"; - QString targetWithoutPrefix = "TestOnlyC"; - -#else - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - "./" + DISTRO_DIR + "/qt.conf"}); - QString target = TestBinDir + "TestOnlyC.exe"; - QString targetWithoutPrefix = "TestOnlyC.exe"; - -#endif - - runTestParams({"-bin", target, "force-clear"}, &comapareTree); - - runTestParams({"-bin", targetWithoutPrefix, - "-binPrefix", TestBinDir, - "force-clear"}, &comapareTree); - -} - -void deploytest::testMd5() { - // This test will check hashes - - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - auto outFile = "./" + DISTRO_DIR + "/InstallerTestOnlyC.run"; - -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - auto outFile = "./" + DISTRO_DIR + "/InstallerTestOnlyC.exe"; - -#endif - - auto comapareTreeqif = utils.createTree( - { - outFile, - outFile + ".md5" - }); - - // Run deploy installer - runTestParams({"-bin", bin, - "force-clear", - "qif", - "qifFromSystem"}, &comapareTreeqif); - - QFile file(outFile); - QVERIFY(file.open(QIODevice::ReadOnly)); - auto binaryData = file.readAll(); - file.close(); - - file.setFileName(outFile + ".md5"); - QVERIFY(file.open(QIODevice::ReadOnly)); - auto hash = file.readAll(); - file.close(); - - // Compare hash sum of the installer with realy hash sum of the object. - QVERIFY(QCryptographicHash::hash(binaryData, QCryptographicHash::Md5).toHex() == hash); - - - comapareTreeqif = utils.createTree( - { - outFile, - }); - - // Check noHashSum option. CQtDeployer must be skip calculating a hash sum of an installer. - runTestParams({"-bin", bin, - "force-clear", - "noHashSum", - "qif", - "qifFromSystem"}, &comapareTreeqif); -} - -void deploytest::testDisableShortcuts() { - - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - - auto cb = [](const DeployConfig * config){ - const auto list = config->getTargetsListByFilter("TestOnlyC"); - // Check shrtcut option. all targets should be return false. - for (auto target: list) { - QVERIFY(!target->getShortCut()); - } - }; - - // Run deploy installer - runTestParams({"-bin", bin, "clear", - "-disableShortCut", "TestOnlyC", - "qif", "qifFromSystem"}, - nullptr, - false, - false, - exitCodes::Good, - cb); - - - -} - -void deploytest::testDisableRunScripts() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - - auto comapareTreeqif = TestModule.onlyC(); - comapareTreeqif -= utils.createTree({DISTRO_DIR + "/TestOnlyC.sh", - DISTRO_DIR + "/TestOnlyC.bat"}); - // Run deploy installer - runTestParams({"-bin", bin, "clear", "-libDir", TestQtDir + "/bin", - "-disableRunScript", "TestOnlyC"}, &comapareTreeqif); -} - -void deploytest::testQifOut() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - -#ifdef Q_OS_UNIX - auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, - {DISTRO_DIR + "/DEB_OUT.deb"}, {DISTRO_DIR + "/DEB_OUT.deb.md5"}, - {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); - - // Run deploy installer - runTestParams({"-bin", bin, "clear", - "qif", "-qifOut", "QIF_OUT.exe", - "deb", "-debOut", "DEB_OUT.deb", - "zip", "-zipOut", "ZIP_OUT.zip"}, &result); -#else - auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, - {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); - - // Run deploy installer - runTestParams({"-bin", bin, "clear", - "qif", "-qifOut", "QIF_OUT.exe", - "zip", "-zipOut", "ZIP_OUT.zip"}, &result); -#endif -} - -void deploytest::testIgnoreEnvWithLibDir() { -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - - QVERIFY(QDir().mkdir("libDirtest")); - - // Run deploy installer - runTestParams({"-bin", bin, "clear", - "-targetDir", "./libDirtest", - "-libDir", "./libDirtest"}, nullptr, false, false, - exitCodes::PrepareError); - - QVERIFY(QDir().rmdir("libDirtest")); -} - -void deploytest::testInstallDirsOptions() { -#ifdef QT_DEBUG -#ifdef Q_OS_UNIX - QStringList binMulti = {TestBinDir + "TestOnlyC" , TestBinDir + "TestCPPOnly"}; - -#else - QStringList binMulti = {TestBinDir + "TestOnlyC.exe" , TestBinDir + "TestCPPOnly.exe"}; - -#endif - - - runTestParams({"-bin", binMulti.join(","), "clear", - "qif", "deb", - "-targetPackage", "pkg;TestCPPOnly", - "-installDirDeb", "pkg;/var", - "-installDirQIFW", "/opt"}); - -#endif -} - -void deploytest::testQIFResources() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = {TestBinDir + "TestOnlyC"}; - - auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.run"}, - {DISTRO_DIR + "/InstallerTestOnlyC.run.md5"}}); -#else - QString bin = {TestBinDir + "TestOnlyC.exe"}; - - auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.exe"}, - {DISTRO_DIR + "/InstallerTestOnlyC.exe.md5"}}); -#endif - - - auto templateDir = TestBinDir + "/../../UnitTests/testRes/QIFCustomTemplate"; - runTestParams({ - "-bin", bin, - "clear", - "qif", - "-qifConfig", templateDir + "/customconfig.xml", - "-qifPackages", templateDir + "/custompackages", - "-qifResources", templateDir + "customRes.qrc" - }, &result - ); - -} - -void deploytest::testCustomPlatform() { - TestUtils utils; - - auto compareTree = TestModule.onlyC(); - -#ifdef Q_OS_UNIX - QString bin = {TestBinDir + "TestOnlyC"}; - QString platform = "linux_x86_64"; - -#else - QString bin = {TestBinDir + "TestOnlyC.exe"}; - QString platform = "win_x86_64"; - - compareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - "./" + DISTRO_DIR + "/qt.conf" - } - ); - -#endif - - runTestParams({ - "-bin", bin, - "clear", - "-platform", platform, - }, &compareTree - ); - - - - runTestParams({ - "-bin", bin, - "clear", - "-platform", "GeneralFile", - }, nullptr, false, false, exitCodes::PrepareError - ); -} - -void deploytest::testQifArchiveFormat() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = {TestBinDir + "TestOnlyC"}; - - auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.run"}, - {DISTRO_DIR + "/InstallerTestOnlyC.run.md5"}}); -#else - QString bin = {TestBinDir + "TestOnlyC.exe"}; - - auto result = utils.createTree({{DISTRO_DIR + "/InstallerTestOnlyC.exe"}, - {DISTRO_DIR + "/InstallerTestOnlyC.exe.md5"}}); -#endif - - - runTestParams({ - "-bin", bin, - "qifFromSystem", - "clear", - "qif", - "-qifArchiveFormat", "zip" - }, &result - ); -} - -void deploytest::testQifBinaryCreator() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = {TestBinDir + "TestOnlyC"}; -#else - QString bin = {TestBinDir + "TestOnlyC.exe"}; -#endif - - { - QuasarAppUtils::Params::parseParams({ - "-bin", bin, - "qifFromSystem", - "clear", - "qif", - "-binarycreator", "test testValue" - }); - Deploy deploy; - QVERIFY(deploy.prepare()); - FileManager fm; - QIF qif(&fm); - - auto command = qif.runCmd(); - QVERIFY(command.size() == 1); - QVERIFY(command.first().command == "test"); - QVERIFY(command.first().arguments.contains("testValue")); - } - - { - QuasarAppUtils::Params::parseParams({ - "-bin", bin, - "qifFromSystem", - "clear", - "qif", - "-binarycreator", "test" - }); - Deploy deploy; - QVERIFY(deploy.prepare()); - FileManager fm; - QIF qif(&fm); - - auto command = qif.runCmd(); - QVERIFY(command.size() == 1); - QVERIFY(command.first().command == "test"); - } - - -} - -void deploytest::customTest() { - //runTestParams({"-confFile", "", - // "qifFromSystem"}); -} - -void deploytest::testQmlExtrct() { - QmlCreator creator("./"); - auto imports = creator.getQmlImports(); - - auto qmlFiles = creator.getCopyedQml(); - - - QML scaner("./", QtMajorVersion::Qt5); - - - for (const auto &file : qAsConst(qmlFiles)) { - - - auto fileImports = scaner.extractImportsFromFile(file); - - for (const auto &fil : imports.value(file)) { - QVERIFY(fileImports.contains(fil, Qt::CaseInsensitive)); - } - - } -} - -void deploytest::testDistroStruct() { - DistroStruct distro; - - auto cases = QList>{ - {"", "/"}, - {"/", "/"}, - {"/res","/../"}, - {"/res/","/../"}, - {"/res/type","/../../"}, - {"/res/type/","/../../"}, - {"res/type","../../"}, - {"res/type/","../../"}, - {"res//type/","../../"}, - {"res////type/","../../"}, - {"//res///type/////","/../../"}, - {"\\", "/"}, - {"\\res","/../"}, - {"\\res\\","/../"}, - {"\\res\\type","/../../"}, - {"\\res\\type\\","/../../"}, - {"res\\type","../../"}, - {"res\\type\\","../../"}, - {"res\\\\type\\","../../"}, - {"res\\\\\\\\type\\","../../"}, - {"\\\\res\\\\\\type\\\\\\\\\\","/../../"}, - }; - - for (const auto &i: qAsConst(cases)) { - if (distro.getRelativePath(i.first) != i.second) - QVERIFY(false); - } - - distro = DistroStruct(); - - distro.setTrOutDir("/tr/"); - QVERIFY(distro.getTrOutDir() == "/tr/"); - - - distro.setTrOutDir("/tr"); - QVERIFY(distro.getTrOutDir() == "/tr/"); - - distro.setTrOutDir("tr"); - QVERIFY(distro.getTrOutDir() == "/tr/"); - - -} - -void deploytest::testRelativeLink() { - auto cases = QList>{ - {"", "", "./"}, - {"/media", "/etc", "./../etc/"}, - {"/media///", "/etc///", "./../etc/"}, - {"/media/etc/usr", "/media/etc", "./../"}, - {"/media/etc", "/media/etc/usr", "./usr/"}, - - {"C:/", "C:/", "./"}, - {"C:\\", "C:/", "./"}, - {"C:/", "C:\\", "./"}, - - {"C:/media", "C:/etc", "./../etc/"}, - {"C:/media//\\", "C:/etc///", "./../etc/"}, - {"C:/media/etc/usr", "C:/media/etc", "./../"}, - {"C:/media\\etc", "C:/media/etc/usr", "./usr/"}, - {"C:/media/etc", "D:/media/etc/usr", "D:/media/etc/usr"}, - -}; - - for (const auto &i: qAsConst(cases)) { - if (PathUtils::getRelativeLink(i[0], i[1]) != i[2]) - QVERIFY(false); - } - - for (int i = 1; i < cases.size() - 1; i++) { - if (!PathUtils::isAbsalutPath(cases[i][0])) - QVERIFY(false); - if (PathUtils::isAbsalutPath(cases[i][2])) - QVERIFY(false); - - } -} - -void deploytest::testCheckQt() { - - Deploy *deployer = new Deploy(); - QuasarAppUtils::Params::parseParams({"-bin", TestBinDir, "clear", - "noCheckRPATH", "noCheckPATH", "noQt"}); - QVERIFY(deployer->prepare()); - - - auto cases = QList>{ - {TestQtDir + "/", QtMajorVersion::NoQt}, - {TestQtDir + "", QtMajorVersion::NoQt}, - {TestQtDir + "/bin/file1", QtMajorVersion::NoQt}, - {TestQtDir + "/lib/file12.so", QtMajorVersion::NoQt}, - {TestQtDir + "/resurces/file13.dll", QtMajorVersion::NoQt}, - {TestQtDir + "/libexec/f", QtMajorVersion::NoQt}, - {TestQtDir + "/mkspecs", QtMajorVersion::NoQt}, - {TestQtDir + "/qml", QtMajorVersion::NoQt}, - {TestQtDir + "/plugins", QtMajorVersion::NoQt}, - {TestQtDir + "/file", QtMajorVersion::NoQt}, - - {TestQtDir + "\\", QtMajorVersion::NoQt}, - {TestQtDir + "", QtMajorVersion::NoQt}, - {TestQtDir + "\\bin\\file1", QtMajorVersion::NoQt}, - {TestQtDir + "\\lib\\file12", QtMajorVersion::NoQt}, - {TestQtDir + "\\resurces\\file13", QtMajorVersion::NoQt}, - {TestQtDir + "\\libexec\\f.so", QtMajorVersion::NoQt}, - {TestQtDir + "\\mkspecs.dll", QtMajorVersion::NoQt}, - {TestQtDir + "\\qml", QtMajorVersion::NoQt}, - {TestQtDir + "\\plugins", QtMajorVersion::NoQt}, - {TestQtDir + "\\file", QtMajorVersion::NoQt}, - - }; - - for (const auto &i: qAsConst(cases)) { - QVERIFY(DeployCore::isQtLib(i.first) == i.second); - } - delete deployer; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestQMLWidgets"; - QString qmake = TestQtDir + "bin/qmake"; - -#else - QString bin = TestBinDir + "TestQMLWidgets.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; -#endif - - deployer = new Deploy(); - QuasarAppUtils::Params::parseParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-qmlDir", TestBinDir + "/../TestQMLWidgets"}); - QVERIFY(deployer->prepare()); - - - cases = QList>{ - {TestQtDir + "/", QtMajorVersion::NoQt}, - {TestQtDir + "", QtMajorVersion::NoQt}, - {TestQtDir + "/bin/file1", QtMajorVersion::NoQt}, - {TestQtDir + "/lib/file12", QtMajorVersion::NoQt}, - {TestQtDir + "/lib/file12", QtMajorVersion::NoQt}, - - {TestQtDir + "/mkspecs", QtMajorVersion::NoQt}, - {TestQtDir + "/qml", QtMajorVersion::NoQt}, - {TestQtDir + "/plugins", QtMajorVersion::NoQt}, - {TestQtDir + "/file", QtMajorVersion::NoQt}, - - {TestQtDir + "\\", QtMajorVersion::NoQt}, - {TestQtDir + "", QtMajorVersion::NoQt}, - {TestQtDir + "\\lib\\file12", QtMajorVersion::NoQt}, - {TestQtDir + "\\libexec\\fQt", QtMajorVersion::NoQt}, - {TestQtDir + "\\mkspecs", QtMajorVersion::NoQt}, - {TestQtDir + "\\qml", QtMajorVersion::NoQt}, - {TestQtDir + "\\plugins", QtMajorVersion::NoQt}, - {TestQtDir + "\\file", QtMajorVersion::NoQt}, - - {TestQtDir + "/bin/file1Qt4.so", QtMajorVersion::Qt4}, - {TestQtDir + "/resources/Qt4file13.so", QtMajorVersion::Qt4}, - {TestQtDir + "/libexec/Qt4f.dll", QtMajorVersion::Qt4}, - {TestQtDir + "\\bin\\Qt4file1.dll", QtMajorVersion::Qt4}, - {TestQtDir + "\\resources\\fileQt413.dll", QtMajorVersion::Qt4}, - - {TestQtDir + "/bin/file1Qt5.so", QtMajorVersion::Qt5}, - {TestQtDir + "/resources/Qt5file13.so", QtMajorVersion::Qt5}, - {TestQtDir + "/libexec/Qt5f.dll", QtMajorVersion::Qt5}, - {TestQtDir + "\\bin\\Qt5file1.dll", QtMajorVersion::Qt5}, - {TestQtDir + "\\resources\\fileQt513.dll", QtMajorVersion::Qt5}, - - {TestQtDir + "/bin/file1Qt6.so", QtMajorVersion::Qt6}, - {TestQtDir + "/resources/Qt6file13.so", QtMajorVersion::Qt6}, - {TestQtDir + "/libexec/Qt6f.dll", QtMajorVersion::Qt6}, - {TestQtDir + "\\bin\\Qt6file1.dll", QtMajorVersion::Qt6}, - {TestQtDir + "\\resources\\fileQt613.dll", QtMajorVersion::Qt6}, - - }; - - for (const auto &i: qAsConst(cases)) { - auto dexription = QString("The isQtLib(%0) function should be return %1").arg( - i.first).arg(i.second); - QVERIFY2(DeployCore::isQtLib(i.first) == i.second, dexription.toLatin1().data()); - } - - delete deployer; -} - -void deploytest::testSetTargetDir() { - - FileManager file; - DependenciesScanner scan; - Packing pac(&file); - PluginsParser _plugins; - ConfigParser dep(&file, &_plugins, &scan, &pac); - - dep.setTargetDir(); - - QVERIFY(dep.config()->getTargetDir() == QFileInfo("./" + DISTRO_DIR + "").absoluteFilePath()); - dep.setTargetDir("./ff"); - QVERIFY(dep.config()->getTargetDir() == QFileInfo("./ff").absoluteFilePath()); - - QStringList argv = {"-targetDir", "./" + DISTRO_DIR + "2"}; - - QuasarAppUtils::Params::parseParams(argv); - - dep.setTargetDir(); - QVERIFY(dep.config()->getTargetDir() == QFileInfo("./" + DISTRO_DIR + "2").absoluteFilePath()); - dep.setTargetDir("./ff"); - QVERIFY(dep.config()->getTargetDir() == QFileInfo("./" + DISTRO_DIR + "2").absoluteFilePath()); - -} - -void deploytest::testZip() { - TestUtils utils; - - ZipCompresser zip; - auto befor = utils.getTree("./test"); - - QVERIFY(zip.compress("./test", "./arr.zip")); - QVERIFY(QDir("./test").removeRecursively()); - QVERIFY(zip.extract("./arr.zip", "./test")); - - auto after = utils.getTree("./test"); - - QVERIFY(utils.compareTree(befor, after).size() == 0); - - -} - -void deploytest::runTestParams(QStringList list, - QSet* tree, - bool noWarnings, bool onlySize, - exitCodes exitCode, - const std::function &cb) { - - QuasarAppUtils::Params::parseParams(list); - - Deploy deploy; - int code = deploy.run(); - if (code != exitCode) { - qDebug() << "Needed exit Code = " << exitCode; - qDebug() << "Exit Code = " << code; - - QVERIFY(false && "exit code not valid"); - } - - if (tree) { - checkResults(*tree, noWarnings, onlySize); - } - - if (cb) - cb(DeployCore::_config); -} - -void deploytest::checkResults(const QSet &tree, - bool noWarnings, - bool onlySize) { - TestUtils utils; - - QVERIFY(DeployCore::_config); - QVERIFY(!DeployCore::_config->getTargetDir().isEmpty()); - - auto resultTree = utils.getTree(DeployCore::_config->getTargetDir()); - -#ifdef Q_OS_WIN - // Remove all API-MS-Win libs, because each OS Windows have a own bundle of this api libs. - // See the https://github.com/QuasarApp/CQtDeployer/issues/481#issuecomment-755156875 post for more information. - resultTree = TestModule.ignoreFilter(resultTree, "API-MS-Win"); - -#endif - - - auto comapre = utils.compareTree(resultTree, tree); - - if (onlySize) { - QVERIFY(resultTree.size() > tree.size()); - return; - } - - if (comapre.size() != 0) { - - bool bug = false; - QJsonObject comapreResult; - - for (auto i = comapre.begin(); i != comapre.end(); ++i) { - - if (i.value() == 1) { - comapreResult[ i.key()] = "Added unnecessary file"; - qCritical() << "added unnecessary file : " + i.key(); - bug = true; - } else if (filesTree.contains(QFileInfo(i.key()).fileName())) { - comapreResult[ i.key()] = "Missing"; - qCritical() << "Missing file : " + i.key(); - bug = true; - } else if (noWarnings) { - comapreResult[ i.key()] = " not exits in qt Dir"; - - qCritical() << "File : " + i.key() + " not exits in qt Dir"; - bug = true; - } else { - comapreResult[ i.key()] = " not exits in qt Dir"; - qWarning() << "File : " + i.key() + " not exits in qt Dir"; - } - } - - if (!bug) { - return; - } - - QJsonObject obj; - for (const auto &i : qAsConst(resultTree)) { - obj[i]; - } - - QJsonDocument doc(obj); - - QFile lasttree("./LastTree.json"); - lasttree.open(QIODevice::WriteOnly| QIODevice::Truncate); - - lasttree.write(doc.toJson()); - lasttree.close(); - - lasttree.setFileName("./CompareTree.json"); - lasttree.open(QIODevice::WriteOnly| QIODevice::Truncate); - - lasttree.write(QJsonDocument(comapreResult).toJson()); - lasttree.close(); - - QVERIFY2(false, "runTestParams fail"); - - - } - -} - -void deploytest::createTree(const QStringList &tree) { - for (const auto& dir : tree) { - QDir().mkpath(dir); - } -} - -void deploytest::costomScript() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/TestOnlyC.sh"}); - QString bin = TestBinDir + "TestOnlyC"; - QString scriptPath = "./" + DISTRO_DIR + "/TestOnlyC.sh"; - -#else - QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - "./" + DISTRO_DIR + "/qt.conf"}); - QString bin = TestBinDir + "TestOnlyC.exe"; - QString scriptPath = "./" + DISTRO_DIR + "/TestOnlyC.bat"; - - -#endif - - runTestParams({"-bin", bin, "force-clear", "noOverwrite", "-libOut", "lib"}, &comapareTree); - - QFile script(scriptPath); - QVERIFY(script.open(QIODevice::ReadOnly)); - auto scriptText = script.readAll(); - - QVERIFY(!scriptText.contains("Begin Custom Script")); - - script.close(); - - runTestParams({"-bin", bin, "force-clear", "noOverwrite", - "-libOut", "lib", - "-customScript", "echo 'this is test script'"}, &comapareTree); - - QVERIFY(script.open(QIODevice::ReadOnly)); - - scriptText = script.readAll(); - - QVERIFY(scriptText.contains("Begin Custom Script")); - QVERIFY(scriptText.contains("echo 'this is test script'")); - QVERIFY(scriptText.contains("End Custom Script")); - - script.close(); - - - - -} - -void deploytest::testOverwrite() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/TestOnlyC.sh"}); - QString bin = TestBinDir + "TestOnlyC"; - -#else - QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - "./" + DISTRO_DIR + "/qt.conf"}); - QString bin = TestBinDir + "TestOnlyC.exe"; - -#endif - - runTestParams({"-bin", bin, "force-clear", "noOverwrite"}, &comapareTree); - - QVERIFY(f.open(QIODevice::ReadOnly)); - auto hashBefor = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); - f.close(); - - QVERIFY(f.open(QIODevice::WriteOnly | QIODevice::Append)); - f.write(QByteArray(10, '1')); - f.close(); - - QVERIFY(f.open(QIODevice::ReadOnly)); - auto hashAfter = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); - f.close(); - - QVERIFY(hashAfter != hashBefor); - - runTestParams({"-bin", bin, "noOverwrite"}, &comapareTree); - - QVERIFY(f.open(QIODevice::ReadOnly)); - hashAfter = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); - f.close(); - - QVERIFY(hashAfter != hashBefor); - - - runTestParams({"-bin", bin}, &comapareTree); - - QVERIFY(f.open(QIODevice::ReadOnly)); - hashAfter = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5); - f.close(); - - QVERIFY(hashAfter == hashBefor); - -} - -void deploytest::testOverwriteWithPacking() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly"; - -#else - QString bin = TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe"; - -#endif -#ifdef Q_OS_UNIX - auto comapareTreeqif = utils.createTree( - { - "./" + DISTRO_DIR + "/InstallerTest.run", - "./" + DISTRO_DIR + "/InstallerTest.run.md5", - }); -#else - auto comapareTreeqif = utils.createTree( - { - "./" + DISTRO_DIR + "/InstallerTest.exe", - "./" + DISTRO_DIR + "/InstallerTest.exe.md5", - - }); - -#endif - - runTestParams({"-bin", bin, - "force-clear", - "noOverwrite", - "qif", - "qifFromSystem", - "-name", "Test"}, &comapareTreeqif); -} - -void deploytest::testextraData() { - TestUtils utils; - - -#ifdef Q_OS_UNIX - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/build/TestOnlyC", - "./" + DISTRO_DIR + "/build/TestCPPOnly", - "./" + DISTRO_DIR + "/build/QtWidgetsProject", - "./" + DISTRO_DIR + "/build/TestQMLWidgets", - "./" + DISTRO_DIR + "/build/basic", - "./" + DISTRO_DIR + "/build/quicknanobrowser", - "./" + DISTRO_DIR + "/build/webui"}); -#else - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/build/TestOnlyC.exe", - "./" + DISTRO_DIR + "/build/TestCPPOnly.exe", - "./" + DISTRO_DIR + "/build/QtWidgetsProject.exe", - "./" + DISTRO_DIR + "/build/TestQMLWidgets.exe", - "./" + DISTRO_DIR + "/build/basic.exe"}); -#endif - - - runTestParams({"-extraData", TestBinDir, "clear", - "noCheckRPATH", "noCheckPATH", "noQt"}, &comapareTree); - - - comapareTree = TestModule.replace(comapareTree, { - {"DistributionKit/build", - "DistributionKit/myExtraData/build"}}); - - runTestParams({"-extraData", TestBinDir, "clear", - "noCheckRPATH", "noCheckPATH", "noQt", - "-extraDataOut", "myExtraData"}, &comapareTree); -} - -void deploytest::testConfFile() { - TestUtils utils; - - - QFile::remove(TestBinDir + "/TestConf.json"); - QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); - -#ifdef Q_OS_UNIX - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/TestOnlyC.sh"}); -#else - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - "./" + DISTRO_DIR + "/qt.conf"}); -#endif - -#ifdef Q_OS_UNIX - runTestParams({"-bin", TestBinDir + "TestOnlyC", "clear" , "noCheckRPATH", "noCheckPATH", "noQt", - "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); -#else - runTestParams({"-bin", TestBinDir + "TestOnlyC.exe", "clear" , "noCheckRPATH", "noCheckPATH", "noQt", - "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); -#endif - - - QVERIFY(QFile::exists(TestBinDir + "/TestConf.json")); - QFile::remove(TestBinDir + "/TestConf.json"); - - - -#ifdef Q_OS_UNIX - comapareTree += utils.createTree( - {"./" + DISTRO_DIR + "/bin/TestCPPOnly", - "./" + DISTRO_DIR + "/TestCPPOnly.sh"}); -#else - comapareTree += utils.createTree( - {"./" + DISTRO_DIR + "/TestCPPOnly.exe", - "./" + DISTRO_DIR + "/TestCPPOnly.bat"}); -#endif - -#ifdef Q_OS_UNIX - runTestParams({"-bin", TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly", - "clear", "noCheckRPATH", "noCheckPATH", "noQt", - "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); -#else - runTestParams({"-bin", TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe", - "clear" , "-libDir", "L:/never/absalut/path", "noCheckPATH", "noQt", - "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); -#endif - - QFile confFile(TestBinDir + "/TestConf.json"); - QVERIFY(confFile.open(QIODevice::ReadOnly)); - - auto data = confFile.readAll(); - confFile.close(); - - QJsonDocument doc; - doc = doc.fromJson(data); - QVERIFY(!doc.isNull()); - -#ifdef Q_OS_UNIX - - QVERIFY(data.contains("\"bin\": [")); - QVERIFY(data.contains("./TestOnlyC")); - QVERIFY(data.contains("./TestCPPOnly")); - - QVERIFY(data.contains("\"clear\": true")); - - data.insert(data.size() - 2, QString(",\"libDir\": \"/never/absalut/path/\"").toLatin1()); - - QVERIFY(confFile.open(QIODevice::WriteOnly | QIODevice::Truncate)); - confFile.write(data); - confFile.close(); - - runTestParams({"-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); -#else - - QVERIFY(data.contains("\"bin\": [")); - QVERIFY(data.contains("./TestOnlyC.exe")); - QVERIFY(data.contains("./TestCPPOnly.exe")); - QVERIFY(data.contains("\"libDir\": \"L:/never/absalut/path\"")); - - QVERIFY(data.contains("\"clear\": true")); - - runTestParams({"-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); - -#endif - - QVERIFY(QuasarAppUtils::Params::isEndable("clear")); - QVERIFY(QuasarAppUtils::Params::isEndable("bin")); - QVERIFY(QuasarAppUtils::Params::isEndable("libDir")); -#ifdef Q_OS_UNIX - QVERIFY(QuasarAppUtils::Params::getArg("libDir") == "/never/absalut/path/"); -#else - QVERIFY(QuasarAppUtils::Params::getArg("libDir") == "L:/never/absalut/path"); -#endif - QFile::remove(TestBinDir + "/TestConf.json"); - - -#ifdef Q_OS_UNIX - runTestParams({"-bin", TestBinDir + "TestOnlyC," + TestBinDir + "TestCPPOnly", - "clear" , "noCheckRPATH", "noCheckPATH", "noQt", - "-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); -#else - runTestParams({"-bin", TestBinDir + "TestOnlyC.exe," + TestBinDir + "TestCPPOnly.exe", - "clear" , "noCheckPATH", "noQt", - "-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); -#endif - - confFile.setFileName(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); - QVERIFY(confFile.open(QIODevice::ReadOnly)); - - data = confFile.readAll(); - confFile.close(); - - doc = doc.fromJson(data); - QVERIFY(!doc.isNull()); - -#ifdef Q_OS_UNIX - - QVERIFY(data.contains("\"bin\": [")); - QVERIFY(data.contains("./../../../../../build/TestOnlyC")); - QVERIFY(data.contains("./../../../../../build/TestCPPOnly")); - - QVERIFY(data.contains("\"clear\": true")); - QString qmake = TestQtDir + "bin/qmake"; - -#else - - QVERIFY(data.contains("\"bin\": [")); - QVERIFY(data.contains("./../../../../../build/TestOnlyC.exe")); - QVERIFY(data.contains("./../../../../../build/TestCPPOnly.exe")); - - QVERIFY(data.contains("\"clear\": true")); - QString qmake = TestQtDir + "bin/qmake.exe"; - -#endif - runTestParams({"-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); - - QVERIFY(QuasarAppUtils::Params::isEndable("clear")); - QVERIFY(QuasarAppUtils::Params::isEndable("bin")); - - QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); - - // Test generar string in confFile - comapareTree = TestModule.qtLibs(); - - comapareTree = TestModule.ignoreFilter(comapareTree, "/plugins/p"); -#ifdef Q_OS_UNIX - comapareTree -= utils.createTree( - { - "./" + DISTRO_DIR + "/lib/libQt5EglFSDeviceIntegration.so", - }); - auto bin = TestBinDir + "QtWidgetsProject"; -#else - comapareTree -= utils.createTree( - { - "./" + DISTRO_DIR + "/Qt5DBus.dll" - - }); - auto bin = TestBinDir + "QtWidgetsProject.exe"; -#endif - - runTestParams({"-bin", bin, - "-qmake", qmake, - "clear", - "-ignore", "/plugins/p", - "-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); - - - runTestParams({"-confFile", TestBinDir + "/TestConf.json"}, &comapareTree); - QFile::remove(TestBinDir + "/TestConf.json"); - -#ifdef Q_OS_UNIX - QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); - comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/package/TestOnlyC.sh", - "./" + DISTRO_DIR + "/package/bin/TestOnlyC", - "./" + DISTRO_DIR + "/package/bin/qt.conf" - }); - QString target1 = TestBinDir + "TestOnlyC"; - -#else - QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); - comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/package/TestOnlyC.exe", - "./" + DISTRO_DIR + "/package/TestOnlyC.bat", - "./" + DISTRO_DIR + "/package/qt.conf"}); - QString target1 = TestBinDir + "TestOnlyC.exe"; - -#endif - bin = target1; - - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", "package;TestOn", - "-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, &comapareTree); - - runTestParams({"-confFile", TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"}, - &comapareTree); - QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); - - auto file = "testCase.json"; -#ifdef Q_OS_UNIX - bin = TestBinDir + "QtWidgetsProject," + TestBinDir + "TestOnlyC"; -#else - bin = TestBinDir + "QtWidgetsProject.exe," + TestBinDir + "TestOnlyC.exe"; -#endif - QVERIFY(utils.deployFile(":/testResurces/testRes/testMultiPackageConfig.json", file, - {{"$BIN_DIR", bin.toLatin1()}})); - - comapareTree = TestModule.onlyC(DISTRO_DIR + "/Dstro1") + - TestModule.qtLibs(DISTRO_DIR + "/Dstro2"); - - - runTestParams({"-confFile", file}, - &comapareTree); - - QFile::remove(TestBinDir + "/TestConf.json"); - QFile::remove(TestBinDir + "/../folder/For/Testing/Deploy/File/TestConf.json"); - -} - -void deploytest::testPackages() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QFile f("./" + DISTRO_DIR + "/bin/TestOnlyC"); - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/package/TestOnlyC.sh", - "./" + DISTRO_DIR + "/package/bin/TestOnlyC", - "./" + DISTRO_DIR + "/package/bin/qt.conf" - }); - QString target1 = TestBinDir + "TestOnlyC"; - -#else - QFile f("./" + DISTRO_DIR + "/TestOnlyC.exe"); - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "/package/TestOnlyC.exe", - "./" + DISTRO_DIR + "/package/TestOnlyC.bat", - "./" + DISTRO_DIR + "/package/qt.conf"}); - QString target1 = TestBinDir + "TestOnlyC.exe"; - -#endif - QString bin = target1; - - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", "/package/;TestOn"}, &comapareTree); - - runTestParams({"-bin", bin, "force-clear", - "-targetPackage", "/package/;" + QFileInfo(target1).absoluteFilePath()}, &comapareTree); - -#ifdef Q_OS_UNIX - QString target2 = TestBinDir + "TestQMLWidgets"; - QString target3 = TestBinDir + "QtWidgetsProject"; - -#else - QString target2 = TestBinDir + "TestQMLWidgets.exe"; - QString target3 = TestBinDir + "QtWidgetsProject.exe"; - -#endif - bin += "," + target2; - bin += "," + target3; - - auto packageString = "package1;" + QFileInfo(target1).absoluteFilePath() + ",package2/ZzZ;" + QFileInfo(target2).absoluteFilePath(); - - comapareTree = TestModule.testDistroLibs(DISTRO_DIR); - - runTestParams({"-bin", bin, "force-clear", - "-binOut", "/lol", - "-libOut", "/lolLib", - "-trOut", "/lolTr", - "-pluginOut", "/p", - "-qmlOut", "package2/ZzZ;/q/and/q,/q", - "-qmlDir", "package2/ZzZ;" + TestBinDir + "/../TestQMLWidgets", - "-targetPackage", packageString}, &comapareTree); - - -#ifdef Q_OS_UNIX - - // test a wrapers source - QFile wraper("./" + DISTRO_DIR + "/package2/ZzZ/TestQMLWidgets.sh"); - - QVERIFY(wraper.open(QIODevice::ReadOnly)); - auto data = wraper.readAll(); - wraper.close(); - - wraper.setFileName(":/testResurces/testRes/TestQMLWidgets.sh"); - QVERIFY(wraper.open(QIODevice::ReadOnly)); - QVERIFY(wraper.readAll() == data); - wraper.close(); -#endif -} - -void deploytest::testQt() { - TestUtils utils; - - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "QtWidgetsProject"; - QString qmake = TestQtDir + "bin/qmake"; - -#else - QString bin = TestBinDir + "QtWidgetsProject.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; - -#endif - - - auto comapareTree = TestModule.qtLibs(); - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake}, &comapareTree); - - // test auto detection of detection qmake from PATH - runTestParams({"-bin", bin, "clear", "noCheckRPATH"}, &comapareTree); - -#ifdef Q_OS_UNIX - // test auto detection of detection qmake from RPATH - runTestParams({"-bin", bin, "clear", "noCheckPATH"}, &comapareTree); -#endif - - - comapareTree = TestModule.qtWithoutTr(); - - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, "noTranslations"}, &comapareTree); - - - comapareTree = TestModule.qmlLibs(); - -#ifdef Q_OS_UNIX - bin = TestBinDir + "TestQMLWidgets"; -#else - bin = TestBinDir + "TestQMLWidgets.exe"; - -#endif - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-qmlDir", TestBinDir + "/../TestQMLWidgets"}, &comapareTree); - - -#ifdef Q_OS_UNIX - - runTestParams({"-bin", bin, "clear" , - "-qmlDir", TestBinDir + "/../TestQMLWidgets"}, &comapareTree); - -#endif - -} - -void deploytest::testClear() { - TestUtils utils; - - - auto compareTree = QSet{}; - - runTestParams({"clear"}, &compareTree); - -} - -void deploytest::testIgnore() { - TestUtils utils; - - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "QtWidgetsProject"; - QString qmake = TestQtDir + "bin/qmake"; - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/QtWidgetsProject.sh", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/bin/QtWidgetsProject", - }); - -#else - QString bin = TestBinDir + "QtWidgetsProject.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/qt.conf", - "./" + DISTRO_DIR + "/QtWidgetsProject.exe", - "./" + DISTRO_DIR + "/QtWidgetsProject.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "/libstdc++-6.dll", - "./" + DISTRO_DIR + "/libwinpthread-1.dll" - - }); - -#endif - - - if (!TestQtDir.contains("Qt5")) { - -#ifdef Q_OS_UNIX - bin = TestBinDir + "QtWidgetsProject"; - qmake = TestQtDir + "bin/qmake"; - -#else - bin = TestBinDir + "QtWidgetsProject.exe"; - qmake = TestQtDir + "bin/qmake.exe"; - -#endif - } - - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-ignore", "Qt5"}, &comapareTree); - - - -#ifdef Q_OS_UNIX - auto removeTree = utils.createTree({ - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_hangul.so", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_openwnn.so", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_pinyin.so", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_tcime.so", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/libqtvirtualkeyboard_thai.so", - "./" + DISTRO_DIR + "/plugins/platforminputcontexts/libqtvirtualkeyboardplugin.so", - "./" + DISTRO_DIR + "/lib/libQt5VirtualKeyboard.so", - - }); -#else - auto removeTree = utils.createTree({ - "./" + DISTRO_DIR + "/Qt5VirtualKeyboard.dll", - "./" + DISTRO_DIR + "/plugins/platforminputcontexts/qtvirtualkeyboardplugin.dll", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_hangul.dll", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_openwnn.dll", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_pinyin.dll", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_tcime.dll", - "./" + DISTRO_DIR + "/plugins/virtualkeyboard/qtvirtualkeyboard_thai.dll" - }); - -#endif - - comapareTree = TestModule.qtLibs() - removeTree; - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-ignore", "VirtualKeyboard"}, &comapareTree); - -} - -void deploytest::testIgnoreEnv() { - - - - Envirement env; - QDir("./testTree").removeRecursively(); - - QStringList ignoreTree = { - "./testTree/test", - "./testTree/", - "./testTree/test1/1", - "./testTree/test2/1/", - }; - - QStringList testTree = { - "./testTree/test/z", - "./testTree/z", - "./testTree/test1/1z", - "./testTree/test2/1/z", - }; - - createTree(ignoreTree); - createTree(testTree); - - env.setIgnoreEnvList(ignoreTree); - env.addEnv(ignoreTree); - - // must be empty becouse all pathes is ignored - QVERIFY(env.size() == 0); - - env.addEnv(testTree); - - // must be equals 4 becouse all pathes is not ignored - QVERIFY(env.size() == 4); - - // try add dublicate - env.addEnv(testTree); - - // must be equals 4 becouse all dublicates must be ignored - QVERIFY(env.size() == 4); - - QVERIFY(QDir("./testTree").removeRecursively()); -} - -void deploytest::testLibDir() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - QString extraPath = "/usr/lib,/lib"; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.sh", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/bin/TestOnlyC" - }); - -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - QString extraPath = TestQtDir; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/qt.conf", - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - - }); - -#endif - - - - - runTestParams({"-bin", bin, "clear" , - "-libDir", extraPath, - }, &comapareTree); - - -#ifdef Q_OS_UNIX - comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.sh", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/lib/libstdc++.so", - "./" + DISTRO_DIR + "/lib/libgcc_s.so", - "./" + DISTRO_DIR + "/lib/ld-linux-x86-64.so", - "./" + DISTRO_DIR + "/lib/libc.so", - "./" + DISTRO_DIR + "/lib/libm.so", - }); - - auto comapareTreeExtraLib = utils.createTree( - { - "./" + DISTRO_DIR + "2/TestOnlyC.sh", - "./" + DISTRO_DIR + "2/bin/qt.conf", - "./" + DISTRO_DIR + "2/bin/TestOnlyC", - "./" + DISTRO_DIR + "2/lib/libstdc++.so", - "./" + DISTRO_DIR + "2/lib/libgcc_s.so" - }); - -#else - comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/qt.conf", - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "/libwinpthread-1.dll", - "./" + DISTRO_DIR + "/libstdc++-6.dll", - - }); - - auto comapareTreeExtraLib = utils.createTree( - { - "./" + DISTRO_DIR + "2/qt.conf", - "./" + DISTRO_DIR + "2/TestOnlyC.exe", - "./" + DISTRO_DIR + "2/TestOnlyC.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "2/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "2/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "2/libstdc++-6.dll", - - }); - -#endif - - - runTestParams({"-bin", bin, "clear" , - "-libDir", extraPath, - "-recursiveDepth", "5", - "noCheckRPATH, noCheckPATH", "noQt"}, &comapareTree, true); - - runTestParams({"-bin", bin, "clear" , - "-targetDir", "./" + DISTRO_DIR + "2", - "-extraLibs", "stdc,gcc", - "noCheckRPATH, noCheckPATH", "noQt"}, &comapareTreeExtraLib, true); - - //task #258 - //https://github.com/QuasarApp/CQtDeployer/issues/258 - - -#ifdef Q_OS_UNIX - comapareTreeExtraLib = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.sh", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/lib/libstdc++.so", - "./" + DISTRO_DIR + "/lib/libgcc_s.so" - }); - extraPath = "./" + DISTRO_DIR + "2/lib"; - - -#else - - comapareTreeExtraLib = utils.createTree( - { - "./" + DISTRO_DIR + "/qt.conf", - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "/libstdc++-6.dll", - - }); - extraPath = "./" + DISTRO_DIR + "2"; - -#endif - runTestParams({"-bin", bin, "clear" , - "-libDir", extraPath, - "noCheckRPATH, noCheckPATH", "noQt"}, &comapareTreeExtraLib, true); - - QDir(extraPath).removeRecursively(); - -} - -void deploytest::testExtraPlugins() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "QtWidgetsProject"; - QString qmake = TestQtDir + "bin/qmake"; - - auto pluginTree = utils.createTree( - { - "./" + DISTRO_DIR + "/plugins/sqldrivers/libqsqlodbc.so", - "./" + DISTRO_DIR + "/plugins/sqldrivers/libqsqlpsql.so", - "./" + DISTRO_DIR + "/plugins/sqldrivers/libqsqlite.so", - "./" + DISTRO_DIR + "/lib/libQt5Sql.so", - "./" + DISTRO_DIR + "/lib/libpq.so", - "./" + DISTRO_DIR + "/lib/libcrypto.so", - "./" + DISTRO_DIR + "/lib/libssl.so", - - }); -#else - QString bin = TestBinDir + "QtWidgetsProject.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; - - auto pluginTree = utils.createTree( - { - "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlmysql.dll", - "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlodbc.dll", - "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlite.dll", - "./" + DISTRO_DIR + "/plugins/sqldrivers/qsqlpsql.dll", - "./" + DISTRO_DIR + "/Qt5Sql.dll", - "./" + DISTRO_DIR + "/libpq.dll", - - }); -#endif - - auto comapareTree = TestModule.qtLibs(); - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - }, &comapareTree); - - - comapareTree = comapareTree + pluginTree; - - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-enablePlugins", "sqldrivers"}, &comapareTree); - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-extraPlugin", TestQtDir + "/plugins/sqldrivers"}, &comapareTree); - - comapareTree -= pluginTree; - comapareTree -= utils.createTree( - { - "./" + DISTRO_DIR + "/plugins/platforms/libqxcb.so", - "./" + DISTRO_DIR + "/lib/libxcb-xinerama.so.0", - "./" + DISTRO_DIR + "/plugins/xcbglintegrations/libqxcb-egl-integration.so", - "./" + DISTRO_DIR + "/plugins/xcbglintegrations/libqxcb-glx-integration.so", - "./" + DISTRO_DIR + "/lib/libQt5XcbQpa.so", - - }); - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "-disablePlugins", "qxcb,xcbglintegrations"}, &comapareTree); -} - -void deploytest::testTargetDir() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "Z/bin/TestOnlyC", - "./" + DISTRO_DIR + "Z/bin/qt.conf", - "./" + DISTRO_DIR + "Z/TestOnlyC.sh"}); -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - - auto comapareTree = utils.createTree( - {"./" + DISTRO_DIR + "Z/TestOnlyC.exe", - "./" + DISTRO_DIR + "Z/TestOnlyC.bat", - "./" + DISTRO_DIR + "Z/qt.conf"}); -#endif - - runTestParams({"-bin", bin, "clear" , - "-targetDir", "./" + DISTRO_DIR + "Z" - }, &comapareTree); -} - -void deploytest::testSystemLib() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - QString qmake = TestQtDir + "bin/qmake"; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.sh", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/lib/systemLibs/libgcc_s.so", - "./" + DISTRO_DIR + "/lib/systemLibs/libstdc++.so" - }); - -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", - "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", - "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", - "./" + DISTRO_DIR + "/qt.conf" - }); - -#endif - - runTestParams({"-bin", bin, "clear" , - "deploySystem", - "-qmake", qmake, - }, &comapareTree); - -#ifdef Q_OS_WIN - bin = TestBinDir + "QtWidgetsProject.exe"; - - comapareTree += TestModule.qtLibs(); - - comapareTree -= utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", - "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", - - }); - - comapareTree += utils.createTree( - { - "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", - "./" + DISTRO_DIR + "/qt.conf", - "./" + DISTRO_DIR + "/systemLibs/mpr.dll", - "./" + DISTRO_DIR + "/systemLibs/profapi.dll", - "./" + DISTRO_DIR + "/systemLibs/rpcrt4.dll", - "./" + DISTRO_DIR + "/systemLibs/shell32.dll", - "./" + DISTRO_DIR + "/systemLibs/userenv.dll", - "./" + DISTRO_DIR + "/systemLibs/uxtheme.dll", - "./" + DISTRO_DIR + "/systemLibs/version.dll", - "./" + DISTRO_DIR + "/systemLibs/ucrtbase.dll", - "./" + DISTRO_DIR + "/systemLibs/oleaut32.dll", - "./" + DISTRO_DIR + "/systemLibs/bcryptprimitives.dll", - "./" + DISTRO_DIR + "/systemLibs/msvcp_win.dll", - "./" + DISTRO_DIR + "/systemLibs/wtsapi32.dll", - "./" + DISTRO_DIR + "/systemLibs/combase.dll", - #if !defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/systemLibs/sspicli.dll", - "./" + DISTRO_DIR + "/systemLibs/cryptbase.dll", - #endif - - }); - - -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - comapareTree += utils.createTree( - { - "./" + DISTRO_DIR + "/systemLibs/d3d11.dll", - "./" + DISTRO_DIR + "/systemLibs/dxgi.dll", - "./" + DISTRO_DIR + "/systemLibs/win32u.dll", - }); -#endif - - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "deploySystem" - }, &comapareTree); - - -#endif -} - -void deploytest::testOutDirs() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestQMLWidgets"; - QString qmake = TestQtDir + "bin/qmake"; - -#else - QString bin = TestBinDir + "TestQMLWidgets.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; - - -#endif - - auto comapareTree = TestModule.testOutLibs(); - - runTestParams({"-bin", bin, "clear" , - "-binOut", "/lol", - "-libOut", "/lolLib", - "-trOut", "/lolTr", - "-pluginOut", "/p", - "-qmlOut", "/q", - "-qmake", qmake, - "-qmlDir", TestBinDir + "/../TestQMLWidgets" - }, &comapareTree); - - QFile file; - - file.setFileName("./" + DISTRO_DIR + "/lol/qt.conf"); - - QVERIFY(file.open(QIODevice::ReadOnly)); - - auto runScript = file.readAll(); - file.close(); - - QVERIFY(runScript.contains("Prefix= ./../")); - QVERIFY(runScript.contains("Libraries= ./lolLib/")); - QVERIFY(runScript.contains("Plugins= ./p/")); - QVERIFY(runScript.contains("Imports= ./q/")); - QVERIFY(runScript.contains("Translations= ./lolTr/")); - QVERIFY(runScript.contains("Qml2Imports= ./q/")); - -#ifdef Q_OS_WIN - - - runTestParams({"-bin", bin, "clear" , - "-binOut", "/lol", - "-libOut", "/lolLib", - "-trOut", "/lolTr", - "-pluginOut", "/p", - "-qmlOut", "/q", - "-qmake", qmake, - "-qmlDir", TestBinDir + "/../TestQMLWidgets" - }, &comapareTree); - - - - file.setFileName( "./" + DISTRO_DIR + "/TestQMLWidgets.bat"); - - QVERIFY(file.open(QIODevice::ReadOnly)); - - runScript = file.readAll(); - file.close(); - - qDebug() << "runScript =" << runScript; - - QVERIFY(runScript.contains("SET BASE_DIR=%~dp0")); - QVERIFY(runScript.contains("SET PATH=%BASE_DIR%\\lol\\;%BASE_DIR%\\lolLib\\;%PATH%")); - QVERIFY(runScript.contains("start \"TestQMLWidgets\" /B \"%BASE_DIR%\\lol\\TestQMLWidgets.exe\" %*")); - - runTestParams({"-bin", TestBinDir + "TestOnlyC.exe", "clear", - }, nullptr); - - file.setFileName( "./" + DISTRO_DIR + "/TestOnlyC.bat"); - - QVERIFY(file.open(QIODevice::ReadOnly)); - - runScript = file.readAll(); - file.close(); - - qDebug() << "runScript =" << runScript; - - QVERIFY(runScript.contains("call \"%BASE_DIR%\\TestOnlyC.exe\" %*")); - -#endif - -} - -QTEST_APPLESS_MAIN(deploytest) - -#include "tst_deploytest.moc" diff --git a/tests/units/deploytest.h b/tests/units/deploytest.h deleted file mode 100644 index 787c9a0f..00000000 --- a/tests/units/deploytest.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) 2018-2022 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 -#include -#include - - -#include -#include -#include -#include - -// add necessary includes here - - -static const QString TestBinDir = TEST_BIN_DIR; -static const QString TestQtDir = QT_BASE_DIR; - -class deploytest : public QObject -{ - Q_OBJECT - -private: - QSet filesTree; - - void runTestParams(QStringList list, - QSet *tree = nullptr, - bool noWarnings = false, - bool onlySize = false, - exitCodes exitCode = exitCodes::Good, - const std::function &cb = {}); - - void checkResults(const QSet &tree, - bool noWarnings, - bool onlySize = false); - - void createTree(const QStringList& tree); - -public: - deploytest(); - /** - * @brief generateLib - * @param paath - * @return size of lib - */ - int generateLib(const QString& paath); - void deleteLib(const QString& paath); - - ~deploytest(); - -private slots: - void initTestCase(); - void cleanupTestCase(); - - // old tests (not valid) - void testDeployTarget(); - void testStrip(); - void testExtractLib(); - void testRelativeLink(); - void testCheckQt(); - - void testQmlExtrct(); - void testSetTargetDir(); - - // void mainTests(); - - // end old tests - - // tested flags customScript - - void testZip(); - void costomScript(); - void testDistroStruct(); - - // tested flags clear noOvervrite - void testOverwrite(); - void testOverwriteWithPacking(); - - // tested flags binDir - void testextraData(); - - // tested flags qmlDir qmake - void testQt(); - - - void testWebEngine(); - - // tested flags confFile - void testConfFile(); - - // tested flags targetPackage - void testPackages(); - - // tested clear force clear in clear mode - void testClear(); - - // tested flags ignore - void testIgnore(); - - // tested flags ignore ignoreEnv - void testIgnoreEnv(); - - // tested flags libDir recursiveDepth - void testLibDir(); - - // tested flag extraPlugin - void testExtraPlugins(); - - // tested flag targetDir - void testTargetDir(); - - // tested flag noLibc deploySystem - void testSystemLib(); - - // tested flag qmlOut libOut trOut pluginOut binOut - void testOutDirs(); - - void testMSVC(); - - // qif flags - void testQIF(); - void testQIFMulti(); - void testQIFCustom(); - - // zip flags - void testZIP(); - void testZIPMulti(); - - // deb flags - void testDEB(); - void testDEBMulti(); - void testDEBCustom(); - - // qif and zip flags - void testMultiPacking(); - - // init flags - void testInit(); - - void testDependencyMap(); - - void testQmlScaner(); - - void testPrefix(); - // test configure empty packages - void testallowEmptyPackages(); - // test skip empty packages - void testEmptyPackages(); - - void testRunScripts(); - void testOverridingDefaultTemplateQIF(); - void testOverridingDefaultTemplateDEB(); - - void testDeployGeneralFiles(); - void testTr(); - void testVirtualKeyBoard(); - // Attention! This test only covers 40% of icon functions - void testIcons(); - void testPathUtils(); - void testBinPrefix(); - - void testMd5(); - - void testDisableShortcuts(); - void testDisableRunScripts(); - void testQifOut(); - void testIgnoreEnvWithLibDir(); - - // note: this test checking in manual mode only. - void testInstallDirsOptions(); - - void testQIFResources(); - - void testCustomPlatform(); - void testQifArchiveFormat(); - void testQifBinaryCreator(); - - void customTest(); -}; diff --git a/tests/units/disablerunscripttest.cpp b/tests/units/disablerunscripttest.cpp index dfae9b41..a18affe5 100644 --- a/tests/units/disablerunscripttest.cpp +++ b/tests/units/disablerunscripttest.cpp @@ -12,7 +12,7 @@ #include #include #include - +#include "modules.h" void DisableRunScriptTest::test() { @@ -32,33 +32,3 @@ void DisableRunScriptTest::test() { "-disableRunScript", "TestOnlyC"}, &comapareTreeqif); } -void deploytest::testQifOut() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; -#else - QString bin = TestBinDir + "TestOnlyC.exe"; -#endif - -#ifdef Q_OS_UNIX - auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, - {DISTRO_DIR + "/DEB_OUT.deb"}, {DISTRO_DIR + "/DEB_OUT.deb.md5"}, - {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); - - // Run deploy installer - runTestParams({"-bin", bin, "clear", - "qif", "-qifOut", "QIF_OUT.exe", - "deb", "-debOut", "DEB_OUT.deb", - "zip", "-zipOut", "ZIP_OUT.zip"}, &result); -#else - auto result = utils.createTree({{DISTRO_DIR + "/QIF_OUT.exe"}, {DISTRO_DIR + "/QIF_OUT.exe.md5"}, - {DISTRO_DIR + "/ZIP_OUT.zip"}, {DISTRO_DIR + "/ZIP_OUT.zip.md5"}}); - - // Run deploy installer - runTestParams({"-bin", bin, "clear", - "qif", "-qifOut", "QIF_OUT.exe", - "zip", "-zipOut", "ZIP_OUT.zip"}, &result); -#endif - -} diff --git a/tests/units/emptypackagestest.cpp b/tests/units/emptypackagestest.cpp index af1c43cb..7ccc1812 100644 --- a/tests/units/emptypackagestest.cpp +++ b/tests/units/emptypackagestest.cpp @@ -7,6 +7,7 @@ #include "emptypackagestest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/extractlibtest.cpp b/tests/units/extractlibtest.cpp index c2004894..dac0852a 100644 --- a/tests/units/extractlibtest.cpp +++ b/tests/units/extractlibtest.cpp @@ -7,6 +7,7 @@ #include "extractlibtest.h" +#include "libcreator.h" #include #include #include diff --git a/tests/units/extradatatest.cpp b/tests/units/extradatatest.cpp index b890779f..81cf0131 100644 --- a/tests/units/extradatatest.cpp +++ b/tests/units/extradatatest.cpp @@ -7,6 +7,7 @@ #include "extradatatest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/extrapluginstest.cpp b/tests/units/extrapluginstest.cpp index a22924a2..9ef6be45 100644 --- a/tests/units/extrapluginstest.cpp +++ b/tests/units/extrapluginstest.cpp @@ -7,6 +7,7 @@ #include "extrapluginstest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/iconstest.cpp b/tests/units/iconstest.cpp index c65864f2..4f7acd73 100644 --- a/tests/units/iconstest.cpp +++ b/tests/units/iconstest.cpp @@ -7,6 +7,7 @@ #include "iconstest.h" +#include "defines.h" #include #include #include diff --git a/tests/units/ignoretest.cpp b/tests/units/ignoretest.cpp index 7eb51d95..72212d38 100644 --- a/tests/units/ignoretest.cpp +++ b/tests/units/ignoretest.cpp @@ -7,6 +7,7 @@ #include "ignoretest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/outdirtest.cpp b/tests/units/outdirtest.cpp index 70e8172c..d869747b 100644 --- a/tests/units/outdirtest.cpp +++ b/tests/units/outdirtest.cpp @@ -7,6 +7,7 @@ #include "outdirtest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/overridingtemplatedebtest.h b/tests/units/overridingtemplatedebtest.h index 09497cb4..d9abf74d 100644 --- a/tests/units/overridingtemplatedebtest.h +++ b/tests/units/overridingtemplatedebtest.h @@ -16,9 +16,6 @@ class OverridingDefaultTemplateDEBTest: public TestBase, protected TestUtils { public: - StripTest(); - ~StripTest(); - void test(); }; diff --git a/tests/units/packagestest.cpp b/tests/units/packagestest.cpp index 4836c9c9..96bc6451 100644 --- a/tests/units/packagestest.cpp +++ b/tests/units/packagestest.cpp @@ -7,6 +7,7 @@ #include "packagestest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/pathutilstest.cpp b/tests/units/pathutilstest.cpp index 17c22219..ae12506b 100644 --- a/tests/units/pathutilstest.cpp +++ b/tests/units/pathutilstest.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include diff --git a/tests/units/prefixtest.cpp b/tests/units/prefixtest.cpp index c8018e33..17ae46a3 100644 --- a/tests/units/prefixtest.cpp +++ b/tests/units/prefixtest.cpp @@ -7,6 +7,7 @@ #include "prefixtest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/qifwbinarycreatortest.cpp b/tests/units/qifwbinarycreatortest.cpp index 73f9f1c2..0e483564 100644 --- a/tests/units/qifwbinarycreatortest.cpp +++ b/tests/units/qifwbinarycreatortest.cpp @@ -7,6 +7,7 @@ #include "qifwbinarycreatortest.h" +#include "Distributions/qif.h" #include #include #include diff --git a/tests/units/qmlextracttest.cpp b/tests/units/qmlextracttest.cpp index d91dc803..3023f5ff 100644 --- a/tests/units/qmlextracttest.cpp +++ b/tests/units/qmlextracttest.cpp @@ -7,6 +7,8 @@ #include "qmlextracttest.h" +#include "qml.h" +#include "qmlcreator.h" #include #include #include diff --git a/tests/units/qmlscanertest.cpp b/tests/units/qmlscanertest.cpp index f959f7e5..8cccf5ba 100644 --- a/tests/units/qmlscanertest.cpp +++ b/tests/units/qmlscanertest.cpp @@ -7,6 +7,7 @@ #include "qmlscanertest.h" +#include "qml.h" #include #include #include diff --git a/tests/units/qttest.cpp b/tests/units/qttest.cpp index 63af68f5..f661d59d 100644 --- a/tests/units/qttest.cpp +++ b/tests/units/qttest.cpp @@ -7,6 +7,7 @@ #include "qttest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/releativelinktest.cpp b/tests/units/releativelinktest.cpp index ad4b2ca5..791c7406 100644 --- a/tests/units/releativelinktest.cpp +++ b/tests/units/releativelinktest.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include diff --git a/tests/units/runscriptstest.cpp b/tests/units/runscriptstest.cpp index d3030fab..e6c965c8 100644 --- a/tests/units/runscriptstest.cpp +++ b/tests/units/runscriptstest.cpp @@ -7,6 +7,7 @@ #include "runscriptstest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/systemlibtest.cpp b/tests/units/systemlibtest.cpp new file mode 100644 index 00000000..d2f851b6 --- /dev/null +++ b/tests/units/systemlibtest.cpp @@ -0,0 +1,121 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#include "systemlibtest.h" +#include +#include +#include +#include +#include + + +void SystemLibTest::test() { + TestUtils utils; + +#ifdef Q_OS_UNIX + QString bin = TestBinDir + "TestOnlyC"; + QString qmake = TestQtDir + "bin/qmake"; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.sh", + "./" + DISTRO_DIR + "/bin/qt.conf", + "./" + DISTRO_DIR + "/bin/TestOnlyC", + "./" + DISTRO_DIR + "/lib/systemLibs/libgcc_s.so", + "./" + DISTRO_DIR + "/lib/systemLibs/libstdc++.so" + }); + +#else + QString bin = TestBinDir + "TestOnlyC.exe"; + QString qmake = TestQtDir + "bin/qmake.exe"; + + auto comapareTree = utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", + "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", + "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", + "./" + DISTRO_DIR + "/qt.conf" + }); + +#endif + + runTestParams({"-bin", bin, "clear" , + "deploySystem", + "-qmake", qmake, + }, &comapareTree); + +#ifdef Q_OS_WIN + bin = TestBinDir + "QtWidgetsProject.exe"; + + comapareTree += TestModule.qtLibs(); + + comapareTree -= utils.createTree( + { + "./" + DISTRO_DIR + "/TestOnlyC.exe", + "./" + DISTRO_DIR + "/TestOnlyC.bat", + #if defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", + #else + "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", + #endif + "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", + "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", + + }); + + comapareTree += utils.createTree( + { + "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", + "./" + DISTRO_DIR + "/qt.conf", + "./" + DISTRO_DIR + "/systemLibs/mpr.dll", + "./" + DISTRO_DIR + "/systemLibs/profapi.dll", + "./" + DISTRO_DIR + "/systemLibs/rpcrt4.dll", + "./" + DISTRO_DIR + "/systemLibs/shell32.dll", + "./" + DISTRO_DIR + "/systemLibs/userenv.dll", + "./" + DISTRO_DIR + "/systemLibs/uxtheme.dll", + "./" + DISTRO_DIR + "/systemLibs/version.dll", + "./" + DISTRO_DIR + "/systemLibs/ucrtbase.dll", + "./" + DISTRO_DIR + "/systemLibs/oleaut32.dll", + "./" + DISTRO_DIR + "/systemLibs/bcryptprimitives.dll", + "./" + DISTRO_DIR + "/systemLibs/msvcp_win.dll", + "./" + DISTRO_DIR + "/systemLibs/wtsapi32.dll", + "./" + DISTRO_DIR + "/systemLibs/combase.dll", + #if !defined(Q_OS_WIN64) + "./" + DISTRO_DIR + "/systemLibs/sspicli.dll", + "./" + DISTRO_DIR + "/systemLibs/cryptbase.dll", + #endif + + }); + + +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + comapareTree += utils.createTree( + { + "./" + DISTRO_DIR + "/systemLibs/d3d11.dll", + "./" + DISTRO_DIR + "/systemLibs/dxgi.dll", + "./" + DISTRO_DIR + "/systemLibs/win32u.dll", + }); +#endif + + + runTestParams({"-bin", bin, "clear" , + "-qmake", qmake, + "deploySystem" + }, &comapareTree); + + +#endif + +} diff --git a/tests/units/systemlibtest.h b/tests/units/systemlibtest.h new file mode 100644 index 00000000..4f9bf47c --- /dev/null +++ b/tests/units/systemlibtest.h @@ -0,0 +1,23 @@ +//# +//# Copyright (C) 2020-2022 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. +//# + + +#ifndef SYSTEM_LIB_TEST_H +#define SYSTEM_LIB_TEST_H +#include "testbase.h" +#include "testutils.h" + +#include + +class SystemLibTest: public TestBase, protected TestUtils +{ +public: + void test() override; + +}; + +#endif // SYSTEM_LIB_TEST_H diff --git a/tests/units/targetdirtest.cpp b/tests/units/targetdirtest.cpp index 1b993f14..3d8347e6 100644 --- a/tests/units/targetdirtest.cpp +++ b/tests/units/targetdirtest.cpp @@ -36,108 +36,3 @@ void TargetDirTest::test() { "-targetDir", "./" + DISTRO_DIR + "Z" }, &comapareTree); } - -void deploytest::testSystemLib() { - TestUtils utils; - -#ifdef Q_OS_UNIX - QString bin = TestBinDir + "TestOnlyC"; - QString qmake = TestQtDir + "bin/qmake"; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.sh", - "./" + DISTRO_DIR + "/bin/qt.conf", - "./" + DISTRO_DIR + "/bin/TestOnlyC", - "./" + DISTRO_DIR + "/lib/systemLibs/libgcc_s.so", - "./" + DISTRO_DIR + "/lib/systemLibs/libstdc++.so" - }); - -#else - QString bin = TestBinDir + "TestOnlyC.exe"; - QString qmake = TestQtDir + "bin/qmake.exe"; - - auto comapareTree = utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", - "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", - "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", - "./" + DISTRO_DIR + "/qt.conf" - }); - -#endif - - runTestParams({"-bin", bin, "clear" , - "deploySystem", - "-qmake", qmake, - }, &comapareTree); - -#ifdef Q_OS_WIN - bin = TestBinDir + "QtWidgetsProject.exe"; - - comapareTree += TestModule.qtLibs(); - - comapareTree -= utils.createTree( - { - "./" + DISTRO_DIR + "/TestOnlyC.exe", - "./" + DISTRO_DIR + "/TestOnlyC.bat", - #if defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_seh-1.dll", - #else - "./" + DISTRO_DIR + "/systemLibs/libgcc_s_dw2-1.dll", - #endif - "./" + DISTRO_DIR + "/systemLibs/libstdc++-6.dll", - "./" + DISTRO_DIR + "/systemLibs/libwinpthread-1.dll", - - }); - - comapareTree += utils.createTree( - { - "./" + DISTRO_DIR + "/systemLibs/msvcrt.dll", - "./" + DISTRO_DIR + "/qt.conf", - "./" + DISTRO_DIR + "/systemLibs/mpr.dll", - "./" + DISTRO_DIR + "/systemLibs/profapi.dll", - "./" + DISTRO_DIR + "/systemLibs/rpcrt4.dll", - "./" + DISTRO_DIR + "/systemLibs/shell32.dll", - "./" + DISTRO_DIR + "/systemLibs/userenv.dll", - "./" + DISTRO_DIR + "/systemLibs/uxtheme.dll", - "./" + DISTRO_DIR + "/systemLibs/version.dll", - "./" + DISTRO_DIR + "/systemLibs/ucrtbase.dll", - "./" + DISTRO_DIR + "/systemLibs/oleaut32.dll", - "./" + DISTRO_DIR + "/systemLibs/bcryptprimitives.dll", - "./" + DISTRO_DIR + "/systemLibs/msvcp_win.dll", - "./" + DISTRO_DIR + "/systemLibs/wtsapi32.dll", - "./" + DISTRO_DIR + "/systemLibs/combase.dll", - #if !defined(Q_OS_WIN64) - "./" + DISTRO_DIR + "/systemLibs/sspicli.dll", - "./" + DISTRO_DIR + "/systemLibs/cryptbase.dll", - #endif - - }); - - -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - comapareTree += utils.createTree( - { - "./" + DISTRO_DIR + "/systemLibs/d3d11.dll", - "./" + DISTRO_DIR + "/systemLibs/dxgi.dll", - "./" + DISTRO_DIR + "/systemLibs/win32u.dll", - }); -#endif - - - runTestParams({"-bin", bin, "clear" , - "-qmake", qmake, - "deploySystem" - }, &comapareTree); - - -#endif -} diff --git a/tests/units/testbase.cpp b/tests/units/testbase.cpp index 4cb1907e..49e4325e 100644 --- a/tests/units/testbase.cpp +++ b/tests/units/testbase.cpp @@ -5,8 +5,8 @@ #include #include -static const QString TestBinDir = TEST_BIN_DIR; -static const QString TestQtDir = QT_BASE_DIR; +const QString TestBase::TestBinDir = TEST_BIN_DIR; +const QString TestBase::TestQtDir = QT_BASE_DIR; TestBase::TestBase() { diff --git a/tests/units/testbase.h b/tests/units/testbase.h index da79a612..961e366d 100644 --- a/tests/units/testbase.h +++ b/tests/units/testbase.h @@ -7,7 +7,6 @@ #include - class TestBase: public Test { public: @@ -33,6 +32,10 @@ class TestBase: public Test exitCodes exitCode = exitCodes::Good, const std::function &cb = {}); + + static const QString TestBinDir; + static const QString TestQtDir; + private: QSet filesTree; diff --git a/tests/units/virtualkeybordtest.cpp b/tests/units/virtualkeybordtest.cpp index bdb2a7c5..8caec410 100644 --- a/tests/units/virtualkeybordtest.cpp +++ b/tests/units/virtualkeybordtest.cpp @@ -7,6 +7,7 @@ #include "virtualkeybordtest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/webenginetest.cpp b/tests/units/webenginetest.cpp index f43d6e8c..c18cfd37 100644 --- a/tests/units/webenginetest.cpp +++ b/tests/units/webenginetest.cpp @@ -7,6 +7,7 @@ #include "webenginetest.h" +#include "modules.h" #include #include #include diff --git a/tests/units/ziparrchivetest.cpp b/tests/units/ziparrchivetest.cpp index 434c6f6c..ff1d4f54 100644 --- a/tests/units/ziparrchivetest.cpp +++ b/tests/units/ziparrchivetest.cpp @@ -7,6 +7,7 @@ #include "ziparrchivetest.h" +#include "zipcompresser.h" #include #include #include From 6c041e43769f077d0889901dd684170bc3ffab61 Mon Sep 17 00:00:00 2001 From: EndrII Date: Sat, 13 Aug 2022 21:37:08 +0300 Subject: [PATCH 09/76] fix default deploy stem for linux --- .gitignore | 2 +- CMakeLists.txt | 6 ++--- src/CQtDeployer/CMakeLists.txt | 9 ++++---- src/CQtDeployer/Deploy/CQtDeployer.json | 27 ---------------------- src/CQtDeployer/Deploy/CQtDeployer.json.in | 8 +++---- src/LibDeploy/CMakeLists.txt | 2 +- submodules/QuasarAppLib | 2 +- tests/CMakeLists.txt | 4 ++-- 8 files changed, 16 insertions(+), 44 deletions(-) delete mode 100644 src/CQtDeployer/Deploy/CQtDeployer.json diff --git a/.gitignore b/.gitignore index 9d42563e..8e052635 100644 --- a/.gitignore +++ b/.gitignore @@ -87,4 +87,4 @@ CTestTestfile.cmake _deps src/LibDeploy/src/deploy_global.h src/QtELFReader/src/elfreader_global.h - +src/CQtDeployer/Deploy/CQtDeployer.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 069e0608..2b2d3566 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,9 +19,10 @@ set(CMAKE_AUTOUIC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(BUILD_SHARED_LIBS ON) -if (ANDROID OR IOS) - set(BUILD_SHARED_LIBS ON) +if (IOS) + set(BUILD_SHARED_LIBS OFF) endif() if (NOT QT_VERSION_MAJOR) @@ -50,7 +51,6 @@ make_directory(Distro) initAll() add_subdirectory(submodules/QuasarAppLib) - add_subdirectory(src/QtELFReader) option(BUILD_COMMAND_LINE_TOOLS "Build Command Line Tools" OFF) diff --git a/src/CQtDeployer/CMakeLists.txt b/src/CQtDeployer/CMakeLists.txt index ee013e06..671b6e11 100644 --- a/src/CQtDeployer/CMakeLists.txt +++ b/src/CQtDeployer/CMakeLists.txt @@ -9,7 +9,7 @@ cmake_minimum_required(VERSION 3.18) get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) -set(CURRENT_PROJECT "${PROJECT_NAME}${CURRENT_PROJECT_DIR}") +set(CURRENT_PROJECT "${PROJECT_NAME}") option(SIGN_APP "This option enable od disabled sign apk and aab files" ON) file(GLOB_RECURSE SOURCE_CPP @@ -28,7 +28,6 @@ set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Private") -updateGitVars() if (${QT_VERSION_MAJOR} EQUAL 6) @@ -43,7 +42,7 @@ else() endif() -target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}LibDeploy) +target_link_libraries(${CURRENT_PROJECT} PUBLIC LibDeploy) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) @@ -71,4 +70,6 @@ set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR}/../ "${LANGS}") - +set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") +configure_file("${global_file}.in" ${global_file} @ONLY) +addDeployFromCustomFile(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") diff --git a/src/CQtDeployer/Deploy/CQtDeployer.json b/src/CQtDeployer/Deploy/CQtDeployer.json deleted file mode 100644 index c12e5c2c..00000000 --- a/src/CQtDeployer/Deploy/CQtDeployer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "bin": [ - "src/build/Debug/CQtDeployerEaxample", - "src/build/Debug/CQtDeployerEaxample.exe" - ], - "clear": true, - "binPrefix": "/media/D/builds/build-CQtDeployerCmakePort-Desktop_Qt_5_15_2_GCC_64bit-Debug", - "libDir": [ - "/media/D/builds/CQtDeployerCmakePort", - "/home/andrei/Qt/5.15.2/gcc_64", - "/media/D/builds/build-CQtDeployerCmakePort-Desktop_Qt_5_15_2_GCC_64bit-Debug" - ], - "recursiveDepth": "10", - "deploySystem": false, - "qmlDir": "../", - "deb": true, - "qif": true, - "zip": true, - "ignoreEnv": [ - "/media/D/builds/CQtDeployerCmakePort/Distro" - ], - "extraLib": "crypto", - "targetDir": "/media/D/builds/CQtDeployerCmakePort/Distro", - "deployVersion": "", - -} - diff --git a/src/CQtDeployer/Deploy/CQtDeployer.json.in b/src/CQtDeployer/Deploy/CQtDeployer.json.in index a607dc68..8c0227c3 100644 --- a/src/CQtDeployer/Deploy/CQtDeployer.json.in +++ b/src/CQtDeployer/Deploy/CQtDeployer.json.in @@ -1,7 +1,7 @@ { "bin": [ - "src/build/Debug/CQtDeployerEaxample", - "src/build/Debug/CQtDeployerEaxample.exe" + "src/CQtDeployer/CQtDeployer", + "src/CQtDeployer/CQtDeployer.exe" ], "clear": true, "binPrefix": "@CMAKE_BINARY_DIR@", @@ -12,16 +12,14 @@ ], "recursiveDepth": "10", "deploySystem": false, - "qmlDir": "../", "deb": true, "qif": true, "zip": true, "ignoreEnv": [ "@CMAKE_SOURCE_DIR@/Distro" ], - "extraLib": "crypto", "targetDir": "@CMAKE_SOURCE_DIR@/Distro", - "deployVersion": "@CQtDeployer_VERSION@", + "deployVersion": "@CQtDeployer_VERSION@" } diff --git a/src/LibDeploy/CMakeLists.txt b/src/LibDeploy/CMakeLists.txt index e0ccc8af..5cc7e907 100644 --- a/src/LibDeploy/CMakeLists.txt +++ b/src/LibDeploy/CMakeLists.txt @@ -9,7 +9,7 @@ cmake_minimum_required(VERSION 3.18) get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) -set(CURRENT_PROJECT "${PROJECT_NAME}${CURRENT_PROJECT_DIR}") +set(CURRENT_PROJECT "${CURRENT_PROJECT_DIR}") add_definitions(-DCQT_DEPLOYER_LIBRARY) diff --git a/submodules/QuasarAppLib b/submodules/QuasarAppLib index 00cdfae2..5bf7366b 160000 --- a/submodules/QuasarAppLib +++ b/submodules/QuasarAppLib @@ -1 +1 @@ -Subproject commit 00cdfae297832196ef1d4268c7bfcdbbb20eaf19 +Subproject commit 5bf7366b6dcd57720f5d145ed987134a61aaf2e5 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d42ab424..e8d89647 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -9,7 +9,7 @@ cmake_minimum_required(VERSION 3.18) get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) -set(CURRENT_PROJECT "${PROJECT_NAME}${CURRENT_PROJECT_DIR}") +set(CURRENT_PROJECT "${PROJECT_NAME}-${CURRENT_PROJECT_DIR}") file(GLOB_RECURSE SOURCE_CPP "*.cpp" "*.h" "*.qrc" @@ -24,7 +24,7 @@ add_definitions(-DQT_BASE_DIR="${QT_QT_ROOT}") add_definitions(-DTEST_BIN_DIR="${CMAKE_CURRENT_LIST_DIR}") add_executable(${CURRENT_PROJECT} ${SOURCE_CPP}) -target_link_libraries(${CURRENT_PROJECT} PRIVATE Qt${QT_VERSION_MAJOR}::Test ${PROJECT_NAME}LibDeploy) +target_link_libraries(${CURRENT_PROJECT} PRIVATE Qt${QT_VERSION_MAJOR}::Test LibDeploy) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) From b9b8719bf3d402c4fdba2fb5782097808439079b Mon Sep 17 00:00:00 2001 From: EndrII Date: Sun, 14 Aug 2022 02:23:52 +0300 Subject: [PATCH 10/76] added cqtdeployer configuration --- .gitignore | 4 + CMakeLists.txt | 6 +- src/CQtDeployer/CMakeLists.txt | 26 +- src/CQtDeployer/Deploy/CQtDeployer.json.in | 35 +- src/CQtDeployer/Deploy/QIFW.py | 47 ++ .../Deploy/QIFWTemplate/config/banner.png | Bin 0 -> 392487 bytes .../Deploy/QIFWTemplate/config/config.xml | 18 + .../QIFWTemplate/config/controlScript.js | 53 ++ .../Deploy/QIFWTemplate/config/icon.ico | Bin 0 -> 39353 bytes .../Deploy/QIFWTemplate/config/logo.png | Bin 0 -> 24729 bytes .../Deploy/QIFWTemplate/config/ru.ts | 53 ++ .../Deploy/QIFWTemplate/config/style.css | 61 ++ .../packages/QIF/meta/package.xml.in | 8 + .../QIFWTemplate/packages/QIF/meta/ru.ts | 4 + .../cqtdeployer.1_6/data/1.5/bin/cqt.sh | 7 + .../cqtdeployer.1_6/data/1.5/icon.png | Bin 0 -> 143802 bytes .../cqtdeployer.1_6/meta/installscript.js | 152 +++++ .../cqtdeployer.1_6/meta/package.xml.in | 14 + .../packages/cqtdeployer.1_6/meta/ru.ts | 53 ++ .../packages/cqtdeployer/meta/package.xml.in | 10 + .../packages/cqtdeployer/meta/ru.ts | 4 + src/CQtDeployer/languages/de.ts | 42 ++ src/CQtDeployer/languages/en.ts | 42 ++ src/CQtDeployer/languages/es.ts | 42 ++ src/CQtDeployer/languages/fr.ts | 42 ++ src/CQtDeployer/languages/ja.ts | 42 ++ src/CQtDeployer/languages/pl.ts | 42 ++ src/CQtDeployer/languages/ru.ts | 42 ++ src/CQtDeployer/languages/tr.ts | 42 ++ src/CQtDeployer/languages/uk.ts | 42 ++ src/CQtDeployer/languages/zh.ts | 42 ++ src/LibDeploy/CMakeLists.txt | 3 +- src/QtELFReader/CMakeLists.txt | 3 +- .../Marketplace/CqtDeployer-Manifest.json | 40 ++ src/docs/Marketplace/Marketplace.md | 33 ++ src/docs/README.md | 13 + src/docs/_config.yml | 1 + src/docs/en/1_4.md | 422 ++++++++++++++ src/docs/en/1_5.md | 158 +++++ src/docs/en/Build-and-Install.md | 90 +++ src/docs/en/Changelog.md | 363 ++++++++++++ src/docs/en/CompareFeatures.md | 17 + src/docs/en/CustomScripts.md | 69 +++ src/docs/en/DEB.md | 101 ++++ src/docs/en/DeployConfigFile.md | 228 ++++++++ src/docs/en/Description.md | 9 + src/docs/en/DisableShortcats.md | 19 + src/docs/en/EnvironmentVariables.md | 50 ++ src/docs/en/ExtraFiles.md | 107 ++++ src/docs/en/ExtractDefaultsTemplates.md | 49 ++ src/docs/en/Guide.md | 550 ++++++++++++++++++ src/docs/en/Home.md | 26 + src/docs/en/Options.md | 174 ++++++ src/docs/en/Packing.md | 139 +++++ src/docs/en/QIF.md | 176 ++++++ src/docs/en/QuickGuide.md | 81 +++ src/docs/en/ReleaseReviews.md | 4 + src/docs/en/ZIP.md | 47 ++ src/docs/ru/1_4.md | 409 +++++++++++++ src/docs/ru/1_5.md | 157 +++++ src/docs/ru/Build-and-Install.md | 86 +++ src/docs/ru/Changelog.md | 346 +++++++++++ src/docs/ru/CompareFeatures.md | 15 + src/docs/ru/CustomScripts.md | 68 +++ src/docs/ru/DEB.md | 100 ++++ src/docs/ru/DeployConfigFile.md | 226 +++++++ src/docs/ru/Description.md | 9 + src/docs/ru/DisableShortcats.md | 19 + src/docs/ru/EnvironmentVariables.md | 46 ++ src/docs/ru/ExtraFiles.md | 107 ++++ src/docs/ru/ExtractDefaultsTemplates.md | 56 ++ src/docs/ru/Guide.md | 536 +++++++++++++++++ src/docs/ru/Home.md | 26 + src/docs/ru/Options.md | 171 ++++++ src/docs/ru/Packing.md | 138 +++++ src/docs/ru/QIF.md | 175 ++++++ src/docs/ru/QuickGuide.md | 81 +++ src/docs/ru/ReleaseReviews.md | 4 + src/docs/ru/ZIP.md | 47 ++ src/docs/screenshots/customStyle.png | Bin 0 -> 26438 bytes src/docs/screenshots/defaultStyle.png | Bin 0 -> 16985 bytes src/docs/screenshots/quasaraStyle.png | Bin 0 -> 24609 bytes submodules/QuasarAppLib | 2 +- 83 files changed, 6762 insertions(+), 9 deletions(-) create mode 100755 src/CQtDeployer/Deploy/QIFW.py create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/banner.png create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/icon.ico create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/logo.png create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/ru.ts create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/style.css create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml.in create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/ru.ts create mode 100755 src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/bin/cqt.sh create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/icon.png create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/installscript.js create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml.in create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/ru.ts create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml.in create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/ru.ts create mode 100644 src/docs/Marketplace/CqtDeployer-Manifest.json create mode 100644 src/docs/Marketplace/Marketplace.md create mode 100644 src/docs/README.md create mode 100644 src/docs/_config.yml create mode 100755 src/docs/en/1_4.md create mode 100755 src/docs/en/1_5.md create mode 100644 src/docs/en/Build-and-Install.md create mode 100755 src/docs/en/Changelog.md create mode 100644 src/docs/en/CompareFeatures.md create mode 100644 src/docs/en/CustomScripts.md create mode 100644 src/docs/en/DEB.md create mode 100644 src/docs/en/DeployConfigFile.md create mode 100644 src/docs/en/Description.md create mode 100644 src/docs/en/DisableShortcats.md create mode 100644 src/docs/en/EnvironmentVariables.md create mode 100644 src/docs/en/ExtraFiles.md create mode 100644 src/docs/en/ExtractDefaultsTemplates.md create mode 100644 src/docs/en/Guide.md create mode 100644 src/docs/en/Home.md create mode 100644 src/docs/en/Options.md create mode 100644 src/docs/en/Packing.md create mode 100644 src/docs/en/QIF.md create mode 100644 src/docs/en/QuickGuide.md create mode 100755 src/docs/en/ReleaseReviews.md create mode 100644 src/docs/en/ZIP.md create mode 100755 src/docs/ru/1_4.md create mode 100755 src/docs/ru/1_5.md create mode 100644 src/docs/ru/Build-and-Install.md create mode 100755 src/docs/ru/Changelog.md create mode 100644 src/docs/ru/CompareFeatures.md create mode 100644 src/docs/ru/CustomScripts.md create mode 100644 src/docs/ru/DEB.md create mode 100644 src/docs/ru/DeployConfigFile.md create mode 100644 src/docs/ru/Description.md create mode 100644 src/docs/ru/DisableShortcats.md create mode 100644 src/docs/ru/EnvironmentVariables.md create mode 100644 src/docs/ru/ExtraFiles.md create mode 100644 src/docs/ru/ExtractDefaultsTemplates.md create mode 100644 src/docs/ru/Guide.md create mode 100644 src/docs/ru/Home.md create mode 100644 src/docs/ru/Options.md create mode 100644 src/docs/ru/Packing.md create mode 100644 src/docs/ru/QIF.md create mode 100644 src/docs/ru/QuickGuide.md create mode 100755 src/docs/ru/ReleaseReviews.md create mode 100644 src/docs/ru/ZIP.md create mode 100644 src/docs/screenshots/customStyle.png create mode 100644 src/docs/screenshots/defaultStyle.png create mode 100644 src/docs/screenshots/quasaraStyle.png diff --git a/.gitignore b/.gitignore index 8e052635..58d00e65 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,7 @@ _deps src/LibDeploy/src/deploy_global.h src/QtELFReader/src/elfreader_global.h src/CQtDeployer/Deploy/CQtDeployer.json +src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml +src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml +src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml +src/CQtDeployer/Deploy/QIFW/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b2d3566..98ee1585 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,11 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test QUIET) include(submodules/QuasarAppLib/CMake/QuasarApp.cmake) updateGitVars() -set(CQT_DEPLOYER_VERSION "1.6.${GIT_COMMIT_COUNT}.${GIT_COMMIT_HASH}") + +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") option(CQT_DEPLOYER_TESTS "This option disables or enables tests of the ${PROJECT_NAME} project" ON) option(CQT_DEPLOYER_TOOL "This option disables or enables example app of the ${PROJECT_NAME} project" ON) diff --git a/src/CQtDeployer/CMakeLists.txt b/src/CQtDeployer/CMakeLists.txt index 671b6e11..34de4ae4 100644 --- a/src/CQtDeployer/CMakeLists.txt +++ b/src/CQtDeployer/CMakeLists.txt @@ -70,6 +70,28 @@ set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR}/../ "${LANGS}") -set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") -configure_file("${global_file}.in" ${global_file} @ONLY) +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") + +# qifw installer +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/QIF/meta/package.xml") + + addDeployFromCustomFile(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") + +set(QIFW_PLATFORM linux) + +if (WIN32) + set(QIFW_PLATFORM windows) +endif() + +ADD_CUSTOM_TARGET( + downloadQIFW + SOURCES ${${name}files} + COMMAND python "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW.py" ${QIFW_PLATFORM} ${QIFW_VERSION} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW" + COMMENT python "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW.py" ${QIFW_PLATFORM} ${QIFW_VERSION} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) +add_dependencies(deploy${CURRENT_PROJECT} downloadQIFW) + diff --git a/src/CQtDeployer/Deploy/CQtDeployer.json.in b/src/CQtDeployer/Deploy/CQtDeployer.json.in index 8c0227c3..112c4746 100644 --- a/src/CQtDeployer/Deploy/CQtDeployer.json.in +++ b/src/CQtDeployer/Deploy/CQtDeployer.json.in @@ -1,8 +1,20 @@ { + + "allowEmptyPackages": true, + "targetPackage": [ + ["CQtDeployer", "nothing"], + ["CQtDeployer.1_6", "CQtDeployer"] + + ], + "extraData": [ + ["QIFW", "./QIFW"] + ], + "bin": [ "src/CQtDeployer/CQtDeployer", "src/CQtDeployer/CQtDeployer.exe" ], + "clear": true, "binPrefix": "@CMAKE_BINARY_DIR@", "libDir": [ @@ -10,10 +22,31 @@ "@CMAKE_PREFIX_PATH@", "@CMAKE_BINARY_DIR@" ], + + "publisher": [ + ["QIFW", "Qt corporation"], + ["CQtDeployer.1_6", "QuasarApp group"] + ], + "releaseDate": [ + ["QIFW", "@TODAY@"], + ["CQtDeployer.1_6", "@TODAY@"] + ], + "name": [ + ["QIFW", "QtInstallerFramework"], + ["CQtDeployer.1_6", "CQtDeployer"] + ], + + "deployVersion": [ + ["QIFW", "@QIFW_VERSION@"], + ["CQtDeployer.1_6", "@CQT_DEPLOYER_VERSION@"], + ["CQtDeployer", "@CQT_DEPLOYER_VERSION_SHORT_PREFIX@"] + + ], + "recursiveDepth": "10", "deploySystem": false, "deb": true, - "qif": true, + "qif": "./QIFWTemplate", "zip": true, "ignoreEnv": [ "@CMAKE_SOURCE_DIR@/Distro" diff --git a/src/CQtDeployer/Deploy/QIFW.py b/src/CQtDeployer/Deploy/QIFW.py new file mode 100755 index 00000000..96aa4a8a --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFW.py @@ -0,0 +1,47 @@ +import sys +import os +import subprocess +import shutil +from glob import glob + +PLATFORM = sys.argv[1] +VERSION = sys.argv[2] +PATHQIF = sys.argv[3] + +if len(PLATFORM) <= 0: + PLATFORM = "linux" + +if os.path.isdir(PATHQIF + "/QIF"): + print("if target already executed") + exit(0) + +print("PLATFORM=" + PLATFORM) +print("VERSION=" + VERSION) + +# Command Example : aqt tool linux tools_ifw 4.0 qt.tools.ifw.40 +command = ["aqt", + "install-tool", + "--outputdir", + PATHQIF, + PLATFORM, + "desktop", + "tools_ifw", + "qt.tools.ifw." + VERSION.replace('.', '')] + +print("command=" + " ".join(command)) + +subprocess.call(command) + +BASEPATHQIF = PATHQIF + "/Tools/QtInstallerFramework/" + VERSION[0:3] + +for file in glob(BASEPATHQIF + "/bin/repogen*"): + os.remove(file) +for file in glob(BASEPATHQIF + "/bin/archivegen*"): + os.remove(file) +for file in glob(BASEPATHQIF + "/bin/devtool*"): + os.remove(file) + +os.rename(PATHQIF + "/Tools/QtInstallerFramework/" + VERSION[0:3] + "/bin/", + PATHQIF + "/QIF") +shutil.rmtree(PATHQIF + "/Tools") +os.remove("aqtinstall.log") diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/banner.png b/src/CQtDeployer/Deploy/QIFWTemplate/config/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd40d4a62d03281e9cb0cd55d0485d4e3ad4f80 GIT binary patch literal 392487 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%0Alj%U}I2efPmim(7jnpLp&L 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

3E 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 z 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 zt@gns172W + + 640px + 400px + CQtDeployer + 1.5.4.17 + CQtDeployer + QuasarApp + CQtDeployer + @HomeDir@/CQtDeployer + true + true + controlScript.js + CQtDeployerTool + Modern + style.css + logo.png + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js b/src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js new file mode 100644 index 00000000..5d823ed7 --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js @@ -0,0 +1,53 @@ +function Controller() +{ + generateTr(); + + installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes); + installer.uninstallationFinished.connect(this, Controller.prototype.uninstallationFinished); + installer.installationFinished.connect(this, Controller.prototype.installationFinished); + + +} + +Controller.prototype.ComponentSelectionPageCallback = function() +{ + var widget = gui.currentPageWidget(); // get the current wizard page + if (widget !== null && installer.isInstaller()) { + widget.deselectAll(); + widget.selectComponent('cqtdeployer.1_6'); + widget.selectComponent('QIF'); + + } +} + +function generateTr() { + console.log("generate tr start ") + + installer.setValue("Name", qsTr("CQtDeployer")); + installer.setValue("Title", qsTr("Install CQtDeployer")); +} + +Controller.prototype.uninstallationFinished = function() +{ + +} + + +Controller.prototype.installationFinished = function() +{ + + if (systemInfo.kernelType === "winnt") { + + QMessageBox["information"](qsTr("install in system"), qsTr("Installer"), + qsTr("CQtDeployer successfully installed on your computer to use the call \"cqtdeployer\"."), + QMessageBox.Ok); + + } else { + + QMessageBox["information"](qsTr("install in system"), qsTr("Installer"), + qsTr("CQtDeployer successfully installed on your computer to use the call \"cqtdeployer\", cqt or cqtdeployer.cqt."), + QMessageBox.Ok); + } + + +} diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/icon.ico b/src/CQtDeployer/Deploy/QIFWTemplate/config/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e39643da7f814b8ece7fcde7dd6642017c9e466f GIT binary patch literal 39353 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 literal 0 HcmV?d00001 diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/logo.png b/src/CQtDeployer/Deploy/QIFWTemplate/config/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6f912788f9fc1257bafe879c7776248aef135bb5 GIT binary patch literal 24729 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 literal 0 HcmV?d00001 diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/ru.ts b/src/CQtDeployer/Deploy/QIFWTemplate/config/ru.ts new file mode 100644 index 00000000..1b284c01 --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/config/ru.ts @@ -0,0 +1,53 @@ + + + + + controlScript + + + CQtDeployer + CQtDeployer + + + + Install CQtDeployer + Install Snake + Установка CQtDeployer + + + + + install in system + Установка в систему + + + + + Installer + Установщик + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + To uninstall cqtdeployer on your system, you need administrator rights!. + Чтобы удалить cqtdeployer в вашей системе, вам нужны права администратора !. + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + To install cqtdeployer on your system, you need administrator rights!. + Чтобы установить cqtdeployer в вашей системе, вам нужны права администратора!. + + + The installation was successful, but cqtdeployer will not be available from the console. + Установка прошла успешно, но cqtdeployer не будет доступен из консоли. + + + Example: + Пример: + + + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/style.css b/src/CQtDeployer/Deploy/QIFWTemplate/config/style.css new file mode 100644 index 00000000..7ff14bdf --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/config/style.css @@ -0,0 +1,61 @@ +.QWidget { + background-color: rgb(255, 255, 255); +} + +.QLabel { + color: #000000; +} + +.QPushButton { + background-color: transparent; + border: 2px solid #ffffff; + border-radius: 3px; + height: 30px; + min-width: 100px; + padding: 0 15px; +} + +.QPushButton:pressed, +.QPushButton:checked { + background-color: #2ed3ed; +} + +.QPushButton:focus { + background-color: #aaf2ff; +} + +.QPushButton:hover { + border: 2px solid #2ed3ed; +} + + +.QProgressBar { + background: #b1dbcc; + border: 1px solid #cdcdcd; + border-radius: 2px; + padding: 0; + margin: 0; + color: #ffffff; + height: 30px; + text-align: center; +} + +.QProgressBar::chunk { + background: #16dbcc; + border-radius: 2px; + margin: 0; +} + +.QProgressBar:hover { + border-color: #2ed3ed; +} + +.QLineEdit { + background-color: transparent; + border-color: #cdcdcd; + height: 30px; +} + +.QLineEdit:hover { + border-color: #2ed3ed; +} diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml.in b/src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml.in new file mode 100644 index 00000000..7114500e --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml.in @@ -0,0 +1,8 @@ + + + Qt Installer Framework + Qt Installer Framework for CQtDeployer + @QIFW_VERSION@ + @TODAY@ + true + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/ru.ts b/src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/ru.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/ru.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/bin/cqt.sh b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/bin/cqt.sh new file mode 100755 index 00000000..46dcf9f9 --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/bin/cqt.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +function join_by { local IFS="$1"; shift; echo "$*"; } + +var=$(join_by , $@) +cqtdeployer $var -bin $var + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/icon.png b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c282fec8feafadd6be1a7e53e90db148b34a82c GIT binary patch literal 143802 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 vf!Xh;;Nzx5_5GD>%!X@U; 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 UUT0aL)Bpeg07*qoM6N<$f=b^i#Q*>R literal 0 HcmV?d00001 diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/installscript.js b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/installscript.js new file mode 100644 index 00000000..8e445fa9 --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/installscript.js @@ -0,0 +1,152 @@ +const VERSION = "$VERSION" + +function Component() +{ + generateTr(); +} + +function generateTr() { + component.setValue("DisplayName", qsTr("CQtDeployer " + VERSION )); + component.setValue("Description", qsTr("This package contains CQtDeployer version " + VERSION)); +} + +Component.prototype.createOperations = function() { +// // call default implementation to actually install README.txt! + component.createOperations(); + systemIntegration(); + +} + +function stripPath(path, separator) { + const array = path.split(separator); + + let newPath = []; + + array.forEach(function (item) { + if (!newPath.includes(item)) { + newPath.push(item); + } + }); + + return newPath.join(separator); +} + +function stripWinPath(path) { + return stripPath(path, ';'); +} + +function stripUnixPath(path) { + return stripPath(path, ':'); +} + +function extractFileName(path) { + const fullName = path.substring(path.lastIndexOf('/') + 1); + + const index = fullName.lastIndexOf('.'); + if (index >= 0) { + return fullName.substring(0, index) + } + + return fullName; +} + +function generateShortCutCmd(cmd, icon) { + if (systemInfo.kernelType === "winnt") { + + console.log("create icons!!! on Windows"); + component.addOperation("CreateShortcut", + "@TargetDir@/" + cmd, + "@DesktopDir@/" + extractFileName(cmd) + ".lnk"); + + } + + + if (systemInfo.kernelType === "linux") { + console.log("create icons!!! on LINUX"); + const name = extractFileName(cmd); + component.addOperation("CreateDesktopEntry", + "@HomeDir@/.local/share/applications/" + name + ".desktop", + "Version=@Version@\n + Type=Application\n + Terminal=true\n + Exec=@TargetDir@/" + cmd + ".sh\n + Name=" + name + "\n + Icon=@TargetDir@/" + icon + "\n + Name[en_US]=" + name); + + console.log("create icons!!! on LINUX done"); + } +} + +function systemIntegration() { + targetDir = installer.value("TargetDir", ""); + homeDir = installer.value("HomeDir", ""); + + console.log("install component") + console.log("targetDir " + targetDir) + console.log("hometDir " + homeDir) + + if (systemInfo.kernelType === "winnt") { + + component.addOperation('Execute', ["SETX", "cqtdeployer", targetDir + "\\" + VERSION + "\\cqtdeployer.bat"], + "UNDOEXECUTE", ["SETX", "cqtdeployer", ""]) + component.addOperation('Execute', ["SETX", "cqtDir", targetDir + "\\" + VERSION + "\\"], + "UNDOEXECUTE", ["SETX", "cqtDir", ""]) + + + let PATH = installer.environmentVariable("PATH"); + const cqtDir = installer.environmentVariable("cqtDir"); + + console.log("path befor strip : " + PATH); + + if (!PATH.includes(cqtDir) && cqtDir.length) { + PATH = stripWinPath(PATH); + console.log("path after strip : " + PATH); + + component.addOperation('Execute', ["SETX", "PATH", PATH + ";%cqtDir%"]) + } + + } else { + + if (!installer.fileExists(homeDir + "/.local/bin")) { + + component.addOperation('Execute', ["mkdir", "-p", homeDir + "/.local/bin"]) + + QMessageBox["warning"](qsTr("install in system"), qsTr("Installer"), + qsTr("The \"~/local/bin\" folder was not initialized, you may need to reboot to work correctly!"), + QMessageBox.Ok); + + const ansver = installer.execute('cat', [homeDir + "/.profile"]); + let result; + if (ansver.length >= 2) { + result = ansver[0]; + } + + if (!result.includes("/.local/bin")) { + + const script = '\n# set PATH so it includes users private bin if it exists (generated by cqtdeployer installer) \n' + + 'if [ -d "$HOME/.local/bin" ] ; then \n' + + ' PATH="$HOME/.local/bin:$PATH" \n' + + 'fi \n'; + + component.addOperation('AppendFile', [homeDir + "/.profile", script]) + } + + } + component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqtdeployer.sh", + homeDir + "/.local/bin/cqtdeployer"], + "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqtdeployer"] ) + + component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqt.sh", + homeDir + "/.local/bin/cqt"], + "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqt"] ) + + component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqt.sh", + homeDir + "/.local/bin/cqtdeployer.cqt"], + "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqtdeployer.cqt"] ) + + generateShortCutCmd(VERSION + "/cqtdeployer", VERSION + "/icon.png"); + + } + +} diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml.in b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml.in new file mode 100644 index 00000000..134229a9 --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml.in @@ -0,0 +1,14 @@ + + + CQtDeployer @CQT_DEPLOYER_VERSION_SHORT_PREFIX@ + CQtDeployer @CQT_DEPLOYER_VERSION_SHORT_PREFIX@ + @CQT_DEPLOYER_VERSION@ + true + false + + @TODAY@ + 201 + + ru.qm + + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/ru.ts b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/ru.ts new file mode 100644 index 00000000..1a671e47 --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/ru.ts @@ -0,0 +1,53 @@ + + + + + installscript + + CQtDeployer 1.3 + CQtDeployer + CQtDeployer + + + This package contains CQtDeployer version 1.3 + This package contains CQtDeployer + Этот пакет содержит CQtDeployer + + + install in system + Установка в систему + + + Installer + Установщик + + + To uninstall cqtdeployer on your system, you need administrator rights!. + Чтобы удалить cqtdeployer в вашей системе, вам нужны права администратора !. + + + To install cqtdeployer on your system, you need administrator rights!. + Чтобы установить cqtdeployer в вашей системе, вам нужны права администратора!. + + + The installation was successful, but cqtdeployer will not be available from the console. + Установка прошла успешно, но cqtdeployer не будет доступен из консоли. + + + To take advantage of this program you will need to enter the full path to it. + Чтобы воспользоваться этой программой, вам нужно будет ввести полный путь к ней. + + + Example: + Пример: + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + CQtDeployer успешно установлен на вашем компьютере, чтобы использоваться введите в консоле "cqtdeployer". + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml.in b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml.in new file mode 100644 index 00000000..5a05b4c0 --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml.in @@ -0,0 +1,10 @@ + + + CQtDeployer + CQtDeployer + @CQT_DEPLOYER_VERSION_SHORT_PREFIX@ + true + false + @TODAY@ + 100 + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/ru.ts b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/ru.ts new file mode 100644 index 00000000..6401616d --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/ru.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/CQtDeployer/languages/de.ts b/src/CQtDeployer/languages/de.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/de.ts +++ b/src/CQtDeployer/languages/de.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/en.ts b/src/CQtDeployer/languages/en.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/en.ts +++ b/src/CQtDeployer/languages/en.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/es.ts b/src/CQtDeployer/languages/es.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/es.ts +++ b/src/CQtDeployer/languages/es.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/fr.ts b/src/CQtDeployer/languages/fr.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/fr.ts +++ b/src/CQtDeployer/languages/fr.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/ja.ts b/src/CQtDeployer/languages/ja.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/ja.ts +++ b/src/CQtDeployer/languages/ja.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/pl.ts b/src/CQtDeployer/languages/pl.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/pl.ts +++ b/src/CQtDeployer/languages/pl.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/ru.ts b/src/CQtDeployer/languages/ru.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/ru.ts +++ b/src/CQtDeployer/languages/ru.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/tr.ts b/src/CQtDeployer/languages/tr.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/tr.ts +++ b/src/CQtDeployer/languages/tr.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/uk.ts b/src/CQtDeployer/languages/uk.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/uk.ts +++ b/src/CQtDeployer/languages/uk.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/CQtDeployer/languages/zh.ts b/src/CQtDeployer/languages/zh.ts index 6401616d..713fd788 100644 --- a/src/CQtDeployer/languages/zh.ts +++ b/src/CQtDeployer/languages/zh.ts @@ -1,4 +1,46 @@ + + controlScript + + CQtDeployer + + + + Install CQtDeployer + + + + install in system + + + + Installer + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer". + + + + CQtDeployer successfully installed on your computer to use the call "cqtdeployer", cqt or cqtdeployer.cqt. + + + + + installscript + + install in system + + + + Installer + + + + The "~/local/bin" folder was not initialized, you may need to reboot to work correctly! + + + diff --git a/src/LibDeploy/CMakeLists.txt b/src/LibDeploy/CMakeLists.txt index 5cc7e907..eae2542b 100644 --- a/src/LibDeploy/CMakeLists.txt +++ b/src/LibDeploy/CMakeLists.txt @@ -43,5 +43,4 @@ prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR} "${LANGS}") set(QML_IMPORT_PATH ${QML_IMPORT_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/src" CACHE STRING "" FORCE) -set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/src/deploy_global.h") -configure_file("${global_file}.in" ${global_file} @ONLY) +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/src/deploy_global.h") diff --git a/src/QtELFReader/CMakeLists.txt b/src/QtELFReader/CMakeLists.txt index 2c5dcc1d..86051c50 100644 --- a/src/QtELFReader/CMakeLists.txt +++ b/src/QtELFReader/CMakeLists.txt @@ -33,5 +33,4 @@ target_link_libraries(${CURRENT_PROJECT} PUBLIC Qt::Core ) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) -set(global_file "${CMAKE_CURRENT_SOURCE_DIR}/src/elfreader_global.h") -configure_file("${global_file}.in" ${global_file} @ONLY) +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/src/elfreader_global.h") diff --git a/src/docs/Marketplace/CqtDeployer-Manifest.json b/src/docs/Marketplace/CqtDeployer-Manifest.json new file mode 100644 index 00000000..55a63b95 --- /dev/null +++ b/src/docs/Marketplace/CqtDeployer-Manifest.json @@ -0,0 +1,40 @@ +{ + "$schema": "http://qt.io/schema/extension-schema-v1#", + "title": "CQtDeployer", + "extensionType": [ + "tool" + ], + "version": "1.3.2", + "vendor": { + "name": "QuasarApp group", + "url": "https://github.com/QuasarApp" + }, + "contact": " QuasarApp@yandex.by", + "copyright": [ "QuasarApp" ], + "author": "QuasarApp team", + "icon": "https://github.com/QuasarApp/CQtDeployer/blob/master/res/icon%20(snapAlpha).png", + "licenses": [ + { "licenseType": "lGPLv3", + "licenseUrl": "https://github.com/QuasarApp/CQtDeployer/blob/master/LICENSE" } + ], + "created": "2018-08-19", + "lastUpdate": "2019-11-15", + "platforms": [ + "Linux (libc 2.27 or later)", "Windows 7 or later" + ], + "qtVersions": [ + "5.12", "5.13", "5.14" + ], + "tags": [ + "Deploy", "Deployment" ], + "price": { + "listprice": 0 + }, + "support": "https://github.com/QuasarApp/CQtDeployer/issues", + "bugUrl": "https://github.com/QuasarApp/CQtDeployer/issues", + "sourceRepoUrl": "https://github.com/QuasarApp/CQtDeployer", + "dependencies": [ + "Core" + ] +} + diff --git a/src/docs/Marketplace/Marketplace.md b/src/docs/Marketplace/Marketplace.md new file mode 100644 index 00000000..7bb31f72 --- /dev/null +++ b/src/docs/Marketplace/Marketplace.md @@ -0,0 +1,33 @@ +## What is CQtDeployer +The CQtDeployer is application for extract all depends library of executable and create 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's got flags that help you to configure the deployment for your or your project's needs +* Crossdeploy: this application's support windows and linux distrebutives, This means that you can use it not only to deploy a project for your platform, but also to deploy a project on Linux for Windows and vice versa. + +## How to use +Deploying a Qt or QML application is easy! +To do this, simply install cqtdeployer on your computer and enter the following line: + +#### Linux: +``` bash +cqtdeployer -bin myApp -qmake /media/D/Qt/5.12.3/gcc_64/bin/qmake -qmlDir ./ +``` + +#### Windows: +``` bash +%cqtdeployer% -bin myApp.exe -qmake /media/D/Qt/5.12.3/gcc_64/bin/qmake.exe -qmlDir ./ +``` + + +#### Discription +* -bin - this is option for set the path to executable files. +* -qmake - this is option for set the path to qmake with which the application was created. +* -qmlDir - this is option for set the path to folder with qml files of application. + +## Install +You can download the latest version of the CQtDeployer [here](https://github.com/QuasarApp/CQtDeployer/releases) for Windows and linux platforms. +Or use the snap version for servers without gui. + +[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) diff --git a/src/docs/README.md b/src/docs/README.md new file mode 100644 index 00000000..c07e95f1 --- /dev/null +++ b/src/docs/README.md @@ -0,0 +1,13 @@ +# CQtDeployer + +Here you can find documentation for the CQtDeployer in different languages. It describes: + +* Information on how to use this deployment Tool. (How to create installers with cqtdeployer) +* Main description (description of the functionality and capabilities of the program) +* Description of recent changes (changelog) + + +## Сhoose your language to read the CQtDeployer documentation: + +* [Документация на русском языке](ru/Home.md) +* [English language documentation](en/Home.md) diff --git a/src/docs/_config.yml b/src/docs/_config.yml new file mode 100644 index 00000000..9da9a029 --- /dev/null +++ b/src/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-dinky \ No newline at end of file diff --git a/src/docs/en/1_4.md b/src/docs/en/1_4.md new file mode 100755 index 00000000..866a1ada --- /dev/null +++ b/src/docs/en/1_4.md @@ -0,0 +1,422 @@ +# Release of CQtDeployer v1.4.0 (Binary Box) + +Release of C++/Qt and QML application deployment utility CQtDeployer v1.4.0 (Binary Box) + +Almost half a year later, a major update of the CQtDeployer deployment utility was released. +This update has many new futures, but the main emphasis is on creating packages. + +## CQtDeployer 1.4.0 +### Fixes +- Fixed The help output in the console, now the actual size of the console is recounted before the output, which allows you to correctly transfer text. +- Fixed work with the deployment of Qt plugins. Now plug-ins do not extract all system dependencies, but only qt. Extract system dependencies caused applications to crash due to incompatible plugin libraries. +- Minor bug fixes and improvements. + +### New features +- Added support for qmake search from the system environment. +- Added the ability to initialize the repository for further packaging, similar to git init. +- Added support for Qt Install Framework packages. Now you can pack the distribution into the installer. +- Added the ability to split the final distribution into several packages. +- Added the ability to unify the creation of packages for the final distribution. +- Added support for adding custom scripts to application launch scripts. +- Added support for extracting system dependencies for Windows. +- Added support for RPATH for Linux. Now cqtdeployer can independently determine the necessary qmake to deploy the application. +- Added support for finding the required dependency by library name. +- Added support for Qt libraries from Linux distributions repositories. +- Added new alias for the run command (cqt and cqtdeployer.cqt) for fast deploy of applications. +- Added support the native name of command for windows. Now you can run a cqtdeployer from cqtdeployer commnad in cmd and powershell. + +### New options +- init - will initialize cqtdeployer.json file (configuration file). For example: "cqtdeployer init" - to initialize the configuration of a base package. "cqtdeployer -init multi" - to initialize the configuration of several packages. +- noCheckRPATH - disables the automatic search for paths to qmake in executable files (Linux only). +- noCheckPATH - disables the automatic search for paths to qmake in the system environment. +- extractPlugins - forces to extract all plug-in dependencies. +- qif - creates an installer at the end of the deployment. +- extraLibs - adds a template for an additional library, which should be included in the distribution. +- customScript - adds a custom script to the startup script of the application. +- -targetPackage [package; tar1, package; tar2] - used to form packages, denotes lists of target files for specific packages. +- recOut - indicates in which folder the resources will be added after deployment. +- name - sets the name of the package. +- description - sets the package description +- deployVersion - sets the package version +- releaseDate - sets the release date of the package. +- icon - sets the package icon. +- publisher - sets the publisher of the package. +- qifStyle - Sets the path to the CSS style file or sets the default style. Available styles: quasar +- qifBanner - Sets path to the banner png file. +- qifLogo - Sets path to the logo png file. + +## A detailed analysis of the most interesting changes. + +The first thing you should pay attention to is that CQtDeployer has learned to work with RPATH (Linux only) and PATH. This means that if your application is built with RPATH support (and RPATH in qt is enabled by default) or your qmake is registered in PATH, then you do not need to specify the path to qmake. CQtDeployer will find qmake for itself. + +Let's test it in practice. +I created a simple console application using Qt. + +``` cpp +#include +#include +int main(int, char *[]) +{ + QString str = "hello CQtDeployer 1.4"; + qInfo() << str; + return 0; +} +``` + +I will use the cmake build system, as it is more relevant than qmake. + +``` bash +andrei@HP:~/Hello$ tree +. +├── CMakeLists.txt +├── CMakeLists.txt.user +└── main.cpp + +0 directories, 3 files +``` + +Create a folder for the assembly. + +``` bash +andrei@HP:~/Hello$ mkdir build +``` + +Run the cmake in the created folder. + +``` bash +andrei@HP:~/Hello/build$ cmake .. -DCMAKE_PREFIX_PATH=~/Qt/5.14.1/gcc_64 +-- Configuring done +-- Generating done +-- Build files have been written to: /home/andrei/Hello/build +``` + +building a project + +``` bash +andrei@HP:~/Hello/build$ make +Scanning dependencies of target Hello_autogen +[ 25%] Automatic MOC and UIC for target Hello +[ 25%] Built target Hello_autogen +Scanning dependencies of target Hello +[ 50%] Building CXX object CMakeFiles/Hello.dir/Hello_autogen/mocs_compilation.cpp.o +[ 75%] Building CXX object CMakeFiles/Hello.dir/main.cpp.o +[100%] Linking CXX executable Hello +[100%] Built target Hello +``` + +Checking our program. + +``` bash +andrei@HP:~/Hello/build$ ls +CMakeCache.txt CMakeFiles cmake_install.cmake Hello Hello_autogen Makefile +``` +And we start cqtdeployer passing it the program without qmake. +``` bash +andrei@HP:~/Hello/build$ cqtdeployer -bin Hello +Deploy ... +flag targetDir not used. use default target dir : "/home/andrei/Hello/build/DistributionKit" +target deploy started!! +copy : "/home/andrei/Hello/build/Hello" +extract lib : "/home/andrei/Hello/build/DistributionKit//bin//Hello" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libQt5Core.so.5" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicuuc.so.56" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicui18n.so.56" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicudata.so.56" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ar.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_bg.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ca.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_cs.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_da.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_de.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_en.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_es.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fi.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fr.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_gd.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_he.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_hu.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_it.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ja.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ko.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_lv.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_pl.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ru.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_sk.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_uk.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_zh_TW.qm" +try deploy msvc +deploy done! +``` + +Oh miracle, now our application is completely autonomous. +Check it out. + +``` bash +andrei@HP:~/Hello/build$ cd DistributionKit/ +andrei@HP:~/Hello/build/DistributionKit$ tree +. +├── bin +│   ├── Hello +│   └── qt.conf +├── Hello.sh +├── lib +│   ├── libicudata.so.56 +│   ├── libicui18n.so.56 +│   ├── libicuuc.so.56 +│   └── libQt5Core.so.5 +└── translations + ├── qtbase_ar.qm + ├── qtbase_bg.qm + ├── qtbase_ca.qm + ├── qtbase_cs.qm + ├── qtbase_da.qm + ├── qtbase_de.qm + ├── qtbase_en.qm + ├── qtbase_es.qm + ├── qtbase_fi.qm + ├── qtbase_fr.qm + ├── qtbase_gd.qm + ├── qtbase_he.qm + ├── qtbase_hu.qm + ├── qtbase_it.qm + ├── qtbase_ja.qm + ├── qtbase_ko.qm + ├── qtbase_lv.qm + ├── qtbase_pl.qm + ├── qtbase_ru.qm + ├── qtbase_sk.qm + ├── qtbase_uk.qm + └── qtbase_zh_TW.qm + +3 directories, 29 files +andrei@HP:~/Hello/build/DistributionKit$ +``` +The root of the program: + +![image](https://user-images.githubusercontent.com/12465465/77245272-619a0280-6c2e-11ea-92f2-447563f72dcc.png) + +Libraries needed for the program to work: + +![image](https://user-images.githubusercontent.com/12465465/77245274-6363c600-6c2e-11ea-8729-7d494a073b66.png) + + +As you can see from the example, the application is fully assembled. + +## Qt Installer Framework +The second innovation worth knowing is the ability to form QIF installers out of the box. All that is needed for our example is to add the qif option to the packaging command. + +Usage example. + + +``` +andrei@HP:~/Hello/build$ cqtdeployer -bin Hello qif +``` + +Just one simple command and the program gets a presentable look. + +![image](https://user-images.githubusercontent.com/12465465/77245315-b3428d00-6c2e-11ea-9326-c23229020eb5.png) + +This installer supports minimal integration of Linux distributions and Windows. Namely: creating shortcuts, and registering the application in the OS. +If for some reason you are not satisfied with the appearance of this installer, you can change it using the qifStyle flag. At the time of version 1.4, cqtdeployer supports only 2 styles (native and quasar). + +Example quasar style: + +![image](https://user-images.githubusercontent.com/12465465/77245334-d2d9b580-6c2e-11ea-9e55-e205499a9219.png) + +You can also use your own qss stylesheet. To do this, pass the path to your qss or css file instead of the style name. +For example, consider the following qss stylesheet. + + +Style.qss: +``` css +QWidget +{ + color: white; + background-color: rgb(65, 65, 65); +} + +QPushButton +{ + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(150, 150, 150, 60%), stop:1 rgba(50, 50, 50, 60%)); + border-color: rgb(60, 60, 60); + border-style: solid; + border-width: 2px; + border-radius: 9px; + min-height: 20px; + max-height: 20px; + min-width: 60px; + max-width: 60px; + padding-left: 15px; + padding-right: 15px; +} + +QPushButton:pressed, QPushButton:checked +{ + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(50, 50, 50, 60%), stop:1 rgba(150, 150, 150, 60%)); +} + +``` + +Let's check what we get in this case. + +``` bash +cqtdeployer -bin Hello qif -qifStyle ./../style.qss +``` + +![image](https://user-images.githubusercontent.com/12465465/77245346-00266380-6c2f-11ea-8426-42bf58038458.png) + +Here, in fact, is the dark theme of the installer. + +## Splitting into packages +And, probably, the last important update worth knowing is the ability to split a large multi-binar project into subprojects. + +This feature is the most difficult of all listed, since it requires a lot of text to use it. So I recommend using the configuration file. + +To begin with, we will complicate our project by adding 2 more executable files to it. I did not bother and just made 2 copies of my Hello utility. + +To simplify working with packages, you need to initialize the directory. + +``` bash +cqtdeployer init +``` + +This is another new function that creates a CQtDeployer.json file, in which we will write our configurations, instead of passing options to the utility. + +``` js +{ + "binDir": ".", + "clear": true, + "libDir": "./", + "recursiveDepth": 5 +} +``` + +Now let's make 2 packages of 3 of our programs. To do this, specify: +```js +{ + "binDir": ".", + "clear": true, + "libDir": "./", + "recursiveDepth": 5, + "targetPackage": [ + ["Dstro1", "Hello1"], + ["Dstro2", "Hello2"], + ["Dstro2", "Hello3"] + ] +} +``` + +Please note that I had to explicitly specify the binding for Dstro2 to Hello2 Hello3. Unfortunately, at the time of version 1.4 cqtdeployer was not able to parse target enumerations. Please note that if I write Hello1 Hello instead, then the selection will be made for all matches and all 3 programs will be selected. +So, let's see what happened. + + +``` bash +cqtdeployer + +. +├── Dstro1 +│   ├── bin +│   │   ├── Hello1 +│   │   └── qt.conf +│   ├── Hello1.sh +│   ├── lib +│   │   ├── libicudata.so.56 +│   │   ├── libicui18n.so.56 +│   │   ├── libicuuc.so.56 +│   │   └── libQt5Core.so.5 +│   └── translations +│   ├── qtbase_ar.qm +│   ├── qtbase_bg.qm +│   ├── qtbase_ca.qm +│   ├── qtbase_cs.qm +│   ├── qtbase_da.qm +│   ├── qtbase_de.qm +│   ├── qtbase_en.qm +│   ├── qtbase_es.qm +│   ├── qtbase_fi.qm +│   ├── qtbase_fr.qm +│   ├── qtbase_gd.qm +│   ├── qtbase_he.qm +│   ├── qtbase_hu.qm +│   ├── qtbase_it.qm +│   ├── qtbase_ja.qm +│   ├── qtbase_ko.qm +│   ├── qtbase_lv.qm +│   ├── qtbase_pl.qm +│   ├── qtbase_ru.qm +│   ├── qtbase_sk.qm +│   ├── qtbase_uk.qm +│   └── qtbase_zh_TW.qm +└── Dstro2 + ├── bin + │   ├── Hello2 + │   ├── Hello3 + │   └── qt.conf + ├── Hello2.sh + ├── Hello3.sh + ├── lib + │   ├── libicudata.so.56 + │   ├── libicui18n.so.56 + │   ├── libicuuc.so.56 + │   └── libQt5Core.so.5 + └── translations + ├── qtbase_ar.qm + ├── qtbase_bg.qm + ├── qtbase_ca.qm + ├── qtbase_cs.qm + ├── qtbase_da.qm + ├── qtbase_de.qm + ├── qtbase_en.qm + ├── qtbase_es.qm + ├── qtbase_fi.qm + ├── qtbase_fr.qm + ├── qtbase_gd.qm + ├── qtbase_he.qm + ├── qtbase_hu.qm + ├── qtbase_it.qm + ├── qtbase_ja.qm + ├── qtbase_ko.qm + ├── qtbase_lv.qm + ├── qtbase_pl.qm + ├── qtbase_ru.qm + ├── qtbase_sk.qm + ├── qtbase_uk.qm + └── qtbase_zh_TW.qm + +8 directories, 60 files +``` + +As you can see from the result tree, we got 2 distributions. +1. Dstro1 - contains the application Hello1 +2. Dstro2 - contains the remaining 2. + +Now let's check what happens if all this is packaged by the installer. Add the qif option to true in CQtDeployer.json: ** qif: true, **. + +``` js +{ + "binDir": ".", + "clear": true, + "qif": true, + "libDir": "./", + "recursiveDepth": 5, + "targetPackage": [ + ["Dstro1", "Hello1"], + ["Dstro2", "Hello2"], + ["Dstro2", "Hello3"] + ] +``` + +![image](https://user-images.githubusercontent.com/12465465/77245542-534ce600-6c30-11ea-9323-72ec5e200f39.png) + +As can be seen from the screenshot, now we have 2 packages during installation. + +## New aliases + +And the last small but nice addition: now new commands have been added to cqtdeployer. +* сqt — is a quick way to deploy your application. It simplifies the deployment call. + * Example: + **cqt myApp** — this is the same as **cqtdeployer -bin myApp**. +* cqtdeployer.cqt - same as cqt but for snap package. +* В windows-версии теперь не нужно добовлять знак % для вызова утилиты. +* In the windows version, now there is no need to add the% sign to call the utility. +Now the call looks like in Linux. (cqtdeployer) diff --git a/src/docs/en/1_5.md b/src/docs/en/1_5.md new file mode 100755 index 00000000..3a0e7b4a --- /dev/null +++ b/src/docs/en/1_5.md @@ -0,0 +1,158 @@ +# Release of CQtDeployer v1.5.0 + +Release of the C++/Qt and QML application deployment utility CQtDeployer v1.5.0 + +This is the first major update in 2021. CQtDeployer 1.5 contains many useful improvements. The biggest improvements are the addition of the ability to package deb packages, and the ability to use your own packaging template for the qt install framework. + +## Complete list of all changes + +## CQtDeployer 1.5.0 + +### New features + +- Added new theme of qif installer "quasarDark". +- Added support of work with custom template for qif option. +- Added support of debian packages. +- Added support of targets icons. now the icon option work with targets but not packages. +- Added support of the control custom translation files. +- Added support the deploy nonexecutable data. (extraData option) +- Added envirement variables for deployed applications. +- Added support of the generate deb packages. +- Added support of the generate zip arrhives. +- Added support create a qif installer using custom template +- Added command for init default qif and deb templates (getDefaulttemplate) +- Added support of import custom launch scripts +- Added support of md5 packages hashes +- Added support of Qt6.1 + +### Fixes + +- Fixed stability for the deploySystem option on windows +- Fixed verbose log. +- Fixed general output log. +- Fixed typo errors in log. +- Fixed cross-deployment for ARM platform . +- Fixed deploy Qt6 qml +- Fixed powershell commands on Windows +- bug fixes and improvements. + + +### New Envirement Variables + +- CQT_RUN_FILE - This variable contains path to the run script of the using application. +- CQT_PKG_ROOT - This variable contains path to root of the current package. + +### New parameters + +- zip - create a ZIP archive for deployable programm +- deb - Create the deb package for deployable programm +- homepage - Sets the homepage url for a package +- noQt - Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework +- allowEmptyPackages - Allows configure the empty packages. +- getDefaultTemplate - Extracts defaults deb or qif templates. +- tr - Adds qm files into the translations folder. +- extraData - Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure. +- extraDataOut - Sets path to extra data files out directory. +- prefix - Sets the prefix for the package relatively a target directory +- homePage - Sets the homepage url for a package +- binPrefix - Sets prefix for bin option. +- noHashSum - Disables campute hashes of packages + +### Deprecated and removed options + +- deploySystem-with-libc - instead of this option use the deploySystem option. +- allQmlDependes - instead of this option use the qmlDir option. + + +## Detailed analysis of the most interesting changes. + +### Debian pacakges +This feature is very conveniently if you want to create server application. +For example i need to create simple server for my simple game. +And my steps: +* build my application in the release mode. +* run cqtdeployer with deb option. + +```bash +cqtdeployer -bin mySimpleServer deb -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +``` +The SimpleServer depends only on qt, so it was enough for me to specify only the path to qmake for my application. + +It is all!!!. And i get the workly deb package. +By Default CQtDeployer create an independet debian packages. + + +### Zip arrhives +This feature allow compress your distribution pacakges to zip arrhive. + +Example: +```bash +cqtdeployer -bin mySimpleServer zip -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +``` + +### Custom Qt Installer Framework tempaltes. + +Now you can override default template of the cqtdeployer. To do this, you must pass the path to your template to the qif parameter. + +``` +cqtdeployer ... -qif /path/to/my/custom/qif/template +``` + +### Template +The qif template should contain 2 folders: +* packages +* config + +### Attention +The name of the packages in the packages folder must match the names of the packages during deployment. + +For example: +``` json +"targetPackage": [ + [ + "myCustomInstaller", + "tar1" + ] +], +``` + +``` bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` + +If the folder names do not match the package names then CQtDeployer will use the standard QIF package. + +If you have only one package then you can use the **name** option for set name the application. + +```bash +cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller +``` + +#### Do not forget to rename the your package folder to the packaga name of the name option. + + +```bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller << "This is folder of the your package" + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` diff --git a/src/docs/en/Build-and-Install.md b/src/docs/en/Build-and-Install.md new file mode 100644 index 00000000..abc4ea3f --- /dev/null +++ b/src/docs/en/Build-and-Install.md @@ -0,0 +1,90 @@ +# Install CQtDeployer + +You can download the latest version of the application [here](https://github.com/QuasarApp/CQtDeployer/releases). + +### Installer + +- [Download](https://github.com/QuasarApp/CQtDeployer/releases) CQtDeployer_X.X.X.X_Installer_Linux64.run or CQtDeployer_X.X.X.X_Installer_Win64.exe + +#### Install without 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 +``` + +**Note** the package name and links can be changed, please check [Download](https://github.com/QuasarApp/CQtDeployer/releases) page before installation. + +### Snap + +[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) + +``` bash +sudo snap install cqtdeployer +``` + +#### Features of the snap version + +If you are using the snap version of the application. Enable all permissions for cqtdeployer. +this can be done in the snap-store +Or starting with ubuntu 20.04 in the ubuntu application settings manager. + +If you do not have the GUI then you can enable all permissions using next commands: + +``` bash +sudo snap connect cqtdeployer:process-control +sudo snap connect cqtdeployer:removable-media +sudo snap connect cqtdeployer:system-backup +``` + +--- + +# Build from sources + +## Build for Linux + +- install qt and qt QtInstallFrameWork from [qt installer](https://www.qt.io/download-qt-installer?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f9bb77-7bb77-4bb77-4) +- git clone https://github.com/QuasarApp/CQtDeployer.git +- cd CQtDeployer +- git submodule update --init --recursive +- qmake -r + - Here you must definitely call the qmake that was loaded from the 1st item. + - Example: ~/Qt/5.15.0/gcc_64/bin/qmake -r +- make -j$(nproc) +- make deploy + - this command requires installed [cqtdeployer](https://github.com/QuasarApp/CQtDeployer/releases) +- ./Distro/CQtDeployerInstaller.run + +## Build for Windows (CMD) + +- install qt and qt QtInstallFrameWork from [qt installer](https://www.qt.io/download-qt-installer?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f9bb77-7bb77-4bb77-4) +- git clone https://github.com/QuasarApp/CQtDeployer.git +- cd CQtDeployer +- git submodule update --init --recursive +- SET PATH=C:/Qt/Tools/mingw810_64/bin;%PATH% + - It is important to set up the qt environment. +- qmake.exe -r + - Here you must definitely call the qmake that was loaded from the 1st item. + - Example: C:/Qt/5.15.0/mingw81_64/bin/qmake.exe -r +- migw32-make -j8 +- migw32-make deploy + - this command requires installed [cqtdeployer](https://github.com/QuasarApp/CQtDeployer/releases) +- ./Distro/CQtDeployerInstaller.exe + diff --git a/src/docs/en/Changelog.md b/src/docs/en/Changelog.md new file mode 100755 index 00000000..18394ea6 --- /dev/null +++ b/src/docs/en/Changelog.md @@ -0,0 +1,363 @@ +# Change log + +## CQtDeployer 1.5.4 + + +### New options + +* qifConfig - Sets a custom path to the configure file of the qt ifw installer. By default it is qif/config/config.xml #653 +* qifPackages - Sets a custom path to the packages directories. By default it is qif/packages #653 +* qifResources - Sets a custom path to the resources files. By default this option is skipped #653 +* debOut - Sets name of the output debian file. This option can be work with multiple packages +* zipOut - Sets name of the output zip arrhive. This option can be work with multiple packages + +### Bug fixes : + +* fixed crossdeploy linux -> windows #652 + + +## CQtDeployer 1.5.3 + +### New options + +* installDirDeb - Sets install target directory for debian package (by default it is /opt path) #640 +* installDirQIFW - Sets install target directory for installers (by default it is /home path) #640 + +### Bug fixes + +* Fix warning on installer fix #628 +* Added support validation input options of the command line fix #421 +* Added Error message for conflict between libDir and targetDir options #629 + +## CQtDeployer 1.5.2 + +### New parameters + +* Added **qifOut** option for set name of the output installer +* Added **disableRunScript** option for disabling the generation of run script for selected targets +* Added **disableShortCut** option for disabling the generation of shortcut for selected targets + +### Fixes + +* Fix documentation +* Fix deploy openssl libraries + +## CQtDeployer 1.5.1 + +### Fixes + +* Fix deploy multi target Debian packages +* Fix deploy qt6 qml applications + + +Change log for all versions of the CQtDeployer. + +## CQtDeployer 1.5.0 + +### New features + +- Added new theme of qif installer "quasarDark". +- Added support of work with custom template for qif option. +- Added support of debian packages. +- Added support icons for targets. now the icon option work with targets but not packages. +- Added support of the control custom translation files. +- Added support the deploy nonexecutable data. (extraData option) +- Added envirement variables for deployed applications. +- Added support of the generate deb packages. +- Added support of the generate zip arrhives. +- Added support create a qif installer using custom template +- Added command of init default qif of deb template (getDefaulttemplate) +- Added support of import custom launch scripts +- Added support of md5 packages hashes +- Added support of Qt6.1 + +### Fixes + +- Fixed stability for the deploySystem option on windows +- Fixed verbose log. +- Fixed general output log. +- Fixed typo errors in log. +- Fixed crossdeploy of the arm distributions. +- Fixed deploy Qt6 qml +- Fixed powershell commands on Windows +- bug fixes and improvements. + + +### New Envirement Variables + +- CQT_RUN_FILE - This variable contains path to the run script of the using application. +- CQT_PKG_ROOT - This variable contains path to root of the current package. + +### New parameters + +- zip - create a ZIP archive for deployable programs +- deb - Create the deb package for deployment programm +- homepage - Sets the homepage url for a package +- noQt - Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework +- allowEmptyPackages - Allows configure the empty packages. +- getDefaultTemplate - Extracts defaults deb or qif templates. +- tr - Adds qm files into the translations folder. +- extraData - Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure. +- extraDataOut - Sets path to extra data files out directory. +- prefix - Sets the prefix for the package relatively a target directory +- homePage - Sets the homepage url for a package +- binPrefix - Sets prefix for bin option. +- noHashSum - Disables campute hashes of packages + +### Deprecated and removed options + +- deploySystem-with-libc - instead of this option use the deploySystem option. +- allQmlDependes - instead of this option use the qmlDir option. + +## CQtDeployer 1.5.0 Alpha + +### Corrections + +- bug fixes and improvements. + +### New Features + +- Added a new Theme for qif installer "quasarDark". + +### New options + +- zip - create the ZIP arhive for deployement programm + + +## CQtDeployer 1.4.7 + +### Corrections + +- Fixed deploy the qxcb plugin. #438 +- Fixed deploy the qtGui module. #446 + +### New Features + +- Added support of Qt6 #437 +- Added support of Qt installer Framework 4 (with improved command line interface experience) #436 + +## CQtDeployer 1.4.6 + +### Corrections + +- Fixed deploy sql drivers #367 +- Fixed algorithm of deploy libraryes. #423 #371 +- Fixed working with a qt from the linux system repository. (classic instaler only) #422 +- Fixed snap version of cqtdeployer, added support for qmake search by RPATH #424 #420 +- Fixed help message. +- Minor bug fixes and improvements. +- Removed deprecated option extractPlugins. #371 + +### New options + +- noQt - Ignore the error of initialize of a qmake. Use only if your application does not use the qt framework. + +## CQtDeployer 1.4.5 + +### Corrections + +- Optimized project deployment performance. 60% faster. +- Optimized output size of distributions. Size reduced by 25%. +- Fixed display of shortcuts after installing deployed applications. +- Fixed launching applications with spaces in the name. Thanks ahndee (#384) +- Fixed deployment of the Renderer plugin. +- Minor bug fixes and improvements. + +### New Features + +- Added a new deployment plugin management system. + +### New options + +- extraPlugin - sets an additional path to third-party application plug-in +- enablePlugins - enables additional plugins for distribution. +- disablePlugins - disables plugins for distribution. + +## CQtDeployer 1.4.4 + +### New options +- qifFromSystem - force use system binarycreator tool of qif from path or qt. + + +## CQtDeployer 1.4.3 +### Fixes +- Fixed display of the application downloaded from the snap store and installers in the ubuntu 20.04 application settings menu + +### New features +- added support recursive ignore for ignoreEnvirement #356 + +### New options +- noRecursiveiIgnoreEnv - Disables recursive ignore for ignoreEnv option. + + + +## CQtDeployer 1.4.2 +### Fixes + +- fixed #337 (error generate installer with custom name) +- fixed #338 (windows version collect pdb files) +- fixed #339 (error of show all help messages) +- fixed #340 (cqdeployer don't added a targets dirs into "ignore") +- fixed #341 (The clear option don't delete old installer) + + +## CQtDeployer 1.4.1 + +### Fixes +- Fixed Not deploying platformthemes (#324) +- Fixed create shortcuts on windows (#322) +- Minor improvements and fixes + + +## CQtDeployer 1.4.0 +### Fixes +- Fixed The help output in the console, now the actual size of the console is recounted before the output, which allows you to correctly transfer text. +- Fixed work with the deployment of Qt plugins. Now plug-ins do not extract all system dependencies, but only qt. Extract system dependencies caused applications to crash due to incompatible plugin libraries. +- Minor bug fixes and improvements. + +### New features +- Added support for qmake search from the system environment. +- Added the ability to initialize the repository for further packaging, similar to git init. +- Added support for Qt Install Framework packages. Now you can pack the distribution into the installer. +- Added the ability to split the final distribution into several packages. +- Added the ability to unify the creation of packages for the final distribution. +- Added support for adding custom scripts to application launch scripts. +- Added support for extracting system dependencies for Windows. +- Added support for RPATH for Linux. Now cqtdeployer can independently determine the necessary qmake to deploy the application. +- Added support for finding the required dependency by library name. +- Added support for Qt libraries from Linux distributions repositories. +- Added new alias for the run command (cqt and cqtdeployer.cqt) for fast deploy of applications. +- Added support the native name of command for windows. Now you can run a cqtdeployer from cqtdeployer commnad in cmd and powershell. + +### New options +- init - will initialize cqtdeployer.json file (configuration file). For example: "cqtdeployer init" - to initialize the configuration of a base package. "cqtdeployer -init multi" - to initialize the configuration of several packages. +- noCheckRPATH - disables the automatic search for paths to qmake in executable files (Linux only). +- noCheckPATH - disables the automatic search for paths to qmake in the system environment. +- extractPlugins - forces to extract all plug-in dependencies. +- qif - creates an installer at the end of the deployment. +- extraLibs - adds a template for an additional library, which should be included in the distribution. +- customScript - adds a custom script to the startup script of the application. +- -targetPackage [package; tar1, package; tar2] - used to form packages, denotes lists of target files for specific packages. +- recOut - indicates in which folder the resources will be added after deployment. +- name - sets the name of the package. +- description - sets the package description +- deployVersion - sets the package version +- releaseDate - sets the release date of the package. +- icon - sets the package icon. +- publisher - sets the publisher of the package. +- qifStyle - Sets the path to the CSS style file or sets the default style. Available styles: quasar +- qifBanner - Sets path to the banner png file. +- qifLogo - Sets path to the logo png file. + +## CQtDeployer 1.3.2 +- Fixed #218 (The CQtDeployer adding sh scripts for target libraries.) +- Fixed #217 (The Qmake option did not work with the configuration file.) +--- + +## CQtDeployer 1.3.1 +- Fixed a task #191 (ignore command for plugins) +- Fixed a task #192 (invalid paths when creating) +- Fixed absalute pathes of deployement file (see [confFile](DeployConfigFile)) +--- + +## CQtDeployer 1.3.0 +- Added support of qt.conf for Linux +- Added support of config file for project (deploy.json) with all rules of deployment, for create deploy.json use flag -confFile [./path/to/file.json], +- Added support of output dirs for all deployement files #145, +- Added support of deploy WebEngine #146 +- Added support multi package in cqtdeployer installer +- Renamed project from Console-QtDeployer to CQtDeployer #139 +- Fixed deployment of system libs in linux #172 +- Added new tests of application +- Removed flag noLibC and added flag deploySystem-with-libc. If you need libc in the program, use the deploySystem-with-libc flag, and if not, use deploySystem. +- The always-overwrite flag has been replaced with noOverwrite, now all files are overwritten by default, use noOverwrite to disable overwriting. +--- + +## CQtDeployer 1.2.3 +- Added support of qt.conf for Windows builds #130 +- Fixed bug #129 now the 'clear' flag remove only copied files. +- Fixed ignoreEnv flag +- Fixed deploySystem flag +--- + +## CQtDeployer 1.2.2 +- Added new flag noLibc for ignore libc and li-linux libs +- Fixed bug #125 Deployed system lib (working with simple projects, for big projects no recommended) +- Fixed ignoreEnv flag +--- + +## CQtDeployer 1.2.1 +- Added new ignore flag (ignoreEnv). This flag disables unnecessary environment +- Added support QIFW (online installer for windows and Other Linux distributives) +- Added support update for windows and Other Linux distributives (not snap) +- Fixed bug #116 (copy files from removable media) +- Fixed bug #115 (create target in folder with russean name) +- Fixed big size of msvc version +- FIxed crossdeploy Linux >> Windows +- Removeв old build scripts +--- + +## CQtDeployer 1.2.0 +- Added own qml dependecies scaner. +- Moved to used a new [PE-Lib scaner](https://github.com/QuasarApp/pe-parse/tree/7138bb218a05c81d825728ba8a0a6f6a56c4fdbc). +- Moved to used a new [ELF-lib scaner](https://github.com/qt/qttools/blob/b0147a5d79ce7a7e77a24f36aaddfacb1a1517c8/src/shared/winutils/elfreader.h). +- Added a new unit tests. +- Added support of snap version (home dir only). +- Added new flag qmlExtern - for use qt qml import scaner. +- Added support a levels of verbose log (0-3). +- Fixed log of deploy app. +- Fixed deploy the app on snap version. +--- + +## CQtDeployer 1.1.2 +- Added support of translations +- Added a flag for disable deploy translations +- Added the strip flag on linux version +- Added unit tests +- Fixed deploy with shared version +- Fixed bug deploy on current dir with snap and static versions +--- + +## CQtDeployer 1.1.1 +- Fixed qml build in dinomisc version +- Fixed -recursiveDepth flag +- Fixed -libDir flag operation +- The output of the application has been cleaned, a part of the log has been moved to verbose +--- + +## CQtDeployer 1.1.0 +- Added windows support (dynamic linking only) +- Added support for snap (now available in the snapstore) +- Added snap build scripts +- Added flag binDir allowing recursively to capture exe dll and so +- Changed the logic of the bin flag now, if you select a folder in the file location, then all its contents will be captured +- Changed and corrected the logic of the clear flag now it cleans all the expanded content on a specific target. +- Added flag targetDir which defines the place where the expanded project will lie +- The structure of the deployed project has been changed, now all the launch shells are in the root and the binaries are in the bin folder, a launch script of the same name is created for each binary. +- Removed old runScript flag due to change of deployment logic +- Added verbose flag for debugging by +- Fixed performance bugs +--- + +## CQtDeployer 1.0.2 +- Added a script to build (dynamic and static release) +- Added flag -libDir to install additional path for additional libraries of the application +- Added flag -extraPlugin to install an additional path for additional application plugins +- Added build for C libraries only +- Fixed deployment +- Fixed startup script +- Fixed static build +--- + +## CQtDeployer 1.0.1 +- fix qml deploy (redundancy) +- fix run script +--- + +## CQtDeployer 1.0.0 +- Added a flag runScript +- Added a flag allQmlDependes +- Fixed bug of deploy qml +- Fixed bug of deploy plugins +- Added support static build + diff --git a/src/docs/en/CompareFeatures.md b/src/docs/en/CompareFeatures.md new file mode 100644 index 00000000..20992118 --- /dev/null +++ b/src/docs/en/CompareFeatures.md @@ -0,0 +1,17 @@ +# Compare Features + +Compare Features of Distributions of the CQtDeployer + +### snap vs installer vs windows installer + +| Feature name | Classic linux version (Installer) | Snap Version | Windows version | +|---|---|---|----| +| Automatic updates | NO | YES | NO | +| Online updates | YES | YES | YES | +| Deploy system libraries | YES | YES | YES | +| Create installers | YES | YES | YES | +| Create archives | YES | YES | YES | +| Search of libraries and cmake from environment | YES | NO | YES | +| Search of the qmake from a RPATH | YES | YES | NO | +| Support of the 'strip' command | YES | NO | NO | +| Support work with the qmake from a system repository of OS| YES| NO| NO | diff --git a/src/docs/en/CustomScripts.md b/src/docs/en/CustomScripts.md new file mode 100644 index 00000000..77a49d14 --- /dev/null +++ b/src/docs/en/CustomScripts.md @@ -0,0 +1,69 @@ +# Custom Scripts + +After version 1.5.1 cqtdeployer support self variables in the custom scripts. +For using custom scripts use the **runScript option** + +### Exmaples : + +```bash +cqtdeployer -bin MyExecutable.exe -runScript MyExecutable,path/to/my/custom/script.bat +``` + +```bash +cqtdeployer -bin MyExecutable -runScript MyExecutable,path/to/my/custom/script.sh +``` + +## 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_SYSTEM_LIB_PATH - are releative path to system libraryes 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. + + +## The Scripts tempalte + +### Linux + +```bash +#!/bin/sh + +BASE_DIR=$(dirname "$(readlink -f "$0")") +export LD_LIBRARY_PATH="$BASE_DIR"CQT_LIB_PATH:"$BASE_DIR":$LD_LIBRARY_PATH +export QML_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML_IMPORT_PATH +export QML2_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML2_IMPORT_PATH +export QT_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH:$QT_PLUGIN_PATH +export QTWEBENGINEPROCESS_PATH="$BASE_DIR"CQT_BIN_PATH/QtWebEngineProcess +export QTDIR="$BASE_DIR" +export CQT_PKG_ROOT="$BASE_DIR" +export CQT_RUN_FILE="$BASE_DIR/CQT_BASE_NAME.sh" + +export QT_QPA_PLATFORM_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH/platforms:$QT_QPA_PLATFORM_PLUGIN_PATH + +CQT_CUSTOM_SCRIPT_BLOCK + +CQT_RUN_COMMAND +``` + +### Windows + +```bash + +@echo off +SET BASE_DIR=%~dp0 +SET PATH=%BASE_DIR%CQT_LIB_PATH;%PATH%;CQT_SYSTEM_LIB_PATH +SET CQT_PKG_ROOT=%BASE_DIR% +SET CQT_RUN_FILE=%BASE_DIR%CQT_BASE_NAME.bat + +CQT_CUSTOM_SCRIPT_BLOCK + +CQT_RUN_COMMAND +``` + + +Or you can get last version of this scripts from the github [repository](https://github.com/QuasarApp/CQtDeployer/tree/main/Deploy/ScriptsTemplates). diff --git a/src/docs/en/DEB.md b/src/docs/en/DEB.md new file mode 100644 index 00000000..119d0c4f --- /dev/null +++ b/src/docs/en/DEB.md @@ -0,0 +1,101 @@ +# DEB using + +General rules for using DEB + +#### Available from version CQtDeployer 1.5 + +### How to use deb option + +Just add to cqtdeployer option "deb". + +#### For example: + +``` bash + cqtdeployer ... deb +``` + +Where: +* **...** - is list of other options. +* **deb** - option for create the deb package. + + +By default, cqtdeployer will create one deb package. +If you want create multi package destribution, you should use [Controll of packages options](Options.md) +To create a new package, use the -targetPackage [package; tar1] option + +cqtdeployer create deb package for each packages. + +Where: + +* **package** - it is package name +* **tar1** - it is name of the target that should be included in this package. + +Or you can describe packages in [configuration file](DeployConfigFile.md) + + +```json +{ +"targetPackage": [ + [ + "package", + "tar1" + ], +], +"deb": true +} +``` + + +## Custom Template for DEB + +You can create a own Template fo the debian pacakges. + +### The debian pacakge structure: + + +```bash +└── Debian templates + ├── debPacakge1 + │ └── DEBIAN + │ ├── control + │ ├── postinst + │ └── prerm + └── debPacakge2 + └── DEBIAN + ├── control + ├── postinst + └── prerm + +``` + +For include your templates into your destribution you need to add path of the Debian templates folder into deployConfig.json + +```json +{ +"targetPackage": [ + [ + "debPacakge1", + "tar1" + ], + [ + "debPacakge2", + "tar2" + ], +], +"deb": "./Debian templates" +} +``` + + +## Initialization of the debian template + +For initialize default templates you can use the getDefaultTemplate option. +The getDefaultTemplate option extract default template of the cqtdeployer. This is can be very convinion if you want override default behavior of the installer or anothe distribution package. + +### Example + +### Getting default debian template. + +```bash +cqtdeployer getDefaultTemplate deb +``` diff --git a/src/docs/en/DeployConfigFile.md b/src/docs/en/DeployConfigFile.md new file mode 100644 index 00000000..106e235f --- /dev/null +++ b/src/docs/en/DeployConfigFile.md @@ -0,0 +1,228 @@ +# Deployment file + +**Deployment file** - it's a json file containing the parameters for cqtdeployer. This file supports all parameters except confFile, since this parameter is responsible for connecting and initializing the file itself. + +### Configuration file structure + +```json +{ + "Bool option": true/false, + "Option": "Value", + "Enumeration-enabled option": [ + "Value 1", + "Value 2", + "Value 3", + ], + "Option with support for multilevel enumerations": [ + [ + "Value A1", + "Value A2" + ], + [ + "Value B1", + "Value B2" + ], + [ + "Value C1", + "Value C2" + ], + ] + +} +``` + +Read more about cqtdeployer options in the [options](Options.md) section. + +Examples of the contents of this file: + +File without using enumerated parameters +```json +{ + "noOverwrite": false, + "bin": "./", + "binDir": "./", + "qmlDir": "./", + "deploySystem": false, + "deploySystem-with-libc": false, + "qmake": "my/custom/path/to/qmake", + "ignore": "ignoreLib.dll", + "ignoreEnv": "/my/ignore/path", + "clear": true, + "force-clear": false, + "allQmlDependes": false, + "libDir": "./", + "recursiveDepth": 3, + "extraLibs": "myExtraLib (libssl)", + "extraPlugin": "myExtraPulgin (platforms)", + "targetDir": "./Distro", + "targetPackage": "", + "noStrip": false, + "extractPlugins": false, + "noTranslations": false, + "qmlOut": "qml", + "libOut": "lib", + "trOut": "tr", + "pluginOut": "plug", + "binOut": "bin", + "recOut": "rec", + "verbose": 3, + "qif": false, + "noCheckRPATH": false, + "noCheckPATH": false, + "name": "mainApplication", + "description": "this is description for default package", + "deployVersion": "1.0.0", + "releaseDate": "yyyy-MM-dd", + "icon": "/path/main/icon.png", + "publisher": "main team", + "customScript": "echo 'I am use custom script!!!'" +} + +``` + +File Using Enumerated Parameters +``` json +{ + "noOverwrite": false, + "bin": "./", + "binDir": "./", + "qmlDir": [ + [ + "package2", + "./TestQMLWidgets/" + ], + [ + "./qml/for/All" + ] + ], + + "deploySystem": false, + "deploySystem-with-libc": false, + "qmake": "this parameter should contain the path to your qmake, for Windows this field is required. On Linux, you can remove it, then qmake will be found by rpath.", + "ignore": "ignoreLib.dll", + "ignoreEnv": "/my/ignore/path", + "clear": true, + "force-clear": false, + "allQmlDependes": false, + "libDir": "./", + "recursiveDepth": 3, + "extraLibs": "myExtraLib (libssl)", + "extraPlugin": "myExtraPulgin (platforms)", + "targetDir": "./Distro", + "targetPackage": [ + [ + "/package1/", + "TestOnlyC" + ], + [ + "/package2/", + "TestQMLWidgets" + ] + ], + "noStrip": false, + "extractPlugins": false, + "noTranslations": false, + "qmlOut": "qml", + "libOut": "lib", + "trOut": "tr", + "pluginOut": "plug", + "binOut": "bin", + "recOut": "rec", + "verbose": 3, + "qif": false, + "noCheckRPATH": false, + "noCheckPATH": false, + "name": [ + [ + "package2", + "package2Application" + ], + [ + "mainApplication" + ] + ], + "description": [ + [ + "package2", + "this is description for package 'package2'" + ], + [ + "this is description for default package" + ] + ], + "deployVersion": [ + [ + "package2", + "1.0.0" + ], + [ + "1.0.0" + ] + ], + "releaseDate": [ + [ + "package2", + "yyyy-MM-dd" + ], + [ + "yyyy-MM-dd" + ] + ], + "icon": [ + [ + "package2", + "/path/icon.png" + ], + [ + "/path/main/icon.png" + ] + ], + "publisher": [ + [ + "package2", + "team of package2" + ], + [ + "main team" + ] + ], + "customScript": "echo 'I am use custom script!!!'" +} + +``` + +The purpose of file is to simplify the cqtdeployer's call and move some of the parameters into a file. The parameters specified in the file have a lower priority than the parameters added to the console at the run. + +### Creating of the file + +#### The first method + +1. Call `cqtdeployer init` to initialize the file for a single-package application. + Or `cqtdeployer -init multi` to initialize the file for a project with multiple packages. +2. Open CQtDeployer.json and edit it to fit your needs. +3. Call 'cqtdeployer' in the directory with the file 'CQtDeployer.json', or specify the path to it using the flag '-confFile path/to/my/CQtDeployer.json' + + +#### The second method +Call the cqtdeployer with a set of parameters you need and specify the path to the file using -confFile flag (the file should be absent). If the file exists, cqtdeployer will start unloading the parameters from it. + +An example: +``` bash +cqtdeployer -confFile deploy.json -bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite +``` + +Where: + +* cqtdeployer - the call of cqtdeployer +* -confFile deploy.json - the path to the file,that should be created +* "-bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite" - necessary parameters. + + +### Using of the deployment file. + + Use the flag -confFile [path to the file] to make cqtdeployer start reading the parameters from the file + +#### Example: + +cqtdeployer -qmake ~/Qt/bin/qmake -confFile ./deploy.json + diff --git a/src/docs/en/Description.md b/src/docs/en/Description.md new file mode 100644 index 00000000..25f5a857 --- /dev/null +++ b/src/docs/en/Description.md @@ -0,0 +1,9 @@ +# What is CQtDeployer + +The CQtDeployer is application for extract all depends library of executable and create 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 utility got flags that help you to configure the deployment for your or your project's needs +* Crossdeploy: this utility support windows and linux distrebutives, This means that you can use it not only to deploy a project for your platform, but also to deploy a project on Linux for Windows and vice versa. +* Packaging - this utility can create installation files and packages for your application. diff --git a/src/docs/en/DisableShortcats.md b/src/docs/en/DisableShortcats.md new file mode 100644 index 00000000..3787bc34 --- /dev/null +++ b/src/docs/en/DisableShortcats.md @@ -0,0 +1,19 @@ +# Disabling shortcuts + +Disabling shortcuts for multi targets distribution Kit in the Qt Installer framework. + +Some times we need to disable creating automaticly shortcuts for some applications. +For solve this problem i recomendet override the default qt installer framework template. + +# Note +Starting from CQtDeployer 1.5.1, you can use the -disableShortcuts option to disable the automatic creation of shortcuts. + +### Example: + +```bash +cqtdeployer -disableShortCut targetName,target2Name +``` + +```bash +cqtdeployer -bin myProgramm.exe -disableShortCut myProgramm +``` diff --git a/src/docs/en/EnvironmentVariables.md b/src/docs/en/EnvironmentVariables.md new file mode 100644 index 00000000..b88084ee --- /dev/null +++ b/src/docs/en/EnvironmentVariables.md @@ -0,0 +1,50 @@ +# Environment variables + +Environment variables of the CQtDeployer + +This page contains information about environment variables of the default launcher script. + +## Initialization + +All environment variables initialized in the default launcher script. So if you use the runScript option then you must be reunited all needed variables manually. + + +## Variables list + +| Variable name | Description | +|---|---| +| CQT_PKG_ROOT | This variable contains path to root of the current package.| +| CQT_RUN_FILE | This variable contains path to the run script of the using application.| + +## Description of definitions + +**Root of the current package** - This root is local root for any separate packages. + + +Example : + +```bash +. +├── pakcage1 << This is local root of the package1 +│ ├── bin +│ ├── lib +│ ├── plugins +│ ├── qml +│ └── translations +├── package2 << This is local root of the package2 +│ ├── bin +│ ├── lib +│ ├── plugins +│ ├── qml +│ └── translations +└── pakcage3 << This is local root of the package3 + ├── bin + ├── lib + ├── plugins + ├── qml + └── translations + +``` + + + diff --git a/src/docs/en/ExtraFiles.md b/src/docs/en/ExtraFiles.md new file mode 100644 index 00000000..5de95ecb --- /dev/null +++ b/src/docs/en/ExtraFiles.md @@ -0,0 +1,107 @@ +# Adding extraData + +Adding extraData into distributive. + +CQtDeployer has support to work with extra data files. + +For this you should use the -extraData and -extraDataOut options. + +## Examples: + +### Add custom file into root directory of the your distribution. + +``` +cqtdeployer -extraData path/to/my/customFile +``` + +Or in configFile.json + +```json +{ + ... + "extraData": "./path/to/my/customFile" + ... +} +``` + +This command support list of arguments. + + +```bash +cqtdeployer -extraData path/to/my/customFile,path/to/my/customFile2,path/to/my/customFile3 +``` + +Or in configFile.json + +```json +{ + ... + "extraData": [ + "./path/to/my/customFile", + "./path/to/my/customFile2", + "./path/to/my/customFile3" + ] + ... +} +``` + +### Changing location of extra data files. + +For change location you should use the extraDataOut options. This option change destination path based on the root of the distributive. + +### Example. Add custom scripts into scripts folder in the Distribution. + +```bash +cqtdeployer -extraData /path/to/myScripts.sh,/another/path/to/myScripts.sh -extraDataOut scripts +``` + +Or in configFile.json + +```json +{ + ... + "extraData": [ + "./path/to/myScripts.sh", + "./another/path/to/myScripts.sh" + ], + "extraDataOut": "scripts" + ... +} +``` + +## Packages + +extraData and extraDataOut options have support to work with packages. See the packaging [page](Packing.md) to get more information about packages. + +Sometimes we need to create a multipackages application. For example create a installer for client-server application with the client and server applications. The client and server have a own default configuration files. We add config files using the extraData option. + +For create a big distribution i recommend use the [confFile](DeployConfigFile.md). + +## Example multipacking application. + + +```json +{ + + "bin": [ + "myClientExecutable", + "myServerExecutable" + ], + + "targetPackage" : [ + ["Client", "myClientExecutable"], + ["Server", "myServerExecutable"] + ], + + "extraData": [ + ["Client", "./path/to/clientConfig.conf"], + ["Server", "./path/to/serverConfig.conf"] + ], + "extraDataOut": [ + ["Client", "defaultConfigurations"], + ["Server", "defaultConfigurations"] + ] +} +``` + +This config create a distribution with two appications (client and server). Each application have a own configuration file in the defaultConfigurations folder. diff --git a/src/docs/en/ExtractDefaultsTemplates.md b/src/docs/en/ExtractDefaultsTemplates.md new file mode 100644 index 00000000..35ed6663 --- /dev/null +++ b/src/docs/en/ExtractDefaultsTemplates.md @@ -0,0 +1,49 @@ +# Extracting default templates + +Sometimes you need to create your own templates for installers or deb packages. +Fot this you can use the getDefaultTemplate option. This option extracts your distribution's default template to the target directory. This option will generate a template according to your settings. If you use the targetPackage option then a template will be generated for each package you configured. + +### Example: + +``` bash +cqtdeployer -bin myExecutable getDefaultTemplate qif +``` +This command generate template for qt installer framework into DistributionKit folder for your "myExecutable" programm. + +If you want change target location just add the targetDir option +``` bash +cqtdeployer -bin myExecutable getDefaultTemplate qif -targetDir "/distanation/Dir" + +``` + +## Work With multipackage distribution. + +This option support the configFile.json + +### Example : + +#### configFile.json + +```json +{ + + "bin": [ + "myClientExecutable", + "myServerExecutable" + ], + + "targetPackage" : [ + ["Client", "myClientExecutable"], + ["Server", "myServerExecutable"] + ], +} +``` + +```bash +cqtdeployer getDefaultTemplate qif -confFile "path/to/configFile.json" +``` + + +## Note +This option support work with all packages except of zip. +If you want get more information about available packages see the packing [page](Packing.md). diff --git a/src/docs/en/Guide.md b/src/docs/en/Guide.md new file mode 100644 index 00000000..6885443e --- /dev/null +++ b/src/docs/en/Guide.md @@ -0,0 +1,550 @@ +# How to deploy + +How to deploy C++ Application + + +In this article i describe deploy processes of c++/qt application with cqtdeployer. + +## Recommendation +If you want maximum stability of your distribution and you want to run your application on different Distributions with a different versions then you need to use Qt from official [build](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5). + +## Case +In this case we deploy Qt GUI Application for Ubuntu 16.04,Ubuntu 18.04 and Ubuntu 20.04 ++. + +**If you want support all distributions begin from Ubuntu 16.04 you need build and deploy you application on the older distribution (in my case it is 16.04)** + +## Install CQtDeployer +If you want use system qt from your OS then install [classic](https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run) version of the cqtdeployer. + +```bash +wget https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run +``` + +``` +chmod +x LinuxInstaller.run +./LinuxInstaller.run +``` +![CQtDeployer Setup](https://user-images.githubusercontent.com/12465465/100077575-9280a600-2e53-11eb-8d9d-d184341cfa7c.png) + +Select latest stable version (1.4) + +![Screenshot from 2020-11-24 12-50-54](https://user-images.githubusercontent.com/12465465/100077707-bb08a000-2e53-11eb-9838-6f896af33105.png) + +Done. + +If You use official qt build then you can use snap version of the cqtdeployer. + +``` +sudo snap install cqtdeployer +``` + +After install add requirement permissions. + +``` +sudo snap connect cqtdeployer:process-control +sudo snap connect cqtdeployer:removable-media +sudo snap connect cqtdeployer:system-backup +``` + +Done!!! + +## Deploy Qt GUI Application + +### Deploy your executable file. + +* For Linux systems: + +```bash +cqtdeployer -bin myexecutable +``` + +* For Windows systems: + +```bash +cqtdeployer -bin myexecutable.exe -qmake C:/Qt/5.15.0/min_gw/bin/qmake.exe +``` + +* For crossplatform build (Linux -> Windows) + +```bash +cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/bin/qmake +``` + +## Extra options + +If you use extra libraries, just add path for cqtdeployer to used libs. + +```bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs +``` + +If you want find libraries recursively from libDir path, just add recursive Depth option. + +```bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 +``` + +If you application use qml, just add qmlDir option + +```bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources +``` + +If you want create simple installer for your application just add gif option. +``` +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif +``` + +If cqtdeployer not found qmake then add the -qmake option to an invoke command. + +``` +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -qmake /path/to/my/qmake + +``` + + +# Using a live animation example from [Qt Examples](https://doc.qt.io/qt-5/qtquick-animation-example.html) + +## Build the project as a release + +Run qmake with the -r option for release build + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.152/quick/animation$ ~/Qt/5.15.2/gcc_64/binqmake -r . +``` + +Call your make command. + +For Linux: + +```bash +make -j${nproc} +``` + +For Windows + +```bash +Qt/Tools/QtCreator/bin/jom.exe +``` + +Build log: + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ make -j${nproc} +g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o main.o main.cpp +/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name shared ../shared/shared.qrc -o qrc_shared.cpp +/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name animation animation.qrc -o qrc_animation.cpp +g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_animation.o qrc_animation.cpp +g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_shared.o qrc_shared.cpp +g++ -Wl,-O1 -Wl,-rpath,/home/andrei/Qt/5.15.2/gcc_64/lib -o animation main.o qrc_shared.o qrc_animation.o /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so -lGL -lpthread +``` + +## Find our resulting executable file + +If you built the project using qtCreator, your executable file will be found one level higher in the **build-animations-Desktop_Qt_5_15_2_GCC_64bit-Release** folder. In my case, the executable file is located in the root directory of the project. + +```bash + andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ tree +. +├── animation # Here it is. +├── animation.pro +├── animation.qml +├── animation.qmlproject +├── animation.qrc +├── basics +│ ├── animators.qml +│ ├── color-animation.qml +│ ├── images +│ │ ├── face-smile.png +│ │ ├── moon.png +│ │ ├── shadow.png +│ │ ├── star.png +│ │ └── sun.png +│ └── property-animation.qml +├── behaviors +│ ├── behavior-example.qml +│ ├── FocusRect.qml +│ ├── SideRect.qml +│ ├── tvtennis.qml +│ └── wigglytext.qml +├── doc +│ ├── images +│ │ └── qml-animations-example.png +│ └── src +│ └── animation.qdoc +├── easing +│ └── easing.qml +├── main.cpp +├── main.o +├── Makefile +├── pathanimation +│ └── pathanimation.qml +├── pathinterpolator +│ └── pathinterpolator.qml +├── qrc_animation.cpp +├── qrc_animation.o +├── qrc_shared.cpp +├── qrc_shared.o +└── states + ├── qt-logo.png + ├── states.qml + └── transitions.qml + +10 directories, 33 files +``` + +## Call cqtdeployer to form the base distribution + +For Linux: + +```bash +cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +``` + +For Windows: + +```bash +cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/mingw_810_64/bin/qmake.exe +``` + +Deploy log: + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +Info: Deploy ... +Info: flag targetDir not used. use default target dir :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit +Info: target deploy started!! +Info: copy :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/animation +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/libqmlplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/libmodelsplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/libqtqmlremoteobjects.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/libqtqmlstatemachine.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/libworkerscriptplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/libparticlesplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/libqtquick2plugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/qmldir +Info: platform : libqvnc is disabled +Info: platform : libqvnc is disabled +Info: platform : libqwebgl is disabled +Info: platform : libqwebgl is disabled +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqconnmanbearer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqgenericbearer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqnmbearer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/iconengines/libqsvgicon.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqgif.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqicns.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqico.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqjpeg.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqsvg.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtga.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtiff.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwbmp.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwebp.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqeglfs.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqlinuxfb.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimal.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimalegl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqoffscreen.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-generic.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-glx.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqgtk3.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqxdgdesktopportal.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-decoration-client/libbradient.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdmabuf-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdrm-egl-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libqt-plugin-wayland-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libshm-emulation-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libvulkan-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-glx.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-dmabuf-server-buffer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-drm-egl-server-buffer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-linux-dmabuf-unstable-v1.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-shm-emulation-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-vulkan-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-eglstream-controller.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-glx.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libfullscreen-shell-v1.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libivi-shell.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libwl-shell.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v5.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v6.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-egl-integration.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-glx-integration.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5EglFSDeviceIntegration.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5XcbQpa.so.5 +Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicui18n.so.56 +Info: copy :/usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5RemoteObjects.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QuickParticles.so.5 +Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicudata.so.56 +Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicuuc.so.56 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlWorkerScript.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Widgets.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandClient.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5DBus.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Svg.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandCompositor.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ar.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_bg.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ca.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_cs.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_da.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_de.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_en.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_es.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fi.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_gd.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_he.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_hu.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_it.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ja.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ko.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_lv.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_pl.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ru.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_sk.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_tr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_uk.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_zh_TW.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_bg.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_da.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_de.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_en.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_es.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fi.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_hu.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ja.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ko.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_lv.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_pl.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ru.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_sk.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_tr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_uk.qm +Info: try deploy msvc +Info: deploy done! +Info: copy ::/shared/Distributions/Templates/Icon.png +Error: not exits +Info: [0] Parsed arguments, ok. +Info: [2] Collecting information about available packages... +Info: [4] Found subdirectory "Application" +Info: [4] - it provides the package "Application" - "1.0" +Info: [4] Copying component data for "Application" +Info: [5] Compressing data directory "bin" +Info: [21] Compressing data directory "icons" +Info: [31] Compressing data directory "lib" +Info: [11111] Compressing data directory "plugins" +Info: [11740] Compressing data directory "qml" +Info: [11786] Compressing data directory "translations" +Info: [12321] Compressing files found in data directory: ("/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/data/animation.sh") +Info: [12321] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" +[12321] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" +Info: [12321] Generated sha1 hash: "0af6cb9dc074407a8857403f07d13aa7d1b3c9cb" +Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" +[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" +Info: [12322] Generated sha1 hash: "aa938cb332bfb427a6d0280c07c204c1bb48da22" +Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" +[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" +Info: [12347] Generated sha1 hash: "7c3a43111e694bc82a0ab0d19a6e4d0025f17313" +Info: [12347] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" +[12347] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" +Info: [12349] Generated sha1 hash: "4ed23c36835a9b62701478ab6897737dfe9dfc9a" +Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" +Info: [12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" +Info: [12349] Generated sha1 hash: "bd44e15d2c26c8f6cb50760032eadf0241eedf43" +Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" +[12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" +Info: [12350] Generated sha1 hash: "030e0ede0c0e058a5d5a3b6c43c6a4767119d3f1" +Info: [12350] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" +Info: [12350] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" +Info: [12350] Generated sha1 hash: "acd2cd63e77971acedbcda2a65f93b2cc036025f" +Info: [12350] Copy meta data for package "Application" using "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/package.xml" +Info: [12350] calculate size of directory "/tmp/binarycreator-yOPMPa/Application/data" +Info: [12359] Copying associated "script" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/installscript.qs" +Info: [12360] done. +Info: [12360] Begin to copy configuration file and data. +Info: [12360] Copying associated "configuration" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/config.xml" +Info: [12360] done. +Info: [12360] Read dom element: animation. +Info: [12360] Read dom element: 1.0. +Info: [12360] Read dom element: animation. +Info: [12360] Read dom element: Company. +[12360] Read dom element: animation. +[12360] Read dom element: @HomeDir@/animation. +Info: [12360] Read dom element: true. +[12360] Read dom element: true. +Info: [12360] Read dom element: controlScript.qs. +Info: [12360] Copying associated "ControlScript" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/controlScript.qs" +Info: [12360] done. +Info: [12360] Read dom element: animationTool. +[12360] Read dom element: . +Info: [12360] done. +Info: [12362] Creating the binary +Info: [12407] Creating resource archive for "Application" +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" ("61.58 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" ("108.00 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" ("18.08 MB") +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" ("1.08 MB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" ("53.29 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" ("40.00 bytes") +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" ("595.71 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" ("439.00 bytes") +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" ("40.00 bytes") +Info: [12449] Cleaning up... +``` + +Done. The distribution has been saved to the **DistributionKit** folder + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ ./DistributionKit/Installeranimation.run +``` +![2021-02-22 11-25-34](https://user-images.githubusercontent.com/12465465/108681955-c629a580-7500-11eb-8087-cedfa8134aae.png) + +After installation, all the necessary shortcuts will be created. + +![2021-02-22 11-27-11](https://user-images.githubusercontent.com/12465465/108682148-012bd900-7501-11eb-9f0b-f46fd79aef25.png) + +![2021-02-22 11-29-23](https://user-images.githubusercontent.com/12465465/108682391-48b26500-7501-11eb-8d81-b430ddf97d46.png) + + +## Integration with QtCreator + +Unfortunately, there is currently no integration with qtcreator. +The only way is to enable build target for ** qmake ** or ** cmake ** + +### qmake + +```qmake +QT_DIR= $$[QT_HOST_BINS] +win32:QMAKE_BIN= $$QT_DIR/qmake.exe +contains(QMAKE_HOST.os, Linux):{ + QMAKE_BIN= $$QT_DIR/qmake +} + +deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif + +QMAKE_EXTRA_TARGETS += deploy + +``` + +### cmake + +```cmake + find_program(Q_MAKE_EXE qmake) + + find_program(CQT_EXE cqtdeployer) + + IF(NOT EXISTS ${CQT_EXE}) + message("the cqtdeployer not exits please install the cqtdeployer and run cmake again!") + return() + endif(NOT EXISTS ${CQT_EXE}) + + ADD_CUSTOM_TARGET( + deploy + COMMAND cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5 + COMMENT "Deploy: cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + ) +``` + +The **libDir** parameter is used to set the paths to the directory paths contain dependencies of your application, and the **qmlDir** parameter is used to set the directory paths contain the qml files required by your application. In this example, the application source code root is selected by these two options. +The **recursiveDepth** parameter is used to set the search depth of **libDir** and **qmlDir**. +The **qif** parameter is used to create a installer using Qt Installer Framework. + + +## Integration example +Create a test project + +```qmake + +QT += quick + +CONFIG += c++11 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + + +QT_DIR= $$[QT_HOST_BINS] +win32:QMAKE_BIN= $$QT_DIR/qmake.exe +contains(QMAKE_HOST.os, Linux):{ + QMAKE_BIN= $$QT_DIR/qmake +} + +DESTDIR=$$PWD/Build + +deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif + +QMAKE_EXTRA_TARGETS += deploy + +``` + +2. Open the project control panel + ![Снимок экрана от 2021-02-22 12-15-51](https://user-images.githubusercontent.com/12465465/108687472-d09b6d80-7507-11eb-9b56-8d09d42dac5e.png) + +3. Choose a release build + ![изображение](https://user-images.githubusercontent.com/12465465/108688147-a39b8a80-7508-11eb-81b9-9a24426a94a3.png) + + +3. Add "Custom build step" + ![изображение](https://user-images.githubusercontent.com/12465465/108687640-02143900-7508-11eb-8d1c-532afd7f6ccb.png) + +4. In the "Make arguments" field, add our "deploy" deployment step + ![изображение](https://user-images.githubusercontent.com/12465465/108687800-35ef5e80-7508-11eb-8f69-aec090d4baa0.png) + +5. Save +6. Start the building + +#### As a result, you will receive a DistributionKit folder with the installer of your application. diff --git a/src/docs/en/Home.md b/src/docs/en/Home.md new file mode 100644 index 00000000..3953aa3c --- /dev/null +++ b/src/docs/en/Home.md @@ -0,0 +1,26 @@ +# Welcome to the "C Qt Deployer"! +# ![Logo](https://user-images.githubusercontent.com/12465465/84260958-99289480-ab23-11ea-8aab-374368a545dc.png) + +*************************** + +# Main sections + +* [Description CQtDeployer](Description.md) +* [Options](Options.md) +* [Guide](Guide.md) +* [Quick guide](QuickGuide.md) +* [Build and Install](Build-and-Install.md) +* [Deploy file](DeployConfigFile.md) +* [Packing](Packing.md) +* [Change log page](Changelog.md) +* [Reviews](ReleaseReviews.md) +* [Compare Features](CompareFeatures.md) +* [Adding extra files](ExtraFiles.md) +* [Retrieving packaging templates](ExtractDefaultsTemplates.md) +* [Default Environment Variables](EnvironmentVariables.md) +* [Disable standard shortcuts ](DisableShortcats.md) +* [Custom scripts](CustomScripts.md) + + +## Support the project +If you like what we do and it benefits you, you can support the project on the official page [QuasarApp in Patreon](https://www.patreon.com/QuasarApp) diff --git a/src/docs/en/Options.md b/src/docs/en/Options.md new file mode 100644 index 00000000..6407e142 --- /dev/null +++ b/src/docs/en/Options.md @@ -0,0 +1,174 @@ +# Options general rules + +General rules for using options + +``` +cqtdeployer -option1 value1 -option2 list, of, values ​​flag1 flag2 flag3 +``` + +* All options must begin with a '-' sign. +* After specifying the desired option, you must specify the value. +* Some options support enumerations (arrays of values). When initializing such options, specify the list of values through ',' without spaces. If you use any programming language and call the cqtdeployer process, then the array of values must be passed as 1 parameter. +* Some options support redistributions with the ability to select the target for which the flag will be applied. Target and values are separated using the ';' sign. Example -libOut target1;value1,target2;value2,defaultValue. +* To include a flag, simply include the flag name in the list of options. + +## Description of values in the table + +* **-binDir [params]** - option without array support. +* **-bin [params,list]** - option with support for arrays. The delimiter used is ','. +* **-libOut [package;path,path]** - parameter with support for selecting the package for which the flag value is set. As a separator, use ';'. Please note that the rule described above is used to enumerate parameter values. The last parameter does not have a package value, this means that this value will be set for all non-configured packages by default. +* **clear** - boolean option + +## Definitions in description + +**System environments** - paths of directories containing the system libraries. + * Windows: + * Paths defined in the PATH variable. + * C:/Windows/System32 + * C:/Windows/SysWOW64 + * Linux: + * Paths defined in the LD_LIBRARY_PATH and PATH variables. + * /usr/lib + * /lib + +**Deployable files** - all file that will be copied into distribution (include executable files) + +**Targets** - all executable files marked by bin option. + +**Executable files** - all files with PE, ELF and Mach-O formats. + +## Options: + +### Boolean options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| init | will initialize cqtdeployer.json file (configuration file)| +| | For example: "cqtdeployer init" - for initialize base package configuration| +| | "cqtdeployer -init multi" - for initialize multi package configuration| +| | "cqtdeployer -init single" - for initialize single package configuration | +| help / h | Shows help. | +| clear | Deletes deployable files of the previous session. +| force-clear | Deletes the destination directory before deployment. | +| noStrip | Skips strip step | +| noTranslations | Skips the translations files. | +| | It doesn't work without qmake and inside a snap package | +| noOverwrite | Prevents replacing existing files. | +| noCheckRPATH | Disables automatic search of paths to qmake in executable files.| +| noCheckPATH | Disables automatic search of paths to qmake in system PATH. | +| noRecursiveiIgnoreEnv | Disables recursive ignore for ignoreEnv option. | +| v / version | Shows compiled version | +| qif | Create the QIF installer for deployment programm" | +| | Example: cqtdeployer qif" }, | +| | Starting with CQtDeployer 1.5 you can specify the path to your own installer template. | +| | Examples: cqtdeployer -qif path/to/myCustom/qif. More details can be found [here](QIF.md) | +| deb | Create the deb package for deployment programm" | +| | Example: cqtdeployer deb" }, | +| | you can specify the path to your own DEBIAN template. | +| | Examples: cqtdeployer -deb path/to/myCustom/DEBIAN. More details can be found [here](DEB.md) | +| deploySystem | Deploys all libraries not recomendet because there may be conflicts with system libraries | +| noQt | Ignors the error of initialize of a qmake. Use only if your application does not use the qt framework. | +| allowEmptyPackages | Allows configure the empty packages. | +| getDefaultTemplate | Extracts defaults deb or qif templates. For more information see the extracting default templates [page](ExtractDefaultsTemplates.md) | +| noHashSum | Disable computation of a packages hash sum | + + +### Deploy options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -bin [list,params] | Files to deploy or folders that contain files to deploy. For example -bin ~/my/project/bin/,~/my/project/bin.exe,~/my/project/runtimeLinking/lib.dll. For files: These files will be unconditional copied to the destination directory, regardless of their format or suffix. For folders: CQtDeployer will enter these folders and non-recursively copy all executable files to the destination directory. Then, CQtDeployer will extract all dependencies of the copied files and search dependencies in system environments and **libDir** paths. **Note**: If CQtDeployer can't find required file then CQtDeployer try find required file in the system PATH enviroment.| +| -binPrefix [prefixPath] | Sets prefix path for bin option. Example: **-bin path/MyExecutable** is some as **-bin MyExecutable -binPrefix path** | +| -confFile [params] | The path to the json file with all deployment configurations.| +| | Using this file, you can add the necessary options, | +| | thereby simplifying in the command invocation the console. | +| | However, the parameters in Kansol have a higher priority than in the file.| +| | For more info about this flag see [wiki](DeployConfigFile) | +| -qmlDir [params] | Qml data dir. For example -qmlDir ~/my/project/qml | +| -qmake [params] | Qmake path. For example | +| | -qmake ~/Qt/5.14.0/gcc_64/bin/qmake | +| -ignore [list,params] | The list of libs to ignore. | +| | For example -ignore libicudata.so.56,libicudata2.so.56 | +| -ignoreEnv [list,params] | The list of the environment to ignore. | +| | For example -ignoreEnv /bad/dir,/my/bad/Dir | +| -libDir [list,params] | Sets additional paths for extra libs of an app. | +| | For example -libDir ~/myLib,~/newLibs. **Attention** the libDir option should not be children of the targetDir directory. The targetDir option is forbidden for library searches, as it may contain outdated project libraries, which in turn may lead to unwanted crashes. | +| -extraLibs [list,params] | Sets the mask of the library name for forced copying. | +| | Example: "-extraLib mySql" - forces to copy all libraries whose names contain mySql to the project folder. This option is case-insensitive on Windows and case-sensitive on other platforms. This option will only search libraries in system environments similar to **deploySystem**.| +| -customScript [scriptCode]| Insert extra code inTo All run script. | +| -extraPlugin [list,params]| Sets an additional path to extraPlugin of an app | +| -recursiveDepth [params] | Sets the Depth of recursive search of libs and ignoreEnv (default 0) | +| -targetDir [params] | Sets target directory(by default it is the path to the first deployable file)| +| -installDirDeb [params] | Sets install target directory fordebian package (by default it is /opt path) | +| -installDirQIFW [params] | Sets install target directory for installers (by default it is /home path) | +| -verbose [0-3] | Shows debug log. By default it is 2 | +| -platform [list] | If this option is enabled then CQtDeployer will deploy only binaries of a selected platform. Supported values: [win_x86 win_x86_64 win_arm win_arm64 linux_x86 linux_x86_64 linux_ARM linux_ARM64] | + +### Controll of packages options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -targetPackage [package;tar1,package;tar2]| Creates a new package and adds 'tar1 and tar2' to it | +| -qmlOut [package;path,path] | Sets path to qml out directory | +| -libOut [package;path,path] | Sets path to libraries out directory | +| -trOut [package;path,path] | Sets path to translations out directory | +| -pluginOut [package;path,path]| Sets path to plugins out directory | +| -binOut [package;path,path] | Sets path to binary out directory | +| -recOut [package;path,path] | Sets path to recurses out directory | +| -extraDataOut [package;path,path] | Sets path to extra data files out directory. By Default it is root dir of the distribution. | +| -name [package;val,val] | Sets name for package. If this if you do not specify a package, the value will be assigned to the default package ("")| +| -description [package;val,val] | Sets description for package | +| -deployVersion [package;val,val] | Sets version for package | +| -releaseDate [package;val,val] | Sets release date for package | +| -publisher [package;val,val]| Sets publisher for package | +| -homePage [package;val,val] | Sets the homepage url for a package | +| -prefix [package;val,val] | Sets the prefix for the package relatively a target directory | +| -extraData [package;val,val]| Adds the extra files or directories like a target. The selected directory will be copy to the extraDataOut location with save own structure.| +| -tr [package;val,val] | Adds qm files into the translations folder. | + +### Controll of targets options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -icon [target;val,val] | Sets path to icon for a targets. This option support only png (Linux) and ico (Windows) files. | +| -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)| + +### Plugins Controll Options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -extraPlugin [package;val1;val2,SingeleVal]| Sets an additional path to third-party application plug-in | +| -enablePlugins [package;val1;val2,SingeleVal] | Enables additional plugins for distribution. | +| -disablePlugins [package;val1;val2,SingeleVal]| Disables plugins for distribution. | +| |You can disable any plugin of your Qt build, just see the yourQtFolder/plugins forlder for available plugins.| +| |Example: if you want disable qxcb plugin: -disablePlugins qxcb. Note that the name of the plugin is indicated without its extension.| + +### QtInstallFramework options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -qifStyle [path/to/style.css]| Sets the path to the CSS style file or sets the default style. Available styles: quasar | +| -qifBanner [path/to/banner.png]| Sets path to the banner png file. | +| -qifLogo [path/to/logo.png]| Sets path to the logo png file. | +| -qifOut [nameOfOutputInstallerFile] | Sets name of output qifw installer. Note: on Windows, the exe suffix will be added to the installer automatically. | +| -qifConfig [path/to/config.xml] | Sets a custom path to the configure file of the qt ifw installer. By default it is qif/config/config.xml. Note This path sets releative target folder (sets by TargetDir option). | +| -qifPackages [path/to/packagesFodoler] | Sets a custom path to the packages directories. By default it is qif/packages. Note This path sets releative target folder (sets by TargetDir option). | +| -qifResources [path/to/resources1.qrc,path/to/resources2.qrc] | Sets a custom path to the resources files. By default this option is skipped. Note This path sets releative target folder (sets by TargetDir option). | +| -qifArchiveFormat [7z,zip,tar,tar.gz,tar.bz2,tar.xz] | Sets the format used when packaging new component data archives. If you omit this option, the 7z format will be used as a default. | +| -binarycreator [binarycreator command] | Sets new binarycreator command. Example : cqtdeployer -bin my.exe qifw -binarycreator 'wine path/to/binarycreator.exe'| + +### Deb package options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -debOut [package;nameOfOutputDebFile,nameOfOutputDebFile]| Sets name of the output debian file. This option can be work with multiple packages | + +### Zip pacakge options + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -zipOut [package;nameOfOutputZipFile,nameOfOutputZipFile]| Sets name of the output zip arrhive. This option can be work with multiple packages | + +#### Example: cqtdeployer -bin myApp -qmlDir ~/MyAppProject/qml -qmake ~/Qt/5.15.4/gcc_64/bin/qmake clear diff --git a/src/docs/en/Packing.md b/src/docs/en/Packing.md new file mode 100644 index 00000000..20ed6fbc --- /dev/null +++ b/src/docs/en/Packing.md @@ -0,0 +1,139 @@ +# Packaging distributions + +General information on packaging your distributions in packages. + +## Packaging Types + +* Automatic +* Manual + +## Automatic Packages + +Packages with this type creates automaticly. +By default the distribution have a one main package. You can configure it using [Controll of packages options](Options.md). + +#### Example (Set new name for pacakge) + +``` +ctdeployer ... -name "MyPackage" +``` + +If your distribution have a multiple executable files then you can be create a distribution with multiple package. + +One package can contain from 1 to infinity of executable files. + +For configure a package you must be use the targetPackage option. + +Example of using: + +``` +cqtdeployer ... -targetPackage myPacage;target1,myPacage2;target2 +``` + +Where myPacage is a name of package and target1 is a name of executable file. +so This example create 2 packages from 2 targets. + +The Next example create a 2 packages from 3 targets. +``` +cqtdeployer ... -targetPackage myPacage;target1,myPacage;target2,myPacage2;target3 +``` + + +You can also do the same in the config file + +``` +{ +"targetPackage": [ + [ + "myPacage", + "target1" + ], + [ + "myPacage2", + "target2" + ] + ] +} +``` + +``` +{ +"targetPackage": [ + [ + "myPacage", + "target1" + ], + [ + "myPacage", + "target2" + ], + [ + "myPacage2", + "target3" + ] + ] +} +``` + + +## Manual Packages + +Manual packages is packages created by user template. +For example you have a aplication that must be execute a complex script on the debian package or the installer. +So you need to create your template and add tehe path to you template for a package option. + +Example + +``` +cqtdeployer ... -qif /path/to/my/template/installer +``` + +The /path/to/my/template/installer folder must be contains a folder with the package name. +for example i am deploy application with the "MyExample" name, so my custom template must be locate in the +/path/to/my/template/installer/MyExample path. + +For multi-package distributions, the same rules apply. + +Your folder with the templates must be contains folders with same names as packages. + +Example: + +``` +{ +"targetPackage": [ + [ + "myPacage", + "target1" + ], + [ + "myPacage", + "target2" + ], + [ + "myPacage2", + "target3" + ] + ] +} +``` + +``` +~/path/to/my/template/installer$ tree +. +├── myPacage +│ └── ... +└── myPacage2 + └── ... + +``` + +### Note + +You can also extract the standard package template in order to override it if for some reason you are not satisfied with the standard implementation. See this [page](ExtractDefaultsTemplates.md) for details on how to do this + + +## Available packages + +* [Qt Install Framework](QIF.md) +* [ZIP Arhive](ZIP.md) +* [DEB Package](DEB.md) diff --git a/src/docs/en/QIF.md b/src/docs/en/QIF.md new file mode 100644 index 00000000..622774e0 --- /dev/null +++ b/src/docs/en/QIF.md @@ -0,0 +1,176 @@ +# Qt Installer Framwork + +General rules for using Qt Installer Framwork + +### What is Qt Installer Framwork + +The **Qt Installer Framework** (QIF) provides a set of tools and utilities to create installers for the supported desktop Qt platforms: Linux, Microsoft Windows, and OS X. +In **CQtDeployer** QIF availabel in qif option. + +### How to use qif option + +The qif option invoke with path to custo qt installer template or with default installer template. + +#### For example: + +```bash + cqtdeployer ... qif +``` + +Where: +* **...** - is list of other options. +* **qif** - option for use qt installer framework with default template. + + +By default, cqtdeployer will create an installation file with one package in which your entire distribution kit will lie. +If you want to configure it, you should use [Controll of packages options](Options.md) +To create a new package, use the -targetPackage [package; tar1] option + + +Where: + +* **package** - it is package name +* **tar1** - it is name of the target that should be included in this package. + +Or you can describe packages in [configuration file](DeployConfigFile.md) + + +```json +{ +"targetPackage": [ + [ + "package", + "tar1" + ] +], +} +``` + +# Custom Template for QIF + +Starting with CQtDeployer Version 1.5 you can use your own installer template. To do this, you must pass the path to your template to the qif parameter. + +```bash +cqtdeployer ... -qif /path/to/my/custom/qif/template +``` + +### Template + +The qif template should contain 2 folders: +* packages +* config + +### Attention + +The name of the packages in the packages folder must match the names of the packages during deployment. + +For example: + +```json +"targetPackage": [ + [ + "myCustomInstaller", + "tar1" + ] +], +``` + +```bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` + +If the folder names do not match the package names then CQtDeployer will use the standard QIF package. + +If you have only one package then you can use the **name** option for set name the application. + +```bash +cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller +``` + +#### Do not forget to rename the your package folder to the packaga name of the name option. + + +```bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller << "This is folder of the your package" + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` + +## Initialization of the qifw template + +For initialize default templates you can use the getDefaultTemplate option. +The getDefaultTemplate option extract default template of the cqtdeployer. This is can be very convinion if you want override default behavior of the installer or anothe distribution package. + +### Example + +### Getting default qt installer framwork template. + +```bash +cqtdeployer getDefaultTemplate qif +``` + + +### Note + +CQtDeployer will skip create a packages directory for the template because this commmnad do not contains any deploying data. +If you want to prepare template with packages configurations then you should add deployed data to your command or your config.json file using bin or extraData options. +If you create multi pacakges distribution then you need to configure your packages in your deploying commnad. + + +#### Example: + +Extracting template with pacakges: + +```bash +cqtdeployer getDefaultTemplate qif -bin myExecutable +``` + +Extracting template for multi packages distribution + +```bash +cqtdeployer getDefaultTemplate qif -bin myExecutable1,myExecutable2 -targetPackage p1;myExecutable1,p2;myExecutable2 +``` + +You also can use the config file for configure templates. + +Config.json + +```json +{ + "qif": true, + "bin": [ + "myExecutable1", + "myExecutable2" + ], + "targetPackage": [ + ["p1", "myExecutable1"], + ["p2", "myExecutable2"] + ] +} +``` + +Run CQtDeployer for generate template: + +```bash +cqtdeployer -confFile Config.json getDefaultTemplate +``` diff --git a/src/docs/en/QuickGuide.md b/src/docs/en/QuickGuide.md new file mode 100644 index 00000000..f6137d4c --- /dev/null +++ b/src/docs/en/QuickGuide.md @@ -0,0 +1,81 @@ +# Quick Guide + +How to deploy project with cqtdeployer. + +1. First one you need to install cqtdeployer into your platform + + * Snap (14 more linux destributions): + ``` + sudo snap install cqtdeployer + ``` + Or + + Install from snap store and add all requirement permissions. + + [![Download from Snap Store](https://snapcraft.io/static/images/badges/ru/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) + + * Other linux [LinuxInstaller.run][1]. + ``` + chmod +x LinuxInstaller.run + ./LinuxInstaller.run + ``` + + * Windows [installer][1] + +2. Build your project on release mode. +3. Deploy yor executable file. + + * For Linux systems: + ``` bash + cqtdeployer -bin myexecutable + ``` + + * For Windows systems: + ``` bash + cqtdeployer -bin myexecutable.exe -qmake C:/Qt/5.15.0/min_gw/bin/qmake.exe + ``` + + * For crossplatform build (Linux -> Windows) + ``` bash + cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/bin/qmake + ``` + +## Extra options + +If you use extra libraries, just add path for cqtdeployer to used libs. +``` bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs +``` + +If you want find libraries recursively from libDir path, just add recursive Depth option. +``` bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 +``` + +If you application use qml, just add qmlDir option +``` bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources +``` + +If you want create simple installer for your application just add gif option. +``` +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif +``` + +If you use system libraries from system PATH, just add deploySystem option. + +#### Warning: snap version do not have permision to system files. To deploy system libraries use the cqtdeployer version from the [installer][1] + +``` +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif deploySystem +``` + + +### If you have any problems with use cqtdeployer then ask you questions on the official github issues [page][2]. + +### For more options of CQtDeploye see oficial [documentation][3]. + +[1]: https://github.com/QuasarApp/CQtDeployer/releases +[2]: https://github.com/QuasarApp/CQtDeployer/issues +[3]: https://github.com/QuasarApp/CQtDeployer/blob/main/md/en/Options.md + diff --git a/src/docs/en/ReleaseReviews.md b/src/docs/en/ReleaseReviews.md new file mode 100755 index 00000000..a0b5f9a8 --- /dev/null +++ b/src/docs/en/ReleaseReviews.md @@ -0,0 +1,4 @@ +# Release Reviews + +* [Review v1.5](1_5.md) +* [Review v1.4 (Binary Box)](1_4.md) diff --git a/src/docs/en/ZIP.md b/src/docs/en/ZIP.md new file mode 100644 index 00000000..d837802a --- /dev/null +++ b/src/docs/en/ZIP.md @@ -0,0 +1,47 @@ +# ZIP Using + +General rules for using ZIP + + +Available from version CQtDeployer 1.5 + +### How to use zip option + +Just add to cqtdeployer option "zip". + +### For example: + +```bash +cqtdeployer ... zip +``` + +Where: +* **...** - is list of other options. +* **zip** - option for use zip arhives. + + +By default, cqtdeployer will create one zip arhive. +If you want create multi package destribution, you should use [Controll of packages options](Options.md) +To create a new package, use the -targetPackage [package; tar1] option + +cqtdeployer create zip arhive for each packages. + +Where: + +* **package** - it is package name +* **tar1** - it is name of the target that should be included in this package. + +Or you can describe packages in [configuration file](DeployConfigFile.md) + + +```json +{ +"targetPackage": [ + [ + "package", + "tar1" + ], +], +"zip": true +} +``` diff --git a/src/docs/ru/1_4.md b/src/docs/ru/1_4.md new file mode 100755 index 00000000..adaeef78 --- /dev/null +++ b/src/docs/ru/1_4.md @@ -0,0 +1,409 @@ +# Релиз CQtDeployer v1.4.0 (Binary Box) + +Релиз утилиты развертывания С++/Qt и QML приложений CQtDeployer v1.4.0 (Binary Box) + +Спустя почти полгода, вышло мажорное обновление утилиты развёртывания CQtDeployer. +В данном обновлении множество нововведений, но основной упор в сделан на создание пакетов. + +## Полный список всех изменений + +### Исправления +- Исправлен вывод справки в консоли, теперь перед выводом пересчитывается реальный размер консоли, что позволяет выполнять переносы текста правильно. +- Исправлена работа с развертыванием плагинов Qt. Теперь плагины не тянут за собой все системные зависимости, а только qt. Захват системных зависимостей приводил к падению приложений из-за несовместимости библиотек плагинов. +- Мелкие исправления и улучшения. +### Нововведения +- Добавлена поддержка поиска qmake из системного окружения. +- Добавлена возможность инициализировать репозиторий для дальнейшей упаковки аналогично git init. +- Добавлена поддержка Qt Install Framework пакетов. Теперь можно запаковать дистрибутив в инсталлятор. +- Добавлена возможность разбивать конечный дистрибутив на несколько пакетов. +- Добавлен механизм, позволяющий унифицировать создание пакетов для конечного дистрибутива. +- Добавлена поддержка добавления пользовательских скриптов в скрипты запуска приложений. +- Добавлена поддержка сборки системных зависимостей для Windows. +- Добавлена поддержка RPATH для Linux. Теперь cqtdeployer может самостоятельно определить нужный qmake для развертывания приложения. +- Добавлена поддержка поиска необходимой зависимости по имени библиотеки. +- Добавлена поддержка Qt библиотек из репозиториев Linux дистрибутивов. +### Новые опции +- init - инициализирует файл cqtdeployer.json (файл конфигурации). Например: «cqtdeployer init» - для инициализации конфигурации одного пакета. "cqtdeployer -init multiPackage" - для инициализации конфигурации нескольких пакетов. +- noCheckRPATH - отключает автоматический поиск путей к qmake в исполняемых файлах (Только Linux). +- noCheckPATH - отключает автоматический поиск путей к qmake в системном окружении. +- extractPlugins - заставляет извлекать все зависимости плагинов. +- qif - создает инсталлятор в конце развертывания. +- extraLibs - добавляет шаблон дополнительной библиотеки, которая должна будет попасть в дистрибутив. +- customScript - добавляет пользовательский скрипт в скрип запуска приложения. +- -targetPackage [package;tar1,package;tar2] - используется для формирования пакетов, обозначает списки целевых файлов для определенных пакетов. +- recOut - указывает в какую папку будут складываться ресурсы после развертывания. +- name - устанавливает имя пакета. +- description - устанавливает описание пакета +- deployVersion - устанавливает версию пакета +- releaseDate - дата релиза пакета. +- icon - иконка пакета. +- publisher - издатель пакета. +- qifStyle - Устанавливает путь к CSS файлу стиля или устанавливает стиль по умолчанию. Доступные стили: quasar +- qifBanner - Устанавливает путь к png-файлу баннера. +- qifLogo - Устанавливает путь к файлу логотипа png. + +## Подробный разбор самых интересных изменений. + +Первое, на что стоит обратить внимание, это то что CQtDeployer научился работать с RPATH (Только Linux) и PATH. Это значит, что если ваше приложение собранно с поддержкой RPATH (а RPATH в qt включен по молчанию) или ваш qmake прописан в PATH, то вам не нужно указывать путь к qmakе. CQtDeployer сам найдет нужный ему qmake. +Давайте проверим это на практике. +Я написал простое консольное приложение с использованием Qt. +``` cpp +#include +#include +int main(int, char *[]) +{ + QString str = "hello CQtDeployer 1.4"; + qInfo() << str; + return 0; +} +``` + +Я буду использовать сборочную систему cmake, так как она более актуальная чем qmake. + +``` bash +andrei@HP:~/Hello$ tree +. +├── CMakeLists.txt +├── CMakeLists.txt.user +└── main.cpp + +0 directories, 3 files +``` + +Создадим папку для сборки. +``` bash +andrei@HP:~/Hello$ mkdir build +``` + +Выполним в созданной папке cmake. + +``` bash +andrei@HP:~/Hello/build$ cmake .. -DCMAKE_PREFIX_PATH=~/Qt/5.14.1/gcc_64 +-- Configuring done +-- Generating done +-- Build files have been written to: /home/andrei/Hello/build +``` + +Выполняем сборку. + +``` bash +andrei@HP:~/Hello/build$ make +Scanning dependencies of target Hello_autogen +[ 25%] Automatic MOC and UIC for target Hello +[ 25%] Built target Hello_autogen +Scanning dependencies of target Hello +[ 50%] Building CXX object CMakeFiles/Hello.dir/Hello_autogen/mocs_compilation.cpp.o +[ 75%] Building CXX object CMakeFiles/Hello.dir/main.cpp.o +[100%] Linking CXX executable Hello +[100%] Built target Hello +``` + +Проверяем нашу программу. +``` bash +andrei@HP:~/Hello/build$ ls +CMakeCache.txt CMakeFiles cmake_install.cmake Hello Hello_autogen Makefile +``` +И запускаем cqtdeployer передав ему программу без qmake. +``` bash +andrei@HP:~/Hello/build$ cqtdeployer -bin Hello +Deploy ... +flag targetDir not used. use default target dir : "/home/andrei/Hello/build/DistributionKit" +target deploy started!! +copy : "/home/andrei/Hello/build/Hello" +extract lib : "/home/andrei/Hello/build/DistributionKit//bin//Hello" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libQt5Core.so.5" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicuuc.so.56" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicui18n.so.56" +copy : "/home/andrei/Qt/5.14.1/gcc_64/lib/libicudata.so.56" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ar.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_bg.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ca.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_cs.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_da.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_de.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_en.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_es.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fi.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_fr.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_gd.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_he.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_hu.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_it.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ja.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ko.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_lv.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_pl.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_ru.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_sk.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_uk.qm" +copy : "/home/andrei/Qt/5.14.1/gcc_64/translations/qtbase_zh_TW.qm" +try deploy msvc +deploy done! +``` + +О чудо, теперь наше приложение полностью автономно. +Проверяем это. + +``` bash +andrei@HP:~/Hello/build$ cd DistributionKit/ +andrei@HP:~/Hello/build/DistributionKit$ tree +. +├── bin +│   ├── Hello +│   └── qt.conf +├── Hello.sh +├── lib +│   ├── libicudata.so.56 +│   ├── libicui18n.so.56 +│   ├── libicuuc.so.56 +│   └── libQt5Core.so.5 +└── translations + ├── qtbase_ar.qm + ├── qtbase_bg.qm + ├── qtbase_ca.qm + ├── qtbase_cs.qm + ├── qtbase_da.qm + ├── qtbase_de.qm + ├── qtbase_en.qm + ├── qtbase_es.qm + ├── qtbase_fi.qm + ├── qtbase_fr.qm + ├── qtbase_gd.qm + ├── qtbase_he.qm + ├── qtbase_hu.qm + ├── qtbase_it.qm + ├── qtbase_ja.qm + ├── qtbase_ko.qm + ├── qtbase_lv.qm + ├── qtbase_pl.qm + ├── qtbase_ru.qm + ├── qtbase_sk.qm + ├── qtbase_uk.qm + └── qtbase_zh_TW.qm + +3 directories, 29 files +andrei@HP:~/Hello/build/DistributionKit$ +``` +Корень программы: + +![image](https://user-images.githubusercontent.com/12465465/77245272-619a0280-6c2e-11ea-92f2-447563f72dcc.png) + +Библиотеки,нужные для работы программы: + +![image](https://user-images.githubusercontent.com/12465465/77245274-6363c600-6c2e-11ea-8729-7d494a073b66.png) + + +Как видно из примера, приложение полностью собрано. + +## Qt Installer Framework +Второе нововведение, о котором стоит знать, это возможность из коробки формировать установщики QIF. Все, что нужно для нашего примера, это добавить в команду на упаковку опцию qif. + +Пример использования. + +``` +andrei@HP:~/Hello/build$ cqtdeployer -bin Hello qif +``` + +Всего одна простая команда и программа получает презентабельный вид. + +![image](https://user-images.githubusercontent.com/12465465/77245315-b3428d00-6c2e-11ea-9326-c23229020eb5.png) + +Этот установщик поддерживает минимальную интеграцию Linux дистрибутивами и Windows. А именно: создание ярлыков, и регистрация приложения в OС. +Если по каким то причинам вас не устраивает внешний вид данного установщика, его можно изменить при помощи флага qifStyle . На момент версии 1.4 cqtdeployer поддерживает всего 2 стиля (native и quasar). + +Пример стиля quasar: + +![image](https://user-images.githubusercontent.com/12465465/77245334-d2d9b580-6c2e-11ea-9e55-e205499a9219.png) + +Вы также можете использовать свою собственную таблицу стилей qss. Для этого вместо названия стиля передайте путь к вашему qss или css файлу. +Для примера можно рассмотреть следующую таблицу стилей qss. + +Style.qss: +``` css +QWidget +{ + color: white; + background-color: rgb(65, 65, 65); +} + +QPushButton +{ + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(150, 150, 150, 60%), stop:1 rgba(50, 50, 50, 60%)); + border-color: rgb(60, 60, 60); + border-style: solid; + border-width: 2px; + border-radius: 9px; + min-height: 20px; + max-height: 20px; + min-width: 60px; + max-width: 60px; + padding-left: 15px; + padding-right: 15px; +} + +QPushButton:pressed, QPushButton:checked +{ + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(50, 50, 50, 60%), stop:1 rgba(150, 150, 150, 60%)); +} +``` + +Давайте проверим, что у нас получится в таком случае. +``` bash +cqtdeployer -bin Hello qif -qifStyle ./../style.qss +``` + +![image](https://user-images.githubusercontent.com/12465465/77245346-00266380-6c2f-11ea-8426-42bf58038458.png) + +Вот,собственно, и тёмная тема установщика. + +## Разбиение на пакеты +И,наверное, последнее важное обновление, о котором стоит знать — это возможность разделять большой многобинарный проект на подпроекты. + +Эта возможность самая сложная из всех перечисленных, так как требует много текста для ее использования. Так что я рекоммендую использовать файл конфигураций. + +Для начала усложним наш проект, добавив в него ещё 2 исполняемого файла. Я не стал заморачиваться и просто сделал 2 копии моей Hello утилиты. + +Для упрощения работы с пакетами нужно инициализировать директорию. + +``` bash +cqtdeployer init +``` + +Это еще одна новая функция, которая создаёт CQtDeployer.json файл, в котором мы и будем писать наши конфигурации, вместо передачи опций в утилиту. + +``` js +{ + "binDir": ".", + "clear": true, + "libDir": "./", + "recursiveDepth": 5 +} +``` + +Теперь давайте сделаем 2 пакета из 3х наших программ. Для этого нужно указать: +```js +{ + "binDir": ".", + "clear": true, + "libDir": "./", + "recursiveDepth": 5, + "targetPackage": [ + ["Dstro1", "Hello1"], + ["Dstro2", "Hello2"], + ["Dstro2", "Hello3"] + ] +} +``` + +Обратите внимание на то, что мне пришлось явно указать привязку для Dstro2 к Hello2 Hello3, К сожалению, на момент версии 1.4 cqtdeployer не умеет парсить перечисления целей. Обратите внимание, что если я напишу вместо Hello1 Hello, то выборка будет сделана по всем совпадениям и будут выбраны все 3 программы. +Итак, смотрим что получилось. + +``` bash +cqtdeployer + +. +├── Dstro1 +│   ├── bin +│   │   ├── Hello1 +│   │   └── qt.conf +│   ├── Hello1.sh +│   ├── lib +│   │   ├── libicudata.so.56 +│   │   ├── libicui18n.so.56 +│   │   ├── libicuuc.so.56 +│   │   └── libQt5Core.so.5 +│   └── translations +│   ├── qtbase_ar.qm +│   ├── qtbase_bg.qm +│   ├── qtbase_ca.qm +│   ├── qtbase_cs.qm +│   ├── qtbase_da.qm +│   ├── qtbase_de.qm +│   ├── qtbase_en.qm +│   ├── qtbase_es.qm +│   ├── qtbase_fi.qm +│   ├── qtbase_fr.qm +│   ├── qtbase_gd.qm +│   ├── qtbase_he.qm +│   ├── qtbase_hu.qm +│   ├── qtbase_it.qm +│   ├── qtbase_ja.qm +│   ├── qtbase_ko.qm +│   ├── qtbase_lv.qm +│   ├── qtbase_pl.qm +│   ├── qtbase_ru.qm +│   ├── qtbase_sk.qm +│   ├── qtbase_uk.qm +│   └── qtbase_zh_TW.qm +└── Dstro2 + ├── bin + │   ├── Hello2 + │   ├── Hello3 + │   └── qt.conf + ├── Hello2.sh + ├── Hello3.sh + ├── lib + │   ├── libicudata.so.56 + │   ├── libicui18n.so.56 + │   ├── libicuuc.so.56 + │   └── libQt5Core.so.5 + └── translations + ├── qtbase_ar.qm + ├── qtbase_bg.qm + ├── qtbase_ca.qm + ├── qtbase_cs.qm + ├── qtbase_da.qm + ├── qtbase_de.qm + ├── qtbase_en.qm + ├── qtbase_es.qm + ├── qtbase_fi.qm + ├── qtbase_fr.qm + ├── qtbase_gd.qm + ├── qtbase_he.qm + ├── qtbase_hu.qm + ├── qtbase_it.qm + ├── qtbase_ja.qm + ├── qtbase_ko.qm + ├── qtbase_lv.qm + ├── qtbase_pl.qm + ├── qtbase_ru.qm + ├── qtbase_sk.qm + ├── qtbase_uk.qm + └── qtbase_zh_TW.qm + +8 directories, 60 files +``` + +Как видно из дерева результата, у нас получилось 2 дистрибутива. +1. Dstro1 — содержит в себе приложение Hello1 +2. Distro2 — содержит оставшиеся 2. + +А теперь давайте проверим, что будет, если все это запаковать а установщик. Добавим в CQtDeployer.json опцию qif **"qif": true,**. + +``` js +{ + "binDir": ".", + "clear": true, + "qif": true, + "libDir": "./", + "recursiveDepth": 5, + "targetPackage": [ + ["Dstro1", "Hello1"], + ["Dstro2", "Hello2"], + ["Dstro2", "Hello3"] + ] +``` + +![image](https://user-images.githubusercontent.com/12465465/77245542-534ce600-6c30-11ea-9323-72ec5e200f39.png) + +Кака видно из скриншота, теперь у нас 2 пакета при установке. + +## Новые алиасы + +И последнее небольшое но приятное дополнение: теперь в cqtdeployer добавлены новые команды. +* сqt — бывстрый способ задеплоить ваше приложение. Он упрощает вызов развертывания. + * Пример: + **cqt myApp** — это тоже самое что и **cqtdeployer -bin myApp**. +* cqtdeployer.cqt — тоже что и cqt но для snap пакета. +* В windows-версии теперь не нужно добовлять знак % для вызова утилиты. +Теперь вызов выглядит так, как и в Linux. (cqtdeployer) diff --git a/src/docs/ru/1_5.md b/src/docs/ru/1_5.md new file mode 100755 index 00000000..21225803 --- /dev/null +++ b/src/docs/ru/1_5.md @@ -0,0 +1,157 @@ +# Выпуск CQtDeployer v1.5.0 + +Выпуск утилиты развертывания приложений C ++ / Qt и QML CQtDeployer v1.5.0 + +Это первое крупное обновление в 2021 году. CQtDeployer 1.5 содержит множество полезных улучшений. Самыми большими улучшениями являются добавление возможности упаковывать пакеты deb и возможность использовать собственный шаблон упаковки для среды установки qt. + +## Полный список всех изменений + +## CQtDeployer 1.5.0 + +### Новые возможности + +- Добавлена ​​новая тема установщика qif "quasarDark". +- Добавлена ​​поддержка работы с кастомным шаблоном для опции qif. +- Добавлена ​​поддержка пакетов debian. +- Добавлены поддержка иконок целей. Теперь опция icon работает с целями, но не с пакетами. +- Добавлена ​​поддержка управления файлами пользовательского перевода. +- Добавлена ​​поддержка развертывания неисполняемых файлов. (опция extraData) +- Добавлены переменные окружения для развернутых приложений. +- Добавлена ​​поддержка создания пакетов deb. +- Добавлена ​​поддержка создания архивов zip. +- Добавлена ​​поддержка создания установщика qif с использованием настраиваемого шаблона. +- Добавлена команда для инициализации шаблонов qif и deb по умолчанию (getDefaulttemplate) +- Добавлена ​​поддержка импорта пользовательских скриптов запуска. +- Добавлена ​​поддержка хэшей md5 пакетов. +- Добавлена ​​поддержка Qt6.1. + +### Исправления + +- Исправлена ​​стабильность для опции deploySystem в Windows. +- Исправлен подробный журнал. +- Исправлен общий журнал вывода. +- Исправлены опечатки в логе. +- Исправлено кросс-развертывание под платформу ARM +- Исправлено развертывание Qt6 qml +- Исправлены команды PowerShell в Windows. +- исправления ошибок и улучшения. + + +### Новые переменные окружения + +- CQT_RUN_FILE - Эта переменная содержит путь к сценарию выполнения используемого приложения. +- CQT_PKG_ROOT - эта переменная содержит путь к корню текущего пакета. + +### Новые параметры + +- zip - создать ZIP-архив для развертываемой программы +- deb - Создать пакет deb для развертываемой программы +- homepage - Устанавливает URL-адрес домашней страницы для пакета +- noQt - игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует фреймворк qt +- allowEmptyPackages - позволяет настраивать пустые пакеты. +- getDefaultTemplate - Извлекает шаблоны deb или qif по умолчанию. +- tr - Добавляет qm файлы в папку переводов. +- extraData - добавляет дополнительные файлы или каталоги как цель. Выбранный каталог будет скопирован в папку extraDataOut с сохранением собственной структуры. +- extraDataOut - Устанавливает путь к каталогу с дополнительными файлами данных. +- prefix - Устанавливает префикс для пакета относительно целевого каталога +- homePage - Устанавливает URL-адрес домашней страницы для пакета +- binPrefix - устанавливает префикс для опции bin. +- noHashSum - отключает хэши кампутных пакетов + +### Устаревшие и удаленные параметры + +- deploySystem-with-libc - вместо этого параметра используйте параметр deploySystem. +- allQmlDependes - вместо этого параметра используйте параметр qmlDir. + + +## Подробный разбор наиболее интересных изменений. + +### Пакеты Debian +Эта функция очень удобна, если вы хотите создать серверное приложение. +Например, мне нужно создать простой сервер для простой игры. +Мои шаги: +* собрать мое приложение в режиме релиза. +* запустите cqtdeployer с опцией deb. + +```bash +cqtdeployer -bin mySimpleServer deb -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +``` +SimpleServer зависит только от qt, поэтому мне было достаточно указать только путь к qmake для моего приложения. + +Это все!!!. И я получаю рабочий пакет deb. +По умолчанию CQtDeployer создает независимые пакеты debian. + + +### Почтовые архивы +Эта функция позволяет сжать пакеты вашего дистрибутива в zip-архив. + +Пример: + +```bash +cqtdeployer -bin mySimpleServer zip -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +``` + +# Пользовательский Шаблон для QIF +Начиная с Версии CQtDeployer 1.5 вы можете использовать свой собственный шаблон установщика. Для этого вы должны передать в параметр qif путь к вашему шаблону. + +``` +cqtdeployer ... -qif /path/to/my/custom/qif/template +``` + +### Шаблон +Шаблон qif долже содержать 2 папки: +* packages +* config + +### Внимание +Название пакетов в папке packages должны совподать с названием пакетов при развертывание. +Например: +``` json +"targetPackage": [ + [ + "myCustomInstaller", + "tar1" + ] +], +``` + +``` bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` + +Если имена папок не совподут с именами пакетов то CQtDeployer будет использовать стандартный пакет для QIF. + +Если у вас только один пакет, вы можете использовать опцию **name** для установки имени приложения. + +``` +cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller +``` + +#### Не забудьте переименовать папку вашего пакета в имя пакета из опции имени. + + +``` bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller << "This is folder of the your package" + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` \ No newline at end of file diff --git a/src/docs/ru/Build-and-Install.md b/src/docs/ru/Build-and-Install.md new file mode 100644 index 00000000..7059c9b9 --- /dev/null +++ b/src/docs/ru/Build-and-Install.md @@ -0,0 +1,86 @@ +# Установка 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 + diff --git a/src/docs/ru/Changelog.md b/src/docs/ru/Changelog.md new file mode 100755 index 00000000..38363336 --- /dev/null +++ b/src/docs/ru/Changelog.md @@ -0,0 +1,346 @@ +# Журнал изменений + +Журнал изменений для всех версий CQtDeployer. + + +## CQtDeployer 1.5.4 + +### Новые параметры +* qifConfig - Устанавливает собственный путь к файлу конфигурации установщика qt ifw. По умолчанию это qif/config/config.xml #653. +* qifPackages - Устанавливает собственный путь к каталогам пакетов. По умолчанию это qif/packages #653. +* qifResources - Устанавливает собственный путь к файлам ресурсов. По умолчанию эта опция пропущена #653 +* debOut - Устанавливает имя выходного файла debian. Эта опция может работать с несколькими пакетами +* zipOut - Устанавливает имя выходного zip-архива. Эта опция может работать с несколькими пакетами + +### Исправление ошибок : + +* исправлено crossdeploy linux -> windows # 652 + + +## CQtDeployer 1.5.3 + +### Новые параметры + +* installDirDeb - Устанавливает целевой каталог установки для пакета debian (по умолчанию это / opt путь) +* installDirQIFW - Устанавливает целевой каталог установки для установщиков (по умолчанию это / home путь) + +### Исправления +* Исправлено предупреждение при установке В windows +* Добавлена пороверка параметров ввода +* Добавлено сообщение об ошибке из-за конфликта между опциями libDir и targetDir + +## CQtDeployer 1.5.2 + +### Новые параметры + +* Добавлена опция **qifOut** для установки имени установщика +* Добавлена опция **disableRunScript** для отключения генерации сценария запуска для выбранных целей +* Добавлена опция **disableShortCut** для отключения генерации ярлыка для выбранных целей + +### Исправления + +* Фикс документации +* Фикс развертывания библиотек openssl + +## CQtDeployer 1.5.1 + +### Исправления + +* Исправлено развертывание многоцелевых пакетов Debian +* Фикс развертывания qt6 qml приложений + +## CQtDeployer 1.5.0 + +### Нововведения + +- Добавлена новая тема установщика qif "quasarDark". +- Добавлена поддержка работы с кастомным шаблоном для опции qif. +- Добавлена поддержка пакетов debian. +- Добавлена поддержка иконок для целей. теперь опция icon работает с целями, а не с пакетами. +- Добавлена поддержка управления файлами пользовательского перевода. +- Добавлена поддержка развертывания дополнительных файлов. (опция extraData) +- Добавлены переменные окружения для развернутых приложений. +- Добавлена поддержка создания пакетов deb. +- Добавлена поддержка создания zip-архивов. +- Добавлена поддержка создания установщика qif с использованием настраиваемого шаблона. +- Добавлена команда инициализации qif по умолчанию шаблона deb (getDefaulttemplate) +- Добавлена поддержка импорта пользовательских скриптов запуска. +- Добавлена поддержка хэш сумм md5 для всех пакетов. +- Добавлена поддержка Qt6.1. + +### Исправления + +- Исправлена стабильность для опции deploySystem в Windows. +- Исправлен подробный журнал. +- Исправлен общий журнал вывода. +- Исправлены опечатки в логе. +- Исправлено кросс-развертывание arm дистрибутива. +- Исправлено развертывание Qt6 qml +- Исправлены команды PowerShell в Windows. +- исправления ошибок и улучшения. + +### Новые переменные среды + +- CQT_RUN_FILE - эта переменная содержит путь к сценарию выполнения используемого приложения. +- CQT_PKG_ROOT - эта переменная содержит путь к корню текущего пакета. + +### Новые параметры + +- zip - создать ZIP-архив для развертываемых программ +- deb - Создаст deb пакет для развертываемой программы +- homepage - Установит URL-адрес домашней страницы для пакета +- noQt - Игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует платформу qt +- allowEmptyPackages - разрешает настраивать пустые пакеты. +- getDefaultTemplate - Извлекает шаблоны deb или qif по умолчанию. +- tr - Добавляет qm файлы в папку переводов. +- extraData - Добавляет дополнительные файлы или каталоги как цель. Выбранный каталог будет скопирован в расположение extraDataOut с сохранением собственной структуры. +- extraDataOut - Устанавливает путь к каталогу с дополнительными файлами данных. По умолчанию это корневой каталог дистрибутива. +- prefix - Устанавливает префикс для пакета относительно целевого каталога +- homePage - Установит URL-адрес домашней страницы для пакета +- binPrefix - Устанавливает путь префикса для опции bin +- noHashSum - Отключить вычисление хеш-суммы пакетов + +### Устаревшие и удаленные параметры + +- deploySystem-with-libc - вместо этого параметра используйте параметр deploySystem. +- allQmlDependes - вместо этого параметра используйте параметр qmlDir. + +## CQtDeployer 1.5.0 Alpha + +### Исправления +- исправления ошибок и улучшения. + +### Новые особенности +- Добавлена новая тема для установщика qif "quasarDark". + +### Новые параметры +- zip - создать ZIP-архив для развертываемых программ + +## CQtDeployer 1.4.7 +### Исправления +- Исправлено развертывание плагина qxcb. #438 +- Исправлено развертывание модуля qtGui. #446 + +### Новые возможности +- Добавлена поддержка Qt6. #437 +- Добавлена поддержка Qt installer Framework 4 (с улучшенным интерфейсом командной строки)ю #436 + +## CQtDeployer 1.4.6 +### Исправления +- Исправлено развертывание драйверов sql #367. +- Исправлен алгоритм развертывания библиотек. #423 #371 +- Исправлена работа с qt из системного репозитория linux. (только классический установщик) #422 +- Исправлена snap версия cqtdeployer, добавлена поддержка поиска qmake по RPATH #424 #420 +- Исправлен хелп. +- Мелкие исправления и улучшения. +- Удалена устаревшая опция extractPlugins. #371 + +### Новые параметры +- noQt - игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует платформу qt. + +## CQtDeployer 1.4.5 +### Исправления +- Оптимизирована производительность развертывания проектов. На 60% быстрее. +- Оптимизирован выходной размер дистрибутивов. Размер уменьшен на 25%. +- Исправлено отображение ярлыков после установки развернутых приложений. +- Исправлен запуск приложений с пробелами в имени. спасибо ahndee (#384) +- Исправлено развертывание плагина Renderer. +- Незначительные исправления и улучшения. + +### Новые особенности +- Добавлена новая система управления плагинами развертывания. + +### Новые опции + +- extraPlugin - устанавливает дополнительный путь к сторонним плагина приложения +- enablePlugins - включает дополнительные плагины для распространения. +- disablePlugins - отключает плагины для распространения. + +## CQtDeployer 1.4.4 + +### New options +- qifFromSystem - Принудительно использовать системный инструмент binarycreator из path или qt + +## CQtDeployer 1.4.3 +### Исправления +- Исправленно отображение приложения скаченого из snap store и установщика в меню настроек приложений ubuntu 20.04 + +### Нововведения +- Добавленна поддержка рекурсивного добовления для флага ignoreEnv #356 + +### Новые опции +- noRecursiveiIgnoreEnv - Отключает рекурсивное игнорирование переменной среды для флага ignoreEnv. + + +## CQtDeployer 1.4.2 +### Исправления + +- исправлено #337 (ошибка генерации установщика с произвольным именем) +- исправлено #338 (версия Windows собирает pdb файлы) +- исправлено #339 (ошибка показа всех справочных сообщений) +- исправлено #340 (cqdeployer не добавлял каталоги целей в "ignore") +- исправлено #341 (опция очистки не удаляет старый установщик) + + +## CQtDeployer 1.4.1 + +### Исправления +- Исправлено не развертывание тем платформ (#324) +- Исправлено создание ярлыков на Windows (#322) +- Незначительные улучшения и исправления + +## CQtDeployer 1.4.0 +### Исправления +- Исправлен вывод справки в консоли, теперь перед выводом пересчитывается реальный размер консоли, что позволяет выполнять правильно переносы текста. +- Исправлена работа с развертыванием плагинов Qt. Теперь плагины не тянут за собой все системные зависимости, а только qt. Захват системных зависимостей приводил к падению приложений из-за несовместимости библиотек плагинов. +- Мелкие исправления и улучшения. + +### Нововведения +- Добавлена поддержка поиска qmake из системного окружения. +- Добавлена возможность инициализировать репозиторий для дальнейшей упаковки аналогично git init. +- Добавлена поддержка Qt Install Framework пакетов. Теперь можно запаковать дистрибутив в инсталлятор. +- Добавлена возможность разбивать конечный дистрибутив на несколько пакетов. +- Добавлен механизм позволяющий унифицировать создание пакетов для конечного дистрибутива. +- Добавлена поддержка добавления пользовательских скриптов в скрипты запуска приложений. +- Добавлена поддержка сборки системных зависимостей для Windows. +- Добавлена поддержка RPATH для Linux. Теперь cqtdeployer может самостоятельно определить нужный qmake для развертывания приложения. +- Добавлена поддержка поиска необходимой зависимости по имени библиотеки. +- Добавлена поддержка Qt библиотек из репозиториев Linux дистрибутивов. +- Добавлены новые псевдонимы для команды запуска (cqt и cqtdeployer.cqt) для быстрого развертывания приложений. +- Добавлена поддержка собственного имени команды для windows. Теперь вы можете запустить cqtdeployer написав cqtdeployer в cmd и powershell. + +### Новые опции +- init - инициализирует файл cqtdeployer.json (файл конфигурации). Например: «cqtdeployer init» - для инициализации конфигурации одного пакета. "cqtdeployer -init multi" - для инициализации конфигурации нескольких пакетов. +- noCheckRPATH - отключает автоматический поиск путей к qmake в исполняемых файлах (Только Linux). +- noCheckPATH - отключает автоматический поиск путей к qmake в системном окружении. +- extractPlugins - заставляет извлекать все зависимости плагинов. +- qif - создает инсталлятор в конце развертывания. +- extraLibs - добавляет шаблон дополнительной библиотеки, которая должна будет попасть в дистрибутив. +- customScript - добавляет пользовательский скрипт в скрип запуска приложения. +- -targetPackage [package;tar1,package;tar2] - используется для формирования пакетов, обозначает списки целевых файлов для определенных пакетов. +- recOut - указывает в какую папку будут складываться ресурсы после развертывания. +- name - устанавливает имя пакета. +- description - устанавливает описание пакета +- deployVersion - устанавливает версию пакета +- releaseDate - дата релиза пакета. +- icon - иконка пакета. +- publisher - издатель пакета. +- qifStyle - Устанавливает путь к CSS файлу стиля или устанавливает стиль по умолчанию. Доступные стили: quasar +- qifBanner - Устанавливает путь к png-файлу баннера. +- qifLogo - Устанавливает путь к файлу логотипа png. + +--- + +## CQtDeployer 1.3.2 +- Исправлено #218 (CQtDeployer добавлял sh-скрипты для целевых библиотек.) +- Исправлено #217 (опция qmake не работала с файлом конфигурации.) +--- + +## CQtDeployer 1.3.1 +- Исправлена задача #191 (команда игнорирования для плагинов) +- Исправлена задача #192 (неверный путь при создании файла развертывания) +- Исправлены абсолютные пути к файлу conf +--- + +## CQtDeployer 1.3.0 +- Добавлена поддержка qt.conf для Linux +- Добавлена поддержка конфигурационного файла для проекта (deploy.json) со всеми правилами развертывания, для создания deploy.json используйте флаг -confFile [./path/to/file.json]. +- Добавлена поддержка выходных каталогов для всех файлов развертывания #145, +- Добавлена поддержка развертывания WebEngine #146. +- Добавлена поддержка нескольких пакетов в установщике cqtdeployer. +- Переименован проект из Console-QtDeployer в CQtDeployer #139 +- Исправлено развертывание системных библиотек в linux #172 +- Добавлены новые тесты приложения +- Удален флаг noLibC и добавлен флаг deploySystem-with-libc. Если вам нужен в программе libc используйте флаг deploySystem-with-libc, а если нет то пользуйтесь deploySystem. +- Заменен флаг always-overwrite на noOverwrite, теперь все файлы по умолчанию перезаписываются, используйте noOverwrite для отключения перезаписи. +--- + +## CQtDeployer 1.2.3 +- Добавлена поддержка qt.conf для сборок Windows #130 +- Исправлена ошибка #129, теперь флаг «очистить» удаляет только скопированные файлы. +- Исправлен флаг ignoreEnv +- Исправлен флаг deploySystem +--- + +## CQtDeployer 1.2.2 +- Добавлен новый флаг noLibc для игнорирования библиотек libc и li-linux +- Исправлена #125 ошибка развертывания системных библиотек (работает с простыми проектами, для больших проектов не рекомендуется) +- Исправлен флаг ignoreEnv +--- + +## CQtDeployer 1.2.1 +- Добавлен новый флаг игнорирования (ignoreEnv). Этот флаг отключает ненужную среду +- Добавлена поддержка QIFW (онлайн-установщик для Windows и других дистрибутивов Linux) +- Добавлено обновление утилиты для Windows и других дистрибутивов Linux (не Snap) +- Исправлена ошибка № 116 (копирование файлов со съемного носителя) +- Исправлена ошибка № 115 (создание цели в папке с русским именем) +- Исправлен большой размер версии msvc +- Исправлено кросс-развертывание Linux >> Windows +- Удалены старые скрипты сборки +--- + +## CQtDeployer 1.2.0 +- Добавлен собственный сканер зависимостей qml. +- Перешел на новый [сканер PE-Lib](https://github.com/QuasarApp/pe-parse/tree/7138bb218a05c81d825728ba8a0a6f6a56c4fdbc). +- Перешел на новый [ELF-lib сканер](https://github.com/qt/qttools/blob/b0147a5d79ce7a7e77a24f36aaddfacb1a1517c8/src/shared/winutils/elfreader.h). +- Добавлены новые юнит-тесты. +- Добавлена поддержка версии Snap (только домашний каталог). +- Добавлен новый флаг qmlExtern - для использования сканера импорта qt qml. +- Добавлена поддержка уровней подробного журнала (0-3). +- Исправлен журнал развертывания приложения. +- Исправлено развертывание приложения в версии Snap. +--- + +## CQtDeployer 1.1.2 +- Добавлена поддержка переводов +- Добавлен флаг для отключения развертывания переводов +- Добавлена strip для Linux +- Добавлены юнит-тесты +- Исправлено развертывание в динамической версией +- Исправлена ошибка развертывания на текущем каталоге с привязкой и статической версией. +--- + +## CQtDeployer 1.1.1 +- Исправлена сборка qml в диномисечкой версии +- Исправленна работа флага -recursiveDepth +- Исправленна работа флага -libDir +- Исправленно копирование библиотек по ссылке +- Почищен вывод приложения, часть лога перенесенна в verbose +--- + +## CQtDeployer 1.1.0 +- Добавлена поддержка windows (только динамическая линковка) +- Добавлена поддержка snap (теперь доступно в snapstore) +- Добавлены сборочные скрипты для snap +- Добавлен флаг binDir позволяющий рекурсивно захватывать exe dll и so +- Изменена логика работы флага bin теперь если выбрать в место файла папку то будет захвачено все ее содержимое +- Изменена и исправлена логика работы флага clear теперь он чистит все развернутое содержимое по определенному таргету. +- Добавлен флаг targetDir который определяет место где будет лежать развернутый проект +- Изменена структура развернутого проекта, теперь все оболочки запуска лежат в корне а бинарники в папке bin, для каждого бинарника создается одноименный скрипт запуска. +- Удален старый флаг runScript из-за смены логики развертывания +- Добавлен флаг verbose для отладки по +- Исправлены ошибки производительности +--- + +## CQtDeployer 1.0.2 +- Добавлен скрипт для сборки (динамический и статический выпуск) +- Добавлен флаг -libDir для установки дополнительного пути для дополнительных библиотек приложения +- Добавлен флаг -extraPlugin для установки дополнительного пути для дополнительных плагинов приложения +- Добавлена сборка только для С библиотек +- Исправленно развертывание +- Исправлен сценарий запуска +- Исправлена статическая сборка +--- + +## CQtDeployer 1.0.1 +- Исправлена ошибка развертывания qml (избыточность) +- Исправлен скрипт запуска приложения + +--- + +## CQtDeployer 1.0.0 +- Добавлен флаг runScript +- Добавлен флаг allQmlDependes +- Исправлена ошибка развертывания qml +- Исправлена ошибка развертывания плагинов +- Добавлена поддержка статической сборки diff --git a/src/docs/ru/CompareFeatures.md b/src/docs/ru/CompareFeatures.md new file mode 100644 index 00000000..58a36241 --- /dev/null +++ b/src/docs/ru/CompareFeatures.md @@ -0,0 +1,15 @@ +# Сравнение особенностей + +Сравните особенности дистрибутивов CQtDeployer + +| Название функции | Классическая версия linux (установщик) | Snap версия | Windows версия | +|---|---|---|----| +| Автоматические обновляется | Нет | Да | Нет | +| Онлайн-обновления | Да | Да | Да | +| Поддержка системных библиотек | Да | Да | Да | +| Поддержка создания установщиков | Да | Да | Да | +| Поддержка создания архивов | Да | Да | Да | +| Поддержка поиска библиотек и cmake из среды | Да | Нет | Да | +| Поддержка поиска qmake из RPATH | Да | Да | Нет +| Поддержка команды 'strip' | Да | Нет | Нет | +| Поддержка работы с qmake из системного репозитория ОС| Да| Нет | Нет | diff --git a/src/docs/ru/CustomScripts.md b/src/docs/ru/CustomScripts.md new file mode 100644 index 00000000..96d823f9 --- /dev/null +++ b/src/docs/ru/CustomScripts.md @@ -0,0 +1,68 @@ +# Пользовательские скрипты + +После версии 1.5.1 cqtdeployer поддерживает собственные переменные в пользовательских скриптах. +Для использования пользовательских сценариев используйте параметр **runScript**. + +### Примеры: + +```bash +cqtdeployer -bin MyExecutable.exe -runScript MyExecutable,path/to/my/custom/script.bat +``` + +```bash +cqtdeployer -bin MyExecutable -runScript MyExecutable,path/to/my/custom/script.sh +``` + +## Список поддерживаемых переменных: + +* CQT_LIB_PATH - это относительный путь к библиотекам развернутого дистрибутива. +* CQT_QML_PATH - это относительный путь к библиотекам qml развернутого дистрибутива. +* CQT_PLUGIN_PATH - это относительный путь к плагинам qt развернутого дистрибутива. +* CQT_BIN_PATH - это относительный путь к целям развернутого дистрибутива. + +* CQT_SYSTEM_LIB_PATH - это относительный путь к системным библиотекам развернутого дистрибутива. +* CQT_BASE_NAME - это базовое имя исполняемого файла, который будет запущен после запуска этого скрипта. +* CQT_CUSTOM_SCRIPT_BLOCK - это код из опции customScript +* CQT_RUN_COMMAND - это команда для запуска приложения. Требуется переменная BASE_DIR. Важно: Эта переменная уже содержит символы перенапровления аргументов скрипта в исполняемый файл. + +## Шаблоны скриптов запуска + +### Linux + +```bash +#!/bin/sh + +BASE_DIR=$(dirname "$(readlink -f "$0")") +export LD_LIBRARY_PATH="$BASE_DIR"CQT_LIB_PATH:"$BASE_DIR":$LD_LIBRARY_PATH +export QML_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML_IMPORT_PATH +export QML2_IMPORT_PATH="$BASE_DIR"CQT_QML_PATH:$QML2_IMPORT_PATH +export QT_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH:$QT_PLUGIN_PATH +export QTWEBENGINEPROCESS_PATH="$BASE_DIR"CQT_BIN_PATH/QtWebEngineProcess +export QTDIR="$BASE_DIR" +export CQT_PKG_ROOT="$BASE_DIR" +export CQT_RUN_FILE="$BASE_DIR/CQT_BASE_NAME.sh" + +export QT_QPA_PLATFORM_PLUGIN_PATH="$BASE_DIR"CQT_PLUGIN_PATH/platforms:$QT_QPA_PLATFORM_PLUGIN_PATH + +CQT_CUSTOM_SCRIPT_BLOCK + +CQT_RUN_COMMAND +``` + +### Windows + +```bash + +@echo off +SET BASE_DIR=%~dp0 +SET PATH=%BASE_DIR%CQT_LIB_PATH;%PATH%;CQT_SYSTEM_LIB_PATH +SET CQT_PKG_ROOT=%BASE_DIR% +SET CQT_RUN_FILE=%BASE_DIR%CQT_BASE_NAME.bat + +CQT_CUSTOM_SCRIPT_BLOCK + +CQT_RUN_COMMAND +``` + + +Или вы можете получить последнюю версию этих скриптов из github [репозитория](https://github.com/QuasarApp/CQtDeployer/tree/main/Deploy/ScriptsTemplates). diff --git a/src/docs/ru/DEB.md b/src/docs/ru/DEB.md new file mode 100644 index 00000000..9048f6b8 --- /dev/null +++ b/src/docs/ru/DEB.md @@ -0,0 +1,100 @@ +# Использование DEB + +Общие правила использования DEB + +#### Доступно с версии CQtDeployer 1.5 + +### Как использовать опцию DEB + +Просто добавьте в cqtdeployer опцию «deb». + +#### Например: + +``` bash + cqtdeployer ... deb +``` + +Где: +* **...** - список других опций. +* **deb** - опция для создания deb пакетов. + + +По умолчанию cqtdeployer создает один deb пакет . +Если вы хотите создать несколько пакетов, вы должны использовать [Параметры управления пакетами](Options.md) +Чтобы создать новый пакет, используйте -targetPackage [package; tar1] + +cqtdeployer создает вуи пакет для каждого пакета. + +Где: + +* **package** - это название пакета +* **tar1** - это имя цели, которая должна быть включена в этот пакет. + +Или вы можете описать пакеты в [файле конфигурации](DeployConfigFile.md) + + +```JSON +{ +"targetPackage": [ + [ + "package", + "Tar1" + ], +], +"deb": true +} +``` + +# Использование собственных шаблонов для создания деб пакетов + +Вы можете создать собственный шаблон для пакетов debian. + +### Структура пакета debian: + + +```bash +└── Debian templates + ├── debPacakge1 + │ └── DEBIAN + │ ├── control + │ ├── postinst + │ └── prerm + └── debPacakge2 + └── DEBIAN + ├── control + ├── postinst + └── prerm + +``` + +Для включения ваших шаблонов в дистрибутив вам необходимо добавить путь к папке шаблонов Debian в deploy Config.json. + +```json +{ +"targetPackage": [ + [ + "debPacakge1", + "tar1" + ], + [ + "debPacakge2", + "tar2" + ], +], +"deb": "./Debian templates" +} +``` + + +## Инициализация шаблона debian + +Для инициализации шаблонов по умолчанию вы можете использовать параметр getDefaultTemplate. +Параметр getDefaultTemplate извлекает шаблон по умолчанию для cqtdeployer. Это может быть очень удобно, если вы хотите переопределить поведение установщика или другого пакета распространения по умолчанию. + +### Пример + +### Получение шаблона debian по умолчанию. + +```bash +cqtdeployer getDefaultTemplate deb +``` diff --git a/src/docs/ru/DeployConfigFile.md b/src/docs/ru/DeployConfigFile.md new file mode 100644 index 00000000..050845e1 --- /dev/null +++ b/src/docs/ru/DeployConfigFile.md @@ -0,0 +1,226 @@ +# Файл развертывания + +**Файл развертывания** - это json файл, содержащий в себе параметры для cqtdeployer. Данный файл поддерживает все параметры кроме confFile, так как данный параметр отвечает за подключение и инициализацию самого файла. + +### Структура файла конфигурации +```json +{ + "Флаг": true/false, + "Параметр": "Значение", + "Параметер с поддержкой перечислений": [ + "Значение 1", + "Значение 2", + "Значение 3", + ], + "Параметр с поддержкой многоуровневых перечислений": [ + [ + "Значение A1", + "Значение A2" + ], + [ + "Значение B1", + "Значение B2" + ], + [ + "Значение C1", + "Значение C2" + ], + ] + +} +``` + +Подробно о параметрах cqtdeployer читайте в разделе [Параметры](Options.md). + +Примеры содержимого данного файла: + +Файл без использования параметров с перечислениями +```json +{ + "noOverwrite": false, + "bin": "./", + "binDir": "./", + "qmlDir": "./", + "deploySystem": false, + "deploySystem-with-libc": false, + "qmake": "my/custom/path/to/qmake", + "ignore": "ignoreLib.dll", + "ignoreEnv": "/my/ignore/path", + "clear": true, + "force-clear": false, + "allQmlDependes": false, + "libDir": "./", + "recursiveDepth": 3, + "extraLibs": "myExtraLib (libssl)", + "extraPlugin": "myExtraPulgin (platforms)", + "targetDir": "./Distro", + "targetPackage": "", + "noStrip": false, + "extractPlugins": false, + "noTranslations": false, + "qmlOut": "qml", + "libOut": "lib", + "trOut": "tr", + "pluginOut": "plug", + "binOut": "bin", + "recOut": "rec", + "verbose": 3, + "qif": false, + "noCheckRPATH": false, + "noCheckPATH": false, + "name": "mainApplication", + "description": "this is description for default package", + "deployVersion": "1.0.0", + "releaseDate": "yyyy-MM-dd", + "icon": "/path/main/icon.png", + "publisher": "main team", + "customScript": "echo 'I am use custom script!!!'" +} + +``` + +Файл с использованием параметров с перечислениями +``` json +{ + "noOverwrite": false, + "bin": "./", + "binDir": "./", + "qmlDir": [ + [ + "package2", + "./TestQMLWidgets/" + ], + [ + "./qml/for/All" + ] + ], + + "deploySystem": false, + "deploySystem-with-libc": false, + "qmake": "this parameter should contain the path to your qmake, for Windows this field is required. On Linux, you can remove it, then qmake will be found by rpath.", + "ignore": "ignoreLib.dll", + "ignoreEnv": "/my/ignore/path", + "clear": true, + "force-clear": false, + "allQmlDependes": false, + "libDir": "./", + "recursiveDepth": 3, + "extraLibs": "myExtraLib (libssl)", + "extraPlugin": "myExtraPulgin (platforms)", + "targetDir": "./Distro", + "targetPackage": [ + [ + "/package1/", + "TestOnlyC" + ], + [ + "/package2/", + "TestQMLWidgets" + ] + ], + "noStrip": false, + "extractPlugins": false, + "noTranslations": false, + "qmlOut": "qml", + "libOut": "lib", + "trOut": "tr", + "pluginOut": "plug", + "binOut": "bin", + "recOut": "rec", + "verbose": 3, + "qif": false, + "noCheckRPATH": false, + "noCheckPATH": false, + "name": [ + [ + "package2", + "package2Application" + ], + [ + "mainApplication" + ] + ], + "description": [ + [ + "package2", + "this is description for package 'package2'" + ], + [ + "this is description for default package" + ] + ], + "deployVersion": [ + [ + "package2", + "1.0.0" + ], + [ + "1.0.0" + ] + ], + "releaseDate": [ + [ + "package2", + "yyyy-MM-dd" + ], + [ + "yyyy-MM-dd" + ] + ], + "icon": [ + [ + "package2", + "/path/icon.png" + ], + [ + "/path/main/icon.png" + ] + ], + "publisher": [ + [ + "package2", + "team of package2" + ], + [ + "main team" + ] + ], + "customScript": "echo 'I am use custom script!!!'" +} + +``` + +Цель файла- упростить вызов cqtdeployer и переместить часть или все параметры в файл. Все параметры, указанные в файле, имеют более низкий приоритет, чем параметры, добавленные в консоль при запуске. + +### Создание файла + +#### Способ 1 + +1. Вызовите `cqtdeployer init` Для инициализации файла для приложения состоящего из одного пакета. + Или `cqtdeployer -init multi` Для инициализации файла для проекта с несколькими пакетами. +2. Откройте CQtDeployer.json и отредактируйте его под свои нужды. +3. Вызовите cqtdeployer в дериктории с файлом CQtDeployer.json, или укажите путь к нему используя флаг -confFile path/to/my/CQtDeployer.json + +#### Способ 2 + +Вызовите cqtdeployer с нужным вам набором параметров и укажите путь к файлу при помощи флага -confFile (файл должен отсутствовать). Если файл будет существовать, то cqtdeployer начнет выгружать из него параметры. + +Пример: +``` bash +cqtdeployer -confFile deploy.json -bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite +``` +Где: + +* cqtdeployer - вызов cqtdeployer +* -confFile deploy.json - путь к файлу, который нужно создать +* "-bin CQtDeployerInstaller -targetDir ./test -qmlOut myqml -binOut mybin -libOut mylib -pluginOut myplugins noStrip noTranslations -recursiveDepth 5 -extraPlugin sqldrivers,audio,mediaservice force-clear deploySystem noOverwrite" - необходимые параметры. + + +### Использование файла развертывания. + +Чтобы cqtdeployer начал читать параметры из файла, используйте флаг -confFile [путь к файлу] + +#### Пример: + +cqtdeployer -qmake ~/Qt/bin/qmake -confFile ./deploy.json + diff --git a/src/docs/ru/Description.md b/src/docs/ru/Description.md new file mode 100644 index 00000000..fe7a80d4 --- /dev/null +++ b/src/docs/ru/Description.md @@ -0,0 +1,9 @@ +# Что такое CQtDeployer + +CQtDeployer - это утилита для извлечения всех зависимых библиотек исполняемых файлов и создания сценария запуска для вашего приложения. + +Основные отличия этой программы: +* Производительность - эта программа развертывает приложение в несколько раз быстрее (до 10 секунд) +* Гибкость - эта утилита имеет флаги, которые помогут вам настроить деплоинг под ваши нужды и нужды вашего проекта +* Crossdeploy - приложение поддерживает Windows и дистрибутивы Linux, это означает, что вы можете использовать его не только для развертывания проекта для вашей платформы, но и для развертывания проекта в Linux для Windows и наоборот. +* Упаковка - эта утилита может создавать установочные файлы и пакеты, для вашего приложения. diff --git a/src/docs/ru/DisableShortcats.md b/src/docs/ru/DisableShortcats.md new file mode 100644 index 00000000..e4d76fae --- /dev/null +++ b/src/docs/ru/DisableShortcats.md @@ -0,0 +1,19 @@ +# Отключение ярлыков для Qt Installer. + + Отключение ярлыков для многоцелевого дистрибутива в структуре Qt Installer. + +Иногда нам нужно отключить автоматическое создание ярлыков для некоторых приложений. +Для решения этой проблемы я рекомендую переопределить шаблон фреймворка установщика qt по умолчанию. + +# Примечание +В CQtDeployer 1.5.1 вы можете добавить опцию -disableShortcuts для отключения автоматизации создания ярлыков. + +### Пример: + +```bash +cqtdeployer -disableShortCut targetName,target2Name +``` + +```bash +cqtdeployer -bin myProgramm.exe -disableShortCut myProgramm +``` diff --git a/src/docs/ru/EnvironmentVariables.md b/src/docs/ru/EnvironmentVariables.md new file mode 100644 index 00000000..4c02be64 --- /dev/null +++ b/src/docs/ru/EnvironmentVariables.md @@ -0,0 +1,46 @@ +# Переменные окружения CQtDeployer + +Эта страница содержит информацию о переменных содержащихся в скрипте запуска по умолчанию. + +## Инициализация + +Все переменные окружения инициализируются в скрипте запуска по умолчанию. Поэтому, если вы используете опцию runScript, вам необходимо вручную воссоздать все необходимые переменные. + + +## Список стандартных переменных + +| Имя переменной | Описание | +| --- | --- | +| CQT_PKG_ROOT | Эта переменная содержит путь к корню текущего пакета. +| CQT_RUN_FILE | Эта переменная содержит путь к скрипту запуска используемого приложения. | + + +## Описания определений + +**корень текущего пакета** - Этот корень является локальным корнем для любых отдельных пакетов. + + +Пример : + +```bash +. +├── pakcage1 << Это локальный корень пакета package1 +│ ├── bin +│ ├── lib +│ ├── plugins +│ ├── qml +│ └── translations +├── package2 << Это локальный корень пакета package2 +│ ├── bin +│ ├── lib +│ ├── plugins +│ ├── qml +│ └── translations +└── pakcage3 << Это локальный корень пакета package3 + ├── bin + ├── lib + ├── plugins + ├── qml + └── translations + +``` diff --git a/src/docs/ru/ExtraFiles.md b/src/docs/ru/ExtraFiles.md new file mode 100644 index 00000000..99d071f4 --- /dev/null +++ b/src/docs/ru/ExtraFiles.md @@ -0,0 +1,107 @@ +# Добавление дополнительных данных + +Добавление дополнительных данных в дистрибутив. + + +CQtDeployer поддерживает работу с дополнительными файлами данных. + +Для этого используйте параметры -extraData и -extraDataOut. + +## Примеры: + +### Добавление собственных файлов в корневой каталог дистрибутива. + +``` +cqtdeployer -extraData путь / к / my / customFile +``` + +Или в configFile.json + +```json +{ + ... + "extraData": "./path/to/my/customFile" + ... +} +``` + +Эта команда поддерживает список аргументов. + + +```bash +cqtdeployer -extraData path/to/my/customFile,path/to/my/customFile2,path/to/my/customFile3 +``` + +Или в configFile.json + +```json +{ + ... + "extraData": [ + "./path/to/my/customFile", + "./path/to/my/customFile2", + "./path/to/my/customFile3" + ] + ... +} +``` + +### Изменение расположения дополнительных файлов данных. + +Для изменения местоположения используйте параметры extraDataOut. Эта опция меняет путь назначения относительно корня дистрибутива. + +### Пример. Добавьте пользовательские скрипты в папку скриптов в Distribution. + +```bash +cqtdeployer -extraData /path/to/myScripts.sh,/another/path/to/myScripts.sh -extraDataOut scripts +``` + +Или в configFile.json + +```json +{ + ... + "extraData": [ + "./path/to/myScripts.sh", + "./another/path/to/myScripts.sh" + ], + "extraDataOut": "скрипты" + ... +} +``` + +## Пакеты +Опции extraData и extraDataOut поддерживают работу с пакетами. Дополнительную информацию о пакетах см. На [странице](Packing.md) упаковки. + +Иногда нам нужно создать многопакетное приложение. Например, создайте установщик для приложения client-server с клиентскими и серверными приложениями. Клиент и сервер имеют собственные файлы конфигурации по умолчанию. Мы добавляем файлы config с помощью опции extraData. + +Для создания большого дистрибьютора я рекомендую использовать [confFile](DeployConfigFile.md). + +## Пример применения мультиупаковки. + + +```json +{ + + "корзина": [ + "myClientExecutable", + "myServerExecutable" + ], + + "targetPackage": [ + ["Клиент", "myClientExecutable"], + ["Сервер", "myServerExecutable"] + ], + + "extraData": [ + ["Клиент", "./path/to/clientConfig.conf"], + ["Сервер", "./path/to/serverConfig.conf"] + ], + "extraDataOut": [ + ["Клиент", "defaultConfigurations"], + ["Сервер", "defaultConfigurations"] + ] +} +``` + +Эта конфигурация создает дистрибутив с двумя приложениями (клиент и сервер). Каждое приложение имеет собственный файл конфигурации в папке defaultConfigurations. diff --git a/src/docs/ru/ExtractDefaultsTemplates.md b/src/docs/ru/ExtractDefaultsTemplates.md new file mode 100644 index 00000000..6c532540 --- /dev/null +++ b/src/docs/ru/ExtractDefaultsTemplates.md @@ -0,0 +1,56 @@ +# Извлечение шаблонов + +Извлечение шаблонов по умолчанию + +Иногда вам нужно создать свои собственные шаблоны для установщиков или пакетов deb. +Для этого вы можете использовать опцию getDefaultTemplate. + +Эта опция извлекает шаблон вашего дистрибутива по умолчанию в целевой каталог. + +Эта опция создаст шаблон в соответствии с вашими настройками. Если вы используете опцию targetPackage, то для каждого настроенного вами пакета будет создан шаблон. + +### Пример: + +```bash +cqtdeployer -bin myExecutable getDefaultTemplate qif +``` +Эта команда создает шаблон для среды установки qt в папке DistributionKit для вашей программы "myExecutable". + +Если вы хотите изменить целевое местоположение, просто добавьте параметр targetDir +```bash +cqtdeployer -bin myExecutable getDefaultTemplate qif -targetDir "/distanation/Dir" + +``` + +## Работа с мультипакетной раздачей. + +Эта опция поддерживает configFile.json + +### Пример: + +#### configFile.json + +```json +{ + + "корзина": [ + "myClientExecutable", + "myServerExecutable" + ], + + "targetPackage": [ + ["Клиент", "myClientExecutable"], + ["Сервер", "myServerExecutable"] + ], +} +``` + +```bash +cqtdeployer getDefaultTemplate qif -confFile "path/to/configFile.json" +``` + + +## Запись + +Эта опция поддерживает работу со всеми пакетами, кроме zip. +Если вы хотите получить больше информации о доступных пакетах, смотрите упаковку [страница](Packing.md). \ No newline at end of file diff --git a/src/docs/ru/Guide.md b/src/docs/ru/Guide.md new file mode 100644 index 00000000..fb16ff5c --- /dev/null +++ b/src/docs/ru/Guide.md @@ -0,0 +1,536 @@ +# Как развернуть приложение + +В этой статье я описываю процессы развертывания приложения c++/qt с помощью cqtdeployer. + +## Рекомендация +Если вам нужна максимальная стабильность вашего дистрибутива и вы хотите запускать свое приложение в разных дистрибутивах с разными версиями, вам необходимо использовать Qt из официального [build](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5). + +## Кейс +В этом случае мы развертываем приложение Qt GUI для Ubuntu 16.04, Ubuntu 18.04 и Ubuntu 20.04++. + +**Если вы хотите поддерживать все дистрибутивы, начиная с Ubuntu 16.04, вам необходимо собрать и развернуть приложение в более старом дистрибутиве (в моем случае это 16.04)** + +## Установить CQtDeployer +Если вы хотите использовать системный qt из своей ОС, установите [классическую](https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run) версию cqtdeployer. + +``` bash +wget https://github.com/QuasarApp/CQtDeployer/releases/download/1.4.7/LinuxInstaller.run +``` + +``` +chmod + x LinuxInstaller.run +./LinuxInstaller.run +``` +![Настройка CQtDeployer](https://user-images.githubusercontent.com/12465465/100077575-9280a600-2e53-11eb-8d9d-d184341cfa7c.png) + +Выберите последнюю стабильную версию (1.4) + +![Настройка CQtDeployer](https://user-images.githubusercontent.com/12465465/100077707-bb08a000-2e53-11eb-9838-6f896af33105.png) + +Выполнено. + +Если вы используете официальную сборку qt, вы можете использовать snap-версию cqtdeployer. + +``` +sudo snap install cqtdeployer +``` + +После установки добавьте необходимые разрешения. + +``` +sudo snap connect cqtdeployer:process-control +sudo snap connect cqtdeployer:removable-media +sudo snap connect cqtdeployer:system-backup +``` + +Выполнено!!! + +## Развертывание приложения Qt GUI + +### Разверните исполняемый файл. + +* Для систем Linux: + +```bash +cqtdeployer -bin myexecutable +``` + +* Для систем Windows: + +```bash +cqtdeployer -bin myexecutable.exe -qmake C: /Qt/5.15.0/min_gw/bin/qmake.exe +``` + +* Для кроссплатформенной сборки (Linux -> Windows) + +```bash +cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/ bin / qmake +``` + +## Дополнительные параметры + +Если вы используете дополнительные библиотеки, просто добавьте путь для cqtdeployer к используемым библиотекам. + +```bash +cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs +``` + +Если вы хотите найти библиотеки рекурсивно из пути libDir, просто добавьте параметр рекурсивной глубины. + +```bash +cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs -recursiveDepth 5 +``` + +Если ваше приложение использует qml, просто добавьте опцию qmlDir + +```bash +cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources +``` + +Если вы хотите создать простой установщик для своего приложения, просто добавьте опцию gif. +``` +cqtdeployer -bin myexecutable -libDir/PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif +``` + +Если cqtdeployer не нашел qmake, добавьте параметр -qmake в команду вызова. + +``` +cqtdeployer -bin myexecutable -libDir / PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif -qmake/path/to/my/qmake + +``` + +# На живом примере animation из [Примеров Qt](https://doc.qt.io/qt-5/qtquick-animation-example.html) + + +## Собираем проект в релизную сборку + +Выполняем qmake с опцие -r для релизной сборки. + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ ~/Qt/5.15.2/gcc_64/bin/qmake -r . +``` + +Вызываем ваш make generator + +Для Linux: + +```bash +make -j${nproc} +``` + +Для Windows + +```bash +Qt/Tools/QtCreator/bin/jom.exe +``` +Билд лог + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ make -j${nproc} +g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o main.o main.cpp +/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name shared ../shared/shared.qrc -o qrc_shared.cpp +/home/andrei/Qt/5.15.2/gcc_64/bin/rcc -name animation animation.qrc -o qrc_animation.cpp +g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_animation.o qrc_animation.cpp +g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../../5.15.2/gcc_64/include -I../../../../5.15.2/gcc_64/include/QtQuick -I../../../../5.15.2/gcc_64/include/QtGui -I../../../../5.15.2/gcc_64/include/QtQmlModels -I../../../../5.15.2/gcc_64/include/QtQml -I../../../../5.15.2/gcc_64/include/QtNetwork -I../../../../5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I../../../../5.15.2/gcc_64/mkspecs/linux-g++ -o qrc_shared.o qrc_shared.cpp +g++ -Wl,-O1 -Wl,-rpath,/home/andrei/Qt/5.15.2/gcc_64/lib -o animation main.o qrc_shared.o qrc_animation.o /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so /home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so -lGL -lpthread +``` + +## Находим наш получившийся исполняемый файл + +Если вы собирали проект с помощью qtCreator ваш исполняемый файл будет находиться на уровень выше в папке **build-Animations-Desktop_Qt_5_15_2_GCC_64bit-Release** +В моем случае исполняемый файл лежит в корневом катологе проекта. + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ tree +. +├── animation # Вот он. +├── animation.pro +├── animation.qml +├── animation.qmlproject +├── animation.qrc +├── basics +│ ├── animators.qml +│ ├── color-animation.qml +│ ├── images +│ │ ├── face-smile.png +│ │ ├── moon.png +│ │ ├── shadow.png +│ │ ├── star.png +│ │ └── sun.png +│ └── property-animation.qml +├── behaviors +│ ├── behavior-example.qml +│ ├── FocusRect.qml +│ ├── SideRect.qml +│ ├── tvtennis.qml +│ └── wigglytext.qml +├── doc +│ ├── images +│ │ └── qml-animations-example.png +│ └── src +│ └── animation.qdoc +├── easing +│ └── easing.qml +├── main.cpp +├── main.o +├── Makefile +├── pathanimation +│ └── pathanimation.qml +├── pathinterpolator +│ └── pathinterpolator.qml +├── qrc_animation.cpp +├── qrc_animation.o +├── qrc_shared.cpp +├── qrc_shared.o +└── states + ├── qt-logo.png + ├── states.qml + └── transitions.qml +10 directories, 33 files +``` + +## Вызываем cqtdeployer для формирования Базового Дистрибутива + +Для Linux: + +```bash +cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +``` +Для Windows: + +```bash +cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/mingw_810_64/bin/qmake.exe +``` + +Лог развёртывания + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ cqtdeployer -bin animation -qmlDir . qif -qmake ~/Qt/5.15.2/gcc_64/bin/qmake +Info: Deploy ... +Info: flag targetDir not used. use default target dir :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit +Info: target deploy started!! +Info: copy :/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/animation +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/libqmlplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/libmodelsplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/Models.2/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/libqtqmlremoteobjects.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/RemoteObjects/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/libqtqmlstatemachine.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/StateMachine/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/libworkerscriptplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQml/WorkerScript.2/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/libparticlesplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick/Particles.2/qmldir +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/libqtquick2plugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/plugins.qmltypes +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/qml/QtQuick.2/qmldir +Info: platform : libqvnc is disabled +Info: platform : libqvnc is disabled +Info: platform : libqwebgl is disabled +Info: platform : libqwebgl is disabled +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqconnmanbearer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqgenericbearer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/bearer/libqnmbearer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/iconengines/libqsvgicon.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqgif.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqicns.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqico.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqjpeg.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqsvg.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtga.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqtiff.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwbmp.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/imageformats/libqwebp.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqeglfs.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqlinuxfb.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimal.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqminimalegl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqoffscreen.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-generic.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqwayland-xcomposite-glx.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqgtk3.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/platformthemes/libqxdgdesktopportal.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-decoration-client/libbradient.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdmabuf-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libdrm-egl-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libqt-plugin-wayland-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libshm-emulation-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libvulkan-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-client/libxcomposite-glx.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-dmabuf-server-buffer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-drm-egl-server-buffer.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-linux-dmabuf-unstable-v1.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-shm-emulation-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-vulkan-server.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-wayland-eglstream-controller.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-egl.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-graphics-integration-server/libqt-wayland-compositor-xcomposite-glx.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libfullscreen-shell-v1.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libivi-shell.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libwl-shell.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v5.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell-v6.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/wayland-shell-integration/libxdg-shell.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-egl-integration.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/plugins/xcbglintegrations/libqxcb-glx-integration.so +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Core.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Network.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5EglFSDeviceIntegration.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5XcbQpa.so.5 +Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicui18n.so.56 +Info: copy :/usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5RemoteObjects.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QuickParticles.so.5 +Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicudata.so.56 +Info: copy :/home/andrei/CQtDeployer/1.5/lib/libicuuc.so.56 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlWorkerScript.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Widgets.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandClient.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5DBus.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Qml.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Quick.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5QmlModels.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Gui.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5Svg.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/lib/libQt5WaylandCompositor.so.5 +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ar.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_bg.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ca.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_cs.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_da.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_de.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_en.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_es.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fi.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_fr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_gd.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_he.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_hu.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_it.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ja.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ko.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_lv.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_pl.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_ru.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_sk.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_tr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_uk.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtbase_zh_TW.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_bg.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_da.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_de.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_en.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_es.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fi.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_fr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_hu.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ja.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ko.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_lv.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_pl.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_ru.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_sk.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_tr.qm +Info: copy :/home/andrei/Qt/5.15.2/gcc_64/translations/qtdeclarative_uk.qm +Info: try deploy msvc +Info: deploy done! +Info: copy ::/shared/Distributions/Templates/Icon.png +Error: not exits +Info: [0] Parsed arguments, ok. +Info: [2] Collecting information about available packages... +Info: [4] Found subdirectory "Application" +Info: [4] - it provides the package "Application" - "1.0" +Info: [4] Copying component data for "Application" +Info: [5] Compressing data directory "bin" +Info: [21] Compressing data directory "icons" +Info: [31] Compressing data directory "lib" +Info: [11111] Compressing data directory "plugins" +Info: [11740] Compressing data directory "qml" +Info: [11786] Compressing data directory "translations" +Info: [12321] Compressing files found in data directory: ("/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/data/animation.sh") +Info: [12321] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" +[12321] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" +Info: [12321] Generated sha1 hash: "0af6cb9dc074407a8857403f07d13aa7d1b3c9cb" +Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" +[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" +Info: [12322] Generated sha1 hash: "aa938cb332bfb427a6d0280c07c204c1bb48da22" +Info: [12322] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" +[12322] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" +Info: [12347] Generated sha1 hash: "7c3a43111e694bc82a0ab0d19a6e4d0025f17313" +Info: [12347] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" +[12347] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" +Info: [12349] Generated sha1 hash: "4ed23c36835a9b62701478ab6897737dfe9dfc9a" +Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" +Info: [12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" +Info: [12349] Generated sha1 hash: "bd44e15d2c26c8f6cb50760032eadf0241eedf43" +Info: [12349] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" +[12349] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" +Info: [12350] Generated sha1 hash: "030e0ede0c0e058a5d5a3b6c43c6a4767119d3f1" +Info: [12350] Hash is stored in "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" +Info: [12350] Creating hash of archive "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" +Info: [12350] Generated sha1 hash: "acd2cd63e77971acedbcda2a65f93b2cc036025f" +Info: [12350] Copy meta data for package "Application" using "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/package.xml" +Info: [12350] calculate size of directory "/tmp/binarycreator-yOPMPa/Application/data" +Info: [12359] Copying associated "script" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/packages/Application/meta/installscript.qs" +Info: [12360] done. +Info: [12360] Begin to copy configuration file and data. +Info: [12360] Copying associated "configuration" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/config.xml" +Info: [12360] done. +Info: [12360] Read dom element: animation. +Info: [12360] Read dom element: 1.0. +Info: [12360] Read dom element: animation. +Info: [12360] Read dom element: Company. +[12360] Read dom element: animation. +[12360] Read dom element: @HomeDir@/animation. +Info: [12360] Read dom element: true. +[12360] Read dom element: true. +Info: [12360] Read dom element: controlScript.qs. +Info: [12360] Copying associated "ControlScript" file "/home/andrei/Qt/Examples/Qt-5.15.2/quick/animation/DistributionKit/defaultQIFWTemplate/config/controlScript.qs" +Info: [12360] done. +Info: [12360] Read dom element: animationTool. +[12360] Read dom element: . +Info: [12360] done. +Info: [12362] Creating the binary +Info: [12407] Creating resource archive for "Application" +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z" ("61.58 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0bin.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z" ("108.00 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0icons.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z" ("18.08 MB") +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0lib.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z" ("1.08 MB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0plugins.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z" ("53.29 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0qml.7z.sha1" ("40.00 bytes") +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z" ("595.71 KB") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0translations.7z.sha1" ("40.00 bytes") +[12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z" ("439.00 bytes") +Info: [12407] Appending "/tmp/binarycreator-yOPMPa/Application/1.0content.7z.sha1" ("40.00 bytes") +Info: [12449] Cleaning up... +``` + +Готово. дистрибутив был сохранен в папку **DistributionKit** + +```bash +andrei@X570-GAMING-X:~/Qt/Examples/Qt-5.15.2/quick/animation$ ./DistributionKit/Installeranimation.run +``` + +![Снимок экрана от 2021-02-22 11-25-34](https://user-images.githubusercontent.com/12465465/108681955-c629a580-7500-11eb-8087-cedfa8134aae.png) + +После установки буду созданы все необходимые ярлыки. + +![Снимок экрана от 2021-02-22 11-27-11](https://user-images.githubusercontent.com/12465465/108682148-012bd900-7501-11eb-9f0b-f46fd79aef25.png) + +![Снимок экрана от 2021-02-22 11-29-23](https://user-images.githubusercontent.com/12465465/108682391-48b26500-7501-11eb-8d81-b430ddf97d46.png) + + +## Интеграция с QtCreator + +К сожалению, на данный момент нет интеграции с qtcreator. +Единственный способ - включить цель сборки для **qmake** или **cmake** + +### qmake + +```qmake +QT_DIR= $$[QT_HOST_BINS] +win32:QMAKE_BIN= $$QT_DIR/qmake.exe +contains(QMAKE_HOST.os, Linux):{ + QMAKE_BIN= $$QT_DIR/qmake +} + +deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif + +QMAKE_EXTRA_TARGETS += deploy + +``` + +### cmake + +```cmake + find_program(Q_MAKE_EXE qmake) + + find_program(CQT_EXE cqtdeployer) + + IF(NOT EXISTS ${CQT_EXE}) + message("the cqtdeployer not exits please install the cqtdeployer and run cmake again!") + return() + endif(NOT EXISTS ${CQT_EXE}) + + ADD_CUSTOM_TARGET( + deploy + COMMAND cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5 + COMMENT "Deploy: cqtdeployer clear -bin ${CURENT_PROJECT} -qmake ${Q_MAKE_EXE} -libDir ${PROJECT_SOURCE_DIR} -qmlDir ${PROJECT_SOURCE_DIR} -recursiveDepth 5" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + ) +``` + +Параметр **libDir** используется для установки путей к каталогам, в которых пути содержат зависимости вашего приложения, а параметр **qmlDir** используется для установки путей к каталогам, содержащих файлы qml, необходимые вашему приложению. В этом примере корень исходного кода приложения выбирается этими двумя параметрами. + +Параметр **recursiveDepth** используется для установки глубины поиска **libDir** и **qmlDir**. + +Параметр **qif** используется для создания установщика с использованием Qt Installer Framework. + + + +## Пример интеграции + +Создаем тестовый проект + +```qmake +QT += quick +CONFIG += c++11 +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +SOURCES += \ + main.cpp +RESOURCES += qml.qrc +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target +QT_DIR= $$[QT_HOST_BINS] +win32:QMAKE_BIN= $$QT_DIR/qmake.exe +contains(QMAKE_HOST.os, Linux):{ + QMAKE_BIN= $$QT_DIR/qmake +} +DESTDIR=$$PWD/Build +deploy.commands= cqtdeployer -bin $$DESTDIR/$$TARGET -qmake $$QMAKE_BIN -libDir $$PWD -qmlDir $$PWD -recursiveDepth 5 qif +QMAKE_EXTRA_TARGETS += deploy +``` + +2. Открываем панель управления проектом + ![Снимок экрана от 2021-02-22 12-15-51](https://user-images.githubusercontent.com/12465465/108687472-d09b6d80-7507-11eb-9b56-8d09d42dac5e.png) + +3. Выбираем релизную сборку. + ![изображение](https://user-images.githubusercontent.com/12465465/108688147-a39b8a80-7508-11eb-81b9-9a24426a94a3.png) + + +3. Добавляем "Особый этап сборки" + ![изображение](https://user-images.githubusercontent.com/12465465/108687640-02143900-7508-11eb-8d1c-532afd7f6ccb.png) + +4. В поле "Make arguments" добавляем наш этап развертывания "Deploy" + ![изображение](https://user-images.githubusercontent.com/12465465/108687800-35ef5e80-7508-11eb-8f69-aec090d4baa0.png) + +5. Сохраняем +6. Запускаем сборку. + +#### На выходе вы получите папку DistributionKit с установщиком вашего приложения. diff --git a/src/docs/ru/Home.md b/src/docs/ru/Home.md new file mode 100644 index 00000000..e636b757 --- /dev/null +++ b/src/docs/ru/Home.md @@ -0,0 +1,26 @@ +# Добро пожаловать в "C Qt Deployer"! +# ![Логотип](https://user-images.githubusercontent.com/12465465/84260958-99289480-ab23-11ea-8aab-374368a545dc.png) + +*************************** + +# Основные разделы + +* [Описание CQtDeployer](Description.md) +* [Параметры](Options.md) +* [Руководство](Guide.md) +* [Краткое Руководство](QuickGuide.md) +* [Сборка и установка](Build-and-Install.md) +* [Файл развертывания](DeployConfigFile.md) +* [Упаковка](Packing.md) +* [Список изменений](Changelog.md) +* [Обзоры](ReleaseReviews.md) +* [Сравнение возможностей](CompareFeatures.md) +* [Добавление дополнительных файлов](ExtraFiles.md) +* [Получение шаблонов упаковки](ExtractDefaultsTemplates.md) +* [Стандартные переменные окружения](EnvironmentVariables.md) +* [Отключение стандартных ярлыков](DisableShortcats.md) +* [Пользовательские скрипты](CustomScripts.md) + + +## Поддержите проект +Если вам нравится то, что мы делаем, и это приносит вам пользу, вы можете поддержать проект на официальной странице [QuasarApp в Patreon](https://www.patreon.com/QuasarApp) diff --git a/src/docs/ru/Options.md b/src/docs/ru/Options.md new file mode 100644 index 00000000..715c0c85 --- /dev/null +++ b/src/docs/ru/Options.md @@ -0,0 +1,171 @@ +# Использование параметров + +Общие правила использования параметров + +``` +cqtdeployer -option1 value1 -option2 list,of,values flag1 flag2 flag3 +``` + +* Все параметры должны начинается с знака '-' за исключением параметров, из котегории "Флаги". +* После указания нужного параметра нужно в обязательном порядке указать значение +* Некоторые параметры поддерживают перечисления (массивы значений). При инициализации таких параметров укажите список значений через ',' без прабелов. Если вы используете какой либо язык программирования и вызываете процесс cqtdeployer то массив значений должен передаваться как 1 параметр. +* Некоторые параметры поддерживают пересисления с возможностью выбрать цель для которой будет применен флаг. Цель и значения разделяются при помощи знака ';'. Пример -libOut target1;value1,target2;value2,defaultValue. +* Для включения какого либо флага достаточно просто включить в список опций имя флага. + +## Обозначения в таблице + + * **-binDir [params]** - параметр без поддержки массивов. + * **-bin [params,list]** - параметр c поддержкой массивов. В качестве разделителя используется ','. + * **-libOut [package;path,path]** - параметр c поддержкой выбора пакета для которого бутет установленно значение флага. В качестве разделителя используется ';'. Обратитте внимание что для перечисления значений параметра используется правило описанное выше. Последний параметр не имеет значение пакета, это значит что это значение будет установленно для всех не настроенных пакетов по умолчанию. + * **clear** - флаг + +## Определения в описании + +**Системное окружение** - пути к системным библиотекам. + * Windows: + * Пути, определенные в переменной PATH. + * C:/Windows/System32 + * C:/Windows/SysWOW64 + + * Linux: + * Пути, определенные в переменных LD_LIBRARY_PATH и PATH. + * /usr/lib + * /lib + +**Развертываемые файлы** - это все файлы, которые будут скопированы в дистрибутив (включая исполняемые файлы) + +**Цели** - это все исполняемые файлы, отмеченные опцией bin. + +**Исполняемые файлы** - это все файлы в форматах PE, ELF и Mach-O. + +## Параметры: + +### Флаги + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| init | проинициализирует файл cqtdeployer.json (файл конфигурации)| +| | Например: «cqtdeployer init» - для инициализации базовой конфигурации пакета| +| | "cqtdeployer -init multi" - для инициализации конфигурации нескольких пакетов| +| | "cqtdeployer -init single" - для инициализации конфигурации одного пакета | +| help / h | Показывает справку | +| clear | Удаляет все старые файлы (с прошлого запуска) | +| force-clear | Удаляет целевую директорию перед развертыванием | +| noStrip | Пропускает шаг strip | +| noTranslations | Пропускает файлы переводов | +| noOverwrite | Запрещает замену уже существующих файлов. | +| noCheckRPATH | Отключает автоматический поиск путей к qmake в исполняемых файлах.| +| noCheckPATH | Отключает автоматический поиск путей к qmake в системном окружении.| +| noRecursiveiIgnoreEnv | Отключает рекурсивное игнорирование переменной среды для флага ignoreEnv. | +| v / version | Показывает версию приложения | +| qif | Создаст установщик QIF для развертываемой программы" | +| | Примеры: cqtdeployer qif | +| | Начиная с версии CQtDeployer 1.5 вы можете указать путь к своему собственному шаблону установщика. | +| | Примеры: cqtdeployer -qif path/to/myCustom/qif. Подробнее можно посмотреть [здесь](QIF.md) | +| deb | Создаст deb пакет для развертываемой программы" | +| | Примеры: cqtdeployer deb | +| | Вы можете указать путь к своему собственному шаблону пакета. | +| | Примеры: cqtdeployer -deb path/to/myCustom/DEBIAN. Подробнее можно посмотреть [здесь](DEB.md) | +| deploySystem | Копирует все библиотеки кроме libc | +| | (не рекомендуется, так как занимает много памяти, возможны конфликты библиотек) | +| noQt | Игнорирует ошибку инициализации qmake. Используйте только в том случае, если ваше приложение не использует платформу qt. | +| allowEmptyPackages | Разрешите настраивать пустые пакеты. | +| getDefaultTemplate | Извлекает deb или qif шаблоны по умолчанию. Для получения дополнительной информации см. [Страницу](ExtractDefaultsTemplates.md) извлечения шаблонов по умолчанию. | +| noHashSum | Отключить вычисление хеш-суммы пакетов | + +### Параметры развертывания: + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -bin [list,params] | Развертываемый файл или папка. пример -bin ~/my/project/bin/,~/my/project/bin.exe. Для файлов: эти файлы будут безоговорочно скопированы в целевой каталог, независимо от их формата или суффикса. Для папок: CQtDeployer войдет в эти папки и нерекурсивно скопирует все развертываемые файлы в целевой каталог. Затем CQtDeployer извлечет все зависимости скопированных файлов. CQtDeployer будет искать зависимости в системной среде и в путях libDir. **Примечание**. Если CQtDeployer не может найти требуемый файл, CQtDeployer попытается найти требуемый файл в системной среде PATH. | +| -binPrefix [prefixPath] | Устанавливает путь префикса для опции bin. Пример: **-bin path/MyExecutable** - это тоже что и **-bin MyExecutable -binPrefix path** | +| -confFile [params] | Путь к файлу json со всеми конфигурациями развертывания. С помощью этого файла можно добавить нужные опции, тем самым упрастить вызов комманды в консоле. Однако пораметры в кансоле имеют больший приоритет чем в файле. Для получения дополнительной информации об этом флаге см. [Вики](DeployConfigFile) | +| -qmlDir [params] | Папка qml. пример -qmlDir ~/my/project/qml | +| -qmake [params] | Путь к qmake. пример | +| | -qmake ~/Qt/5.14.0/gcc_64/bin/qmake | +| -ignore [list,params] | Список библиотек для игнорирования | +| | Пример -ignore libicudata.so.56,libicudata2.so.56 | +| -ignoreEnv [list,params] | Список путей для игнорирования. | +| | Пример -ignoreEnv /bad/dir,/my/bad/Dir | +| -libDir [list,params] | Устанавливает дополнительные пути к библиотекам | +| | Пример -libDir ~/myLib,~/newLibs. **Внимание** опция libDir не должна быть дочерней от каталога targetDir. Опция targetDir является запрещенной для поиска библиотек, так как может содержать устаревшие библиотеки проекта, что в свою очередь может привести к нежелательным крашам. | +| -extraLibs [list,params] | Пример: «-extraLib mySql» - заставляет скопировать все библиотеки, имена которых содержат mySql, в папку проекта. Этот параметр не чувствителен к регистру в Windows и чувствителен к регистру на других платформах. Эта опция будет искать библиотеки только в системных средах, подобных **deploySystem**. | +| -customScript [scriptCode] | Установит дополнительный код в скрипты запуска. | +| -extraPlugin [list,params] | Устанавливает дополнительный путь для extraPlugin приложения| +| -recursiveDepth [params] | Устанавливает глубину поиска библиотек и глубину игнорирования окружения для ignoreEnv (по умолчанию 0) | +| -targetDir [params] | Устанавливает целевой каталог (по умолчанию это путь к первому развертываемому файлу)| +| -installDirDeb [параметры] | Устанавливает целевой каталог для установки пакета Debian (по умолчанию это /opt путь) | +| -installDirQIFW [параметры]| Устанавливает целевой каталог установки для инсталляторов (по умолчанию это путь /home) | +| -verbose [0-3] | Показывает дебаг лог. По умолчанию равен 2 | +| -platform [list] | Если этот параметр включен, CQtDeployer будет развертывать только двоичные файлы указанной платформы. Поддерживоемые значения : [win_x86 win_x86_64 win_arm win_arm64 linux_x86 linux_x86_64 linux_ARM linux_ARM64] | + +### Параметры управлениями пакетами: + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -targetPackage [package;tar1,package;tar2]| Создает новый пакет и добавляет в него 'tar1 и tar2'| +| -qmlOut [package;path,path] | Установит путь к папке с qml | +| -libOut [package;path,path] | Установит путь к папке с зависимостями | +| -trOut [package;path,path] | Установит путь к папке с файламми переводов | +| -pluginOut [package;path,path]| Установит путь к папке с плагинами | +| -binOut [package;path,path] | Установит путь к папке с исполняемыми файлами | +| -recOut [package;path,path] | Установит путь к папке с ресурсами | +| -extraDataOut [package;path,path] | Устанавливает путь к каталогу с дополнительными файлами данных. По умолчанию это корневой каталог дистрибутива. | +| -name [package;val,val] | Установит имя пакету. Если указать значение без префикса, то значение будет установленно пакету по умолчанию. | +| -description [package;val,val] | Установит описание пакету | +| -deployVersion [package;val,val]| Установит версию пакету | +| -releaseDate [package;val,val] | Установит дату выпуска пакету | +| -icon [package;val,val] | Установит путь к иконке или логотипу пакету | +| -publisher [package;val,val]| Установит Издательство (автора) пакету | +| -homePage [package;val,val] | Установит URL-адрес домашней страницы для пакета | +| -prefix [package;val,val] | Устанавливает префикс для пакета относительно целевого каталога | +| -extraData [package;val,val]| Добавляет дополнительные файлы или каталоги как цель. Выбранный каталог будет скопирован в расположение extraDataOut с сохранением собственной структуры.| +| -tr [package;val,val] | Добавляет qm файлы в папку переводов. | + +### Параметры управлениями целями: + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -icon [target;val,val] | Установит путь к иконке или логотипу для целе. Эта комманда поддерживает только png файлы для Linux и ico файлы для Windows | +| -disableRunScript [target; val, val]| Отключает создание сценария выполнения для выбранных целей | +| -disableShortCut [target; val, val] | Отключает создание ярлыков для выбранных целей | +| -runScript [target; val, val] | заставляет cqtdeployer заменить сценарий запуска по умолчанию на новый из аргументов параметра. Эта опция копирует все содержимое из входного файла и вставляет весь код в runScript.sh или .bat. Пример использования: cqtdeployer -runScript "myTargetMame;path/to/my/myCustomLaunchScript.sh,myTargetSecondMame;path/to/my/mySecondCustomLaunchScript.sh". Для получения дополнительной информации смотрите статью [Кастомные скрипты](CustomScripts.md)| + +### Параметры управления плагинами: + +| Option | Descriptiion | +| ----------------------------|---------------------------------------------------------- | +| -extraPlugin [пакет; val1; val2, SingeleVal] | Устанавливает дополнительный путь к стороннему плагину приложения | +| -enablePlugins [target,target2,target3] | Включает дополнительные плагины для распространения. | +| -disablePlugins [target,target2,target3] | Отключает плагины для распространения. | +| | Вы можете отключить любой плагин вашей сборки Qt, просто проверте список доступных плагинов в свой qlFolder/plugins папке. +| | Пример: Если вы хотите отключить плагин qxcb: -disablePlugins qxcb. Обратите внимание, что имя плагина указывается без его расширения. + +### Параметры QtInstallFramework: + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -qifStyle [path/to/style.css]| Устанавливает путь к CSS файлу стиля или устанавливает стиль по умолчанию. Доступные стили: quasar | +| -qifBanner [path/to/banner.png]| Устанавливает путь к png-файлу баннера. | +| -qifLogo [path/to/logo.png]| Устанавливает путь к файлу логотипа png. | +| -qifOut [nameOfOutputInstallerFile] | Устанавливает имя выходного установщика qifw. Примечание: для установщика Windows автоматически добавляется суффикс exe. | +| -qifConfig [path/to/config.xml] | Устанавливает пользовательский путь к файлу конфигурации установщика qt ifw. По умолчанию это qif/config/config.xml. Важно путь считаеться относительным целевого католога (установленным опцией targetDir). | +| -qifPackages [path/to/packagesFodoler] | Устанавливает пользовательский путь к каталогам пакетов. По умолчанию это qif/packages. Важно путь считаеться относительным целевого католога (установленным опцией targetDir). | +| -qifResources [path/to/resources1.qrc,path/to/resources2.qrc] | Устанавливает пользовательский путь к файлам ресурсов. По умолчанию эта опция пропущена. Важно путь считаеться относительным целевого католога (установленным опцией targetDir). | +| -qifArchiveFormat [7z,zip,tar,tar.gz,tar.bz2,tar.xz] | Задает формат, используемый при упаковке новых архивов данных компонентов. Если вы опустите этот параметр, по умолчанию будет использоваться формат 7z. | +| -binarycreator [binarycreator command] | Установит новую команду вызова binarycreator. Пример : cqtdeployer -bin my.exe qifw -binarycreator 'wine path/to/binarycreator.exe'| + +### Deb package options: + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -debOut [package;nameOfOutputDebFile,nameOfOutputDebFile]| Устанавливает имя выходного файла debian. Эта опция может работать с несколькими пакетами | + +### Zip pacakge options: + +| Option | Descriptiion | +|-----------------------------|-----------------------------------------------------------| +| -zipOut [package;nameOfOutputZipFile,nameOfOutputZipFile]| Устанавливает имя выходного zip архива. Эта опция может работать с несколькими пакетами | + + +#### Пример: cqtdeployer -bin myApp -qmlDir ~/MyAppProject/qml -qmake ~/Qt/5.15.0/gcc_64/bin/qmake clear diff --git a/src/docs/ru/Packing.md b/src/docs/ru/Packing.md new file mode 100644 index 00000000..699022a9 --- /dev/null +++ b/src/docs/ru/Packing.md @@ -0,0 +1,138 @@ +# Упаковка дистрибутивов + +Общая информация об упаковке ваших дистрибутивов в пакеты. + +## Типы упаковки + +* Автоматически +* Вручную + +## Автоматические пакеты + +Пакеты с этим типом создаются автоматически. +По умолчанию в дистрибутиве есть один основной пакет. Вы можете настроить его, используя [Параметры управления пакетами](Options.md). + +#### Пример (Установить новое имя для pacakge) + +``` +ctdeployer ... -name "MyPackage" +``` + +Если в вашем дистрибутиве есть несколько исполняемых файлов, вы можете создать дистрибутив с несколькими пакетами. + +Один пакет может содержать от 1 до бесконечности исполняемых файлов. + +Для настройки пакета необходимо использовать параметр targetPackage. + +Пример использования: + +``` +cqtdeployer ... -targetPackage myPacage; target1, myPacage2; target2 +``` + +Где myPacage - это имя пакета, а target1 - имя исполняемого файла. +Итак, в этом примере создается 2 пакета из 2 целей. + +В следующем примере создается 2 пакета из 3 целей. +``` +cqtdeployer ... -targetPackage myPacage; target1, myPacage; target2, myPacage2; target3 +``` + + +Вы также можете сделать то же самое в файле конфигурации + +``` +{ +"targetPackage": [ + [ + "myPacage", + "target1" + ], + [ + "myPacage2", + "target2" + ] + ] +} +``` + +``` +{ +"targetPackage": [ + [ + "myPacage", + "target1" + ], + [ + "myPacage", + "target2" + ], + [ + "myPacage2", + "target3" + ] + ] +} +``` + + +## Ручные пакеты + +Ручные пакеты - это пакеты, созданные по шаблону пользователя. +Например, у вас есть приложение, которое должно выполнять сложный сценарий в пакете debian или программе установки. +Итак, вам нужно создать свой шаблон и добавить путь к вашему шаблону для варианта пакета. + +пример + +``` +cqtdeployer ... -qif /path/to/my/template/installer +``` + +Папка /path/to/my/template/installer должна содержать папку с именем пакета. +например, я развертываю приложение с именем "MyExample", поэтому мой настраиваемый шаблон должен быть расположен в + /path/to/my/template/installer/MyExample путь. + +Для многопакетных дистрибутивов применяются те же правила. + +Ваша папка с шаблонами должна содержать папки с такими же названиями, что и пакеты. + +Пример: + +``` +{ +"targetPackage": [ + [ + "myPacage", + "target1" + ], + [ + "myPacage", + "target2" + ], + [ + "myPacage2", + "target3" + ] + ] +} +``` + +``` +~/path/to/my/template/installer $ tree +. +├── myPacage +│ └── ... +└── myPacage2 + └── ... + +``` + +### Примечание + +Вы так же можете извлечь стандартный шаблон пакета для того что бы его переопределить если вас по каким то причинам не устраевает стандартная реализация. Подробнее как это сделать смотрите на этой [странице](ExtractDefaultsTemplates.md). + +## Доступные пакеты + +* [Qt Install Framework](QIF.md) +* [ZIP-архив](ZIP.md) +* [Пакет DEB](DEB.md) diff --git a/src/docs/ru/QIF.md b/src/docs/ru/QIF.md new file mode 100644 index 00000000..9a966eb1 --- /dev/null +++ b/src/docs/ru/QIF.md @@ -0,0 +1,175 @@ +# Использование Qt Installer Framwork + +Общие правила использования Qt Installer Framwork + +### Что такое Qt Installer Framwork + +**Qt Installer Framework** (QIF) предоставляет набор инструментов и утилит для создания установщиков для поддерживаемых настольных платформ Qt: Linux, Microsoft Windows и OS X. +В **CQtDeployer** QIF доступен в виде опции qif. + +### Как использовать опцию qif + +Опция qif является булевским параметром для создания Установочного файла. + +#### Пример: + +``` bash + cqtdeployer ... qif +``` + +Где: +* **...** - список других опций. +* **qif** - опция для использования qt installer framework с шаблоном по умолчанию. + + +По умолчанию cqtdeployer создаст установочный файл с одним пакетом в котором будет лежать весь ваш дистрибутив. +Если вы хотите его настроить вы должны использовать [параметр c поддержкой выбора пакета](Options.md) +Для создание нового пакета используйте флаг -targetPackage [package;tar1] + + +Где: + +* **package** - это имя пакета +* **tar1** - это название таргета который должен попасть в этот пакет. + +Или вы можете описать пакеты в [конфигурационном файле](DeployConfigFile.md) + +```json +{ +"targetPackage": [ + [ + "package", + "tar1" + ] +], +} +``` + +# Пользовательский Шаблон для QIF + +Начиная с Версии CQtDeployer 1.5 вы можете использовать свой собственный шаблон установщика. Для этого вы должны передать в параметр qif путь к вашему шаблону. + +``` +cqtdeployer ... -qif /path/to/my/custom/qif/template +``` + +### Шаблон + +Шаблон qif долже содержать 2 папки: +* packages +* config + +### Внимание + +Название пакетов в папке packages должны совподать с названием пакетов при развертывание. + +Например: + +```json +"targetPackage": [ + [ + "myCustomInstaller", + "tar1" + ] +], +``` + +```bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` + +Если имена папок не совподут с именами пакетов то CQtDeployer будет использовать стандартный пакет для QIF. + +Если у вас только один пакет, вы можете использовать опцию **name** для установки имени приложения. + +``` +cqtdeployer ... -qif /path/to/my/custom/qif/template -name myCustomInstaller +``` + +#### Не забудьте переименовать папку вашего пакета в имя пакета из опции имени. + + +```bash +. +├── config +│ ├── config.xml +│ └── style.qss +└── packages + └── myCustomInstaller << "This is folder of the your package" + └── meta + ├── installscript.qs + └── package.xml + +4 directories, 4 files + +``` + + +## Инициализация шаблона qifw + +Для инициализации шаблонов по умолчанию вы можете использовать параметр getDefaultTemplate. +Параметр getDefaultTemplate извлекает шаблон по умолчанию для cqtdeployer. Это может быть очень удобно, если вы хотите переопределить поведение установщика или другого пакета распространения по умолчанию. + +### Пример + +### Получение шаблона фреймворка установщика qt по умолчанию. + +```bash +cqtdeployer getDefaultTemplate qif +``` + +### Примечание + +CQtDeployer пропустит создание каталога пакетов для шаблона, поскольку эта команда не содержит данных для развертывания. +Если вы хотите подготовить шаблон с конфигурациями пакетов, вам следует добавить развернутые данные в свою команду или в файл config.json, используя параметры bin или extraData. +Если вы создаете дистрибутив с несколькими пакетами, вам необходимо настроить свои пакеты в развертываемой команде. + + +#### Пример: + +Извлечение шаблона с пакетами: + +```bash +cqtdeployer getDefaultTemplate qif -bin myExecutable +``` + +Извлечение шаблона для распространения нескольких пакетов + +```bash +cqtdeployer getDefaultTemplate qif -bin myExecutable1,myExecutable2 -targetPackage p1;myExecutable1,p2;myExecutable2 +``` + +Вы также можете использовать файл конфигурации для настройки шаблонов. + +Config.json + +```json +{ + "qif": true, + "bin": [ + "myExecutable1", + "myExecutable2" + ], + "targetPackage": [ + ["p1", "myExecutable1"], + ["p2", "myExecutable2"] + ] +} +``` + +Запустите CQtDeployer для создания шаблона: + +```bash +cqtdeployer -confFile Config.json getDefaultTemplate +``` diff --git a/src/docs/ru/QuickGuide.md b/src/docs/ru/QuickGuide.md new file mode 100644 index 00000000..8247f89c --- /dev/null +++ b/src/docs/ru/QuickGuide.md @@ -0,0 +1,81 @@ +# Быстрый гайд + +Как развернуть приложение с помощью CQtDeployer + +1. Прежде всего вам нужно установить CQtDeployer на вашу платформу + + * Snap (более 14 дистрибутивов Linux): + ``` + sudo snap install cqtdeployer + ``` + или + + Установите из магазина snap и включите все необходимые приложению разрешения. + + [![Download from Snap Store](https://snapcraft.io/static/images/badges/ru/snap-store-black.svg)](https://snapcraft.io/cqtdeployer) + + * Другие Linux дистрибутивы [LinuxInstaller.run][1]. + ``` + chmod +x LinuxInstaller.run + ./LinuxInstaller.run + ``` + + * Windows [installer][1] + +2. Скомпилируйте ваш проект в режиме релиза. +3. Разверните ваш исполняемый файл: + + * Для Linux систем: + ``` bash + cqtdeployer -bin myexecutable + ``` + + * Для Windows систем: + ``` bash + cqtdeployer -bin myexecutable.exe -qmake C:/Qt/5.15.0/min_gw/bin/qmake.exe + ``` + + * Для кросплатформенной сборки (Linux -> Windows) + ``` bash + cqtdeployer -bin myexecutable.exe -qmake ~/crossbuildet-Qt/5.15.0/min_gw/bin/qmake + ``` + +## Дополнительные опции + +Если вы используете дополнительные библиотеки, просто добавьте путь к cqtdeployer для используемых библиотек. +``` bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs +``` + +Если вы хотите найти библиотеки рекурсивно по пути libDir, просто добавьте рекурсивный параметр Depth. +``` bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 +``` + +Если ваше приложение использует qml, просто добавьте опцию qmlDir +``` bash +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources +``` + +Если вы хотите создать простой установщик для вашего приложения, просто добавьте опцию qif. +``` +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif +``` + +Если вы используете системные библиотеки из системного PATH, просто добавьте опцию deploySystem. + +#### Предупреждение: версия Snap не имеет прав доступа к системным файлам. Для развертывания системных библиотек используйте версию cqtdeployer из [установщика][1] + +``` +cqtdeployer -bin myexecutable -libDir /PathToMyExtraLibs -recursiveDepth 5 -qmlDir /path/to/my/qml/sources qif deploySystem +``` + + +### Если у вас есть какие-либо проблемы с использованием cqtdeployer, тогда задавайте вопросы на официальной github [странице][2]. + +### Дополнительные параметры CQtDeployer см. В официальной [документации][3]. + +[1]: https://github.com/QuasarApp/CQtDeployer/releases +[2]: https://github.com/QuasarApp/CQtDeployer/issues +[3]: https://github.com/QuasarApp/CQtDeployer/blob/main/md/ru/Options.md + diff --git a/src/docs/ru/ReleaseReviews.md b/src/docs/ru/ReleaseReviews.md new file mode 100755 index 00000000..69cc0086 --- /dev/null +++ b/src/docs/ru/ReleaseReviews.md @@ -0,0 +1,4 @@ +# Обзоры на релизы + +* [Обзор v1.5](1_5.md) +* [Обзор v1.4 (Бинарный ящик)](1_4.md) diff --git a/src/docs/ru/ZIP.md b/src/docs/ru/ZIP.md new file mode 100644 index 00000000..0dedaac2 --- /dev/null +++ b/src/docs/ru/ZIP.md @@ -0,0 +1,47 @@ +# Использование ZIP + +Общие правила использования ZIP + +Доступно с версии CQtDeployer 1.5 + +### Как использовать опцию zip + +Просто добавьте в cqtdeployer опцию «zip». + +### Например: + +```bash +cqtdeployer ... zip +``` + +Где: + +* **...** - список других опций. +* **zip** - опция использования zip архивов. + + +По умолчанию cqtdeployer создает один zip-архив. +Если вы хотите создать рассылку нескольких пакетов, вы должны использовать [Параметры управления пакетами](Options.md). +Чтобы создать новый пакет, используйте -targetPackage [package; tar1] вариант + +cqtdeployer создает zip-архив для каждого пакета. + +Где: + +* **package** - это название пакета +* **tar1** - это имя цели, которая должна быть включена в этот пакет. + +Или вы можете описать пакеты в [файле конфигурации](DeployConfigFile.md) + + +```json +{ +"targetPackage": [ + [ + "package", + "Tar1" + ], +], +"zip": true +} +``` diff --git a/src/docs/screenshots/customStyle.png b/src/docs/screenshots/customStyle.png new file mode 100644 index 0000000000000000000000000000000000000000..adc7d6b791376ced8ef3718d72cec4228c136209 GIT binary patch literal 26438 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 KRQY?8Z~qM!a6>Tw literal 0 HcmV?d00001 diff --git a/src/docs/screenshots/quasaraStyle.png b/src/docs/screenshots/quasaraStyle.png new file mode 100644 index 0000000000000000000000000000000000000000..278b2feb287b94c33c7559d41d7ba14693e6d5a8 GIT binary patch literal 24609 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 literal 0 HcmV?d00001 diff --git a/submodules/QuasarAppLib b/submodules/QuasarAppLib index 5bf7366b..bc08092e 160000 --- a/submodules/QuasarAppLib +++ b/submodules/QuasarAppLib @@ -1 +1 @@ -Subproject commit 5bf7366b6dcd57720f5d145ed987134a61aaf2e5 +Subproject commit bc08092e1abe7cb01e597033c1c671bec876a2f8 From e82d05b5388b8a1a0205bd72f18e33f965e6717c Mon Sep 17 00:00:00 2001 From: EndrII Date: Sun, 14 Aug 2022 17:32:31 +0300 Subject: [PATCH 11/76] fix installer deploy script --- .gitignore | 5 +- .../Marketplace/CqtDeployer-Manifest.json | 0 {src/docs => md}/Marketplace/Marketplace.md | 0 {src/docs => md}/README.md | 0 {src/docs => md}/_config.yml | 0 {src/docs => md}/en/1_4.md | 0 {src/docs => md}/en/1_5.md | 0 {src/docs => md}/en/Build-and-Install.md | 0 {src/docs => md}/en/Changelog.md | 0 {src/docs => md}/en/CompareFeatures.md | 0 {src/docs => md}/en/CustomScripts.md | 0 {src/docs => md}/en/DEB.md | 0 {src/docs => md}/en/DeployConfigFile.md | 0 {src/docs => md}/en/Description.md | 0 {src/docs => md}/en/DisableShortcats.md | 0 {src/docs => md}/en/EnvironmentVariables.md | 0 {src/docs => md}/en/ExtraFiles.md | 0 .../en/ExtractDefaultsTemplates.md | 0 {src/docs => md}/en/Guide.md | 0 {src/docs => md}/en/Home.md | 0 {src/docs => md}/en/Options.md | 0 {src/docs => md}/en/Packing.md | 0 {src/docs => md}/en/QIF.md | 0 {src/docs => md}/en/QuickGuide.md | 0 {src/docs => md}/en/ReleaseReviews.md | 0 {src/docs => md}/en/ZIP.md | 0 {src/docs => md}/ru/1_4.md | 0 {src/docs => md}/ru/1_5.md | 0 {src/docs => md}/ru/Build-and-Install.md | 0 {src/docs => md}/ru/Changelog.md | 0 {src/docs => md}/ru/CompareFeatures.md | 0 {src/docs => md}/ru/CustomScripts.md | 0 {src/docs => md}/ru/DEB.md | 0 {src/docs => md}/ru/DeployConfigFile.md | 0 {src/docs => md}/ru/Description.md | 0 {src/docs => md}/ru/DisableShortcats.md | 0 {src/docs => md}/ru/EnvironmentVariables.md | 0 {src/docs => md}/ru/ExtraFiles.md | 0 .../ru/ExtractDefaultsTemplates.md | 0 {src/docs => md}/ru/Guide.md | 0 {src/docs => md}/ru/Home.md | 0 {src/docs => md}/ru/Options.md | 0 {src/docs => md}/ru/Packing.md | 0 {src/docs => md}/ru/QIF.md | 0 {src/docs => md}/ru/QuickGuide.md | 0 {src/docs => md}/ru/ReleaseReviews.md | 0 {src/docs => md}/ru/ZIP.md | 0 {src/docs => md}/screenshots/customStyle.png | Bin {src/docs => md}/screenshots/defaultStyle.png | Bin {src/docs => md}/screenshots/quasaraStyle.png | Bin src/CQtDeployer/CMakeLists.txt | 9 ++- src/CQtDeployer/Deploy/CQtDeployer.json.in | 62 ++++++++++++------ .../Deploy/CQtDeployerSingle.json.in | 34 ++++++++++ .../Deploy/QIFWTemplate/config/config.xml | 6 +- .../Deploy/QIFWTemplate/config/config.xml.in | 18 +++++ .../QIFWTemplate/config/controlScript.js | 3 +- .../meta/installscript.js | 10 +-- .../meta/package.xml.in | 0 .../meta/ru.ts | 0 .../meta/package.xml.in | 0 .../{cqtdeployer => CQtDeployer}/meta/ru.ts | 0 .../data/1.5/bin => res}/cqt.sh | 0 .../Deploy/QIFWTemplate/res/icon.ico | Bin 0 -> 39353 bytes .../cqtdeployer.1_6/data/1.5 => res}/icon.png | Bin 64 files changed, 114 insertions(+), 33 deletions(-) rename {src/docs => md}/Marketplace/CqtDeployer-Manifest.json (100%) rename {src/docs => md}/Marketplace/Marketplace.md (100%) rename {src/docs => md}/README.md (100%) rename {src/docs => md}/_config.yml (100%) rename {src/docs => md}/en/1_4.md (100%) rename {src/docs => md}/en/1_5.md (100%) rename {src/docs => md}/en/Build-and-Install.md (100%) rename {src/docs => md}/en/Changelog.md (100%) rename {src/docs => md}/en/CompareFeatures.md (100%) rename {src/docs => md}/en/CustomScripts.md (100%) rename {src/docs => md}/en/DEB.md (100%) rename {src/docs => md}/en/DeployConfigFile.md (100%) rename {src/docs => md}/en/Description.md (100%) rename {src/docs => md}/en/DisableShortcats.md (100%) rename {src/docs => md}/en/EnvironmentVariables.md (100%) rename {src/docs => md}/en/ExtraFiles.md (100%) rename {src/docs => md}/en/ExtractDefaultsTemplates.md (100%) rename {src/docs => md}/en/Guide.md (100%) rename {src/docs => md}/en/Home.md (100%) rename {src/docs => md}/en/Options.md (100%) rename {src/docs => md}/en/Packing.md (100%) rename {src/docs => md}/en/QIF.md (100%) rename {src/docs => md}/en/QuickGuide.md (100%) rename {src/docs => md}/en/ReleaseReviews.md (100%) rename {src/docs => md}/en/ZIP.md (100%) rename {src/docs => md}/ru/1_4.md (100%) rename {src/docs => md}/ru/1_5.md (100%) rename {src/docs => md}/ru/Build-and-Install.md (100%) rename {src/docs => md}/ru/Changelog.md (100%) rename {src/docs => md}/ru/CompareFeatures.md (100%) rename {src/docs => md}/ru/CustomScripts.md (100%) rename {src/docs => md}/ru/DEB.md (100%) rename {src/docs => md}/ru/DeployConfigFile.md (100%) rename {src/docs => md}/ru/Description.md (100%) rename {src/docs => md}/ru/DisableShortcats.md (100%) rename {src/docs => md}/ru/EnvironmentVariables.md (100%) rename {src/docs => md}/ru/ExtraFiles.md (100%) rename {src/docs => md}/ru/ExtractDefaultsTemplates.md (100%) rename {src/docs => md}/ru/Guide.md (100%) rename {src/docs => md}/ru/Home.md (100%) rename {src/docs => md}/ru/Options.md (100%) rename {src/docs => md}/ru/Packing.md (100%) rename {src/docs => md}/ru/QIF.md (100%) rename {src/docs => md}/ru/QuickGuide.md (100%) rename {src/docs => md}/ru/ReleaseReviews.md (100%) rename {src/docs => md}/ru/ZIP.md (100%) rename {src/docs => md}/screenshots/customStyle.png (100%) rename {src/docs => md}/screenshots/defaultStyle.png (100%) rename {src/docs => md}/screenshots/quasaraStyle.png (100%) create mode 100644 src/CQtDeployer/Deploy/CQtDeployerSingle.json.in create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml.in rename src/CQtDeployer/Deploy/QIFWTemplate/packages/{cqtdeployer.1_6 => CQtDeployer.1_6}/meta/installscript.js (96%) rename src/CQtDeployer/Deploy/QIFWTemplate/packages/{cqtdeployer.1_6 => CQtDeployer.1_6}/meta/package.xml.in (100%) rename src/CQtDeployer/Deploy/QIFWTemplate/packages/{cqtdeployer.1_6 => CQtDeployer.1_6}/meta/ru.ts (100%) rename src/CQtDeployer/Deploy/QIFWTemplate/packages/{cqtdeployer => CQtDeployer}/meta/package.xml.in (100%) rename src/CQtDeployer/Deploy/QIFWTemplate/packages/{cqtdeployer => CQtDeployer}/meta/ru.ts (100%) rename src/CQtDeployer/Deploy/QIFWTemplate/{packages/cqtdeployer.1_6/data/1.5/bin => res}/cqt.sh (100%) create mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/res/icon.ico rename src/CQtDeployer/Deploy/QIFWTemplate/{packages/cqtdeployer.1_6/data/1.5 => res}/icon.png (100%) diff --git a/.gitignore b/.gitignore index 58d00e65..2b6f30f0 100644 --- a/.gitignore +++ b/.gitignore @@ -88,7 +88,8 @@ _deps src/LibDeploy/src/deploy_global.h src/QtELFReader/src/elfreader_global.h src/CQtDeployer/Deploy/CQtDeployer.json -src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml -src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml +src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml +src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml src/CQtDeployer/Deploy/QIFW/ +src/CQtDeployer/Deploy/CQtDeployerSingle.json diff --git a/src/docs/Marketplace/CqtDeployer-Manifest.json b/md/Marketplace/CqtDeployer-Manifest.json similarity index 100% rename from src/docs/Marketplace/CqtDeployer-Manifest.json rename to md/Marketplace/CqtDeployer-Manifest.json diff --git a/src/docs/Marketplace/Marketplace.md b/md/Marketplace/Marketplace.md similarity index 100% rename from src/docs/Marketplace/Marketplace.md rename to md/Marketplace/Marketplace.md diff --git a/src/docs/README.md b/md/README.md similarity index 100% rename from src/docs/README.md rename to md/README.md diff --git a/src/docs/_config.yml b/md/_config.yml similarity index 100% rename from src/docs/_config.yml rename to md/_config.yml diff --git a/src/docs/en/1_4.md b/md/en/1_4.md similarity index 100% rename from src/docs/en/1_4.md rename to md/en/1_4.md diff --git a/src/docs/en/1_5.md b/md/en/1_5.md similarity index 100% rename from src/docs/en/1_5.md rename to md/en/1_5.md diff --git a/src/docs/en/Build-and-Install.md b/md/en/Build-and-Install.md similarity index 100% rename from src/docs/en/Build-and-Install.md rename to md/en/Build-and-Install.md diff --git a/src/docs/en/Changelog.md b/md/en/Changelog.md similarity index 100% rename from src/docs/en/Changelog.md rename to md/en/Changelog.md diff --git a/src/docs/en/CompareFeatures.md b/md/en/CompareFeatures.md similarity index 100% rename from src/docs/en/CompareFeatures.md rename to md/en/CompareFeatures.md diff --git a/src/docs/en/CustomScripts.md b/md/en/CustomScripts.md similarity index 100% rename from src/docs/en/CustomScripts.md rename to md/en/CustomScripts.md diff --git a/src/docs/en/DEB.md b/md/en/DEB.md similarity index 100% rename from src/docs/en/DEB.md rename to md/en/DEB.md diff --git a/src/docs/en/DeployConfigFile.md b/md/en/DeployConfigFile.md similarity index 100% rename from src/docs/en/DeployConfigFile.md rename to md/en/DeployConfigFile.md diff --git a/src/docs/en/Description.md b/md/en/Description.md similarity index 100% rename from src/docs/en/Description.md rename to md/en/Description.md diff --git a/src/docs/en/DisableShortcats.md b/md/en/DisableShortcats.md similarity index 100% rename from src/docs/en/DisableShortcats.md rename to md/en/DisableShortcats.md diff --git a/src/docs/en/EnvironmentVariables.md b/md/en/EnvironmentVariables.md similarity index 100% rename from src/docs/en/EnvironmentVariables.md rename to md/en/EnvironmentVariables.md diff --git a/src/docs/en/ExtraFiles.md b/md/en/ExtraFiles.md similarity index 100% rename from src/docs/en/ExtraFiles.md rename to md/en/ExtraFiles.md diff --git a/src/docs/en/ExtractDefaultsTemplates.md b/md/en/ExtractDefaultsTemplates.md similarity index 100% rename from src/docs/en/ExtractDefaultsTemplates.md rename to md/en/ExtractDefaultsTemplates.md diff --git a/src/docs/en/Guide.md b/md/en/Guide.md similarity index 100% rename from src/docs/en/Guide.md rename to md/en/Guide.md diff --git a/src/docs/en/Home.md b/md/en/Home.md similarity index 100% rename from src/docs/en/Home.md rename to md/en/Home.md diff --git a/src/docs/en/Options.md b/md/en/Options.md similarity index 100% rename from src/docs/en/Options.md rename to md/en/Options.md diff --git a/src/docs/en/Packing.md b/md/en/Packing.md similarity index 100% rename from src/docs/en/Packing.md rename to md/en/Packing.md diff --git a/src/docs/en/QIF.md b/md/en/QIF.md similarity index 100% rename from src/docs/en/QIF.md rename to md/en/QIF.md diff --git a/src/docs/en/QuickGuide.md b/md/en/QuickGuide.md similarity index 100% rename from src/docs/en/QuickGuide.md rename to md/en/QuickGuide.md diff --git a/src/docs/en/ReleaseReviews.md b/md/en/ReleaseReviews.md similarity index 100% rename from src/docs/en/ReleaseReviews.md rename to md/en/ReleaseReviews.md diff --git a/src/docs/en/ZIP.md b/md/en/ZIP.md similarity index 100% rename from src/docs/en/ZIP.md rename to md/en/ZIP.md diff --git a/src/docs/ru/1_4.md b/md/ru/1_4.md similarity index 100% rename from src/docs/ru/1_4.md rename to md/ru/1_4.md diff --git a/src/docs/ru/1_5.md b/md/ru/1_5.md similarity index 100% rename from src/docs/ru/1_5.md rename to md/ru/1_5.md diff --git a/src/docs/ru/Build-and-Install.md b/md/ru/Build-and-Install.md similarity index 100% rename from src/docs/ru/Build-and-Install.md rename to md/ru/Build-and-Install.md diff --git a/src/docs/ru/Changelog.md b/md/ru/Changelog.md similarity index 100% rename from src/docs/ru/Changelog.md rename to md/ru/Changelog.md diff --git a/src/docs/ru/CompareFeatures.md b/md/ru/CompareFeatures.md similarity index 100% rename from src/docs/ru/CompareFeatures.md rename to md/ru/CompareFeatures.md diff --git a/src/docs/ru/CustomScripts.md b/md/ru/CustomScripts.md similarity index 100% rename from src/docs/ru/CustomScripts.md rename to md/ru/CustomScripts.md diff --git a/src/docs/ru/DEB.md b/md/ru/DEB.md similarity index 100% rename from src/docs/ru/DEB.md rename to md/ru/DEB.md diff --git a/src/docs/ru/DeployConfigFile.md b/md/ru/DeployConfigFile.md similarity index 100% rename from src/docs/ru/DeployConfigFile.md rename to md/ru/DeployConfigFile.md diff --git a/src/docs/ru/Description.md b/md/ru/Description.md similarity index 100% rename from src/docs/ru/Description.md rename to md/ru/Description.md diff --git a/src/docs/ru/DisableShortcats.md b/md/ru/DisableShortcats.md similarity index 100% rename from src/docs/ru/DisableShortcats.md rename to md/ru/DisableShortcats.md diff --git a/src/docs/ru/EnvironmentVariables.md b/md/ru/EnvironmentVariables.md similarity index 100% rename from src/docs/ru/EnvironmentVariables.md rename to md/ru/EnvironmentVariables.md diff --git a/src/docs/ru/ExtraFiles.md b/md/ru/ExtraFiles.md similarity index 100% rename from src/docs/ru/ExtraFiles.md rename to md/ru/ExtraFiles.md diff --git a/src/docs/ru/ExtractDefaultsTemplates.md b/md/ru/ExtractDefaultsTemplates.md similarity index 100% rename from src/docs/ru/ExtractDefaultsTemplates.md rename to md/ru/ExtractDefaultsTemplates.md diff --git a/src/docs/ru/Guide.md b/md/ru/Guide.md similarity index 100% rename from src/docs/ru/Guide.md rename to md/ru/Guide.md diff --git a/src/docs/ru/Home.md b/md/ru/Home.md similarity index 100% rename from src/docs/ru/Home.md rename to md/ru/Home.md diff --git a/src/docs/ru/Options.md b/md/ru/Options.md similarity index 100% rename from src/docs/ru/Options.md rename to md/ru/Options.md diff --git a/src/docs/ru/Packing.md b/md/ru/Packing.md similarity index 100% rename from src/docs/ru/Packing.md rename to md/ru/Packing.md diff --git a/src/docs/ru/QIF.md b/md/ru/QIF.md similarity index 100% rename from src/docs/ru/QIF.md rename to md/ru/QIF.md diff --git a/src/docs/ru/QuickGuide.md b/md/ru/QuickGuide.md similarity index 100% rename from src/docs/ru/QuickGuide.md rename to md/ru/QuickGuide.md diff --git a/src/docs/ru/ReleaseReviews.md b/md/ru/ReleaseReviews.md similarity index 100% rename from src/docs/ru/ReleaseReviews.md rename to md/ru/ReleaseReviews.md diff --git a/src/docs/ru/ZIP.md b/md/ru/ZIP.md similarity index 100% rename from src/docs/ru/ZIP.md rename to md/ru/ZIP.md diff --git a/src/docs/screenshots/customStyle.png b/md/screenshots/customStyle.png similarity index 100% rename from src/docs/screenshots/customStyle.png rename to md/screenshots/customStyle.png diff --git a/src/docs/screenshots/defaultStyle.png b/md/screenshots/defaultStyle.png similarity index 100% rename from src/docs/screenshots/defaultStyle.png rename to md/screenshots/defaultStyle.png diff --git a/src/docs/screenshots/quasaraStyle.png b/md/screenshots/quasaraStyle.png similarity index 100% rename from src/docs/screenshots/quasaraStyle.png rename to md/screenshots/quasaraStyle.png diff --git a/src/CQtDeployer/CMakeLists.txt b/src/CQtDeployer/CMakeLists.txt index 34de4ae4..4ce1b8b7 100644 --- a/src/CQtDeployer/CMakeLists.txt +++ b/src/CQtDeployer/CMakeLists.txt @@ -71,12 +71,17 @@ set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR}/../ "${LANGS}") configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json") # qifw installer -configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml") -configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml") configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/QIF/meta/package.xml") +# sets qifw variable +set(HomeDir "@HomeDir@") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/config/config.xml") + addDeployFromCustomFile(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") diff --git a/src/CQtDeployer/Deploy/CQtDeployer.json.in b/src/CQtDeployer/Deploy/CQtDeployer.json.in index 112c4746..efbfd5dc 100644 --- a/src/CQtDeployer/Deploy/CQtDeployer.json.in +++ b/src/CQtDeployer/Deploy/CQtDeployer.json.in @@ -2,57 +2,81 @@ "allowEmptyPackages": true, "targetPackage": [ - ["CQtDeployer", "nothing"], - ["CQtDeployer.1_6", "CQtDeployer"] + ["CQtDeployer.1_6", "CQtDeployer"], + ["CQtDeployer.1_6", "cqt"] ], + + "icon": [ + ["CQtDeployer", "./QIFWTemplate/res/icon.png"], + ["CQtDeployer.exe", "./QIFWTemplate/res/icon.ico"] + ], + "extraData": [ - ["QIFW", "./QIFW"] + ["QIF", "./QIFW/QIF"], + ["CQtDeployer", "./../../../LICENSE"] + ], + + "extraDataOut": [ + ["QIF", ""], + ["CQtDeployer", ""] ], "bin": [ "src/CQtDeployer/CQtDeployer", "src/CQtDeployer/CQtDeployer.exe" - ], - + ], "clear": true, "binPrefix": "@CMAKE_BINARY_DIR@", "libDir": [ - "@CMAKE_SOURCE_DIR@", - "@CMAKE_PREFIX_PATH@", - "@CMAKE_BINARY_DIR@" + "@CMAKE_SOURCE_DIR@", + "@CMAKE_PREFIX_PATH@", + "@CMAKE_BINARY_DIR@" + ], + + "prefix": [ + ["CQtDeployer.1_6", "1.6"], + ["QIF", "/"], + ["CQtDeployer", "/"] + ], "publisher": [ - ["QIFW", "Qt corporation"], + ["QIF", "Qt corporation"], + ["CQtDeployer", "QuasarApp group"], ["CQtDeployer.1_6", "QuasarApp group"] + ], + "releaseDate": [ - ["QIFW", "@TODAY@"], + ["QIF", "@TODAY@"], + ["CQtDeployer", "@TODAY@"], ["CQtDeployer.1_6", "@TODAY@"] + ], + "name": [ - ["QIFW", "QtInstallerFramework"], - ["CQtDeployer.1_6", "CQtDeployer"] + ["QIF", "QtInstallerFramework"], + ["CQtDeployer", "CQtDeployer"], + ["CQtDeployer.1_6", "CQtDeployer 1.6"] ], "deployVersion": [ - ["QIFW", "@QIFW_VERSION@"], - ["CQtDeployer.1_6", "@CQT_DEPLOYER_VERSION@"], - ["CQtDeployer", "@CQT_DEPLOYER_VERSION_SHORT_PREFIX@"] + ["QIF", "@QIFW_VERSION@"], + ["CQtDeployer", "@CQT_DEPLOYER_VERSION_SHORT_PREFIX@"], + ["CQtDeployer.1_6", "@CQT_DEPLOYER_VERSION@"] ], "recursiveDepth": "10", "deploySystem": false, - "deb": true, + "deb": false, "qif": "./QIFWTemplate", - "zip": true, + "zip": false, "ignoreEnv": [ "@CMAKE_SOURCE_DIR@/Distro" ], - "targetDir": "@CMAKE_SOURCE_DIR@/Distro", - "deployVersion": "@CQtDeployer_VERSION@" + "targetDir": "@CMAKE_SOURCE_DIR@/Distro" } diff --git a/src/CQtDeployer/Deploy/CQtDeployerSingle.json.in b/src/CQtDeployer/Deploy/CQtDeployerSingle.json.in new file mode 100644 index 00000000..c4a105c2 --- /dev/null +++ b/src/CQtDeployer/Deploy/CQtDeployerSingle.json.in @@ -0,0 +1,34 @@ +{ + + "extraData": "./QIFW/QIF", + "bin": [ + "src/CQtDeployer/CQtDeployer", + "src/CQtDeployer/CQtDeployer.exe" + ], + + "clear": true, + "binPrefix": "@CMAKE_BINARY_DIR@", + "libDir": [ + "@CMAKE_SOURCE_DIR@", + "@CMAKE_PREFIX_PATH@", + "@CMAKE_BINARY_DIR@" + ], + + "publisher": "QuasarApp group", + "releaseDate": "@TODAY@", + + "name": "CQtDeployer", + "deployVersion": "@CQT_DEPLOYER_VERSION@", + + "recursiveDepth": "10", + "deploySystem": false, + "deb": true, + "qif": false, + "zip": true, + "ignoreEnv": [ + "@CMAKE_SOURCE_DIR@/Distro" + ], + "targetDir": "@CMAKE_SOURCE_DIR@/Distro" + +} + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml b/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml index 0f6df83e..dbccd847 100644 --- a/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml +++ b/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml @@ -1,9 +1,9 @@ - 640px - 400px + 980px + 540px CQtDeployer - 1.5.4.17 + 1.6.2108.b9b8719 CQtDeployer QuasarApp CQtDeployer diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml.in b/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml.in new file mode 100644 index 00000000..3203b47e --- /dev/null +++ b/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml.in @@ -0,0 +1,18 @@ + + + 980px + 540px + CQtDeployer + @CQT_DEPLOYER_VERSION@ + CQtDeployer + QuasarApp + CQtDeployer + @HomeDir@/CQtDeployer + true + true + controlScript.js + CQtDeployerTool + Modern + style.css + logo.png + diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js b/src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js index 5d823ed7..ba627e10 100644 --- a/src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js +++ b/src/CQtDeployer/Deploy/QIFWTemplate/config/controlScript.js @@ -6,7 +6,6 @@ function Controller() installer.uninstallationFinished.connect(this, Controller.prototype.uninstallationFinished); installer.installationFinished.connect(this, Controller.prototype.installationFinished); - } Controller.prototype.ComponentSelectionPageCallback = function() @@ -14,7 +13,7 @@ Controller.prototype.ComponentSelectionPageCallback = function() var widget = gui.currentPageWidget(); // get the current wizard page if (widget !== null && installer.isInstaller()) { widget.deselectAll(); - widget.selectComponent('cqtdeployer.1_6'); + widget.selectComponent('CQtDeployer.1_6'); widget.selectComponent('QIF'); } diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/installscript.js b/src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/installscript.js similarity index 96% rename from src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/installscript.js rename to src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/installscript.js index 8e445fa9..da7e0f06 100644 --- a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/installscript.js +++ b/src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/installscript.js @@ -1,4 +1,4 @@ -const VERSION = "$VERSION" +const VERSION = "1.6" function Component() { @@ -88,7 +88,7 @@ function systemIntegration() { if (systemInfo.kernelType === "winnt") { - component.addOperation('Execute', ["SETX", "cqtdeployer", targetDir + "\\" + VERSION + "\\cqtdeployer.bat"], + component.addOperation('Execute', ["SETX", "cqtdeployer", targetDir + "\\" + VERSION + "\\CQtDeployer.bat"], "UNDOEXECUTE", ["SETX", "cqtdeployer", ""]) component.addOperation('Execute', ["SETX", "cqtDir", targetDir + "\\" + VERSION + "\\"], "UNDOEXECUTE", ["SETX", "cqtDir", ""]) @@ -133,15 +133,15 @@ function systemIntegration() { } } - component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqtdeployer.sh", + component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/CQtDeployer.sh", homeDir + "/.local/bin/cqtdeployer"], "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqtdeployer"] ) - component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqt.sh", + component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/bin/cqt.sh", homeDir + "/.local/bin/cqt"], "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqt"] ) - component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/cqt.sh", + component.addOperation('Execute', ["ln", "-sf", targetDir + "/" + VERSION + "/bin/cqt.sh", homeDir + "/.local/bin/cqtdeployer.cqt"], "UNDOEXECUTE", ["rm", "-f", homeDir + "/.local/bin/cqtdeployer.cqt"] ) diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml.in b/src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml.in similarity index 100% rename from src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/package.xml.in rename to src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml.in diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/ru.ts b/src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/ru.ts similarity index 100% rename from src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/meta/ru.ts rename to src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/ru.ts diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml.in b/src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml.in similarity index 100% rename from src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/package.xml.in rename to src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml.in diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/ru.ts b/src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer/meta/ru.ts similarity index 100% rename from src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer/meta/ru.ts rename to src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer/meta/ru.ts diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/bin/cqt.sh b/src/CQtDeployer/Deploy/QIFWTemplate/res/cqt.sh similarity index 100% rename from src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/bin/cqt.sh rename to src/CQtDeployer/Deploy/QIFWTemplate/res/cqt.sh diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/res/icon.ico b/src/CQtDeployer/Deploy/QIFWTemplate/res/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e39643da7f814b8ece7fcde7dd6642017c9e466f GIT binary patch literal 39353 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 literal 0 HcmV?d00001 diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/icon.png b/src/CQtDeployer/Deploy/QIFWTemplate/res/icon.png similarity index 100% rename from src/CQtDeployer/Deploy/QIFWTemplate/packages/cqtdeployer.1_6/data/1.5/icon.png rename to src/CQtDeployer/Deploy/QIFWTemplate/res/icon.png From 755be52cd32ea29d07db1491dc9f13ac3aeec129 Mon Sep 17 00:00:00 2001 From: EndrII Date: Sun, 14 Aug 2022 17:37:21 +0300 Subject: [PATCH 12/76] adde deb and zip deploy steps --- .gitignore | 3 +++ src/CQtDeployer/CMakeLists.txt | 1 + .../Deploy/QIFWTemplate/config/config.xml | 18 ------------------ 3 files changed, 4 insertions(+), 18 deletions(-) delete mode 100644 src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml diff --git a/.gitignore b/.gitignore index 2b6f30f0..77561655 100644 --- a/.gitignore +++ b/.gitignore @@ -85,6 +85,8 @@ install_manifest.txt compile_commands.json CTestTestfile.cmake _deps + +# cmake configured files src/LibDeploy/src/deploy_global.h src/QtELFReader/src/elfreader_global.h src/CQtDeployer/Deploy/CQtDeployer.json @@ -93,3 +95,4 @@ src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml src/CQtDeployer/Deploy/QIFW/ src/CQtDeployer/Deploy/CQtDeployerSingle.json +src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml diff --git a/src/CQtDeployer/CMakeLists.txt b/src/CQtDeployer/CMakeLists.txt index 4ce1b8b7..7e30f0e4 100644 --- a/src/CQtDeployer/CMakeLists.txt +++ b/src/CQtDeployer/CMakeLists.txt @@ -100,3 +100,4 @@ ADD_CUSTOM_TARGET( ) add_dependencies(deploy${CURRENT_PROJECT} downloadQIFW) +addDeployFromCustomFile(${CURRENT_PROJECT}Single "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json") diff --git a/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml b/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml deleted file mode 100644 index dbccd847..00000000 --- a/src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 980px - 540px - CQtDeployer - 1.6.2108.b9b8719 - CQtDeployer - QuasarApp - CQtDeployer - @HomeDir@/CQtDeployer - true - true - controlScript.js - CQtDeployerTool - Modern - style.css - logo.png - From 2a40da9c0af7ed20372a47fbad091bebdcf18719 Mon Sep 17 00:00:00 2001 From: EndrII Date: Mon, 15 Aug 2022 21:51:31 +0300 Subject: [PATCH 13/76] added base support of the snap generation --- .gitignore | 1 + snap/{snapcraft.yaml => snapcraft.yaml.in} | 24 ++++++++-------------- src/CQtDeployer/CMakeLists.txt | 7 +++++++ submodules/QuasarAppLib | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) rename snap/{snapcraft.yaml => snapcraft.yaml.in} (70%) diff --git a/.gitignore b/.gitignore index 77561655..868443db 100644 --- a/.gitignore +++ b/.gitignore @@ -96,3 +96,4 @@ src/CQtDeployer/Deploy/QIFWTemplate/packages/QIF/meta/package.xml src/CQtDeployer/Deploy/QIFW/ src/CQtDeployer/Deploy/CQtDeployerSingle.json src/CQtDeployer/Deploy/QIFWTemplate/config/config.xml +snap/snapcraft.yaml diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml.in similarity index 70% rename from snap/snapcraft.yaml rename to snap/snapcraft.yaml.in index d519e450..d66b804b 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml.in @@ -6,8 +6,8 @@ # name: cqtdeployer # you probably want to 'snapcraft register ' -version: '1.5.4.17' # just for humans, typically '1.2+git' or '1.3.2' -summary: deploy your qt projects # 79 char long summary +version: '@CQT_DEPLOYER_VERSION@' +summary: deploy your qt or c/c++ projects # 79 char long summary description: | Console app for deploy qt libs. Key differences of this program @@ -16,25 +16,26 @@ description: | grade: stable # must be 'stable' to release into candidate/stable channels confinement: strict # use 'strict' once you have the right plugs and slots -base: core18 +base: core20 icon: snap/gui/icon.png apps: cqtdeployer: - command: bash $SNAP/cqtdeployer.sh + command: bin/bash $SNAP/CQtDeployer.sh plugs: [home, removable-media, process-control, system-backup] - cqt: - command: bash $SNAP/cqt.sh - plugs: [home, removable-media, process-control, system-backup] +# cqt: +# command: bin/bash $SNAP/bin/cqt.sh +# plugs: [home, removable-media, process-control, system-backup] parts: cqtdeployer: # See 'snapcraft plugins' plugin: dump - source: QIFData/packages/cqtdeployer.1_5/data/1.5 + source: Distro/CQtDeployer.zip stage-packages: + - bash - libfreetype6 - libpng16-16 - dpkg @@ -45,12 +46,5 @@ parts: - libxcb-render-util0 - libxcb-xinerama0 - qif: - plugin: dump - source: QIFData/packages/QIF/data/ - - override-stage: | - snapcraftctl stage - chmod 777 -R "$SNAPCRAFT_STAGE/QIF" diff --git a/src/CQtDeployer/CMakeLists.txt b/src/CQtDeployer/CMakeLists.txt index 7e30f0e4..83dff939 100644 --- a/src/CQtDeployer/CMakeLists.txt +++ b/src/CQtDeployer/CMakeLists.txt @@ -78,6 +78,10 @@ configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTem configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml") configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/QIF/meta/package.xml") +# snap +configure_file_in(${CURRENT_PROJECT} "${CMAKE_SOURCE_DIR}/snap/snapcraft.yaml") + + # sets qifw variable set(HomeDir "@HomeDir@") configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/config/config.xml") @@ -101,3 +105,6 @@ ADD_CUSTOM_TARGET( add_dependencies(deploy${CURRENT_PROJECT} downloadQIFW) addDeployFromCustomFile(${CURRENT_PROJECT}Single "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json") + +set(SNAPCRAFT_EXTRA_ARG "--use-lxd") +addDeploySnap(${CURRENT_PROJECT} "${CMAKE_SOURCE_DIR}/Distro/") diff --git a/submodules/QuasarAppLib b/submodules/QuasarAppLib index bc08092e..dcb12781 160000 --- a/submodules/QuasarAppLib +++ b/submodules/QuasarAppLib @@ -1 +1 @@ -Subproject commit bc08092e1abe7cb01e597033c1c671bec876a2f8 +Subproject commit dcb12781bef23d8c810a945edf4d1fa718260ef1 From 222474b7d8a32a2f5af28dc180384fcd39625779 Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 17 Aug 2022 17:59:48 +0300 Subject: [PATCH 14/76] added tests projects --- tests/examples/TestCPPOnly/CMakeLists.txt | 8 + tests/examples/TestCPPOnly/main.cpp | 9 + tests/examples/TestOnlyC/CMakeLists.txt | 8 + tests/examples/TestOnlyC/main.cpp | 9 + tests/examples/TestQMLWidgets/CMakeLists.txt | 110 +++ tests/examples/TestQMLWidgets/HomeForm.ui.qml | 14 + .../examples/TestQMLWidgets/Page1Form.ui.qml | 14 + .../examples/TestQMLWidgets/Page2Form.ui.qml | 14 + tests/examples/TestQMLWidgets/conf.qrc | 5 + tests/examples/TestQMLWidgets/main.cpp | 19 + tests/examples/TestQMLWidgets/main.qml | 65 ++ tests/examples/TestQMLWidgets/qml.qrc | 9 + tests/examples/TestQtWidgets/CMakeLists.txt | 110 +++ tests/examples/TestQtWidgets/conf.qrc | 5 + tests/examples/TestQtWidgets/main.cpp | 16 + tests/examples/TestQtWidgets/mainwindow.cpp | 14 + tests/examples/TestQtWidgets/mainwindow.h | 22 + tests/examples/TestQtWidgets/mainwindow.ui | 24 + tests/examples/TestQtWidgets/qt.conf | 2 + .../quicknanobrowser/ApplicationRoot.qml | 87 ++ .../quicknanobrowser/BrowserDialog.qml | 74 ++ .../quicknanobrowser/BrowserWindow.qml | 801 ++++++++++++++++++ .../examples/quicknanobrowser/CMakeLists.txt | 75 ++ .../quicknanobrowser/DownloadView.qml | 174 ++++ tests/examples/quicknanobrowser/FindBar.qml | 142 ++++ .../FullScreenNotification.qml | 109 +++ .../doc/images/quicknanobrowser-demo.jpg | Bin 0 -> 30156 bytes .../doc/src/quicknanobrowser.qdoc | 153 ++++ .../quicknanobrowser/icons/3rdparty/COPYING | 1 + .../icons/3rdparty/go-next.png | Bin 0 -> 930 bytes .../icons/3rdparty/go-previous.png | Bin 0 -> 955 bytes .../icons/3rdparty/process-stop.png | Bin 0 -> 1272 bytes .../icons/3rdparty/qt_attribution.json | 24 + .../icons/3rdparty/view-refresh.png | Bin 0 -> 1364 bytes tests/examples/quicknanobrowser/main.cpp | 90 ++ tests/examples/quicknanobrowser/resources.qrc | 16 + tests/examples/quicknanobrowser/utils.h | 70 ++ tests/examples/virtualkeyboard/CMakeLists.txt | 3 + .../basic/.prev_CMakeLists.txt | 80 ++ .../examples/virtualkeyboard/basic/Basic.qml | 146 ++++ .../virtualkeyboard/basic/CMakeLists.txt | 73 ++ .../virtualkeyboard/basic/basic-b2qt.qml | 172 ++++ .../examples/virtualkeyboard/basic/basic.pro | 32 + .../basic/content/AutoScroller.qml | 104 +++ .../basic/content/FloatingButton_Active.svg | 41 + .../content/FloatingButton_Available.svg | 41 + .../content/FloatingButton_Unavailable.svg | 39 + .../basic/content/HandwritingModeButton.qml | 165 ++++ .../basic/content/TextArea.qml | 53 ++ .../basic/content/TextField.qml | 53 ++ tests/examples/virtualkeyboard/basic/demo.qrc | 13 + tests/examples/virtualkeyboard/basic/main.cpp | 47 + .../virtualkeyboard/virtualkeyboard.pro | 3 + tests/examples/webui/CMakeLists.txt | 46 + tests/examples/webui/about.html | 129 +++ .../webui/doc/images/webui-example.png | Bin 0 -> 28862 bytes tests/examples/webui/doc/src/webui.qdoc | 165 ++++ tests/examples/webui/main.cpp | 81 ++ tests/examples/webui/webui.pro | 16 + tests/examples/webui/webui.qrc | 5 + tests/examples/webui/webuihandler.cpp | 98 +++ tests/examples/webui/webuihandler.h | 70 ++ 62 files changed, 3968 insertions(+) create mode 100644 tests/examples/TestCPPOnly/CMakeLists.txt create mode 100644 tests/examples/TestCPPOnly/main.cpp create mode 100644 tests/examples/TestOnlyC/CMakeLists.txt create mode 100644 tests/examples/TestOnlyC/main.cpp create mode 100644 tests/examples/TestQMLWidgets/CMakeLists.txt create mode 100644 tests/examples/TestQMLWidgets/HomeForm.ui.qml create mode 100644 tests/examples/TestQMLWidgets/Page1Form.ui.qml create mode 100644 tests/examples/TestQMLWidgets/Page2Form.ui.qml create mode 100644 tests/examples/TestQMLWidgets/conf.qrc create mode 100644 tests/examples/TestQMLWidgets/main.cpp create mode 100644 tests/examples/TestQMLWidgets/main.qml create mode 100644 tests/examples/TestQMLWidgets/qml.qrc create mode 100644 tests/examples/TestQtWidgets/CMakeLists.txt create mode 100644 tests/examples/TestQtWidgets/conf.qrc create mode 100644 tests/examples/TestQtWidgets/main.cpp create mode 100644 tests/examples/TestQtWidgets/mainwindow.cpp create mode 100644 tests/examples/TestQtWidgets/mainwindow.h create mode 100644 tests/examples/TestQtWidgets/mainwindow.ui create mode 100644 tests/examples/TestQtWidgets/qt.conf create mode 100644 tests/examples/quicknanobrowser/ApplicationRoot.qml create mode 100644 tests/examples/quicknanobrowser/BrowserDialog.qml create mode 100644 tests/examples/quicknanobrowser/BrowserWindow.qml create mode 100644 tests/examples/quicknanobrowser/CMakeLists.txt create mode 100644 tests/examples/quicknanobrowser/DownloadView.qml create mode 100644 tests/examples/quicknanobrowser/FindBar.qml create mode 100644 tests/examples/quicknanobrowser/FullScreenNotification.qml create mode 100644 tests/examples/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg create mode 100644 tests/examples/quicknanobrowser/doc/src/quicknanobrowser.qdoc create mode 100644 tests/examples/quicknanobrowser/icons/3rdparty/COPYING create mode 100644 tests/examples/quicknanobrowser/icons/3rdparty/go-next.png create mode 100644 tests/examples/quicknanobrowser/icons/3rdparty/go-previous.png create mode 100644 tests/examples/quicknanobrowser/icons/3rdparty/process-stop.png create mode 100644 tests/examples/quicknanobrowser/icons/3rdparty/qt_attribution.json create mode 100644 tests/examples/quicknanobrowser/icons/3rdparty/view-refresh.png create mode 100644 tests/examples/quicknanobrowser/main.cpp create mode 100644 tests/examples/quicknanobrowser/resources.qrc create mode 100644 tests/examples/quicknanobrowser/utils.h create mode 100644 tests/examples/virtualkeyboard/CMakeLists.txt create mode 100644 tests/examples/virtualkeyboard/basic/.prev_CMakeLists.txt create mode 100644 tests/examples/virtualkeyboard/basic/Basic.qml create mode 100644 tests/examples/virtualkeyboard/basic/CMakeLists.txt create mode 100644 tests/examples/virtualkeyboard/basic/basic-b2qt.qml create mode 100644 tests/examples/virtualkeyboard/basic/basic.pro create mode 100644 tests/examples/virtualkeyboard/basic/content/AutoScroller.qml create mode 100644 tests/examples/virtualkeyboard/basic/content/FloatingButton_Active.svg create mode 100644 tests/examples/virtualkeyboard/basic/content/FloatingButton_Available.svg create mode 100644 tests/examples/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg create mode 100644 tests/examples/virtualkeyboard/basic/content/HandwritingModeButton.qml create mode 100644 tests/examples/virtualkeyboard/basic/content/TextArea.qml create mode 100644 tests/examples/virtualkeyboard/basic/content/TextField.qml create mode 100644 tests/examples/virtualkeyboard/basic/demo.qrc create mode 100644 tests/examples/virtualkeyboard/basic/main.cpp create mode 100644 tests/examples/virtualkeyboard/virtualkeyboard.pro create mode 100644 tests/examples/webui/CMakeLists.txt create mode 100644 tests/examples/webui/about.html create mode 100644 tests/examples/webui/doc/images/webui-example.png create mode 100644 tests/examples/webui/doc/src/webui.qdoc create mode 100644 tests/examples/webui/main.cpp create mode 100644 tests/examples/webui/webui.pro create mode 100644 tests/examples/webui/webui.qrc create mode 100644 tests/examples/webui/webuihandler.cpp create mode 100644 tests/examples/webui/webuihandler.h diff --git a/tests/examples/TestCPPOnly/CMakeLists.txt b/tests/examples/TestCPPOnly/CMakeLists.txt new file mode 100644 index 00000000..aeae3f8a --- /dev/null +++ b/tests/examples/TestCPPOnly/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.16) +project(TestCPPOnly LANGUAGES CXX) + + +qt_add_executable(TestCPPOnly + main.cpp +) + diff --git a/tests/examples/TestCPPOnly/main.cpp b/tests/examples/TestCPPOnly/main.cpp new file mode 100644 index 00000000..fd0821c9 --- /dev/null +++ b/tests/examples/TestCPPOnly/main.cpp @@ -0,0 +1,9 @@ +#include + +using namespace std; + +int main() +{ + cout << "TEST DONE (ONLY_C)" << endl; + return 0; +} diff --git a/tests/examples/TestOnlyC/CMakeLists.txt b/tests/examples/TestOnlyC/CMakeLists.txt new file mode 100644 index 00000000..ab70185b --- /dev/null +++ b/tests/examples/TestOnlyC/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.16) +project(TestOnlyC LANGUAGES C) + + +qt_add_executable(TestOnlyC + main.cpp +) + diff --git a/tests/examples/TestOnlyC/main.cpp b/tests/examples/TestOnlyC/main.cpp new file mode 100644 index 00000000..fd0821c9 --- /dev/null +++ b/tests/examples/TestOnlyC/main.cpp @@ -0,0 +1,9 @@ +#include + +using namespace std; + +int main() +{ + cout << "TEST DONE (ONLY_C)" << endl; + return 0; +} diff --git a/tests/examples/TestQMLWidgets/CMakeLists.txt b/tests/examples/TestQMLWidgets/CMakeLists.txt new file mode 100644 index 00000000..83dff939 --- /dev/null +++ b/tests/examples/TestQMLWidgets/CMakeLists.txt @@ -0,0 +1,110 @@ +# +# Copyright (C) 2021-2022 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. +# + +cmake_minimum_required(VERSION 3.18) + +get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +set(CURRENT_PROJECT "${PROJECT_NAME}") +option(SIGN_APP "This option enable od disabled sign apk and aab files" ON) + +file(GLOB_RECURSE SOURCE_CPP + "*.cpp" "*.h" +) + +if (${QT_VERSION_MAJOR}) + file(GLOB_RECURSE SOURCE_QRC + "*.qrc" + ) +endif() + +set(ALL_SOURCES ${SOURCE_CPP} ${SOURCE_QRC}) + +set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + +set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Private") + + +if (${QT_VERSION_MAJOR} EQUAL 6) + + qt_add_executable(${CURRENT_PROJECT} MANUAL_FINALIZATION ${ALL_SOURCES}) + +else() + if (ANDROID) + add_library(${CURRENT_PROJECT} ${ALL_SOURCES}) + else () + add_executable(${CURRENT_PROJECT} ${ALL_SOURCES} ) + endif() + +endif() + +target_link_libraries(${CURRENT_PROJECT} PUBLIC LibDeploy) + +target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) +target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) + +SET(TARGET_DIR "${CMAKE_SOURCE_DIR}/Distro") +file(MAKE_DIRECTORY ${TARGET_DIR}) + +if(QT_VERSION_MAJOR EQUAL 6) + # Add This line if your project use the Quick module + # qt_import_qml_plugins(${CURRENT_PROJECT}) + qt_finalize_executable(${CURRENT_PROJECT}) +endif() + + +set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/ru.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/uk.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/ja.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/tr.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/zh.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/de.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/fr.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/es.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/pl.ts) + +prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR}/../ "${LANGS}") + +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json") + +# qifw installer +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/QIF/meta/package.xml") + +# snap +configure_file_in(${CURRENT_PROJECT} "${CMAKE_SOURCE_DIR}/snap/snapcraft.yaml") + + +# sets qifw variable +set(HomeDir "@HomeDir@") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/config/config.xml") + + +addDeployFromCustomFile(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") + +set(QIFW_PLATFORM linux) + +if (WIN32) + set(QIFW_PLATFORM windows) +endif() + +ADD_CUSTOM_TARGET( + downloadQIFW + SOURCES ${${name}files} + COMMAND python "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW.py" ${QIFW_PLATFORM} ${QIFW_VERSION} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW" + COMMENT python "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW.py" ${QIFW_PLATFORM} ${QIFW_VERSION} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) +add_dependencies(deploy${CURRENT_PROJECT} downloadQIFW) + +addDeployFromCustomFile(${CURRENT_PROJECT}Single "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json") + +set(SNAPCRAFT_EXTRA_ARG "--use-lxd") +addDeploySnap(${CURRENT_PROJECT} "${CMAKE_SOURCE_DIR}/Distro/") diff --git a/tests/examples/TestQMLWidgets/HomeForm.ui.qml b/tests/examples/TestQMLWidgets/HomeForm.ui.qml new file mode 100644 index 00000000..6474fad0 --- /dev/null +++ b/tests/examples/TestQMLWidgets/HomeForm.ui.qml @@ -0,0 +1,14 @@ +import QtQuick 2.10 +import QtQuick.Controls 2.3 + +Page { + width: 600 + height: 400 + + title: qsTr("Home") + + Label { + text: qsTr("You are on the home page.") + anchors.centerIn: parent + } +} diff --git a/tests/examples/TestQMLWidgets/Page1Form.ui.qml b/tests/examples/TestQMLWidgets/Page1Form.ui.qml new file mode 100644 index 00000000..a25e78ae --- /dev/null +++ b/tests/examples/TestQMLWidgets/Page1Form.ui.qml @@ -0,0 +1,14 @@ +import QtQuick 2.10 +import QtQuick.Controls 2.3 + +Page { + width: 600 + height: 400 + + title: qsTr("Page 1") + + Label { + text: qsTr("You are on Page 1.") + anchors.centerIn: parent + } +} diff --git a/tests/examples/TestQMLWidgets/Page2Form.ui.qml b/tests/examples/TestQMLWidgets/Page2Form.ui.qml new file mode 100644 index 00000000..c34bb984 --- /dev/null +++ b/tests/examples/TestQMLWidgets/Page2Form.ui.qml @@ -0,0 +1,14 @@ +import QtQuick 2.10 +import QtQuick.Controls 2.3 + +Page { + width: 600 + height: 400 + + title: qsTr("Page 2") + + Label { + text: qsTr("You are on Page 2.") + anchors.centerIn: parent + } +} diff --git a/tests/examples/TestQMLWidgets/conf.qrc b/tests/examples/TestQMLWidgets/conf.qrc new file mode 100644 index 00000000..03a1bfc7 --- /dev/null +++ b/tests/examples/TestQMLWidgets/conf.qrc @@ -0,0 +1,5 @@ + + + qt.conf + + diff --git a/tests/examples/TestQMLWidgets/main.cpp b/tests/examples/TestQMLWidgets/main.cpp new file mode 100644 index 00000000..b532603f --- /dev/null +++ b/tests/examples/TestQMLWidgets/main.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) + return -1; + + QTimer::singleShot(200, [&app](){ app.exit(0);}); + + return app.exec(); +} diff --git a/tests/examples/TestQMLWidgets/main.qml b/tests/examples/TestQMLWidgets/main.qml new file mode 100644 index 00000000..d5d621a3 --- /dev/null +++ b/tests/examples/TestQMLWidgets/main.qml @@ -0,0 +1,65 @@ +import QtQuick 2.10 +import QtQuick.Controls 2.3 + +ApplicationWindow { + id: window + visible: true + width: 640 + height: 480 + title: qsTr("Stack") + + header: ToolBar { + contentHeight: toolButton.implicitHeight + + ToolButton { + id: toolButton + text: stackView.depth > 1 ? "\u25C0" : "\u2630" + font.pixelSize: Qt.application.font.pixelSize * 1.6 + onClicked: { + if (stackView.depth > 1) { + stackView.pop() + } else { + drawer.open() + } + } + } + + Label { + text: stackView.currentItem.title + anchors.centerIn: parent + } + } + + Drawer { + id: drawer + width: window.width * 0.66 + height: window.height + + Column { + anchors.fill: parent + + ItemDelegate { + text: qsTr("Page 1") + width: parent.width + onClicked: { + stackView.push("Page1Form.ui.qml") + drawer.close() + } + } + ItemDelegate { + text: qsTr("Page 2") + width: parent.width + onClicked: { + stackView.push("Page2Form.ui.qml") + drawer.close() + } + } + } + } + + StackView { + id: stackView + initialItem: "HomeForm.ui.qml" + anchors.fill: parent + } +} diff --git a/tests/examples/TestQMLWidgets/qml.qrc b/tests/examples/TestQMLWidgets/qml.qrc new file mode 100644 index 00000000..77259896 --- /dev/null +++ b/tests/examples/TestQMLWidgets/qml.qrc @@ -0,0 +1,9 @@ + + + main.qml + HomeForm.ui.qml + Page1Form.ui.qml + Page2Form.ui.qml + qtquickcontrols2.conf + + diff --git a/tests/examples/TestQtWidgets/CMakeLists.txt b/tests/examples/TestQtWidgets/CMakeLists.txt new file mode 100644 index 00000000..83dff939 --- /dev/null +++ b/tests/examples/TestQtWidgets/CMakeLists.txt @@ -0,0 +1,110 @@ +# +# Copyright (C) 2021-2022 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. +# + +cmake_minimum_required(VERSION 3.18) + +get_filename_component(CURRENT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +set(CURRENT_PROJECT "${PROJECT_NAME}") +option(SIGN_APP "This option enable od disabled sign apk and aab files" ON) + +file(GLOB_RECURSE SOURCE_CPP + "*.cpp" "*.h" +) + +if (${QT_VERSION_MAJOR}) + file(GLOB_RECURSE SOURCE_QRC + "*.qrc" + ) +endif() + +set(ALL_SOURCES ${SOURCE_CPP} ${SOURCE_QRC}) + +set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + +set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Private") + + +if (${QT_VERSION_MAJOR} EQUAL 6) + + qt_add_executable(${CURRENT_PROJECT} MANUAL_FINALIZATION ${ALL_SOURCES}) + +else() + if (ANDROID) + add_library(${CURRENT_PROJECT} ${ALL_SOURCES}) + else () + add_executable(${CURRENT_PROJECT} ${ALL_SOURCES} ) + endif() + +endif() + +target_link_libraries(${CURRENT_PROJECT} PUBLIC LibDeploy) + +target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) +target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) + +SET(TARGET_DIR "${CMAKE_SOURCE_DIR}/Distro") +file(MAKE_DIRECTORY ${TARGET_DIR}) + +if(QT_VERSION_MAJOR EQUAL 6) + # Add This line if your project use the Quick module + # qt_import_qml_plugins(${CURRENT_PROJECT}) + qt_finalize_executable(${CURRENT_PROJECT}) +endif() + + +set(LANGS ${CMAKE_CURRENT_SOURCE_DIR}/languages/en.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/ru.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/uk.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/ja.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/tr.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/zh.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/de.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/fr.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/es.ts + ${CMAKE_CURRENT_SOURCE_DIR}/languages/pl.ts) + +prepareQM(${CURRENT_PROJECT} ${CMAKE_CURRENT_SOURCE_DIR}/../ "${LANGS}") + +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json") + +# qifw installer +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/CQtDeployer.1_6/meta/package.xml") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/packages/QIF/meta/package.xml") + +# snap +configure_file_in(${CURRENT_PROJECT} "${CMAKE_SOURCE_DIR}/snap/snapcraft.yaml") + + +# sets qifw variable +set(HomeDir "@HomeDir@") +configure_file_in(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFWTemplate/config/config.xml") + + +addDeployFromCustomFile(${CURRENT_PROJECT} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployer.json") + +set(QIFW_PLATFORM linux) + +if (WIN32) + set(QIFW_PLATFORM windows) +endif() + +ADD_CUSTOM_TARGET( + downloadQIFW + SOURCES ${${name}files} + COMMAND python "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW.py" ${QIFW_PLATFORM} ${QIFW_VERSION} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW" + COMMENT python "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW.py" ${QIFW_PLATFORM} ${QIFW_VERSION} "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/QIFW" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) +add_dependencies(deploy${CURRENT_PROJECT} downloadQIFW) + +addDeployFromCustomFile(${CURRENT_PROJECT}Single "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/CQtDeployerSingle.json") + +set(SNAPCRAFT_EXTRA_ARG "--use-lxd") +addDeploySnap(${CURRENT_PROJECT} "${CMAKE_SOURCE_DIR}/Distro/") diff --git a/tests/examples/TestQtWidgets/conf.qrc b/tests/examples/TestQtWidgets/conf.qrc new file mode 100644 index 00000000..03a1bfc7 --- /dev/null +++ b/tests/examples/TestQtWidgets/conf.qrc @@ -0,0 +1,5 @@ + + + qt.conf + + diff --git a/tests/examples/TestQtWidgets/main.cpp b/tests/examples/TestQtWidgets/main.cpp new file mode 100644 index 00000000..79fe5e8d --- /dev/null +++ b/tests/examples/TestQtWidgets/main.cpp @@ -0,0 +1,16 @@ +#include "mainwindow.h" +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + + QTimer::singleShot(200, [&a](){ a.exit(0);}); + + + return a.exec(); +} diff --git a/tests/examples/TestQtWidgets/mainwindow.cpp b/tests/examples/TestQtWidgets/mainwindow.cpp new file mode 100644 index 00000000..49d64fce --- /dev/null +++ b/tests/examples/TestQtWidgets/mainwindow.cpp @@ -0,0 +1,14 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); +} + +MainWindow::~MainWindow() +{ + delete ui; +} diff --git a/tests/examples/TestQtWidgets/mainwindow.h b/tests/examples/TestQtWidgets/mainwindow.h new file mode 100644 index 00000000..93534413 --- /dev/null +++ b/tests/examples/TestQtWidgets/mainwindow.h @@ -0,0 +1,22 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private: + Ui::MainWindow *ui; +}; + +#endif // MAINWINDOW_H diff --git a/tests/examples/TestQtWidgets/mainwindow.ui b/tests/examples/TestQtWidgets/mainwindow.ui new file mode 100644 index 00000000..6050363f --- /dev/null +++ b/tests/examples/TestQtWidgets/mainwindow.ui @@ -0,0 +1,24 @@ + + MainWindow + + + + 0 + 0 + 400 + 300 + + + + MainWindow + + + + + + + + + + + diff --git a/tests/examples/TestQtWidgets/qt.conf b/tests/examples/TestQtWidgets/qt.conf new file mode 100644 index 00000000..b19181a8 --- /dev/null +++ b/tests/examples/TestQtWidgets/qt.conf @@ -0,0 +1,2 @@ +[Paths] +Prefix = /some/path diff --git a/tests/examples/quicknanobrowser/ApplicationRoot.qml b/tests/examples/quicknanobrowser/ApplicationRoot.qml new file mode 100644 index 00000000..cd40a7fd --- /dev/null +++ b/tests/examples/quicknanobrowser/ApplicationRoot.qml @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtWebEngine + +QtObject { + id: root + + property QtObject defaultProfile: WebEngineProfile { + storageName: "Profile" + offTheRecord: false + } + + property QtObject otrProfile: WebEngineProfile { + offTheRecord: true + } + + property Component browserWindowComponent: BrowserWindow { + applicationRoot: root + } + property Component browserDialogComponent: BrowserDialog { + onClosing: destroy() + } + function createWindow(profile) { + var newWindow = browserWindowComponent.createObject(root); + newWindow.currentWebView.profile = profile; + profile.downloadRequested.connect(newWindow.onDownloadRequested); + return newWindow; + } + function createDialog(profile) { + var newDialog = browserDialogComponent.createObject(root); + newDialog.currentWebView.profile = profile; + return newDialog; + } + function load(url) { + var browserWindow = createWindow(defaultProfile); + browserWindow.currentWebView.url = url; + } +} diff --git a/tests/examples/quicknanobrowser/BrowserDialog.qml b/tests/examples/quicknanobrowser/BrowserDialog.qml new file mode 100644 index 00000000..281f4490 --- /dev/null +++ b/tests/examples/quicknanobrowser/BrowserDialog.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Window +import QtWebEngine + +Window { + id: window + property alias currentWebView: webView + flags: Qt.Dialog | Qt.WindowStaysOnTopHint + width: 800 + height: 600 + visible: true + onClosing: destroy() + WebEngineView { + id: webView + anchors.fill: parent + + onGeometryChangeRequested: function(geometry) { + window.x = geometry.x + window.y = geometry.y + window.width = geometry.width + window.height = geometry.height + } + } +} diff --git a/tests/examples/quicknanobrowser/BrowserWindow.qml b/tests/examples/quicknanobrowser/BrowserWindow.qml new file mode 100644 index 00000000..0da1bc04 --- /dev/null +++ b/tests/examples/quicknanobrowser/BrowserWindow.qml @@ -0,0 +1,801 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import Qt.labs.settings +import QtQml +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import QtQuick.Window +import QtWebEngine + +ApplicationWindow { + id: browserWindow + property QtObject applicationRoot + property Item currentWebView: tabBar.currentIndex < tabBar.count ? tabLayout.children[tabBar.currentIndex] : null + property int previousVisibility: Window.Windowed + property int createdTabs: 0 + + width: 1300 + height: 900 + visible: true + title: currentWebView && currentWebView.title + + // Make sure the Qt.WindowFullscreenButtonHint is set on OS X. + Component.onCompleted: flags = flags | Qt.WindowFullscreenButtonHint + + onCurrentWebViewChanged: { + findBar.reset(); + } + + // When using style "mac", ToolButtons are not supposed to accept focus. + property bool platformIsMac: Qt.platform.os == "osx" + + Settings { + id : appSettings + property alias autoLoadImages: loadImages.checked + property alias javaScriptEnabled: javaScriptEnabled.checked + property alias errorPageEnabled: errorPageEnabled.checked + property alias pluginsEnabled: pluginsEnabled.checked + property alias fullScreenSupportEnabled: fullScreenSupportEnabled.checked + property alias autoLoadIconsForPage: autoLoadIconsForPage.checked + property alias touchIconsEnabled: touchIconsEnabled.checked + property alias webRTCPublicInterfacesOnly : webRTCPublicInterfacesOnly.checked + property alias devToolsEnabled: devToolsEnabled.checked + property alias pdfViewerEnabled: pdfViewerEnabled.checked + } + + Action { + shortcut: "Ctrl+D" + onTriggered: { + downloadView.visible = !downloadView.visible; + } + } + Action { + id: focus + shortcut: "Ctrl+L" + onTriggered: { + addressBar.forceActiveFocus(); + addressBar.selectAll(); + } + } + Action { + shortcut: StandardKey.Refresh + onTriggered: { + if (currentWebView) + currentWebView.reload(); + } + } + Action { + shortcut: StandardKey.AddTab + onTriggered: { + tabBar.createTab(tabBar.count != 0 ? currentWebView.profile : defaultProfile); + addressBar.forceActiveFocus(); + addressBar.selectAll(); + } + } + Action { + shortcut: StandardKey.Close + onTriggered: { + currentWebView.triggerWebAction(WebEngineView.RequestClose); + } + } + Action { + shortcut: StandardKey.Quit + onTriggered: browserWindow.close() + } + Action { + shortcut: "Escape" + onTriggered: { + if (currentWebView.state == "FullScreen") { + browserWindow.visibility = browserWindow.previousVisibility; + fullScreenNotification.hide(); + currentWebView.triggerWebAction(WebEngineView.ExitFullScreen); + } + + if (findBar.visible) + findBar.visible = false; + } + } + Action { + shortcut: "Ctrl+0" + onTriggered: currentWebView.zoomFactor = 1.0 + } + Action { + shortcut: StandardKey.ZoomOut + onTriggered: currentWebView.zoomFactor -= 0.1 + } + Action { + shortcut: StandardKey.ZoomIn + onTriggered: currentWebView.zoomFactor += 0.1 + } + + Action { + shortcut: StandardKey.Copy + onTriggered: currentWebView.triggerWebAction(WebEngineView.Copy) + } + Action { + shortcut: StandardKey.Cut + onTriggered: currentWebView.triggerWebAction(WebEngineView.Cut) + } + Action { + shortcut: StandardKey.Paste + onTriggered: currentWebView.triggerWebAction(WebEngineView.Paste) + } + Action { + shortcut: "Shift+"+StandardKey.Paste + onTriggered: currentWebView.triggerWebAction(WebEngineView.PasteAndMatchStyle) + } + Action { + shortcut: StandardKey.SelectAll + onTriggered: currentWebView.triggerWebAction(WebEngineView.SelectAll) + } + Action { + shortcut: StandardKey.Undo + onTriggered: currentWebView.triggerWebAction(WebEngineView.Undo) + } + Action { + shortcut: StandardKey.Redo + onTriggered: currentWebView.triggerWebAction(WebEngineView.Redo) + } + Action { + shortcut: StandardKey.Back + onTriggered: currentWebView.triggerWebAction(WebEngineView.Back) + } + Action { + shortcut: StandardKey.Forward + onTriggered: currentWebView.triggerWebAction(WebEngineView.Forward) + } + Action { + shortcut: StandardKey.Find + onTriggered: { + if (!findBar.visible) + findBar.visible = true; + } + } + Action { + shortcut: StandardKey.FindNext + onTriggered: findBar.findNext() + } + Action { + shortcut: StandardKey.FindPrevious + onTriggered: findBar.findPrevious() + } + + menuBar: ToolBar { + id: navigationBar + RowLayout { + anchors.fill: parent + ToolButton { + enabled: currentWebView && (currentWebView.canGoBack || currentWebView.canGoForward) + onClicked: historyMenu.open() + text: qsTr("▼") + Menu { + id: historyMenu + Instantiator { + model: currentWebView && currentWebView.history.items + MenuItem { + text: model.title + onTriggered: currentWebView.goBackOrForward(model.offset) + checkable: !enabled + checked: !enabled + enabled: model.offset + } + + onObjectAdded: function(index, object) { + historyMenu.insertItem(index, object) + } + onObjectRemoved: function(index, object) { + historyMenu.removeItem(object) + } + } + } + } + + ToolButton { + id: backButton + icon.source: "qrc:/icons/go-previous.png" + onClicked: currentWebView.goBack() + enabled: currentWebView && currentWebView.canGoBack + activeFocusOnTab: !browserWindow.platformIsMac + } + ToolButton { + id: forwardButton + icon.source: "qrc:/icons/go-next.png" + onClicked: currentWebView.goForward() + enabled: currentWebView && currentWebView.canGoForward + activeFocusOnTab: !browserWindow.platformIsMac + } + ToolButton { + id: reloadButton + icon.source: currentWebView && currentWebView.loading ? "qrc:/icons/process-stop.png" : "qrc:/icons/view-refresh.png" + onClicked: currentWebView && currentWebView.loading ? currentWebView.stop() : currentWebView.reload() + activeFocusOnTab: !browserWindow.platformIsMac + } + TextField { + id: addressBar + Image { + anchors.verticalCenter: addressBar.verticalCenter; + x: 5 + z: 2 + id: faviconImage + width: 16; height: 16 + sourceSize: Qt.size(width, height) + source: currentWebView && currentWebView.icon ? currentWebView.icon : '' + } + MouseArea { + id: textFieldMouseArea + acceptedButtons: Qt.RightButton + anchors.fill: parent + onClicked: { + var textSelectionStartPos = addressBar.selectionStart; + var textSelectionEndPos = addressBar.selectionEnd; + textFieldContextMenu.open(); + addressBar.select(textSelectionStartPos, textSelectionEndPos); + } + Menu { + id: textFieldContextMenu + x: textFieldMouseArea.mouseX + y: textFieldMouseArea.mouseY + MenuItem { + text: qsTr("Cut") + onTriggered: addressBar.cut() + enabled: addressBar.selectedText.length > 0 + } + MenuItem { + text: qsTr("Copy") + onTriggered: addressBar.copy() + enabled: addressBar.selectedText.length > 0 + } + MenuItem { + text: qsTr("Paste") + onTriggered: addressBar.paste() + enabled: addressBar.canPaste + } + MenuItem { + text: qsTr("Delete") + onTriggered: addressBar.text = qsTr("") + enabled: addressBar.selectedText.length > 0 + } + MenuSeparator {} + MenuItem { + text: qsTr("Select All") + onTriggered: addressBar.selectAll() + enabled: addressBar.text.length > 0 + } + } + } + leftPadding: 26 + focus: true + Layout.fillWidth: true + Binding on text { + when: currentWebView + value: currentWebView.url + } + onAccepted: currentWebView.url = utils.fromUserInput(text) + selectByMouse: true + } + ToolButton { + id: settingsMenuButton + text: qsTr("⋮") + onClicked: settingsMenu.open() + Menu { + id: settingsMenu + y: settingsMenuButton.height + MenuItem { + id: loadImages + text: "Autoload images" + checkable: true + checked: WebEngine.settings.autoLoadImages + } + MenuItem { + id: javaScriptEnabled + text: "JavaScript On" + checkable: true + checked: WebEngine.settings.javascriptEnabled + } + MenuItem { + id: errorPageEnabled + text: "ErrorPage On" + checkable: true + checked: WebEngine.settings.errorPageEnabled + } + MenuItem { + id: pluginsEnabled + text: "Plugins On" + checkable: true + checked: true + } + MenuItem { + id: fullScreenSupportEnabled + text: "FullScreen On" + checkable: true + checked: WebEngine.settings.fullScreenSupportEnabled + } + MenuItem { + id: offTheRecordEnabled + text: "Off The Record" + checkable: true + checked: currentWebView && currentWebView.profile === otrProfile + onToggled: function(checked) { + if (currentWebView) { + currentWebView.profile = checked ? otrProfile : defaultProfile; + } + } + } + MenuItem { + id: httpDiskCacheEnabled + text: "HTTP Disk Cache" + checkable: currentWebView && !currentWebView.profile.offTheRecord + checked: currentWebView && (currentWebView.profile.httpCacheType === WebEngineProfile.DiskHttpCache) + onToggled: function(checked) { + if (currentWebView) { + currentWebView.profile.httpCacheType = checked ? WebEngineProfile.DiskHttpCache : WebEngineProfile.MemoryHttpCache; + } + } + } + MenuItem { + id: autoLoadIconsForPage + text: "Icons On" + checkable: true + checked: WebEngine.settings.autoLoadIconsForPage + } + MenuItem { + id: touchIconsEnabled + text: "Touch Icons On" + checkable: true + checked: WebEngine.settings.touchIconsEnabled + enabled: autoLoadIconsForPage.checked + } + MenuItem { + id: webRTCPublicInterfacesOnly + text: "WebRTC Public Interfaces Only" + checkable: true + checked: WebEngine.settings.webRTCPublicInterfacesOnly + } + MenuItem { + id: devToolsEnabled + text: "Open DevTools" + checkable: true + checked: false + } + MenuItem { + id: pdfViewerEnabled + text: "PDF viewer enabled" + checkable: true + checked: WebEngine.settings.pdfViewerEnabled + } + } + } + } + ProgressBar { + id: progressBar + height: 3 + anchors { + left: parent.left + top: parent.bottom + right: parent.right + leftMargin: parent.leftMargin + rightMargin: parent.rightMargin + } + background: Item {} + z: -2 + from: 0 + to: 100 + value: (currentWebView && currentWebView.loadProgress < 100) ? currentWebView.loadProgress : 0 + } + } + + StackLayout { + id: tabLayout + currentIndex: tabBar.currentIndex + + anchors.top: tabBar.bottom + anchors.bottom: devToolsView.top + anchors.left: parent.left + anchors.right: parent.right + } + + Component { + id: tabButtonComponent + + TabButton { + property color frameColor: "#999" + property color fillColor: "#eee" + property color nonSelectedColor: "#ddd" + property string tabTitle: "New Tab" + + id: tabButton + contentItem: Rectangle { + id: tabRectangle + color: tabButton.down ? fillColor : nonSelectedColor + border.width: 1 + border.color: frameColor + implicitWidth: Math.max(text.width + 30, 80) + implicitHeight: Math.max(text.height + 10, 20) + Rectangle { height: 1 ; width: parent.width ; color: frameColor} + Rectangle { height: parent.height ; width: 1; color: frameColor} + Rectangle { x: parent.width - 2; height: parent.height ; width: 1; color: frameColor} + Text { + id: text + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 6 + text: tabButton.tabTitle + elide: Text.ElideRight + color: tabButton.down ? "black" : frameColor + width: parent.width - button.background.width + } + Button { + id: button + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.rightMargin: 4 + height: 12 + background: Rectangle { + implicitWidth: 12 + implicitHeight: 12 + color: button.hovered ? "#ccc" : tabRectangle.color + Text {text: "x"; anchors.centerIn: parent; color: "gray"} + } + onClicked: tabButton.closeTab() + } + } + + onClicked: addressBar.text = tabLayout.itemAt(TabBar.index).url; + function closeTab() { + tabBar.removeView(TabBar.index); + } + } + } + + TabBar { + id: tabBar + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + Component.onCompleted: createTab(defaultProfile) + + function createTab(profile, focusOnNewTab = true, url = undefined) { + var webview = tabComponent.createObject(tabLayout, {profile: profile}); + var newTabButton = tabButtonComponent.createObject(tabBar, {tabTitle: Qt.binding(function () { return webview.title; })}); + tabBar.addItem(newTabButton); + if (focusOnNewTab) { + tabBar.setCurrentIndex(tabBar.count - 1); + } + if (url !== undefined) { + webview.url = url; + } + return webview; + } + + function removeView(index) { + tabBar.removeItem(index); + if (tabBar.count > 1) { + tabBar.removeItem(tabBar.itemAt(index)); + tabLayout.children[index].destroy(); + } else { + browserWindow.close(); + } + } + + Component { + id: tabComponent + WebEngineView { + id: webEngineView + focus: true + + onLinkHovered: function(hoveredUrl) { + if (hoveredUrl == "") + hideStatusText.start(); + else { + statusText.text = hoveredUrl; + statusBubble.visible = true; + hideStatusText.stop(); + } + } + + states: [ + State { + name: "FullScreen" + PropertyChanges { + target: tabBar + visible: false + height: 0 + } + PropertyChanges { + target: navigationBar + visible: false + } + } + ] + settings.autoLoadImages: appSettings.autoLoadImages + settings.javascriptEnabled: appSettings.javaScriptEnabled + settings.errorPageEnabled: appSettings.errorPageEnabled + settings.pluginsEnabled: appSettings.pluginsEnabled + settings.fullScreenSupportEnabled: appSettings.fullScreenSupportEnabled + settings.autoLoadIconsForPage: appSettings.autoLoadIconsForPage + settings.touchIconsEnabled: appSettings.touchIconsEnabled + settings.webRTCPublicInterfacesOnly: appSettings.webRTCPublicInterfacesOnly + settings.pdfViewerEnabled: appSettings.pdfViewerEnabled + + onCertificateError: function(error) { + error.defer(); + sslDialog.enqueue(error); + } + + onNewWindowRequested: function(request) { + if (!request.userInitiated) + console.warn("Blocked a popup window."); + else if (request.destination === WebEngineNewWindowRequest.InNewTab) { + var tab = tabBar.createTab(currentWebView.profile, true, request.requestedUrl); + tab.acceptAsNewWindow(request); + } else if (request.destination === WebEngineNewWindowRequest.InNewBackgroundTab) { + var backgroundTab = tabBar.createTab(currentWebView.profile, false); + backgroundTab.acceptAsNewWindow(request); + } else if (request.destination === WebEngineNewWindowRequest.InNewDialog) { + var dialog = applicationRoot.createDialog(currentWebView.profile); + dialog.currentWebView.acceptAsNewWindow(request); + } else { + var window = applicationRoot.createWindow(currentWebView.profile); + window.currentWebView.acceptAsNewWindow(request); + } + } + + onFullScreenRequested: function(request) { + if (request.toggleOn) { + webEngineView.state = "FullScreen"; + browserWindow.previousVisibility = browserWindow.visibility; + browserWindow.showFullScreen(); + fullScreenNotification.show(); + } else { + webEngineView.state = ""; + browserWindow.visibility = browserWindow.previousVisibility; + fullScreenNotification.hide(); + } + request.accept(); + } + + onQuotaRequested: function(request) { + if (request.requestedSize <= 5 * 1024 * 1024) + request.accept(); + else + request.reject(); + } + + onRegisterProtocolHandlerRequested: function(request) { + console.log("accepting registerProtocolHandler request for " + + request.scheme + " from " + request.origin); + request.accept(); + } + + onRenderProcessTerminated: function(terminationStatus, exitCode) { + var status = ""; + switch (terminationStatus) { + case WebEngineView.NormalTerminationStatus: + status = "(normal exit)"; + break; + case WebEngineView.AbnormalTerminationStatus: + status = "(abnormal exit)"; + break; + case WebEngineView.CrashedTerminationStatus: + status = "(crashed)"; + break; + case WebEngineView.KilledTerminationStatus: + status = "(killed)"; + break; + } + + print("Render process exited with code " + exitCode + " " + status); + reloadTimer.running = true; + } + + onSelectClientCertificate: function(selection) { + selection.certificates[0].select(); + } + + onFindTextFinished: function(result) { + if (!findBar.visible) + findBar.visible = true; + + findBar.numberOfMatches = result.numberOfMatches; + findBar.activeMatch = result.activeMatch; + } + + onLoadingChanged: function(loadRequest) { + if (loadRequest.status == WebEngineView.LoadStartedStatus) + findBar.reset(); + } + + Timer { + id: reloadTimer + interval: 0 + running: false + repeat: false + onTriggered: currentWebView.reload() + } + } + } + } + WebEngineView { + id: devToolsView + visible: devToolsEnabled.checked + height: visible ? 400 : 0 + inspectedView: visible && tabBar.currentIndex < tabBar.count ? tabLayout.children[tabBar.currentIndex] : null + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + onNewWindowRequested: function(request) { + var tab = tabBar.createTab(currentWebView.profile); + request.openIn(tab); + } + + Timer { + id: hideTimer + interval: 0 + running: false + repeat: false + onTriggered: devToolsEnabled.checked = false + } + onWindowCloseRequested: function(request) { + // Delay hiding for keep the inspectedView set to receive the ACK message of close. + hideTimer.running = true; + } + } + Dialog { + id: sslDialog + anchors.centerIn: parent + contentWidth: Math.max(mainText.width, detailedText.width) + contentHeight: mainText.height + detailedText.height + property var certErrors: [] + // fixme: icon! + // icon: StandardIcon.Warning + standardButtons: Dialog.No | Dialog.Yes + title: "Server's certificate not trusted" + contentItem: Item { + id: textContentItem + Label { + id: mainText + text: "Do you wish to continue?" + } + Text { + id: detailedText + anchors.top: mainText.bottom + text: "If you wish so, you may continue with an unverified certificate.\n" + + "Accepting an unverified certificate means\n" + + "you may not be connected with the host you tried to connect to.\n" + + "Do you wish to override the security check and continue?" + } + } + + onAccepted: { + certErrors.shift().acceptCertificate(); + presentError(); + } + onRejected: reject() + + function reject(){ + certErrors.shift().rejectCertificate(); + presentError(); + } + function enqueue(error){ + certErrors.push(error); + presentError(); + } + function presentError(){ + visible = certErrors.length > 0 + } + } + + FullScreenNotification { + id: fullScreenNotification + } + + DownloadView { + id: downloadView + visible: false + anchors.fill: parent + } + + function onDownloadRequested(download) { + downloadView.visible = true; + downloadView.append(download); + download.accept(); + } + + FindBar { + id: findBar + visible: false + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.top: parent.top + + onFindNext: { + if (text) + currentWebView && currentWebView.findText(text); + else if (!visible) + visible = true; + } + onFindPrevious: { + if (text) + currentWebView && currentWebView.findText(text, WebEngineView.FindBackward); + else if (!visible) + visible = true; + } + } + + + Rectangle { + id: statusBubble + color: "oldlace" + property int padding: 8 + visible: false + + anchors.left: parent.left + anchors.bottom: parent.bottom + width: statusText.paintedWidth + padding + height: statusText.paintedHeight + padding + + Text { + id: statusText + anchors.centerIn: statusBubble + elide: Qt.ElideMiddle + + Timer { + id: hideStatusText + interval: 750 + onTriggered: { + statusText.text = ""; + statusBubble.visible = false; + } + } + } + } +} diff --git a/tests/examples/quicknanobrowser/CMakeLists.txt b/tests/examples/quicknanobrowser/CMakeLists.txt new file mode 100644 index 00000000..cdccc26b --- /dev/null +++ b/tests/examples/quicknanobrowser/CMakeLists.txt @@ -0,0 +1,75 @@ +cmake_minimum_required(VERSION 3.16) +project(quicknanobrowser LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/webenginequick/quicknanobrowser") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Quick WebEngineQuick) + +qt_add_executable(quicknanobrowser + main.cpp + utils.h +) + +set_target_properties(quicknanobrowser PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(quicknanobrowser PUBLIC + Qt::Core + Qt::Gui + Qt::Qml + Qt::Quick + Qt::WebEngineQuick +) + +# Resources: +set(resources_resource_files + "ApplicationRoot.qml" + "BrowserDialog.qml" + "BrowserWindow.qml" + "DownloadView.qml" + "FindBar.qml" + "FullScreenNotification.qml" +) + +qt_add_resources(quicknanobrowser "resources" + PREFIX + "/" + FILES + ${resources_resource_files} +) + +set(resources1_resource_files + "icons/3rdparty/go-next.png" + "icons/3rdparty/go-previous.png" + "icons/3rdparty/process-stop.png" + "icons/3rdparty/view-refresh.png" +) + +qt_add_resources(quicknanobrowser "resources1" + PREFIX + "/icons" + BASE + "icons/3rdparty" + FILES + ${resources1_resource_files} +) + +if(TARGET Qt::Widgets) + target_link_libraries(quicknanobrowser PUBLIC + Qt::Widgets + ) +endif() + +install(TARGETS quicknanobrowser + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/examples/quicknanobrowser/DownloadView.qml b/tests/examples/quicknanobrowser/DownloadView.qml new file mode 100644 index 00000000..ea7e0b53 --- /dev/null +++ b/tests/examples/quicknanobrowser/DownloadView.qml @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls +import QtWebEngine +import QtQuick.Layouts + +Rectangle { + id: downloadView + color: "lightgray" + + ListModel { + id: downloadModel + property var downloads: [] + } + + function append(download) { + downloadModel.append(download); + downloadModel.downloads.push(download); + } + + Component { + id: downloadItemDelegate + + Rectangle { + width: listView.width + height: childrenRect.height + anchors.margins: 10 + radius: 3 + color: "transparent" + border.color: "black" + Rectangle { + id: progressBar + + property real progress: downloadModel.downloads[index] + ? downloadModel.downloads[index].receivedBytes / downloadModel.downloads[index].totalBytes : 0 + + radius: 3 + color: width == listView.width ? "green" : "#2b74c7" + width: listView.width * progress + height: cancelButton.height + + Behavior on width { + SmoothedAnimation { duration: 100 } + } + } + Rectangle { + anchors { + left: parent.left + right: parent.right + leftMargin: 20 + } + Label { + id: label + text: downloadModel.downloads[index] ? downloadModel.downloads[index].downloadDirectory + "/" + downloadModel.downloads[index].downloadFileName : qsTr("") + anchors { + verticalCenter: cancelButton.verticalCenter + left: parent.left + right: cancelButton.left + } + } + Button { + id: cancelButton + anchors.right: parent.right + icon.source: "qrc:/icons/process-stop.png" + onClicked: { + var download = downloadModel.downloads[index]; + + download.cancel(); + + downloadModel.downloads = downloadModel.downloads.filter(function (el) { + return el.id !== download.id; + }); + downloadModel.remove(index); + } + } + } + } + + } + ListView { + id: listView + anchors { + topMargin: 10 + top: parent.top + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + width: parent.width - 20 + spacing: 5 + + model: downloadModel + delegate: downloadItemDelegate + + Text { + visible: !listView.count + horizontalAlignment: Text.AlignHCenter + height: 30 + anchors { + top: parent.top + left: parent.left + right: parent.right + } + font.pixelSize: 20 + text: "No active downloads." + } + + Rectangle { + color: "gray" + anchors { + bottom: parent.bottom + left: parent.left + right: parent.right + } + height: 30 + Button { + id: okButton + text: "OK" + anchors.centerIn: parent + onClicked: { + downloadView.visible = false; + } + } + } + } +} diff --git a/tests/examples/quicknanobrowser/FindBar.qml b/tests/examples/quicknanobrowser/FindBar.qml new file mode 100644 index 00000000..738a38c8 --- /dev/null +++ b/tests/examples/quicknanobrowser/FindBar.qml @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +Rectangle { + id: root + + property int numberOfMatches: 0 + property int activeMatch: 0 + property alias text: findTextField.text + + function reset() { + numberOfMatches = 0; + activeMatch = 0; + visible = false; + } + + signal findNext() + signal findPrevious() + + width: 250 + height: 35 + radius: 2 + + border.width: 1 + border.color: "black" + color: "white" + + onVisibleChanged: { + if (visible) + findTextField.forceActiveFocus(); + } + + + RowLayout { + anchors.fill: parent + anchors.topMargin: 5 + anchors.bottomMargin: 5 + anchors.leftMargin: 10 + anchors.rightMargin: 10 + + spacing: 5 + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + + TextField { + id: findTextField + anchors.fill: parent + background: Rectangle { + color: "transparent" + } + + onAccepted: root.findNext() + onTextChanged: root.findNext() + onActiveFocusChanged: activeFocus ? selectAll() : deselect() + } + } + + Label { + text: activeMatch + "/" + numberOfMatches + visible: findTextField.text != "" + } + + Rectangle { + border.width: 1 + border.color: "#ddd" + width: 2 + height: parent.height + anchors.topMargin: 5 + anchors.bottomMargin: 5 + } + + ToolButton { + text: "<" + enabled: numberOfMatches > 0 + onClicked: root.findPrevious() + } + + ToolButton { + text: ">" + enabled: numberOfMatches > 0 + onClicked: root.findNext() + } + + ToolButton { + text: "x" + onClicked: root.visible = false + } + } +} diff --git a/tests/examples/quicknanobrowser/FullScreenNotification.qml b/tests/examples/quicknanobrowser/FullScreenNotification.qml new file mode 100644 index 00000000..c5f891db --- /dev/null +++ b/tests/examples/quicknanobrowser/FullScreenNotification.qml @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick + +Rectangle { + id: fullScreenNotification + width: 500 + height: 40 + color: "white" + radius: 7 + + visible: false + opacity: 0 + + function show() { + visible = true; + opacity = 1; + reset.start(); + } + + function hide() { + reset.stop(); + opacity = 0; + } + + Behavior on opacity { + NumberAnimation { + duration: 750 + onStopped: { + if (opacity == 0) + visible = false; + } + } + } + + Timer { + id: reset + interval: 5000 + onTriggered: hide() + } + + anchors.horizontalCenter: parent.horizontalCenter + y: 125 + + Text { + id: message + width: parent.width + + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + + wrapMode: Text.WordWrap + elide: Text.ElideNone + clip: true + + text: qsTr("You are now in fullscreen mode. Press ESC to quit!") + } +} diff --git a/tests/examples/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg b/tests/examples/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12693bb0fd9323234e38e3269862412579b3be42 GIT binary patch literal 30156 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 K&Jw_13;zq!78Q~J literal 0 HcmV?d00001 diff --git a/tests/examples/quicknanobrowser/doc/src/quicknanobrowser.qdoc b/tests/examples/quicknanobrowser/doc/src/quicknanobrowser.qdoc new file mode 100644 index 00000000..3b9af68b --- /dev/null +++ b/tests/examples/quicknanobrowser/doc/src/quicknanobrowser.qdoc @@ -0,0 +1,153 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example webenginequick/quicknanobrowser + \title WebEngine Quick Nano Browser + \ingroup webengine-examples + \brief A web browser implemented using the WebEngineView QML type. + + \image quicknanobrowser-demo.jpg + + \e {Quick Nano Browser} demonstrates how to use the \l{Qt WebEngine QML Types} + {Qt WebEngine QML types} to develop a small web browser application that consists of a browser + window with a title bar, toolbar, tab view, and status bar. The web content is loaded in a web + engine view within the tab view. If certificate errors occur, users are prompted for action in a + message dialog. The status bar pops up to display the URL of a hovered link. + + A web page can issue a request for being displayed in fullscreen mode. Users can allow full + screen mode by using a toolbar button. They can leave fullscreen mode by using a keyboard + shortcut. Additional toolbar buttons enable moving backwards and forwards in the browser + history, reloading tab content, and opening a settings menu for enabling the following features: + JavaScript, plugins, fullscreen mode, off the record, HTTP disk cache, autoloading images, and + ignoring certificate errors. + + \include examples-run.qdocinc + + \section1 Creating the Main Browser Window + + When the browser main window is loaded, it creates an empty tab using the default profile. Each + tab is a web engine view that fills the main window. + + We create the main window in the \e BrowserWindow.qml file using the ApplicationWindow type: + + \quotefromfile webenginequick/quicknanobrowser/BrowserWindow.qml + \skipto ApplicationWindow + \printuntil currentWebView + \dots + \skipto width + \printuntil title + + We use the TabBar Qt Quick control to create a tab bar anchored to the top of the window, and + create a new, empty tab: + + \skipto TabBar { + \printuntil return webview + \printuntil } + + The tab contains a web engine view that loads web content: + + \skipto Component { + \printuntil currentWebView.reload + \printuntil /^\ {8}\}/ + + We use the \l Action type to create new tabs: + + \quotefromfile webenginequick/quicknanobrowser/BrowserWindow.qml + \skipto reload + \skipto Action + \printuntil } + + We use the \l TextField Qt Quick Control within a \l ToolBar to create an address bar that + shows the current URL and where users can enter another URL: + + \quotefromfile webenginequick/quicknanobrowser/BrowserWindow.qml + \skipto menuBar: ToolBar + \printuntil anchors.fill + \dots + \skipto TextField + \printuntil addressBar + \dots + \skipto focus + \printuntil /^\ {12}\}/ + + \section1 Handling Certificate Errors + + If the certificate of the site being loaded triggers a certificate error, we call the + \l{WebEngineCertificateError::}{defer()} QML method to pause the URL request and wait for user + input: + + \quotefromfile webenginequick/quicknanobrowser/BrowserWindow.qml + \skipto onCertificateError + \printuntil } + + We use the Dialog type to prompt users to continue or cancel the loading of the web page. + If users select \uicontrol Yes, we call the + \l{WebEngineCertificateError::}{acceptCertificate()} method to continue loading content from + the URL. If users select \uicontrol No, we call the + \l{WebEngineCertificateError::}{rejectCertificate()} method to reject the request and stop + loading content from the URL: + + \skipto Dialog { + \printuntil /^\ {4}\}/ + + \section1 Entering and Leaving Fullscreen Mode + + We create a menu item for allowing fullscreen mode in a settings menu that we place on the tool + bar. Also, we create an action for leaving fullscreen mode by using a keyboard shortcut. + We call the \l{FullScreenRequest::}{accept()} method to accept the fullscreen request. + The methdod sets the \l{WebEngineView::}{isFullScreen} property to be equal to the + \l{FullScreenRequest::}{toggleOn} property. + + \quotefromfile webenginequick/quicknanobrowser/BrowserWindow.qml + \skipto onFullScreenRequested + \printuntil /^\ {16}\}/ + + When entering fullscreen mode, we display a notification using the FullScreenNotification custom + type that we create in \e FullScreenNotification.qml. + + We use the \l Action type in the settings menu to create a shortcut for leaving fullscreen mode + by pressing the escape key: + + \quotefromfile webenginequick/quicknanobrowser/BrowserWindow.qml + \skipto Settings + \printuntil appSettings + \skipto fullScreenSupportEnabled + \printuntil Action + \skipto Escape + \printuntil /^\ {4}\}/ + + \section1 Files and Attributions + + The example uses icons from the Tango Icon Library: + + \table + \row + \li \l{quicknanobrowser-tango}{Tango Icon Library} + \li Public Domain + \endtable +*/ diff --git a/tests/examples/quicknanobrowser/icons/3rdparty/COPYING b/tests/examples/quicknanobrowser/icons/3rdparty/COPYING new file mode 100644 index 00000000..220881da --- /dev/null +++ b/tests/examples/quicknanobrowser/icons/3rdparty/COPYING @@ -0,0 +1 @@ +The icons in this repository are herefore released into the Public Domain. diff --git a/tests/examples/quicknanobrowser/icons/3rdparty/go-next.png b/tests/examples/quicknanobrowser/icons/3rdparty/go-next.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3f65d33d303315f0d8d9dd03c7e7e2427d4950 GIT binary patch literal 930 zcmV;T16}-yP)b zm0M^XRTPH5HM8gBV(mpKDJa$_Z|#GH3N?w)f>s1UMXmZGQl%7pX-P>7f}&tiq(1aT zP)ljdLx@@mDPl`Bh9;&enie%Q#!J+svBm_`ljO{0&t5*9IdzgY(T8-w&&-B3-`fA$ zi`k;8T#fLq3ibbj8=Hf!`X=+>l7rQ;d2QV-?>9CVb}uOyV8_ERRIj^vt-Jr}^J`7#mgi;JV)-V&XlM@pz)^Qubt9p3w))KZP8v6Cty-~c zRl~=9ZT*|}%9hiw>&TVBk{`E*J%R4u*)k_V)uAX(9bH4M2p)H=X<%%8)E(<;`P*81 z@8<{N{{IBOvg2J&{nVa86~&Rd6sHcSmeg5NwcJ*BHyV2!{p9dWDJ(v9>J8g5$L0J= zsk213L}W|EX-H&4k~AVoLt+~ery;Q|@y+iixR{RdYHa50=@ zc;Z`>a*MNG;dVYeab$LCdg4%TZMthga6bIN!w)=6m3OItX9Q0?*00)%Kf9c^j>EIlQ#1Qc zA57l?;H7zB5ee#>%FD+$>_Y(0NEvPf-v}qi-lVpshC8o+i1CprJ$AfhX7ZQl+3(t2 zH&6>05s6eaF&WeV1%>gq+V-!$Z0APe-Os&PsP>n$@w!Jj_x-uF^Rtr^!@atFw9gFz zHT*jWDk5oR$3Ecq9kAr&;el~2&q-4lO(_RF6KKCrtkj_?;y0348J zvVd8%$N30LAs>C(5f2Uy_MAE5UP~ip7D;y%aK4(KDFy_}Bhr4nHU9O7(L-n7bFEo! zk}1x<%d6Z9Rkb2Q1|nz80wzuLs~`JES_Y1~?yQi@K`QVBC;_3W>YRUtl<7g%+ko=a zR2)dofzERo0gb zl}%_|RTze!@0@e*&7V^HBN&Y|1&xTHg2tGcEZQg$sloamid{(QrYma`p)R6`8xe$x zE=)JAVs%lCB0?>;8x67IczQ|E_9Y~NZ8{U=yn5|bNt zZ{FN-`>T5f542e0(zO_A*m+=BT65yYyKmi^zpwkzroe@3VKxTmpO<#Qo$9}PN9Ubg z_Xgiie@@TlL5!nPUT}-K{lP!##V{MR`u1A(tAcYQ;T_gAofzD<^P1~6-C!rCJ_VE{ zO?Y9~Tg^rcf*`V-pKddeGBNcDMl99@d@*?#BMu`5 zYb=66M96P>ym1t{;b7mot2ey7qkmV+`Nb)IK6?gh0-Om*H6=|GtZ^8z_|#xB$4MHa zD6$$jKjIFyZ|rzxApcm)!!tZo00$ zhq5n{niALwE`qSx617;GS}jp)^&B)CQmI@XtfQKK{hHtR*X)JiW5*8{*M}YSbUs87 z1lYjfLPHRlDtrlQago7TL4k#H%e?#y8Bg9ja)0mkw!Y3Mr7-(3 zYAQUqh^+o!nj9Hs){H z=}ylcLsNMD&@1I~F^*P_E-*KL76XJLlGGgAOs=NizD)j@|COP{pFB8!alR|pGZbnf z#AOW%WB!5iMHYZ^rc$=oSgzquXnvZ7!rRH-LgDnu&rXb&7mKAv<@GDAIZiV9I`7ewn;fJhF#0jl@vQT*g_QU!iIgs_I1~i>lhOu8{-W_eYbl%HYh8>o&{o zBxWuf-PgfmU=b*(s!IKhkt#g^qHK3{6G$e_R6k`ID61~NDss8UR75P*@7&g@Hcf4! d1W0rh$lr11Sh~C<&aD6d002ovPDHLkV1hiw#cluq literal 0 HcmV?d00001 diff --git a/tests/examples/quicknanobrowser/icons/3rdparty/process-stop.png b/tests/examples/quicknanobrowser/icons/3rdparty/process-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..b68290bf1ebf568d8ab080a4e3ec7d75048ec461 GIT binary patch literal 1272 zcmVP(cu>t+olJDB6Oi7<19INt@fcyGh*L?Ahx%bEXfwuEs>^z{fny z%x}K=F8>icV;qMifOy81NDJ6=Ej;zmN%%s+rvl_$>k2dh=Ow(;0_uN(Pr~WyhK7%} zHZ{3*mkX3CnzC)MEUZ+DpWE9rgMEG9OW5-yd=~fwoT;v_|6tqBo$h#FAF1(iux+sI zJXA`Ql(-iyV*Z*nTse0xGt}Gr-RJP`;~f17=vUQsb?mwZsAw=PBr5?>n zVHpONVNg?F?}*0Z)vtxa%RAtQS>O}!_3A)i&-UhKPpqehbRMKZ1HFw&nEyHfUfIk zLXf_H9|}+RS{9)*XAnZL?7#t1<>eTqrM%qQinFwozYZP3ZJM|Mr4&XujIL>@LM|M| zx>PEkc_Bb4Dr}qh)D*$fr&)3EATJ(2j;?8FN-=QwFa(46aygVzD5bEK0x640)*e;7 zDwfm3k}A*TU~-bF3m0&DJUG2xA{Q@Wjg1wdwryiSgv&?0h4CGCbns!G!05h^3KijSjv1eNJ#=PJRV*;b_{1(8ULI* zMc@AYXhKkP^e9u~tsnJvA|wym+@;ktDV4bEI7LT+LL zXClFaa2Pc*f@fd=y8zIpr-|OVLoS)b6^)V`8Nsu1B~^g{JvVNcp~=bH9q^3~&;eKL zQYke$Hnwry=FQHWVUP(1(T0Z5L!lznE|^nFa=pD|M@A^EtfVp!;7)I^`RCocf7tMP zCs;+T=zyym(`h+6K3?yyuXpB>NwV>H5vJyt%PK2bSzF8Rot@eKv9Vumc(Vnvv(&8v zuGM8S=4ddu$sY(fbD0d;bQ*LWrR$(+sDhPORk7Uf=h`p7WQJm~A8mNM1+1s(u@hMG zF??3z^L_Z%h7Bdo`STHFW%=SSXtI(L<@M5e{=C^8kN@^19I_z-gn{&v;8I{Y@I0`r z33j{+ZvaB&_X!0; +Steven Garrity +Lapo Calamandrei +Ryan Collier +Rodney Dawes +Andreas Nilsson +Tuomas Kuosmanen +Garrett LeSage +Jakub Steiner " +} diff --git a/tests/examples/quicknanobrowser/icons/3rdparty/view-refresh.png b/tests/examples/quicknanobrowser/icons/3rdparty/view-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..cab4d02c756502f922bbff34df34c0056406bd96 GIT binary patch literal 1364 zcmV-a1*`grP)b zm1#^AXBfx-?>jR)yR%CSkD4Z}F=^Tmf|{770@hEqO%szQ{n9is zHEGgX6eKmafTT2OwXsKHJW8z!1VLK`LOl=`0dax7=XjrfU?CiS@JlE8XOfv`e)F4W zo|%^s5&n;jKTAy&;^&>EBHBBo`5EO|sKj&=J z5_Cb3Xb}|nqocOcn7QVqeWz0dr@u@KTRZD39?SzX23GoBb3MSyUw(0^ZDmff>~gB$ zoI%$O1VRQLJess_^m+m#;{k~=9QJeN3zwvG=)Bz$Vg)gg)ls`=U>nzH zUSF+63=0$fFk&_?ZmD@ zc?Mck^<7DVOM82J@iOh}mUc1b4RX!_VG$97nd)|hN(wTZg)gK^L_o+OY+avgFUrrb z_dk3R^J-BR>*^ggbs>p)FV8M3)z7(9XZ@K@nhF@qVOPSI5Z_;`t>7V!6wio%`?=P> zA3pu2HQ3fOOioq8(0B+>0w&hyr!z(7uq*-D9-a>d!)pV>lgu3#<6WMedPCPuFCab# zfSWZH-uC*6wktK|<%Vu;{QXK_`-vYrg7FTH%p?t$ZjC~bI4mJpWT7z$sG36^%FIZv zjn(W8V7$*Fn|I;FwAEE~>4te|Dxga-4h2KwAqW6=g~PIlDMA(iFxz8Gh+v}2@nwv| z{_|(`Ig88U z%-%Ny0HAWkqWLbWYDiTyjEIJ7LTO$Sn$F*e42=4Y zwjJNqu+UBx&J;-%$5e;!r^&ELn(+IpY_e?4oS!pp)0T!Qkdf#F1JK<+Mx3!##qTsP zUG&@%p0g~mVbT}eef!?vhrU2Kn{nKoz45Fth%o?ba^f&J9>kEBT0b&DOv1B6Yh(lH4dhQNwwkZ<1V>QD&5vpGVo|a|^hIHgFiABV;(0R{` zR|+$w;{0^28<*3^uZbcVE|zw(r3W-b^98;e$VZ)-gBS*1HciDJ$>!YH7P5%l`C5O zT5zU1RmBKKOo<2(5#OJqeXYj^t~PZ82t^YlqTmdet=@g?&6^GTF9WaxQ0GL6Mv|Ov zB_X3AA?O|U21fh50QBfwN1{+4fCv%MqNRy3Ce4A(LT%lQu} WX +#include +#include +#include + +static QUrl startupUrl() +{ + QUrl ret; + QStringList args(qApp->arguments()); + args.takeFirst(); + for (const QString &arg : qAsConst(args)) { + if (arg.startsWith(QLatin1Char('-'))) + continue; + ret = Utils::fromUserInput(arg); + if (ret.isValid()) + return ret; + } + return QUrl(QStringLiteral("https://www.qt.io")); +} + +int main(int argc, char **argv) +{ + QCoreApplication::setOrganizationName("QtExamples"); + QtWebEngineQuick::initialize(); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine appEngine; + Utils utils; + appEngine.rootContext()->setContextProperty("utils", &utils); + appEngine.load(QUrl("qrc:/ApplicationRoot.qml")); + if (!appEngine.rootObjects().isEmpty()) + QMetaObject::invokeMethod(appEngine.rootObjects().first(), "load", Q_ARG(QVariant, startupUrl())); + else + qFatal("Failed to load sources"); + + return app.exec(); +} diff --git a/tests/examples/quicknanobrowser/resources.qrc b/tests/examples/quicknanobrowser/resources.qrc new file mode 100644 index 00000000..9d1f927d --- /dev/null +++ b/tests/examples/quicknanobrowser/resources.qrc @@ -0,0 +1,16 @@ + + + ApplicationRoot.qml + BrowserDialog.qml + BrowserWindow.qml + DownloadView.qml + FindBar.qml + FullScreenNotification.qml + + + icons/3rdparty/go-next.png + icons/3rdparty/go-previous.png + icons/3rdparty/process-stop.png + icons/3rdparty/view-refresh.png + + diff --git a/tests/examples/quicknanobrowser/utils.h b/tests/examples/quicknanobrowser/utils.h new file mode 100644 index 00000000..79aa38cc --- /dev/null +++ b/tests/examples/quicknanobrowser/utils.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef UTILS_H +#define UTILS_H + +#include +#include + +class Utils : public QObject { + Q_OBJECT +public: + Q_INVOKABLE static QUrl fromUserInput(const QString& userInput); +}; + +inline QUrl Utils::fromUserInput(const QString& userInput) +{ + QFileInfo fileInfo(userInput); + if (fileInfo.exists()) + return QUrl::fromLocalFile(fileInfo.absoluteFilePath()); + return QUrl::fromUserInput(userInput); +} + +#endif // UTILS_H diff --git a/tests/examples/virtualkeyboard/CMakeLists.txt b/tests/examples/virtualkeyboard/CMakeLists.txt new file mode 100644 index 00000000..e04da6ad --- /dev/null +++ b/tests/examples/virtualkeyboard/CMakeLists.txt @@ -0,0 +1,3 @@ +if(TARGET Qt::QuickControls2) + qt_internal_add_example(basic) +endif() diff --git a/tests/examples/virtualkeyboard/basic/.prev_CMakeLists.txt b/tests/examples/virtualkeyboard/basic/.prev_CMakeLists.txt new file mode 100644 index 00000000..cc153191 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/.prev_CMakeLists.txt @@ -0,0 +1,80 @@ +# Generated from basic.pro. + +cmake_minimum_required(VERSION 3.14) +project(basic LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/virtualkeyboard/basic") + +find_package(Qt6 COMPONENTS Core) +find_package(Qt6 COMPONENTS Gui) +find_package(Qt6 COMPONENTS Qml) +find_package(Qt6 COMPONENTS Quick) + +qt_add_executable(basic + main.cpp +) +set_target_properties(basic PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) +target_link_libraries(basic PUBLIC + Qt::Core + Qt::Gui + Qt::Qml + Qt::Quick +) + + +# Resources: +set(demo_resource_files + "Basic.qml" + "basic-b2qt.qml" + "content/AutoScroller.qml" + "content/FloatingButton_Active.svg" + "content/FloatingButton_Available.svg" + "content/FloatingButton_Unavailable.svg" + "content/HandwritingModeButton.qml" + "content/TextArea.qml" + "content/TextField.qml" +) + +qt6_add_resources(basic "demo" + PREFIX + "/" + FILES + ${demo_resource_files} +) + +if(NOT QT_BUILD_SHARED_LIBS) + target_link_libraries(basic PUBLIC + Qt::Svg + ) +endif() + +if(NOT QT_FEATURE_vkb_desktop) + target_compile_definitions(basic PUBLIC + MAIN_QML=\\\"basic-b2qt.qml\\\" + ) +endif() + +if(QT_FEATURE_vkb_desktop) + target_compile_definitions(basic PUBLIC + MAIN_QML=\\\"Basic.qml\\\" + ) +endif() + +install(TARGETS basic + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/examples/virtualkeyboard/basic/Basic.qml b/tests/examples/virtualkeyboard/basic/Basic.qml new file mode 100644 index 00000000..2fb42197 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/Basic.qml @@ -0,0 +1,146 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls +import QtQuick.VirtualKeyboard +import "content" + +Rectangle { + width: 1280 + height: 720 + color: "#F6F6F6" + + // Only set with CONFIG+=disable-desktop. + property bool handwritingInputPanelActive: false + + Flickable { + id: flickable + anchors.fill: parent + contentWidth: content.width + contentHeight: content.height + interactive: contentHeight > height + flickableDirection: Flickable.VerticalFlick + + property real scrollMarginVertical: 20 + + ScrollBar.vertical: ScrollBar {} + + MouseArea { + id: content + width: flickable.width + height: textEditors.height + 24 + + onClicked: focus = true + + Column { + id: textEditors + spacing: 15 + x: 12 + y: 12 + width: parent.width - 26 + + Label { + color: "#565758" + text: "Tap fields to enter text" + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: 22 + } + TextField { + width: parent.width + placeholderText: "One line field" + enterKeyAction: EnterKeyAction.Next + onAccepted: passwordField.focus = true + } + TextField { + id: passwordField + width: parent.width + echoMode: TextInput.Password + placeholderText: "Password field" + inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText + enterKeyAction: EnterKeyAction.Next + onAccepted: upperCaseField.focus = true + } + TextField { + id: upperCaseField + width: parent.width + placeholderText: "Upper case field" + inputMethodHints: Qt.ImhUppercaseOnly + enterKeyAction: EnterKeyAction.Next + onAccepted: lowerCaseField.focus = true + } + TextField { + id: lowerCaseField + width: parent.width + placeholderText: "Lower case field" + inputMethodHints: Qt.ImhLowercaseOnly + enterKeyAction: EnterKeyAction.Next + onAccepted: phoneNumberField.focus = true + } + TextField { + id: phoneNumberField + validator: RegularExpressionValidator { regularExpression: /^[0-9\+\-\#\*\ ]{6,}$/ } + width: parent.width + placeholderText: "Phone number field" + inputMethodHints: Qt.ImhDialableCharactersOnly + enterKeyAction: EnterKeyAction.Next + onAccepted: formattedNumberField.focus = true + } + TextField { + id: formattedNumberField + width: parent.width + placeholderText: "Formatted number field" + inputMethodHints: Qt.ImhFormattedNumbersOnly + enterKeyAction: EnterKeyAction.Next + onAccepted: digitsField.focus = true + } + TextField { + id: digitsField + width: parent.width + placeholderText: "Digits only field" + inputMethodHints: Qt.ImhDigitsOnly + enterKeyAction: EnterKeyAction.Next + onAccepted: textArea.focus = true + } + TextArea { + id: textArea + width: parent.width + placeholderText: "Multiple line field" + height: Math.max(206, implicitHeight) + } + } + } + } + + // Hide the text fields' cursors when fullscreen handwriting is active. + MouseArea { + anchors.fill: parent + visible: handwritingInputPanelActive + } +} diff --git a/tests/examples/virtualkeyboard/basic/CMakeLists.txt b/tests/examples/virtualkeyboard/basic/CMakeLists.txt new file mode 100644 index 00000000..8be9b50d --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/CMakeLists.txt @@ -0,0 +1,73 @@ +cmake_minimum_required(VERSION 3.16) +project(basic LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/virtualkeyboard/basic") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Quick) + +qt_add_executable(basic + main.cpp +) + +set_target_properties(basic PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(basic PUBLIC + Qt::Core + Qt::Gui + Qt::Qml + Qt::Quick +) + +# Resources: +set(demo_resource_files + "Basic.qml" + "basic-b2qt.qml" + "content/AutoScroller.qml" + "content/FloatingButton_Active.svg" + "content/FloatingButton_Available.svg" + "content/FloatingButton_Unavailable.svg" + "content/HandwritingModeButton.qml" + "content/TextArea.qml" + "content/TextField.qml" +) + +qt6_add_resources(basic "demo" + PREFIX + "/" + FILES + ${demo_resource_files} +) + +if(QT_FEATURE_static) + find_package(Qt6 REQUIRED COMPONENTS Svg) + target_link_libraries(basic PUBLIC + Qt::Svg + ) +endif() + +if(NOT QT_FEATURE_vkb_desktop) + target_compile_definitions(basic PUBLIC + MAIN_QML="basic-b2qt.qml" + ) +endif() + +if(QT_FEATURE_vkb_desktop) + target_compile_definitions(basic PUBLIC + MAIN_QML="Basic.qml" + ) +endif() + +install(TARGETS basic + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/examples/virtualkeyboard/basic/basic-b2qt.qml b/tests/examples/virtualkeyboard/basic/basic-b2qt.qml new file mode 100644 index 00000000..274599cb --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/basic-b2qt.qml @@ -0,0 +1,172 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +// Deliberately imported after QtQuick to avoid missing restoreMode property in Binding. Fix in Qt 6. +import QtQml +import QtQuick.Window +import QtQuick.VirtualKeyboard +import QtQuick.VirtualKeyboard.Settings +import "content" + +Item { + width: 1280 + height: 720 + + Item { + id: appContainer + width: Screen.orientation === Qt.LandscapeOrientation ? parent.width : parent.height + height: Screen.orientation === Qt.LandscapeOrientation ? parent.height : parent.width + anchors.centerIn: parent + Basic { + id: virtualKeyboard + anchors.left: parent.left + anchors.top: parent.top + anchors.right: parent.right + anchors.bottom: parent.bottom + handwritingInputPanelActive: handwritingInputPanel.available && handwritingInputPanel.active + } + + /* Handwriting input panel for full screen handwriting input. + + This component is an optional add-on for the InputPanel component, that + is, its use does not affect the operation of the InputPanel component, + but it also can not be used as a standalone component. + + The handwriting input panel is positioned to cover the entire area of + application. The panel itself is transparent, but once it is active the + user can draw handwriting on it. + */ + HandwritingInputPanel { + z: 79 + id: handwritingInputPanel + anchors.fill: parent + inputPanel: inputPanel + Rectangle { + z: -1 + anchors.fill: parent + color: "black" + opacity: 0.10 + } + } + + /* Container area for the handwriting mode button. + + Handwriting mode button can be moved freely within the container area. + In this example, a single click changes the handwriting mode and a + double-click changes the availability of the full screen handwriting input. + */ + Item { + z: 99 + visible: handwritingInputPanel.enabled && Qt.inputMethod.visible + anchors { left: parent.left; top: parent.top; right: parent.right; bottom: inputPanel.top; } + HandwritingModeButton { + id: handwritingModeButton + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 10 + floating: true + flipable: true + width: 76 + height: width + state: handwritingInputPanel.state + onClicked: handwritingInputPanel.active = !handwritingInputPanel.active + onDoubleClicked: handwritingInputPanel.available = !handwritingInputPanel.available + } + } + + /* Keyboard input panel. + + The keyboard is anchored to the bottom of the application. + */ + InputPanel { + id: inputPanel + z: 89 + y: yPositionWhenHidden + x: Screen.orientation === Qt.LandscapeOrientation ? 0 : (parent.width-parent.height) / 2 + width: Screen.orientation === Qt.LandscapeOrientation ? parent.width : parent.height + + keyboard.shadowInputControl.height: (Screen.orientation === Qt.LandscapeOrientation ? parent.height : parent.width) - keyboard.height + + property real yPositionWhenHidden: Screen.orientation === Qt.LandscapeOrientation ? parent.height : parent.width + (parent.height-parent.width) / 2 + + states: State { + name: "visible" + /* The visibility of the InputPanel can be bound to the Qt.inputMethod.visible property, + but then the handwriting input panel and the keyboard input panel can be visible + at the same time. Here the visibility is bound to InputPanel.active property instead, + which allows the handwriting panel to control the visibility when necessary. + */ + when: inputPanel.active + PropertyChanges { + target: inputPanel + y: inputPanel.yPositionWhenHidden - inputPanel.height + } + } + transitions: Transition { + id: inputPanelTransition + from: "" + to: "visible" + reversible: true + enabled: !VirtualKeyboardSettings.fullScreenMode + ParallelAnimation { + NumberAnimation { + properties: "y" + duration: 250 + easing.type: Easing.InOutQuad + } + } + } + Binding { + target: InputContext + property: "animating" + value: inputPanelTransition.running + restoreMode: Binding.RestoreBinding + + } + AutoScroller {} + } + + Binding { + target: VirtualKeyboardSettings + property: "fullScreenMode" + value: appContainer.height > 0 && (appContainer.width / appContainer.height) > (16.0 / 9.0) + restoreMode: Binding.RestoreBinding + } + + } + + property bool inLandscapeOrientation: Screen.orientation === Qt.LandscapeOrientation + + Binding { + target: appContainer.Window.window !== null ? appContainer.Window.window.contentItem : null + property: "rotation" + value: inLandscapeOrientation ? 0 : 90 + } +} diff --git a/tests/examples/virtualkeyboard/basic/basic.pro b/tests/examples/virtualkeyboard/basic/basic.pro new file mode 100644 index 00000000..ed471dbb --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/basic.pro @@ -0,0 +1,32 @@ +TEMPLATE = app +TARGET = basic +QT += qml quick + +QT_FOR_CONFIG += virtualkeyboard + +SOURCES += main.cpp +CONFIG += link_pkgconfig +contains(CONFIG, static) { + QT += svg + QTPLUGIN += qtvirtualkeyboardplugin +} + +target.path = $$[QT_INSTALL_EXAMPLES]/virtualkeyboard/basic +INSTALLS += target + +RESOURCES += \ + demo.qrc + +OTHER_FILES += \ + Basic.qml \ + basic-b2qt.qml \ + content/AutoScroller.qml \ + content/HandwritingModeButton.qml \ + content/TextArea.qml \ + content/TextField.qml \ + +!qtConfig(vkb-desktop) { + DEFINES += MAIN_QML=\\\"basic-b2qt.qml\\\" +} else { + DEFINES += MAIN_QML=\\\"Basic.qml\\\" +} diff --git a/tests/examples/virtualkeyboard/basic/content/AutoScroller.qml b/tests/examples/virtualkeyboard/basic/content/AutoScroller.qml new file mode 100644 index 00000000..529791d1 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/content/AutoScroller.qml @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.VirtualKeyboard + +Item { + + property var innerFlickable + property var outerFlickable + property var inputItem: InputContext.priv.inputItem + + onInputItemChanged: { + innerFlickable = null + outerFlickable = null + if (inputItem !== null) { + var parent_ = inputItem.parent + while (parent_) { + if (parent_.maximumFlickVelocity) { + if (innerFlickable) { + outerFlickable = parent_ + break + } else { + innerFlickable = parent_ + } + } + parent_ = parent_.parent + } + delayedLoading.restart() + } + } + + function ensureVisible(flickable) { + if (Qt.inputMethod.visible && inputItem && flickable && flickable.visible && flickable.interactive) { + + var verticallyFlickable = (flickable.flickableDirection === Flickable.HorizontalAndVerticalFlick || flickable.flickableDirection === Flickable.VerticalFlick + || (flickable.flickableDirection === Flickable.AutoFlickDirection && flickable.contentHeight > flickable.height)) + var horizontallyFlickable = (flickable.flickableDirection === Flickable.HorizontalAndVerticalFlick || flickable.flickableDirection === Flickable.HorizontalFlick + || (flickable.flickableDirection === Flickable.AutoFlickDirection && flickable.contentWidth > flickable.width)) + + if ((!verticallyFlickable && !horizontallyFlickable) || !inputItem.hasOwnProperty("cursorRectangle")) + return + + var cursorRectangle = flickable.contentItem.mapFromItem(inputItem, inputItem.cursorRectangle.x, inputItem.cursorRectangle.y) + + var oldContentY = flickable.contentY + if (verticallyFlickable) { + var scrollMarginVertical = (flickable && flickable.scrollMarginVertical) ? flickable.scrollMarginVertical : 10 + if (flickable.contentY >= cursorRectangle.y - scrollMarginVertical) + flickable.contentY = Math.max(0, cursorRectangle.y - scrollMarginVertical) + else if (flickable.contentY + flickable.height <= cursorRectangle.y + inputItem.cursorRectangle.height + scrollMarginVertical) + flickable.contentY = Math.min(flickable.contentHeight - flickable.height, cursorRectangle.y + inputItem.cursorRectangle.height - flickable.height + scrollMarginVertical) + } + if (horizontallyFlickable) { + var scrollMarginHorizontal = (flickable && flickable.scrollMarginHorizontal) ? flickable.scrollMarginHorizontal : 10 + if (flickable.contentX >= cursorRectangle.x - scrollMarginHorizontal) + flickable.contentX = Math.max(0, cursorRectangle.x - scrollMarginHorizontal) + else if (flickable.contentX + flickable.width <= cursorRectangle.x + inputItem.cursorRectangle.width + scrollMarginHorizontal) + flickable.contentX = Math.min(flickable.contentWidth - flickable.width, cursorRectangle.x + inputItem.cursorRectangle.width - flickable.width + scrollMarginHorizontal) + } + } + } + Timer { + id: delayedLoading + interval: 10 + onTriggered: { + ensureVisible(innerFlickable) + ensureVisible(outerFlickable) + } + } + Connections { + ignoreUnknownSignals: true + target: Qt.inputMethod + function onAnimatingChanged() { if (inputItem && !Qt.inputMethod.animating) delayedLoading.restart() } + function onKeyboardRectangleChanged() { if (inputItem) delayedLoading.restart() } + function onCursorRectangleChanged() { if (inputItem && inputItem.activeFocus) delayedLoading.restart() } + } +} diff --git a/tests/examples/virtualkeyboard/basic/content/FloatingButton_Active.svg b/tests/examples/virtualkeyboard/basic/content/FloatingButton_Active.svg new file mode 100644 index 00000000..ef108358 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/content/FloatingButton_Active.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/virtualkeyboard/basic/content/FloatingButton_Available.svg b/tests/examples/virtualkeyboard/basic/content/FloatingButton_Available.svg new file mode 100644 index 00000000..1178c8c6 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/content/FloatingButton_Available.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg b/tests/examples/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg new file mode 100644 index 00000000..d8149b53 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/content/FloatingButton_Unavailable.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/virtualkeyboard/basic/content/HandwritingModeButton.qml b/tests/examples/virtualkeyboard/basic/content/HandwritingModeButton.qml new file mode 100644 index 00000000..21ac3444 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/content/HandwritingModeButton.qml @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick + +Item { + id: handwritingModeButton + state: "unavailable" + property bool floating + property bool flipable + readonly property real __minWidthHeight: Math.min(width, height) + + signal clicked() + signal doubleClicked() + + Flipable { + id: flipableImage + anchors.fill: parent + + property bool flipped + + front: Image { + sourceSize.width: handwritingModeButton.__minWidthHeight + sourceSize.height: handwritingModeButton.__minWidthHeight + smooth: false + source: "qrc:/content/FloatingButton_Unavailable.svg" + } + + back: Image { + id: buttonImage + sourceSize.width: handwritingModeButton.__minWidthHeight + sourceSize.height: handwritingModeButton.__minWidthHeight + smooth: false + source: "qrc:/content/FloatingButton_Available.svg" + } + + states: State { + PropertyChanges { target: rotation; angle: 180 } + when: flipableImage.flipped + } + + transform: Rotation { + id: rotation + origin.x: flipableImage.width / 2 + origin.y: flipableImage.height / 2 + axis { x: 0; y: 1; z: 0 } + angle: 0 + } + + transitions: Transition { + enabled: handwritingModeButton.flipable + NumberAnimation { target: rotation; property: "angle"; duration: 400 } + } + } + + states: [ + State { + name: "available" + PropertyChanges { target: flipableImage; flipped: true } + }, + State { + name: "active" + PropertyChanges { target: flipableImage; flipped: true } + PropertyChanges { target: buttonImage; source: "qrc:/content/FloatingButton_Active.svg" } + } + ] + + function snapHorizontal() { + if (!floating) + return + if (mouseArea.drag.maximumX > mouseArea.drag.minimumX) { + if (x + 20 >= mouseArea.drag.maximumX) { + anchors.left = undefined + anchors.right = parent.right + } else if (x - 20 <= mouseArea.drag.minimumX) { + anchors.right = undefined + anchors.left = parent.left + } + } + } + + function snapVertical() { + if (!floating) + return + if (mouseArea.drag.maximumY > mouseArea.drag.minimumY) { + if (y + 20 >= mouseArea.drag.maximumY) { + anchors.top = undefined + anchors.bottom = parent.bottom + } else if (y - 20 <= mouseArea.drag.minimumY) { + anchors.bottom = undefined + anchors.top = parent.top + } + } + } + + MouseArea { + id: mouseArea + anchors.fill: parent + drag { + target: handwritingModeButton.floating ? handwritingModeButton : undefined + axis: Drag.XAxis | Drag.YAxis + minimumX: 0 + maximumX: handwritingModeButton.parent.width - handwritingModeButton.width + onMaximumXChanged: !mouseArea.drag.active && handwritingModeButton.snapHorizontal() + minimumY: 0 + maximumY: handwritingModeButton.parent.height - handwritingModeButton.height + onMaximumYChanged: !mouseArea.drag.active && handwritingModeButton.snapVertical() + } + onPressed: { + if (!handwritingModeButton.floating) + return + handwritingModeButton.anchors.left = undefined + handwritingModeButton.anchors.top = undefined + handwritingModeButton.anchors.right = undefined + handwritingModeButton.anchors.bottom = undefined + } + onReleased: { + handwritingModeButton.snapHorizontal() + handwritingModeButton.snapVertical() + } + onClicked: { + handwritingModeButton.snapHorizontal() + handwritingModeButton.snapVertical() + clickTimer.restart() + } + onDoubleClicked: { + clickTimer.stop() + handwritingModeButton.snapHorizontal() + handwritingModeButton.snapVertical() + handwritingModeButton.doubleClicked() + } + Timer { + id: clickTimer + interval: Qt.styleHints ? Qt.styleHints.mouseDoubleClickInterval / 3 : 0 + repeat: false + onTriggered: handwritingModeButton.clicked() + } + } +} diff --git a/tests/examples/virtualkeyboard/basic/content/TextArea.qml b/tests/examples/virtualkeyboard/basic/content/TextArea.qml new file mode 100644 index 00000000..bc83310f --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/content/TextArea.qml @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls as Controls +import QtQuick.VirtualKeyboard + +Controls.TextArea { + id: control + color: "#2B2C2E" + selectionColor: Qt.rgba(0.0, 0.0, 0.0, 0.15) + selectedTextColor: color + selectByMouse: true + font.pixelSize: Qt.application.font.pixelSize * 2 + + property int enterKeyAction: EnterKeyAction.None + readonly property bool enterKeyEnabled: enterKeyAction === EnterKeyAction.None || text.length > 0 || inputMethodComposing + + EnterKeyAction.actionId: control.enterKeyAction + EnterKeyAction.enabled: control.enterKeyEnabled + + background: Rectangle { + color: "#FFFFFF" + border.width: 1 + border.color: control.activeFocus ? "#5CAA15" : "#BDBEBF" + } +} diff --git a/tests/examples/virtualkeyboard/basic/content/TextField.qml b/tests/examples/virtualkeyboard/basic/content/TextField.qml new file mode 100644 index 00000000..16ed0cdd --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/content/TextField.qml @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls as Controls +import QtQuick.VirtualKeyboard + +Controls.TextField { + id: control + color: "#2B2C2E" + selectionColor: Qt.rgba(0.0, 0.0, 0.0, 0.15) + selectedTextColor: color + selectByMouse: true + font.pixelSize: Qt.application.font.pixelSize * 2 + + property int enterKeyAction: EnterKeyAction.None + readonly property bool enterKeyEnabled: enterKeyAction === EnterKeyAction.None || acceptableInput || inputMethodComposing + + EnterKeyAction.actionId: control.enterKeyAction + EnterKeyAction.enabled: control.enterKeyEnabled + + background: Rectangle { + color: "#FFFFFF" + border.width: 1 + border.color: control.activeFocus ? "#5CAA15" : "#BDBEBF" + } +} diff --git a/tests/examples/virtualkeyboard/basic/demo.qrc b/tests/examples/virtualkeyboard/basic/demo.qrc new file mode 100644 index 00000000..52706522 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/demo.qrc @@ -0,0 +1,13 @@ + + + content/AutoScroller.qml + content/TextArea.qml + content/TextField.qml + content/HandwritingModeButton.qml + content/FloatingButton_Active.svg + content/FloatingButton_Available.svg + content/FloatingButton_Unavailable.svg + Basic.qml + basic-b2qt.qml + + diff --git a/tests/examples/virtualkeyboard/basic/main.cpp b/tests/examples/virtualkeyboard/basic/main.cpp new file mode 100644 index 00000000..883808b8 --- /dev/null +++ b/tests/examples/virtualkeyboard/basic/main.cpp @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); + + QGuiApplication app(argc, argv); + QQuickView view(QString("qrc:/%2").arg(MAIN_QML)); + if (view.status() == QQuickView::Error) + return -1; + view.setResizeMode(QQuickView::SizeRootObjectToView); + + view.show(); + + return app.exec(); +} diff --git a/tests/examples/virtualkeyboard/virtualkeyboard.pro b/tests/examples/virtualkeyboard/virtualkeyboard.pro new file mode 100644 index 00000000..8d129b25 --- /dev/null +++ b/tests/examples/virtualkeyboard/virtualkeyboard.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs + +qtHaveModule(quickcontrols2): SUBDIRS += basic diff --git a/tests/examples/webui/CMakeLists.txt b/tests/examples/webui/CMakeLists.txt new file mode 100644 index 00000000..e736a2cd --- /dev/null +++ b/tests/examples/webui/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.16) +project(webui LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/webenginewidgets/webui") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui WebEngineWidgets) + +qt_add_executable(webui + main.cpp + webuihandler.cpp webuihandler.h +) + +set_target_properties(webui PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(webui PUBLIC + Qt::Core + Qt::Gui + Qt::WebEngineWidgets +) + +# Resources: +set(webui_resource_files + "about.html" +) + +qt_add_resources(webui "webui" + PREFIX + "/" + FILES + ${webui_resource_files} +) + +install(TARGETS webui + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/examples/webui/about.html b/tests/examples/webui/about.html new file mode 100644 index 00000000..7b5a5896 --- /dev/null +++ b/tests/examples/webui/about.html @@ -0,0 +1,129 @@ + + + + Qt WebEngine WebUI Example + + + +

+ +

WebEngine Widgets
WebUI Example

+
+
+

+ Aside from the built-in schemes, such as http and + qrc, Qt WebEngine may be extended with custom + schemes by creating custom scheme handlers. +

+ +

+ This is a simple HTML page loaded from a custom scheme and + displayed by a QWebEngineView. Even the Quit button + below is a standard HTML <button> element. +

+ +

+ Read the documentation to find out +

+
    +
  • +

    + How to create a custom scheme handler which serves HTML + and handles HTML form submissions. +

    +
  • +
  • +

    + How to prevent ordinary web content from accessing the + custom scheme. +

    +
  • +
  • +

    + How to prevent any other scheme from submitting HTML + form data. +

    +
  • +
+
+
+
+ +
+
+ + diff --git a/tests/examples/webui/doc/images/webui-example.png b/tests/examples/webui/doc/images/webui-example.png new file mode 100644 index 0000000000000000000000000000000000000000..84e2c7fc32fa600f4df768455519b7341d439f5f GIT binary patch literal 28862 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 literal 0 HcmV?d00001 diff --git a/tests/examples/webui/doc/src/webui.qdoc b/tests/examples/webui/doc/src/webui.qdoc new file mode 100644 index 00000000..949b358a --- /dev/null +++ b/tests/examples/webui/doc/src/webui.qdoc @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example webenginewidgets/webui + \title WebEngine Widgets WebUI Example + \ingroup webengine-widgetexamples + \brief Displays HTML over a custom scheme. + + \image webui-example.png + + \e {WebUI} demonstrates how to implement a custom scheme in a secure way. + + Aside from the built-in URL schemes, such as \c {http} and \c {qrc}, + \QWE may be extended with \e {custom schemes} by creating \e {custom + scheme handlers}. This example shows: + + \list + \li How to create a custom scheme handler which serves HTML and handles + HTML form submissions. + \li How to prevent ordinary web content from accessing the custom scheme. + \li How to prevent any other scheme from submitting HTML form data. + \endlist + + \include examples-run.qdocinc + + \section1 Overview + + The example program consists of a single \l {QWebEngineView} showing a + simple HTML page loaded from the URL \c {webui:about}, over our custom + scheme. Pressing the button at the bottom of the page will trigger an HTML + form submission via POST to the same URL, at which point our custom scheme + handler will cause the application to exit. + + The program is divided into two parts, the \c {main} function for setting + everything up, and the \c {WebUiHandler} class for implementing our custom + scheme handler. The \c {main} function is quite short: + + \quotefromfile webenginewidgets/webui/main.cpp + \skipto int main + \printuntil /^\}/ + + Aside from the relatively standard setup of widgets, two points are + noteworthy. First, we call the static method \c + {WebUiHandler::registerUrlScheme()} to register our custom scheme with the + web engine. Second, we create and install our custom scheme handler \c + {WebUiHandler} using \l + {QWebEngineProfile::installUrlSchemeHandler()}{installUrlSchemeHandler()}. + The following sections describe these aspects in more detail. + + \section1 Registering the Scheme + + As custom schemes are integrated directly into the web engine, they do not + necessarily need to follow the standard security rules which apply to + ordinary web content. Depending on the chosen configuration, content served + over a custom scheme may be given access to local resources, be set to + ignore Content-Security-Policy rules, or conversely, be denied access to any + other content entirely. + + In order to take advantage of these possibilities, the custom scheme must + first be registered. This means creating and configuring a \l + {QWebEngineUrlScheme} object and then handing it over to \l + {QWebEngineUrlScheme::registerScheme()}. The example program does exactly this in + the static method \c {WebUiHandler::registerUrlScheme()}: + + \quotefromfile webenginewidgets/webui/webuihandler.cpp + \skipto void WebUiHandler::registerUrlScheme + \printuntil /^\}/ + + A custom scheme needs a name, which can be set by passing it to + the constructor of \c {QWebEngineUrlScheme} or by calling \l + {QWebEngineUrlScheme::setName}. In the above, the name \c {webui} is set + through the constructor. Additionally, we activate the flags \l + {QWebEngineUrlScheme::SecureScheme}{SecureScheme}, \l + {QWebEngineUrlScheme::LocalScheme}{LocalScheme} and \l + {QWebEngineUrlScheme::LocalAccessAllowed}{LocalAccessAllowed}. Since our + custom scheme handler will not deliver resources received from insecure + network connections, we can safely mark it as a \c {SecureScheme}. The \c {LocalScheme} + flag prevents content from non-local schemes (such as \c {http}) from + interacting with our custom scheme. Without this flag it would be possible, + for example, to embed the \c {webui:about} page in an \c