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{};