From 1ac5a4167fb027c5190d53a085f299e608ef5588 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 10 Feb 2024 15:53:02 +0200 Subject: [PATCH] Support for AppImage. --- .cirrus.yml | 50 ++ dist/ua.com.smart-pattern.puzzle.desktop | 4 +- dist/ua.com.smart-pattern.tape.desktop | 4 +- dist/ua.com.smart-pattern.valentina.desktop | 6 +- qbs/imports/VToolApp.qbs | 15 - qbs/modules/buildconfig/buildconfig.qbs | 1 + scripts/appimage-deploy.sh | 34 + scripts/deploy.py | 3 +- src/app/puzzle/layout/vppiece.cpp | 5 + src/app/puzzle/main.cpp | 18 - src/app/puzzle/puzzle.qbs | 16 + src/app/tape/main.cpp | 18 - src/app/tape/mapplication.cpp | 4 - src/app/tape/tape.qbs | 16 + src/app/valentina/main.cpp | 18 - src/app/valentina/valentina.qbs | 25 +- src/libs/vlayout/vfoldline.cpp | 6 +- src/libs/vlayout/vlayoutpiece.cpp | 5 + src/libs/vlayout/vsapoint.h | 12 +- src/libs/vmisc/appimage.cpp | 46 +- src/libs/vmisc/appimage.h | 2 - src/libs/vmisc/binreloc.c | 758 ------------------ src/libs/vmisc/binreloc.h | 89 -- src/libs/vmisc/svgfont/vsvgfontdatabase.cpp | 10 +- src/libs/vmisc/vabstractapplication.cpp | 41 +- src/libs/vmisc/vabstractapplication.h | 1 + src/libs/vmisc/vmisc.pri | 2 - src/libs/vmisc/vmisc.qbs | 4 +- .../floatItemData/vabstractfloatitemdata.cpp | 5 + src/libs/vwidgets/vpiecegrainline.cpp | 5 + 30 files changed, 238 insertions(+), 985 deletions(-) create mode 100755 scripts/appimage-deploy.sh delete mode 100644 src/libs/vmisc/binreloc.c delete mode 100644 src/libs/vmisc/binreloc.h diff --git a/.cirrus.yml b/.cirrus.yml index 5b7130f80..58e5a2e03 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -111,6 +111,34 @@ linux_qt5_qbs_task_template: &LINUX_QT5_QBS_TASK_TEMPLATE - qbs -p autotest-runner -d build profile:qt5 config:release - ccache -s +linuxdeployqt_task_template: &LINUXDEPLOYQT_TASK_TEMPLATE + - bash -c "$PACKAGE_MANAGER_INSTALL qt515base qt515svg qt515tools qt515xmlpatterns qt515translations qt515doc qt515imageformats poppler-utils git xvfb ccache build-essential" + build_script: + - uname -a + - mkdir -pm 0700 $XDG_RUNTIME_DIR + - Xvfb $DISPLAY -ac -screen 0 1600x1200x24+32 -nolisten tcp -nolisten unix & + - sleep 1 + - ccache --set-config sloppiness=pch_defines,time_macros max_size="$CCACHE_SIZE" + - echo $PATH + - which qmake + - which qbs + - pwd + - ls -l /usr/bin/ | grep -E "${COMPILER_REGEX}" + - ${COMPILER} --version + - qmake --version + - qbs --version + - qbs setup-toolchains /usr/bin/${COMPILER} ${COMPILER} + - qbs setup-qt /opt/qt515/bin/qmake qt5 + - qbs config defaultProfile qt5 + - qbs config profiles.qt5.baseProfile ${COMPILER} + - qbs build -f valentina.qbs -d $CIRRUS_WORKING_DIR/build --jobs $(nproc) profile:qt5 config:release modules.buildconfig.enableCcache:${ENABLE_CCACHE} modules.cpp.linkerVariant:mold qbs.installRoot:$CIRRUS_WORKING_DIR/build/install-root modules.buildconfig.enableAppImage:true + - qbs -p autotest-runner -d build profile:qt5 config:release + - linuxdeployqt $CIRRUS_WORKING_DIR/build/install-root/usr/local/share/applications/ua.com.smart-pattern.valentina.desktop -appimage -qmake='/opt/qt515/bin/qmake' -executable-dir=$CIRRUS_WORKING_DIR/build/install-root/usr/local/bin -extra-plugins=iconengines,platformthemes/libqgtk3.so + - ccache -s + deploy_script: + - pwd + - $CIRRUS_WORKING_DIR/scripts/appimage-deploy.sh + linux_task: << : *REGULER_TASK_TEMPLATE env: @@ -174,6 +202,28 @@ linux_task: container: cpu: 2 memory: 8G # Set to 8GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container + - container: + image: dismine/linuxdeployqt:latest + env: + COMPILER: gcc + QMAKE_SPEC: "linux-g++" + GCC_COLORS: 'error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + COMPILER_REGEX: "gcc|g\\+\\+" + matrix: + - name: 'AppImage' + << : *LINUXDEPLOYQT_TASK_TEMPLATE + env: + ACCESS_TOKEN: ENCRYPTED[81e0b2381ffb628b73f5c94f834010e6631191e0ad03cdd0850d440fb2737a74b68131d842030f010c1bf73ab4cdc1ae] + DEPLOY: "true" + QT_SELECT: "qt5" + ENABLE_CCACHE: true + VERSION: "continuous" + QT_VERSION: Qt6 + ARCH: x86_64 + TARGET_PLATFORM: "Linux" + container: + cpu: 4 + memory: 8G # Set to 8GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-container - container: image: dismine/gcc-ubuntu:latest env: diff --git a/dist/ua.com.smart-pattern.puzzle.desktop b/dist/ua.com.smart-pattern.puzzle.desktop index 7164788f4..abab0d7e6 100644 --- a/dist/ua.com.smart-pattern.puzzle.desktop +++ b/dist/ua.com.smart-pattern.puzzle.desktop @@ -2,7 +2,7 @@ Type=Application Name=Puzzle Exec=puzzle %F -Version=1.1 +Version=1.0 GenericName=Valentina's layout editor GenericName[uk]=Редактор розкладки Валентини Comment=Create and edit layouts @@ -12,5 +12,5 @@ Terminal=false MimeType=application/x-valentina-layout; Categories=Qt;Utility;FileTools; TryExec=puzzle -Keywords=layout;nesting +Keywords=layout;nesting; StartupWMClass=puzzle diff --git a/dist/ua.com.smart-pattern.tape.desktop b/dist/ua.com.smart-pattern.tape.desktop index 9e1ac9c96..b00fe39e6 100644 --- a/dist/ua.com.smart-pattern.tape.desktop +++ b/dist/ua.com.smart-pattern.tape.desktop @@ -2,7 +2,7 @@ Type=Application Name=Tape Exec=tape %F -Version=1.1 +Version=1.0 GenericName=Valentina's measurements editor GenericName[uk]=Редактор мірок Валентини Comment=Create and edit measurements @@ -12,5 +12,5 @@ Terminal=false MimeType=application/x-valentina-s-measurements;application/x-valentina-i-measurements;application/x-valentina-k-measurements Categories=Qt;Utility;FileTools; TryExec=tape -Keywords=measurements +Keywords=measurements; StartupWMClass=tape diff --git a/dist/ua.com.smart-pattern.valentina.desktop b/dist/ua.com.smart-pattern.valentina.desktop index 1e3e22a98..659408373 100644 --- a/dist/ua.com.smart-pattern.valentina.desktop +++ b/dist/ua.com.smart-pattern.valentina.desktop @@ -2,7 +2,7 @@ Type=Application Name=Valentina Exec=valentina %F -Version=1.1 +Version=1.0 GenericName=Pattern making program GenericName[uk]=Програма створення викрійок Comment=Creating pattern of clothes @@ -10,7 +10,7 @@ Comment[uk]=Створеня викрійок одягу Icon=valentina Terminal=false MimeType=application/x-valentina-pattern; -Categories=Graphics;VectorGraphics;2DGraphics;Qt;Engineering; +Categories=Graphics;VectorGraphics;2DGraphics;Qt;Engineering;FileTools; TryExec=valentina -Keywords=pattern +Keywords=pattern; StartupWMClass=valentina diff --git a/qbs/imports/VToolApp.qbs b/qbs/imports/VToolApp.qbs index ca0fe46e8..3a0d9aef0 100644 --- a/qbs/imports/VToolApp.qbs +++ b/qbs/imports/VToolApp.qbs @@ -33,21 +33,6 @@ VApp { cpp.dynamicLibraries: ["icudata", "icui18n", "icuuc"] } - Group { - name: "freedesktop" - prefix: project.sourceDirectory + "/dist/" - files: [ - "ua.com.smart-pattern." + product.targetName + ".desktop" - ] - } - - freedesktop2.desktopKeys: ({ - 'Exec': FileInfo.joinPaths(qbs.installPrefix, - product.installDir, - product.targetName) + ' %F', - 'X-Application-Version': product.version, - }) - Group { name: "Translations" condition: product.primaryApp || (qbs.targetOS.contains("macos") && (!bundle.isBundle || (bundle.isBundle && buildconfig.enableMultiBundle))) diff --git a/qbs/modules/buildconfig/buildconfig.qbs b/qbs/modules/buildconfig/buildconfig.qbs index 2899f8c04..86e3136a6 100644 --- a/qbs/modules/buildconfig/buildconfig.qbs +++ b/qbs/modules/buildconfig/buildconfig.qbs @@ -132,6 +132,7 @@ Module { if (enableAppImage && qbs.targetOS.contains("unix") && !qbs.targetOS.contains("macos")) defines.push('APPIMAGE'); + defines.push('APPIMAGE_QT_TRANSLATIONS="' + FileInfo.joinPaths(qbs.installPrefix, "translations") + '"'); if (enableMultiBundle) defines.push('MULTI_BUNDLE'); diff --git a/scripts/appimage-deploy.sh b/scripts/appimage-deploy.sh new file mode 100755 index 000000000..444321ba2 --- /dev/null +++ b/scripts/appimage-deploy.sh @@ -0,0 +1,34 @@ +print_error() { + echo "[CI] ERROR: $1" +} + + +print_info() { + echo "[CI] INFO: $1" +} + + +check_failure() { + if [ $? -ne 0 ] ; then + if [ -z $1 ] ; then + print_error $1 + else + print_error "Failure exit code is detected." + fi + exit 1 + fi +} + +if [[ "$DEPLOY" == "true" ]]; then + print_info "Start cleaning."; + python3 $CIRRUS_WORKING_DIR/scripts/deploy.py clean $ACCESS_TOKEN; + check_failure "Unable to clean stale artifacts."; + + print_info "Start uploading."; + python3 $CIRRUS_WORKING_DIR/scripts/deploy.py upload $ACCESS_TOKEN $CIRRUS_WORKING_DIR/Valentina-continuous-x86_64.AppImage "/0.7.x/Linux/valentina-${TARGET_PLATFORM}-${ARCH}-${CIRRUS_BRANCH}-${CIRRUS_CHANGE_IN_REPO}.AppImage"; + check_failure "Unable to upload Valentina's AppImage."; + + print_info "Successfully uploaded."; +else + print_info "No deployment needed."; +fi diff --git a/scripts/deploy.py b/scripts/deploy.py index 668cce501..2a88564ea 100644 --- a/scripts/deploy.py +++ b/scripts/deploy.py @@ -141,7 +141,8 @@ def run_clean(refresh_token): r'^valentina-macOS_10.13\+-Qt.*-x64-develop-[a-f0-9]{40}\.dmg$', r'^valentina-macOS_10.13\+-Qt.*-x64-develop-multibundle-[a-f0-9]{40}\.dmg$', r'^valentina-macOS.*\+-Qt.*-arm.*-develop-[a-f0-9]{40}\.dmg$', - r'^valentina-macOS.*\+-Qt.*-arm.*-develop-multibundle-[a-f0-9]{40}\.dmg$'] + r'^valentina-macOS.*\+-Qt.*-arm.*-develop-multibundle-[a-f0-9]{40}\.dmg$', + r'^valentina-Linux-x86_64-develop-[a-f0-9]{40}\.AppImage$'] item_types = {} diff --git a/src/app/puzzle/layout/vppiece.cpp b/src/app/puzzle/layout/vppiece.cpp index 445663865..59d8cf5e7 100644 --- a/src/app/puzzle/layout/vppiece.cpp +++ b/src/app/puzzle/layout/vppiece.cpp @@ -346,8 +346,13 @@ auto VPPiece::StickyPosition(qreal &dx, qreal &dy) const -> bool return false; } + QT_WARNING_PUSH + QT_WARNING_DISABLE_GCC("-Wnoexcept") + VStickyDistance match; + QT_WARNING_POP + if (!StickySheet(match)) { return false; diff --git a/src/app/puzzle/main.cpp b/src/app/puzzle/main.cpp index b4157f038..a4ac684ce 100644 --- a/src/app/puzzle/main.cpp +++ b/src/app/puzzle/main.cpp @@ -31,11 +31,6 @@ #include "vpapplication.h" -#if defined(APPIMAGE) && defined(Q_OS_LINUX) -#include "../vmisc/appimage.h" -#include -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif @@ -71,12 +66,6 @@ auto main(int argc, char *argv[]) -> int { -#if defined(APPIMAGE) && defined(Q_OS_LINUX) - /* Fix path to ICU_DATA when run AppImage.*/ - char *exe_dir = IcuDataPath("/../share/icu"); - auto FreeMemory = qScopeGuard([exe_dir] { free(exe_dir); }); -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - Q_INIT_RESOURCE(puzzleicon); // NOLINT Q_INIT_RESOURCE(icon); // NOLINT Q_INIT_RESOURCE(schema); // NOLINT @@ -123,12 +112,5 @@ auto main(int argc, char *argv[]) -> int QTimer::singleShot(0, &app, &VPApplication::ProcessCMD); -#if defined(APPIMAGE) && defined(Q_OS_LINUX) - if (exe_dir) - { - qDebug() << "Path to ICU folder:" << exe_dir; - } -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - return VPApplication::exec(); } diff --git a/src/app/puzzle/puzzle.qbs b/src/app/puzzle/puzzle.qbs index a3ab909b4..9457cd85d 100644 --- a/src/app/puzzle/puzzle.qbs +++ b/src/app/puzzle/puzzle.qbs @@ -337,6 +337,22 @@ VToolApp { fileTags:["svg_fonts"] } + Group { + name: "freedesktop" + condition: !buildconfig.enableAppImage && qbs.targetOS.contains("unix") && !qbs.targetOS.contains("macos") + prefix: project.sourceDirectory + "/dist/" + files: [ + "ua.com.smart-pattern." + product.targetName + ".desktop" + ] + } + + freedesktop2.desktopKeys: ({ + 'Exec': FileInfo.joinPaths(qbs.installPrefix, + product.installDir, + product.targetName) + ' %F', + 'X-Application-Version': product.version, + }) + Rule { condition: product.qbs.targetOS.contains("macos") && product.buildconfig.enableMultiBundle inputs: ["svg_fonts"] diff --git a/src/app/tape/main.cpp b/src/app/tape/main.cpp index 522ae49df..91f3f0954 100644 --- a/src/app/tape/main.cpp +++ b/src/app/tape/main.cpp @@ -31,11 +31,6 @@ #include // For QT_REQUIRE_VERSION #include -#if defined(APPIMAGE) && defined(Q_OS_LINUX) -#include "../vmisc/appimage.h" -#include -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif @@ -71,12 +66,6 @@ auto main(int argc, char *argv[]) -> int { -#if defined(APPIMAGE) && defined(Q_OS_LINUX) - /* Fix path to ICU_DATA when run AppImage.*/ - char *exe_dir = IcuDataPath("/../share/icu"); - auto FreeMemory = qScopeGuard([exe_dir] { free(exe_dir); }); -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - Q_INIT_RESOURCE(tapeicon); // NOLINT Q_INIT_RESOURCE(icon); // NOLINT Q_INIT_RESOURCE(schema); // NOLINT @@ -121,12 +110,5 @@ auto main(int argc, char *argv[]) -> int QTimer::singleShot(0, &app, &MApplication::ProcessCMD); -#if defined(APPIMAGE) && defined(Q_OS_LINUX) - if (exe_dir) - { - qDebug() << "Path to ICU folder:" << exe_dir; - } -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - return MApplication::exec(); } diff --git a/src/app/tape/mapplication.cpp b/src/app/tape/mapplication.cpp index bfc826d99..10df0bf65 100644 --- a/src/app/tape/mapplication.cpp +++ b/src/app/tape/mapplication.cpp @@ -74,10 +74,6 @@ #define BUILD_REVISION VCS_REPO_STATE_REVISION #endif -#if defined(APPIMAGE) && defined(Q_OS_LINUX) -#include "../vmisc/appimage.h" -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - #if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) #include "../vmisc/compatibility.h" #endif diff --git a/src/app/tape/tape.qbs b/src/app/tape/tape.qbs index e3c8d1388..11fccef94 100644 --- a/src/app/tape/tape.qbs +++ b/src/app/tape/tape.qbs @@ -245,4 +245,20 @@ VToolApp { "k-measurements.iconset" ] } + + Group { + name: "freedesktop" + condition: !buildconfig.enableAppImage && qbs.targetOS.contains("unix") && !qbs.targetOS.contains("macos") + prefix: project.sourceDirectory + "/dist/" + files: [ + "ua.com.smart-pattern." + product.targetName + ".desktop" + ] + } + + freedesktop2.desktopKeys: ({ + 'Exec': FileInfo.joinPaths(qbs.installPrefix, + product.installDir, + product.targetName) + ' %F', + 'X-Application-Version': product.version, + }) } diff --git a/src/app/valentina/main.cpp b/src/app/valentina/main.cpp index d824ac239..011f557ad 100644 --- a/src/app/valentina/main.cpp +++ b/src/app/valentina/main.cpp @@ -35,11 +35,6 @@ #include // For QT_REQUIRE_VERSION #include -#if defined(APPIMAGE) && defined(Q_OS_LINUX) -#include "../vmisc/appimage.h" -#include -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif @@ -77,12 +72,6 @@ auto main(int argc, char *argv[]) -> int { -#if defined(APPIMAGE) && defined(Q_OS_LINUX) - /* Fix path to ICU_DATA when run AppImage.*/ - char *exe_dir = IcuDataPath("/../share/icu"); - auto FreeMemory = qScopeGuard([exe_dir] { free(exe_dir); }); -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - Q_INIT_RESOURCE(cursor); // NOLINT Q_INIT_RESOURCE(toolcursor); // NOLINT Q_INIT_RESOURCE(icon); // NOLINT @@ -158,12 +147,5 @@ auto main(int argc, char *argv[]) -> int QTimer::singleShot(msec, &w, &MainWindow::ProcessCMD); -#if defined(APPIMAGE) && defined(Q_OS_LINUX) - if (exe_dir) - { - qDebug() << "Path to ICU folder:" << exe_dir; - } -#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) - return VApplication::exec(); } diff --git a/src/app/valentina/valentina.qbs b/src/app/valentina/valentina.qbs index f82bdebc8..08d62bf9b 100644 --- a/src/app/valentina/valentina.qbs +++ b/src/app/valentina/valentina.qbs @@ -261,10 +261,33 @@ VToolApp { name: "freedesktop" prefix: project.sourceDirectory + "/dist/" files: [ - "ua.com.smart-pattern." + product.targetName + ".metainfo.xml" + "ua.com.smart-pattern." + product.targetName + ".metainfo.xml", + "ua.com.smart-pattern." + product.targetName + ".desktop" ] } + freedesktop2.desktopKeys: { + var desktopKeys = { + 'Exec': FileInfo.joinPaths(qbs.installPrefix, + product.installDir, + product.targetName) + ' %F', + 'X-Application-Version': product.version, + }; + + if (buildconfig.enableAppImage) { + var mimeTypes = [ + 'application/x-valentina-pattern', + 'application/x-valentina-s-measurements', + 'application/x-valentina-i-measurements', + 'application/x-valentina-k-measurements', + 'application/x-valentina-layout' + ]; + desktopKeys['MimeType'] = mimeTypes.join(';'); + } + + return (desktopKeys); + } + Group { name: "48x48/apps" prefix: project.sourceDirectory + "/share/icons/48x48/apps/" diff --git a/src/libs/vlayout/vfoldline.cpp b/src/libs/vlayout/vfoldline.cpp index 6f8545bf3..3ed2d2fa1 100644 --- a/src/libs/vlayout/vfoldline.cpp +++ b/src/libs/vlayout/vfoldline.cpp @@ -223,9 +223,13 @@ auto VFoldLine::FoldLineMarkPoints() const -> QVector> //--------------------------------------------------------------------------------------------------------------------- auto VFoldLine::LabelPosition(bool &ok) const -> FoldLabelPosData { - FoldLabelPosData posData; + QT_WARNING_PUSH + QT_WARNING_DISABLE_GCC("-Wnoexcept") + FoldLabelPosData posData; std::unique_ptr data; + + QT_WARNING_POP if (m_type == FoldLineType::Text) { data = std::make_unique(TextData()); diff --git a/src/libs/vlayout/vlayoutpiece.cpp b/src/libs/vlayout/vlayoutpiece.cpp index e2c32a310..c09ce22d1 100644 --- a/src/libs/vlayout/vlayoutpiece.cpp +++ b/src/libs/vlayout/vlayoutpiece.cpp @@ -585,11 +585,16 @@ auto operator>>(QDataStream &dataStream, VLayoutPiece &piece) -> QDataStream & } //--------------------------------------------------------------------------------------------------------------------- +QT_WARNING_PUSH +QT_WARNING_DISABLE_GCC("-Wnoexcept") + VLayoutPiece::VLayoutPiece() : d(new VLayoutPieceData) { } +QT_WARNING_POP + //--------------------------------------------------------------------------------------------------------------------- COPY_CONSTRUCTOR_IMPL_2(VLayoutPiece, VAbstractPiece) diff --git a/src/libs/vlayout/vsapoint.h b/src/libs/vlayout/vsapoint.h index babe85618..11b645949 100644 --- a/src/libs/vlayout/vsapoint.h +++ b/src/libs/vlayout/vsapoint.h @@ -46,12 +46,7 @@ QT_WARNING_DISABLE_CLANG("-Wnon-virtual-dtor") class VSAPoint final : public VLayoutPoint { public: - QT_WARNING_PUSH - QT_WARNING_DISABLE_GCC("-Wnoexcept") - - Q_DECL_CONSTEXPR VSAPoint() = default; - - QT_WARNING_POP + Q_DECL_CONSTEXPR VSAPoint() noexcept; Q_DECL_CONSTEXPR VSAPoint(qreal xpos, qreal ypos); Q_DECL_CONSTEXPR explicit VSAPoint(QPointF p); @@ -114,6 +109,11 @@ private: Q_DECLARE_METATYPE(VSAPoint) // NOLINT Q_DECLARE_TYPEINFO(VSAPoint, Q_MOVABLE_TYPE); // NOLINT +//--------------------------------------------------------------------------------------------------------------------- +Q_DECL_CONSTEXPR inline VSAPoint::VSAPoint() noexcept // NOLINT(hicpp-use-equals-default) +{ +} + //--------------------------------------------------------------------------------------------------------------------- Q_DECL_CONSTEXPR inline VSAPoint::VSAPoint(qreal xpos, qreal ypos) : VLayoutPoint(xpos, ypos) diff --git a/src/libs/vmisc/appimage.cpp b/src/libs/vmisc/appimage.cpp index 5b1fb0117..93b727dee 100644 --- a/src/libs/vmisc/appimage.cpp +++ b/src/libs/vmisc/appimage.cpp @@ -27,45 +27,15 @@ *************************************************************************/ #include "appimage.h" -#include -#include -#include #include -#include +#include #include -extern "C" { -#include "binreloc.h" -} -#include "../vmisc/def.h" +#include + #include "compatibility.h" +#include "def.h" -//--------------------------------------------------------------------------------------------------------------------- -/* When deploying with AppImage based on OpenSuse, the ICU library has a hardcoded path to the icudt*.dat file. - * This prevents the library from using shared in memory data. There are few ways to resolve this issue. According - * to documentation we can either use ICU_DATA environment variable or the function u_setDataDirectory(). - */ -char* IcuDataPath(const char* correction) -{ - char * data_path = nullptr; - BrInitError error; - if (br_init (&error)) - { - char *path = br_find_exe_dir(nullptr); - if (path) - { - data_path = static_cast (malloc(strlen(path) + strlen(correction) + 1)); - if(data_path) - { - strcpy(data_path, path); - strcat(data_path, correction); - u_setDataDirectory(data_path); - } - free(path); - } - } - - return data_path; -} +using namespace Qt::Literals::StringLiterals; //--------------------------------------------------------------------------------------------------------------------- /** @@ -89,7 +59,7 @@ QString AppImageRoot(const QString &applicationDir, const QString &defaultAppDir if (appSub.isEmpty() || defaultSub.isEmpty() || appSub.size() <= defaultSub.size()) { - return QString(); + return {}; } appSub = Reverse(appSub); @@ -99,12 +69,12 @@ QString AppImageRoot(const QString &applicationDir, const QString &defaultAppDir { if (defaultSub.at(i) != appSub.at(i)) { - return QString(); + return {}; } } QStringList rootSub = appSub.mid(defaultSub.size()); rootSub = Reverse(rootSub); - return '/' + rootSub.join('/'); + return '/'_L1 + rootSub.join('/'); } diff --git a/src/libs/vmisc/appimage.h b/src/libs/vmisc/appimage.h index 0ec6a3adc..ce209e738 100644 --- a/src/libs/vmisc/appimage.h +++ b/src/libs/vmisc/appimage.h @@ -30,8 +30,6 @@ class QString; -char* IcuDataPath(const char* correction); - QString AppImageRoot(); QString AppImageRoot(const QString &applicationDir, const QString &defaultAppDir); diff --git a/src/libs/vmisc/binreloc.c b/src/libs/vmisc/binreloc.c deleted file mode 100644 index 191eeede1..000000000 --- a/src/libs/vmisc/binreloc.c +++ /dev/null @@ -1,758 +0,0 @@ -/* - * BinReloc - a library for creating relocatable executables - * - * Originally written by: Hongli Lai - * http://autopackage.org/ (defunct) - * - * Maintained by: Wolfgang 'datenwolf' Draxinger - * - * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - * Version 2, December 2004 - * - * Everyone is permitted to copy and distribute verbatim or modified - * copies of this license document, and changing it is allowed as long - * as the name is changed. - * - * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - * - * 0. You just DO WHAT THE FUCK YOU WANT TO. - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "binreloc.h" - -#ifndef SSIZE_MAX -#define SSIZE_MAX ((ssize_t)(SIZE_MAX>>1)) -#endif - -/** @internal - * Find the canonical filename of the executable. Returns the filename - * (which must be freed) or NULL on error. If the parameter 'error' is - * not NULL, the error code will be stored there, if an error occured. - */ -static char * -_br_find_exe (BrInitError *error) -{ - char *path, *path2, *line, *result; - size_t buf_size; - struct stat stat_buf; - FILE *f; - - /* Read from /proc/self/exe (symlink) */ - if (sizeof (path) > SSIZE_MAX) - buf_size = SSIZE_MAX - 1; - else - buf_size = PATH_MAX - 1; - path = (char *) malloc (buf_size); - if (path == NULL) { - /* Cannot allocate memory. */ - if (error) - *error = BR_INIT_ERROR_NOMEM; - return NULL; - } - path2 = (char *) malloc (buf_size); - if (path2 == NULL) { - /* Cannot allocate memory. */ - if (error) - *error = BR_INIT_ERROR_NOMEM; - free (path); - return NULL; - } - - strncpy (path2, "/proc/self/exe", buf_size - 1); - - while (1) { - int i; - - ssize_t size = readlink (path2, path, buf_size - 1); - if (size == -1) { - /* Error. */ - free (path2); - break; - } - - /* readlink() success. */ - path[size] = '\0'; - - /* Check whether the symlink's target is also a symlink. - * We want to get the final target. */ - i = stat (path, &stat_buf); - if (i == -1) { - /* Error. */ - free (path2); - break; - } - - /* stat() success. */ - if (!S_ISLNK (stat_buf.st_mode)) { - /* path is not a symlink. Done. */ - free (path2); - return path; - } - - /* path is a symlink. Continue loop and resolve this. */ - strncpy (path, path2, buf_size - 1); - } - - - /* readlink() or stat() failed; this can happen when the program is - * running in Valgrind 2.2. Read from /proc/self/maps as fallback. */ - - buf_size = PATH_MAX + 128; - line = (char *) realloc (path, buf_size); - if (line == NULL) { - /* Cannot allocate memory. */ - free (path); - if (error) - *error = BR_INIT_ERROR_NOMEM; - return NULL; - } - - f = fopen ("/proc/self/maps", "r"); - if (f == NULL) { - free (line); - if (error) - *error = BR_INIT_ERROR_OPEN_MAPS; - return NULL; - } - - /* The first entry should be the executable name. */ - result = fgets (line, (int) buf_size, f); - if (result == NULL) { - fclose (f); - free (line); - if (error) - *error = BR_INIT_ERROR_READ_MAPS; - return NULL; - } - - /* Get rid of newline character. */ - buf_size = strlen (line); - if (buf_size == 0) { - /* Huh? An empty string? */ - fclose (f); - free (line); - if (error) - *error = BR_INIT_ERROR_INVALID_MAPS; - return NULL; - } - if (line[buf_size - 1] == 10) - line[buf_size - 1] = 0; - - /* Extract the filename; it is always an absolute path. */ - path = strchr (line, '/'); - - /* Sanity check. */ - if (strstr (line, " r-xp ") == NULL || path == NULL) { - fclose (f); - free (line); - if (error) - *error = BR_INIT_ERROR_INVALID_MAPS; - return NULL; - } - - path = strdup (path); - free (line); - fclose (f); - return path; -} - - -/** @internal - * Find the canonical filename of the executable which owns symbol. - * Returns a filename which must be freed, or NULL on error. - */ -static char * -_br_find_exe_for_symbol (const void *symbol, BrInitError *error) -{ - #define SIZE PATH_MAX + 100 - FILE *f; - size_t address_string_len; - char *address_string, line[SIZE], *found; - - if (symbol == NULL) - return (char *) NULL; - - f = fopen ("/proc/self/maps", "r"); - if (f == NULL) - return (char *) NULL; - - address_string_len = 4; - address_string = (char *) malloc (address_string_len); - found = (char *) NULL; - - while (!feof (f)) { - char *start_addr, *end_addr, *end_addr_end, *file; - void *start_addr_p, *end_addr_p; - size_t len; - - if (fgets (line, SIZE, f) == NULL) - break; - - /* Sanity check. */ - if (strstr (line, " r-xp ") == NULL || strchr (line, '/') == NULL) - continue; - - /* Parse line. */ - start_addr = line; - end_addr = strchr (line, '-'); - file = strchr (line, '/'); - - /* More sanity check. */ - if (!(file > end_addr && end_addr != NULL && end_addr[0] == '-')) - continue; - - end_addr[0] = '\0'; - end_addr++; - end_addr_end = strchr (end_addr, ' '); - if (end_addr_end == NULL) - continue; - - end_addr_end[0] = '\0'; - len = strlen (file); - if (len == 0) - continue; - if (file[len - 1] == '\n') - file[len - 1] = '\0'; - - /* Get rid of "(deleted)" from the filename. */ - len = strlen (file); - if (len > 10 && strcmp (file + len - 10, " (deleted)") == 0) - file[len - 10] = '\0'; - - /* I don't know whether this can happen but better safe than sorry. */ - len = strlen (start_addr); - if (len != strlen (end_addr)) - continue; - - - /* Transform the addresses into a string in the form of 0xdeadbeef, - * then transform that into a pointer. */ - if (address_string_len < len + 3) { - address_string_len = len + 3; - char *new_address_string = (char *) realloc (address_string, address_string_len); - if (new_address_string == NULL){ - *error = BR_INIT_ERROR_NOMEM; - free (address_string); - fclose (f); - return (char *) NULL; - } - else - address_string = new_address_string; - } - - memcpy (address_string, "0x", 2); - memcpy (address_string + 2, start_addr, len); - address_string[2 + len] = '\0'; - sscanf (address_string, "%p", &start_addr_p); - - memcpy (address_string, "0x", 2); - memcpy (address_string + 2, end_addr, len); - address_string[2 + len] = '\0'; - sscanf (address_string, "%p", &end_addr_p); - - - if (symbol >= start_addr_p && symbol < end_addr_p) { - found = file; - break; - } - } - - free (address_string); - fclose (f); - - if (found == NULL) - return (char *) NULL; - else - return strdup (found); -} - - -#ifndef BINRELOC_RUNNING_DOXYGEN - #undef NULL - #define NULL ((void *) 0) /* typecasted as char* for C++ type safeness */ -#endif - -static char *exe = (char *) NULL; - - -/** Initialize the BinReloc library (for applications). - * - * This function must be called before using any other BinReloc functions. - * It attempts to locate the application's canonical filename. - * - * @note If you want to use BinReloc for a library, then you should call - * br_init_lib() instead. - * - * @param error If BinReloc failed to initialize, then the error code will - * be stored in this variable. Set to NULL if you want to - * ignore this. See #BrInitError for a list of error codes. - * - * @returns 1 on success, 0 if BinReloc failed to initialize. - */ -int -br_init (BrInitError *error) -{ - exe = _br_find_exe (error); - return exe != NULL; -} - - -/** Initialize the BinReloc library (for libraries). - * - * This function must be called before using any other BinReloc functions. - * It attempts to locate the calling library's canonical filename. - * - * @note The BinReloc source code MUST be included in your library, or this - * function won't work correctly. - * - * @param error If BinReloc failed to initialize, then the error code will - * be stored in this variable. Set to NULL if you want to - * ignore this. See #BrInitError for a list of error codes. - * - * @returns 1 on success, 0 if a filename cannot be found. - */ -int -br_init_lib (BrInitError *error) -{ - exe = _br_find_exe_for_symbol ((const void *) "", error); - return exe != NULL; -} - - -/** Find the canonical filename of the current application. - * - * @param default_exe A default filename which will be used as fallback. - * @returns A string containing the application's canonical filename, - * which must be freed when no longer necessary. If BinReloc is - * not initialized, or if br_init() failed, then a copy of - * default_exe will be returned. If default_exe is NULL, then - * NULL will be returned. - */ -char * -br_find_exe (const char *default_exe) -{ - if (exe == (char *) NULL) { - /* BinReloc is not initialized. */ - if (default_exe != (const char *) NULL) - return strdup (default_exe); - else - return (char *) NULL; - } - return strdup (exe); -} - - -/** Locate the directory in which the current application is installed. - * - * The prefix is generated by the following pseudo-code evaluation: - * \code - * dirname(exename) - * \endcode - * - * @param default_dir A default directory which will used as fallback. - * @return A string containing the directory, which must be freed when no - * longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_dir - * will be returned. If default_dir is NULL, then NULL will be - * returned. - */ -char * -br_find_exe_dir (const char *default_dir) -{ - if (exe == NULL) { - /* BinReloc not initialized. */ - if (default_dir != NULL) - return strdup (default_dir); - else - return NULL; - } - - return br_dirname (exe); -} - - -/** Locate the prefix in which the current application is installed. - * - * The prefix is generated by the following pseudo-code evaluation: - * \code - * dirname(dirname(exename)) - * \endcode - * - * @param default_prefix A default prefix which will used as fallback. - * @return A string containing the prefix, which must be freed when no - * longer necessary. If BinReloc is not initialized, or if - * the initialization function failed, then a copy of default_prefix - * will be returned. If default_prefix is NULL, then NULL will be returned. - */ -char * -br_find_prefix (const char *default_prefix) -{ - char *dir1, *dir2; - - if (exe == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_prefix != (const char *) NULL) - return strdup (default_prefix); - else - return (char *) NULL; - } - - dir1 = br_dirname (exe); - dir2 = br_dirname (dir1); - free (dir1); - return dir2; -} - - -/** Locate the application's binary folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/bin" - * \endcode - * - * @param default_bin_dir A default path which will used as fallback. - * @return A string containing the bin folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if - * the initialization function failed, then a copy of default_bin_dir will - * be returned. If default_bin_dir is NULL, then NULL will be returned. - */ -char * -br_find_bin_dir (const char *default_bin_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_bin_dir != (const char *) NULL) - return strdup (default_bin_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "bin"); - free (prefix); - return dir; -} - - -/** Locate the application's superuser binary folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/sbin" - * \endcode - * - * @param default_sbin_dir A default path which will used as fallback. - * @return A string containing the sbin folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_sbin_dir will - * be returned. If default_bin_dir is NULL, then NULL will be returned. - */ -char * -br_find_sbin_dir (const char *default_sbin_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_sbin_dir != (const char *) NULL) - return strdup (default_sbin_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "sbin"); - free (prefix); - return dir; -} - - -/** Locate the application's data folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/share" - * \endcode - * - * @param default_data_dir A default path which will used as fallback. - * @return A string containing the data folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_data_dir - * will be returned. If default_data_dir is NULL, then NULL will be - * returned. - */ -char * -br_find_data_dir (const char *default_data_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_data_dir != (const char *) NULL) - return strdup (default_data_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "share"); - free (prefix); - return dir; -} - - -/** Locate the application's localization folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/share/locale" - * \endcode - * - * @param default_locale_dir A default path which will used as fallback. - * @return A string containing the localization folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_locale_dir will be returned. - * If default_locale_dir is NULL, then NULL will be returned. - */ -char * -br_find_locale_dir (const char *default_locale_dir) -{ - char *data_dir, *dir; - - data_dir = br_find_data_dir ((const char *) NULL); - if (data_dir == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_locale_dir != (const char *) NULL) - return strdup (default_locale_dir); - else - return (char *) NULL; - } - - dir = br_build_path (data_dir, "locale"); - free (data_dir); - return dir; -} - - -/** Locate the application's library folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/lib" - * \endcode - * - * @param default_lib_dir A default path which will used as fallback. - * @return A string containing the library folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_lib_dir will be returned. - * If default_lib_dir is NULL, then NULL will be returned. - */ -char * -br_find_lib_dir (const char *default_lib_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_lib_dir != (const char *) NULL) - return strdup (default_lib_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "lib"); - free (prefix); - return dir; -} - - -/** Locate the application's libexec folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/libexec" - * \endcode - * - * @param default_libexec_dir A default path which will used as fallback. - * @return A string containing the libexec folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_libexec_dir will be returned. - * If default_libexec_dir is NULL, then NULL will be returned. - */ -char * -br_find_libexec_dir (const char *default_libexec_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_libexec_dir != (const char *) NULL) - return strdup (default_libexec_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "libexec"); - free (prefix); - return dir; -} - - -/** Locate the application's configuration files folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/etc" - * \endcode - * - * @param default_etc_dir A default path which will used as fallback. - * @return A string containing the etc folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_etc_dir will be returned. - * If default_etc_dir is NULL, then NULL will be returned. - */ -char * -br_find_etc_dir (const char *default_etc_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_etc_dir != (const char *) NULL) - return strdup (default_etc_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "etc"); - free (prefix); - return dir; -} - - -/*********************** - * Utility functions - ***********************/ - -/** Concatenate str1 and str2 to a newly allocated string. - * - * @param str1 A string. - * @param str2 Another string. - * @returns A newly-allocated string. This string should be freed when no longer needed. - */ -char * -br_strcat (const char *str1, const char *str2) -{ - char *result; - size_t len1, len2; - - if (str1 == NULL) - str1 = ""; - if (str2 == NULL) - str2 = ""; - - len1 = strlen (str1); - len2 = strlen (str2); - - result = (char *) malloc (len1 + len2 + 1); - memcpy (result, str1, len1); - memcpy (result + len1, str2, len2); - result[len1 + len2] = '\0'; - - return result; -} - - -char * -br_build_path (const char *dir, const char *file) -{ - char *result; - size_t len; - - len = strlen (dir); - if (len > 0 && dir[len - 1] != '/') { - char *dir2 = br_strcat (dir, "/"); - result = br_strcat (dir2, file); - free (dir2); - } else - result = br_strcat (dir, file); - - return result; -} - - -/* Emulates glibc's strndup() */ -static char * -br_strndup (const char *str, size_t size) -{ - char *result = (char *) NULL; - size_t len; - - if (str == (const char *) NULL) - return (char *) NULL; - - len = strlen (str); - if (len == 0) - return strdup (""); - if (size > len) - size = len; - - result = (char *) malloc (len + 1); - memcpy (result, str, size); - result[size] = '\0'; - return result; -} - - -/** Extracts the directory component of a path. - * - * Similar to g_dirname() or the dirname commandline application. - * - * Example: - * \code - * br_dirname ("/usr/local/foobar"); --> Returns: "/usr/local" - * \endcode - * - * @param path A path. - * @returns A directory name. This string should be freed when no longer needed. - */ -char * -br_dirname (const char *path) -{ - char *end, *result; - - if (path == (const char *) NULL) - return (char *) NULL; - - end = strrchr (path, '/'); - if (end == (const char *) NULL) - return strdup ("."); - - while (end > path && *end == '/') - end--; - result = br_strndup (path, (size_t)(end - path + 1)); - if (result[0] == 0) { - free (result); - return strdup ("/"); - } else - return result; -} - diff --git a/src/libs/vmisc/binreloc.h b/src/libs/vmisc/binreloc.h deleted file mode 100644 index 847a20490..000000000 --- a/src/libs/vmisc/binreloc.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * BinReloc - a library for creating relocatable executables - * - * Originally written by: Hongli Lai - * http://autopackage.org/ (defunct) - * - * Maintained by: Wolfgang 'datenwolf' Draxinger - * - * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - * Version 2, December 2004 - * - * Everyone is permitted to copy and distribute verbatim or modified - * copies of this license document, and changing it is allowed as long - * as the name is changed. - * - * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - * - * 0. You just DO WHAT THE FUCK YOU WANT TO. - */ - -#ifndef __BINRELOC_H__ -#define __BINRELOC_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/** These error codes can be returned by br_init(), br_init_lib(), gbr_init() or gbr_init_lib(). */ -typedef enum { - /** Cannot allocate memory. */ - BR_INIT_ERROR_NOMEM, - /** Unable to open /proc/self/maps; see errno for details. */ - BR_INIT_ERROR_OPEN_MAPS, - /** Unable to read from /proc/self/maps; see errno for details. */ - BR_INIT_ERROR_READ_MAPS, - /** The file format of /proc/self/maps is invalid; kernel bug? */ - BR_INIT_ERROR_INVALID_MAPS, - /** BinReloc is disabled (the ENABLE_BINRELOC macro is not defined). */ - BR_INIT_ERROR_DISABLED -} BrInitError; - - -#ifndef BINRELOC_RUNNING_DOXYGEN -/* Mangle symbol names to avoid symbol collisions with other ELF objects. */ - #define br_init SbCJ22537442193159_br_init - #define br_init_lib SbCJ22537442193159_br_init_lib - #define br_find_exe SbCJ22537442193159_br_find_exe - #define br_find_exe_dir SbCJ22537442193159_br_find_exe_dir - #define br_find_prefix SbCJ22537442193159_br_find_prefix - #define br_find_bin_dir SbCJ22537442193159_br_find_bin_dir - #define br_find_sbin_dir SbCJ22537442193159_br_find_sbin_dir - #define br_find_data_dir SbCJ22537442193159_br_find_data_dir - #define br_find_locale_dir SbCJ22537442193159_br_find_locale_dir - #define br_find_lib_dir SbCJ22537442193159_br_find_lib_dir - #define br_find_libexec_dir SbCJ22537442193159_br_find_libexec_dir - #define br_find_etc_dir SbCJ22537442193159_br_find_etc_dir - #define br_strcat SbCJ22537442193159_br_strcat - #define br_build_path SbCJ22537442193159_br_build_path - #define br_dirname SbCJ22537442193159_br_dirname - - -#endif -int br_init (BrInitError *error); -int br_init_lib (BrInitError *error); - -char *br_find_exe (const char *default_exe); -char *br_find_exe_dir (const char *default_dir); -char *br_find_prefix (const char *default_prefix); -char *br_find_bin_dir (const char *default_bin_dir); -char *br_find_sbin_dir (const char *default_sbin_dir); -char *br_find_data_dir (const char *default_data_dir); -char *br_find_locale_dir (const char *default_locale_dir); -char *br_find_lib_dir (const char *default_lib_dir); -char *br_find_libexec_dir (const char *default_libexec_dir); -char *br_find_etc_dir (const char *default_etc_dir); - -/* Utility functions */ -char *br_strcat (const char *str1, const char *str2); -char *br_build_path (const char *dir, const char *file); -char *br_dirname (const char *path); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __BINRELOC_H__ */ diff --git a/src/libs/vmisc/svgfont/vsvgfontdatabase.cpp b/src/libs/vmisc/svgfont/vsvgfontdatabase.cpp index eeacd0d81..a2a106954 100644 --- a/src/libs/vmisc/svgfont/vsvgfontdatabase.cpp +++ b/src/libs/vmisc/svgfont/vsvgfontdatabase.cpp @@ -38,6 +38,10 @@ #include "vsvgfontengine.h" #include "vsvgfontreader.h" +#if defined(APPIMAGE) && defined(Q_OS_LINUX) +#include "../appimage.h" +#endif // defined(APPIMAGE) && defined(Q_OS_LINUX) + #if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) #include "../compatibility.h" #endif @@ -231,9 +235,9 @@ auto VSvgFontDatabase::SystemSVGFontPath() -> QString #ifdef QBS_BUILD #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - dir.setPath(QCoreApplication::applicationDirPath() + "/../../.." + PKGDATADIR + fontPath); + dir.setPath(QCoreApplication::applicationDirPath() + "/../../.."_L1 + PKGDATADIR + fontPath); #else - dir = QDir(QCoreApplication::applicationDirPath() + "/../../.." + PKGDATADIR + fontPath); + dir = QDir(QCoreApplication::applicationDirPath() + "/../../.."_L1 + PKGDATADIR + fontPath); #endif if (dir.exists()) { @@ -243,7 +247,7 @@ auto VSvgFontDatabase::SystemSVGFontPath() -> QString #if defined(APPIMAGE) && defined(Q_OS_LINUX) /* Fix path to trasnaltions when run inside AppImage. */ - return AppImageRoot() + PKGDATADIR + trPath; + return AppImageRoot() + PKGDATADIR + fontPath; #else return PKGDATADIR + fontPath; #endif // defined(APPIMAGE) && defined(Q_OS_LINUX) diff --git a/src/libs/vmisc/vabstractapplication.cpp b/src/libs/vmisc/vabstractapplication.cpp index ba700c6ad..08fe24f72 100644 --- a/src/libs/vmisc/vabstractapplication.cpp +++ b/src/libs/vmisc/vabstractapplication.cpp @@ -239,7 +239,7 @@ auto VAbstractApplication::translationsPath(const QString &locale) -> QString #endif // QBS_BUILD #if defined(APPIMAGE) && defined(Q_OS_LINUX) - /* Fix path to trasnaltions when run inside AppImage. */ + /* Fix path to translations when run inside AppImage. */ return AppImageRoot() + PKGDATADIR + trPath; #else return PKGDATADIR + trPath; @@ -247,6 +247,41 @@ auto VAbstractApplication::translationsPath(const QString &locale) -> QString #endif // Unix } +//--------------------------------------------------------------------------------------------------------------------- +auto VAbstractApplication::QtTranslationsPath(const QString &locale) -> QString +{ +#if defined(Q_OS_LINUX) + const QString trPath = QStringLiteral("/translations"); + + QDir dir(QCoreApplication::applicationDirPath() + trPath); + if (dir.exists()) + { + return dir.absolutePath(); + } + +#ifdef QBS_BUILD +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + dir.setPath(QCoreApplication::applicationDirPath() + "/../../.."_L1 + PKGDATADIR + trPath); +#else + dir = QDir(QCoreApplication::applicationDirPath() + "/../../.."_L1 + PKGDATADIR + trPath); +#endif + if (dir.exists()) + { + return dir.absolutePath(); + } +#endif // QBS_BUILD + +#if defined(APPIMAGE) + /* Fix path to translations when run inside AppImage. */ + return AppImageRoot() + APPIMAGE_QT_TRANSLATIONS; +#else + return translationsPath(locale); +#endif // defined(APPIMAGE) +#else + return translationsPath(locale); +#endif // defined(Q_OS_LINUX) +} + //--------------------------------------------------------------------------------------------------------------------- auto VAbstractApplication::getUndoStack() const -> QUndoStack * { @@ -307,8 +342,12 @@ void VAbstractApplication::LoadTranslation(QString locale) qtTranslator = new QTranslator(this); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) const QString qtQmDir = appQmDir; +#else +#if defined(APPIMAGE) + const QString qtQmDir = VAbstractApplication::QtTranslationsPath(locale); #else const QString qtQmDir = QLibraryPath(QLibraryInfo::TranslationsPath); +#endif // defined(APPIMAGE) #endif LoadQM(qtTranslator, QStringLiteral("qt_"), locale, qtQmDir); installTranslator(qtTranslator); diff --git a/src/libs/vmisc/vabstractapplication.h b/src/libs/vmisc/vabstractapplication.h index b3c105e7c..e0a41be05 100644 --- a/src/libs/vmisc/vabstractapplication.h +++ b/src/libs/vmisc/vabstractapplication.h @@ -76,6 +76,7 @@ public: virtual auto TrVars() -> const VTranslateVars * = 0; static auto translationsPath(const QString &locale = QString()) -> QString; + static auto QtTranslationsPath(const QString &locale = QString()) -> QString; void LoadTranslation(QString locale); diff --git a/src/libs/vmisc/vmisc.pri b/src/libs/vmisc/vmisc.pri index 2ee07e869..8adeb2483 100644 --- a/src/libs/vmisc/vmisc.pri +++ b/src/libs/vmisc/vmisc.pri @@ -44,7 +44,6 @@ macx { contains(DEFINES, APPIMAGE) { SOURCES += \ - $$PWD/binreloc.c \ $$PWD/appimage.cpp } @@ -102,7 +101,6 @@ HEADERS += \ contains(DEFINES, APPIMAGE) { SOURCES += \ - $$PWD/binreloc.h \ $$PWD/appimage.h } diff --git a/src/libs/vmisc/vmisc.qbs b/src/libs/vmisc/vmisc.qbs index ec09ea070..0c1a5d97b 100644 --- a/src/libs/vmisc/vmisc.qbs +++ b/src/libs/vmisc/vmisc.qbs @@ -58,10 +58,8 @@ VLib { name: "AppImage" condition: buildconfig.enableAppImage && qbs.targetOS.contains("unix") && !qbs.targetOS.contains("macos") files: [ - "binreloc.h", "appimage.h", - "binreloc.c", - "appimage.cpp" + "appimage.cpp", ] } diff --git a/src/libs/vpatterndb/floatItemData/vabstractfloatitemdata.cpp b/src/libs/vpatterndb/floatItemData/vabstractfloatitemdata.cpp index 74b596a5d..118aa172e 100644 --- a/src/libs/vpatterndb/floatItemData/vabstractfloatitemdata.cpp +++ b/src/libs/vpatterndb/floatItemData/vabstractfloatitemdata.cpp @@ -31,11 +31,16 @@ #include "vabstractfloatitemdata_p.h" //--------------------------------------------------------------------------------------------------------------------- +QT_WARNING_PUSH +QT_WARNING_DISABLE_GCC("-Wnoexcept") + VAbstractFloatItemData::VAbstractFloatItemData() : d(new VAbstractFloatItemDataPrivate()) { } +QT_WARNING_POP + //--------------------------------------------------------------------------------------------------------------------- COPY_CONSTRUCTOR_IMPL(VAbstractFloatItemData) diff --git a/src/libs/vwidgets/vpiecegrainline.cpp b/src/libs/vwidgets/vpiecegrainline.cpp index a3f5c4578..7bf96ab56 100644 --- a/src/libs/vwidgets/vpiecegrainline.cpp +++ b/src/libs/vwidgets/vpiecegrainline.cpp @@ -51,11 +51,16 @@ auto VPieceGrainlinePrivate::MainLine(const QPointF &p1, qreal length, qreal ang // VPieceGrainline //--------------------------------------------------------------------------------------------------------------------- +QT_WARNING_PUSH +QT_WARNING_DISABLE_GCC("-Wnoexcept") + VPieceGrainline::VPieceGrainline() : d(new VPieceGrainlinePrivate) { } +QT_WARNING_POP + //--------------------------------------------------------------------------------------------------------------------- VPieceGrainline::~VPieceGrainline() = default;