diff --git a/.github/workflows/macos-homebrew-nobreakpad.yml b/.github/workflows/macos-homebrew-nobreakpad.yml
new file mode 100644
index 00000000..7d4b0509
--- /dev/null
+++ b/.github/workflows/macos-homebrew-nobreakpad.yml
@@ -0,0 +1,239 @@
+name: macos-homebrew-nobreakpad
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - dev
+ - master
+ # - staged
+ paths-ignore:
+ - 'docs/**'
+ - ".github/**"
+ - "howto/**"
+ - "*.md"
+ - ".clang-format"
+jobs:
+ build:
+ name: Build
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [macos-12,macos-13]
+ qt_ver: [ 6.5.1 ]
+ qt_arch: [clang_64]
+ env:
+ targetName: GoldenDict
+ version: 23.06.02
+ version-suffix: alpha
+ prerelease: true
+ steps:
+ # macos 11.0 默认环境变了,要指定
+ - name: prepare env
+ if: ${{ matrix.os == 'macos-11' }}
+ run: |
+ softwareupdate --all --install --force
+ sudo xcode-select --print-path
+ sudo xcode-select --switch /Library/Developer/CommandLineTools
+
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ submodules: true
+ - name: Set outputs
+ id: githash
+ run: |
+ echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
+
+ - name: install deps on macos
+ run: |
+ brew install pcre2 harfbuzz freetype
+ brew install cmake ninja python
+ brew install automake
+ brew install autoconf
+ brew install libtool
+ brew install opencc
+ brew install speex
+ brew install wavpack
+ brew install automake fdk-aac git lame libass libtool libvorbis libvpx opus sdl shtool texi2html theora wget x264 x265 xvid nasm
+ brew install speex
+
+ brew tap homebrew-ffmpeg/ffmpeg
+ brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-speex
+
+ brew install libiconv
+ brew install lzo bzip2
+ brew install libogg
+ brew install zstd lzip
+ brew install libvorbis
+ brew install hunspell
+ git clone https://github.com/xiaoyifang/eb.git
+ cd eb && ./configure && make -j 8 && sudo make install && cd ..
+ brew install xz lzo
+ brew install pkg-config
+ brew install create-dmg
+ brew install xapian
+ brew install libzim
+ # brew reinstall icu4c
+ brew install dylibbundler
+ find /opt -name libicudata.72.dylib
+ find /usr/local -name libicudata.72.dylib
+ - name: version-file
+ shell: bash
+ run: |
+ current_tag=$(git tag --sort=-creatordate | grep "v.*" | sed -n 1p |cut -c 2-)
+ echo "$current_tag">version.txt
+
+ - name: vcpkg install
+ shell: bash
+ run: |
+ vcpkg install breakpad
+ - name: copy vcpkg packages into winlibs
+ shell: bash
+ run: |
+ ls -al /usr/local/share/vcpkg/packages/breakpad*
+ cp -R /usr/local/share/vcpkg/packages/breakpad*/* thirdparty/breakpad
+ ls -al thirdparty/breakpad/lib
+ - uses: actions/setup-python@v3
+ with:
+ python-version: '3.9'
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: ${{ matrix.qt_ver }}
+ arch: ${{ matrix.qt_arch }}
+
+ modules: qtwebengine qtwebchannel qtpositioning qt5compat qtmultimedia qtimageformats qtspeech
+ setup-python: 'false'
+
+ - name: compile
+ run: |
+ qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=use_xapian
+ make -j8
+
+ - name: package
+ run: |
+
+ macdeployqt ${targetName}.app -qmldir=. -verbose=1
+ otool -L GoldenDict.app/Contents/MacOS/GoldenDict
+ ls -al GoldenDict.app/Contents/Frameworks
+ otool -L GoldenDict.app/Contents/Frameworks/libicu*.dylib
+ cp -r /usr/local/Cellar/icu4c/7*/lib/libicudata.*.dylib GoldenDict.app/Contents/Frameworks
+
+ codesign --force --deep -s - GoldenDict.app
+
+ ls -al GoldenDict.app/Contents/Frameworks
+ mkdir tmp
+ mv ${targetName}.app ./tmp
+ # --background "installer_background.png"
+ create-dmg --volname "${targetName} Installer" --volicon "icons/macicon.icns" --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon "${targetName}.app" 200 190 --hide-extension "${targetName}.app" --app-drop-link 600 185 --skip-jenkins "${targetName}.dmg" tmp/
+ - name: changelog
+ id: changelog
+ run: |
+ previousTag=$(git tag --sort=-creatordate | grep "v.*" | sed -n 2p)
+ echo "previousTag : $previousTag"
+
+ CHANGELOG="$(git log --oneline --no-decorate $previousTag..HEAD)"
+ CHANGELOG="${CHANGELOG//'%'/'%25'}"
+ CHANGELOG="${CHANGELOG//$'\n'/'%0A'}"
+ CHANGELOG="${CHANGELOG//$'\r'/'%0D'}"
+ CHANGELOG="${CHANGELOG//'\"'/'%22'}"
+ CHANGELOG="${CHANGELOG//"'"/ }"
+ echo "::set-output name=changelog::$(echo "$CHANGELOG")"
+ echo "::set-output name=prev_tag::$previousTag"
+ echo "::set-output name=curr_tag::$(git tag --sort=-creatordate | grep "v.*" | sed -n 1p)"
+
+ - name: Set outputs
+ id: vars
+ run: |
+ echo "::set-output name=sha_short::$(git rev-parse --short=8 HEAD)"
+ echo "::set-output name=release_date::$(date +'%Y%m%d')"
+ echo "::set-output name=release_time::$(date +'%H%M%S')"
+ echo "::set-output name=release_time_clock::$(date +'%H:%M:%S')"
+ echo "::set-output name=release_hm::$(date +'%y%m%d')"
+
+ # tag 上传Release
+ - name: "Build Changelog"
+ id: build_changelog
+ uses: mikepenz/release-changelog-builder-action@v3
+ with:
+ commitMode: false
+ fromTag: ${{ steps.changelog.outputs.prev_tag }}
+ toTag: "${{ steps.changelog.outputs.curr_tag }}"
+ configurationJson: |
+ {
+ "template": "#{{CHANGELOG}}\n\n\n🔴 Uncategorized
\n\n#{{UNCATEGORIZED}}\n ",
+ "categories": [
+ {
+ "title": "## 🚀 Features",
+ "labels": ["feature","feat","opt"]
+ },
+ {
+ "title": "## 🐛 Fixes",
+ "labels": ["fix","bug"]
+ }
+ ,
+ {
+ "title": "## 🤖 Github action",
+ "labels": ["action"]
+ }
+ ,
+ {
+ "title": "## 🧼 Clean Code",
+ "labels": ["clean"]
+ }
+
+ ],
+ "label_extractor": [
+ {
+ "pattern": "([^:]*):.*",
+ "target": "$1",
+ "on_property": "title",
+ "flags": "gu"
+ }
+ ]
+ }
+ - name: uploadRelease
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
+ file: ${{ env.targetName }}.dmg
+ asset_name: ${{ matrix.qt_ver }}-${{ env.targetName }}_${{ matrix.os }}_homebrew_${{steps.vars.outputs.release_date}}.dmg
+
+ overwrite: true
+ release_name: GoldenDict-ng-v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
+ prerelease: ${{env.prerelease}}
+ body: |
+ release on date: ${{steps.vars.outputs.release_date}} time: ${{steps.vars.outputs.release_time_clock}}
+ branch: ${{ github.ref_name }}
+ commit: ${{ steps.vars.outputs.sha_short }}
+ Qt version: Qt5.15.2, Qt6.X
+ Windows built with: msvc64, Visual studio 2019
+ ## goldendict.exe can not be used alone
+ if you have a previous version. replace this maybe ok. if not ,download the whole bundle.
+
+ AppImage built with: Ubuntu-20.04 ,latest gcc
+ macos built with: macos-10.15,macos-11.0,clang_64 x86_64
+ Qt6.X(homebrew build)
+ Qt5.15.2(Intel Kind)
+ auto built by github action. use on your on risk:-)
+ **recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
+
+ Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
+ [xapian](https://xapian.org/) is enabled by default which offers 10X~20X performance
+ ------------------------------
+ 文件名的模式: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
+ [xapian](https://xapian.org/) 用于全文索引的创建,提供更快的全文索引创建、搜索支持
+ 比如:
+ 6.4.3-GoldenDict.exe_windows-2022_20230502.zip
+ 表示基于qt6.4.3,windows-2022, 于20230502日创建的版本。
+
+
+ CHANGES:
+ ${{ steps.changelog.outputs.changelog }}
+
+ ----------------
+
+ ${{steps.build_changelog.outputs.changelog}}
diff --git a/.github/workflows/macos-homebrew-xapian.yml b/.github/workflows/macos-homebrew-xapian.yml
index 671431ce..423dc208 100644
--- a/.github/workflows/macos-homebrew-xapian.yml
+++ b/.github/workflows/macos-homebrew-xapian.yml
@@ -1,28 +1,28 @@
-name: macos-homebrew-xapian
+name: macos-homebrew-breakpad
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
- push:
- branches:
- - dev
- - master
- # - staged
- paths-ignore:
- - 'docs/**'
- - ".github/**"
- - "howto/**"
- - "*.md"
- - ".clang-format"
+ #push:
+ # branches:
+ # - dev
+ # - master
+ # # - staged
+ # paths-ignore:
+ # - 'docs/**'
+ # - ".github/**"
+ # - "howto/**"
+ # - "*.md"
+ # - ".clang-format"
jobs:
build:
name: Build
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [macos-11,macos-12]
- qt_ver: [ 6.5.1 ]
+ os: [macos-13]
+ qt_ver: [ 6.4.3,6.5.1 ]
qt_arch: [clang_64]
env:
targetName: GoldenDict
@@ -37,18 +37,7 @@ jobs:
softwareupdate --all --install --force
sudo xcode-select --print-path
sudo xcode-select --switch /Library/Developer/CommandLineTools
- - uses: actions/setup-python@v3
- with:
- python-version: '3.9'
- - name: Install Qt
- uses: jurplel/install-qt-action@v3
- with:
- version: ${{ matrix.qt_ver }}
- arch: ${{ matrix.qt_arch }}
-
- modules: qtwebengine qtwebchannel qtpositioning qt5compat qtmultimedia qtimageformats qtspeech
- setup-python: 'false'
-
+
- uses: actions/checkout@v3
with:
fetch-depth: 0
@@ -102,15 +91,38 @@ jobs:
echo "$VAR_VERSION-$VAR_SUFFIX.$release_date.$current_tag">version.txt
cat version.txt
echo "$version"
+
+ - name: vcpkg install
+ shell: bash
+ run: |
+ vcpkg install breakpad
+ - name: copy vcpkg packages into winlibs
+ shell: bash
+ run: |
+ ls -al /usr/local/share/vcpkg/packages/breakpad*
+ cp -R /usr/local/share/vcpkg/packages/breakpad*/* thirdparty/breakpad
+ ls -al thirdparty/breakpad/lib
+ - uses: actions/setup-python@v3
+ with:
+ python-version: '3.9'
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v3
+ with:
+ version: ${{ matrix.qt_ver }}
+ arch: ${{ matrix.qt_arch }}
+
+ modules: qtwebengine qtwebchannel qtpositioning qt5compat qtmultimedia qtimageformats qtspeech
+ setup-python: 'false'
+
- name: compile
run: |
- qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=use_xapian
+ qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=use_xapian CONFIG+=use_breakpad
make -j8
- name: package
run: |
- macdeployqt ${targetName}.app -qmldir=. -verbose=1
+ macdeployqt ${targetName}.app -no-strip -qmldir=. -verbose=1
otool -L GoldenDict.app/Contents/MacOS/GoldenDict
ls -al GoldenDict.app/Contents/Frameworks
otool -L GoldenDict.app/Contents/Frameworks/libicu*.dylib
@@ -195,7 +207,7 @@ jobs:
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ env.targetName }}.dmg
- asset_name: ${{ matrix.qt_ver }}-${{ env.targetName }}_${{ matrix.os }}_homebrew_${{steps.vars.outputs.release_date}}.dmg
+ asset_name: ${{ matrix.qt_ver }}-${{ env.targetName }}_${{ matrix.os }}_homebrew_breakpad_${{steps.vars.outputs.release_date}}.dmg
tag: tag-${{env.version-suffix}}.${{ steps.vars.outputs.sha_short }}
overwrite: true
diff --git a/goldendict.pro b/goldendict.pro
index b5fb3b08..20c3b77e 100644
--- a/goldendict.pro
+++ b/goldendict.pro
@@ -83,8 +83,8 @@ win32{
CONFIG( use_breakpad ) {
DEFINES += USE_BREAKPAD
- win32: LIBS += -L$$PWD/thirdparty/breakpad/lib/ -llibbreakpad -llibbreakpad_client
- else:unix: LIBS += -L$$PWD/thirdparty/breakpad/lib/ -llibbreakpa
+ LIBS += -L$$PWD/thirdparty/breakpad/lib/ -llibbreakpad -llibbreakpad_client
+
INCLUDEPATH += $$PWD/thirdparty/breakpad/include
DEPENDPATH += $$PWD/thirdparty/breakpad/include
diff --git a/src/main.cc b/src/main.cc
index db889281..0eb6dd9d 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -33,10 +33,17 @@
#include
#if defined(USE_BREAKPAD)
- #include "client/windows/handler/exception_handler.h"
+ #if defined( Q_OS_MAC )
+ #include "client/mac/handler/exception_handler.h"
+ #elif defined( Q_OS_LINUX )
+ #include "client/linux/handler/exception_handler.h"
+ #elif defined( Q_OS_WIN32 )
+ #include "client/windows/handler/exception_handler.h"
+ #endif
#endif
#if defined(USE_BREAKPAD)
+ #ifdef Q_OS_WIN32
bool callback(const wchar_t* dump_path, const wchar_t* id,
void* context, EXCEPTION_POINTERS* exinfo,
MDRawAssertionInfo* assertion,
@@ -48,6 +55,31 @@ bool callback(const wchar_t* dump_path, const wchar_t* id,
}
return succeeded;
}
+#endif
+ #ifdef Q_OS_LINUX
+bool callback( const google_breakpad::MinidumpDescriptor & descriptor, void * context, bool succeeded )
+{
+ if ( succeeded ) {
+ qDebug() << "Create dump file success";
+ }
+ else {
+ qDebug() << "Create dump file failed";
+ }
+ return succeeded;
+}
+ #endif
+ #ifdef Q_OS_MAC
+bool callback( const char * dump_dir, const char * minidump_id, void * context, bool succeeded )
+{
+ if ( succeeded ) {
+ qDebug() << "Create dump file success";
+ }
+ else {
+ qDebug() << "Create dump file failed";
+ }
+ return succeeded;
+}
+ #endif
#endif
QMutex logMutex;
@@ -55,9 +87,7 @@ QMutex logMutex;
void gdMessageHandler( QtMsgType type, const QMessageLogContext &context, const QString &mess )
{
QString strTime = QDateTime::currentDateTime().toString( "MM-dd hh:mm:ss" );
- QString message = QString( "%1 %2\r\n" )
- .arg( strTime )
- .arg( mess );
+ QString message = QString( "%1 %2\r\n" ).arg( strTime, mess );
if ( ( logFilePtr != nullptr ) && logFilePtr->isOpen() ) {
//without the lock ,on multithread,there would be assert error.
@@ -292,18 +322,32 @@ int main( int argc, char ** argv )
QHotkeyApplication::setWindowIcon( QIcon( ":/icons/programicon.png" ) );
#if defined(USE_BREAKPAD)
- QString appDirPath = QCoreApplication::applicationDirPath() + "/crash";
+ QString appDirPath = Config::getConfigDir() + "crash";
QDir dir;
if ( !dir.exists( appDirPath ) ) {
dir.mkpath( appDirPath );
}
+ #ifdef Q_OS_WIN32
google_breakpad::ExceptionHandler eh(
appDirPath.toStdWString(), NULL, callback, NULL,
google_breakpad::ExceptionHandler::HANDLER_ALL);
+ #elif defined( Q_OS_MAC )
+ google_breakpad::ExceptionHandler eh( appDirPath.toStdString(), 0, callback, 0, true, NULL );
+
+ #else
+
+ google_breakpad::ExceptionHandler eh( google_breakpad::MinidumpDescriptor( appDirPath.toStdString() ),
+ /*FilterCallback*/ 0,
+ callback,
+ /*context*/ 0,
+ true,
+ -1 );
+ #endif
+
#endif
GDOptions gdcl{};