env: QT_VERSION: '5.15.2' SQLITE_VERSION: '3410200' SQLITE_RELEASE_YEAR: '2023' QT_ARCH: 'win64_mingw81' PYTHON_VERSION: '3.9' ICU_VER: '72' ICU_URL: https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-icu-72.1-1-any.pkg.tar.zst MINGW_DIR: ../Qt/Tools/mingw810_64 QT_BIN_DIR: ../Qt/5.15.2/mingw81_64/bin PORTABLE_DIR: output/portable/SQLiteStudio INSTALLBUILDER_DIR: ../ib MINGW_URL: https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/tools_mingw/qt.tools.win64_mingw810/8.1.0-1-202004170606x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z INSTALLBUILDER_URL: https://releases.bitrock.com/installbuilder/installbuilder-enterprise-23.1.0-windows-x64-installer.exe name: Windows 64-bit release build on: workflow_dispatch: inputs: use_ccache: description: 'Use ccache (for workflow debugging only!)' required: false type: boolean schedule: - cron: '0 2 * * 1' # run at 2 AM UTC every Monday repository_dispatch: types: [win64_release] jobs: build: runs-on: windows-2019 steps: - name: Cache Qt id: cache-qt uses: actions/cache@v3 with: path: ${{ github.workspace }}\..\Qt key: ${{ runner.os }}-${{ env.QT_VERSION }}-Qt-Cache - name: Install Qt uses: jurplel/install-qt-action@v3 with: cache: true version: ${{ env.QT_VERSION }} host: 'windows' arch: ${{ env.QT_ARCH }} # jurplel/install-qt-action has a bug due to which we cannot use ${{ github.workspace }} for the "dir" property, because it will fail. dir: 'D:/' setup-python: 'false' - name: Install mingw if: steps.cache-qt.outputs.cache-hit != 'true' shell: bash run: | curl -L ${{ env.MINGW_URL }} --output ../mingw.7z 7z x -o"../Qt" ../mingw.7z echo "${{ env.MINGW_DIR }}/bin" >> $GITHUB_PATH - uses: actions/setup-python@v4 with: python-version: ${{ env.PYTHON_VERSION }} architecture: 'x64' - name: Clone repo uses: actions/checkout@v3 with: ref: ${{ github.event.client_payload.branch }} - name: Install dependencies shell: bash run: | 7z x -o".." win_deps/win64_deps.zip echo "../lib" >> $GITHUB_PATH - name: Prepare ccache if: inputs.use_ccache || false uses: hendrikmuhs/ccache-action@v1.2.8 with: key: win64_release max-size: "24M" - name: Configure ccache (or not ccache) shell: bash run: | if [ ${{ inputs.use_ccache || false }} = false ]; then printf 'GCC_COMMAND=gcc.exe\nGXX_COMMAND=g++.exe\n' else printf 'GCC_COMMAND=ccache.exe gcc.exe\nGXX_COMMAND=ccache.exe g++.exe\n' fi >> $GITHUB_ENV - name: Install SQLite3 shell: bash run: | cd .. curl -L http://sqlite.org/$SQLITE_RELEASE_YEAR/sqlite-amalgamation-$SQLITE_VERSION.zip --output sqlite-amalgamation-$SQLITE_VERSION.zip 7z x sqlite-amalgamation-$SQLITE_VERSION.zip cd sqlite-amalgamation-$SQLITE_VERSION $GCC_COMMAND sqlite3.c -Os -fpic -DWIN64 -m64 -I. -shared -o sqlite3.dll \ -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \ -DSQLITE_ENABLE_DBSTAT_VTAB \ -DSQLITE_ENABLE_BYTECODE_VTAB \ -DSQLITE_ENABLE_COLUMN_METADATA \ -DSQLITE_ENABLE_EXPLAIN_COMMENTS \ -DSQLITE_ENABLE_FTS3 \ -DSQLITE_ENABLE_FTS4 \ -DSQLITE_ENABLE_FTS5 \ -DSQLITE_ENABLE_GEOPOLY \ -DSQLITE_ENABLE_JSON1 \ -DSQLITE_ENABLE_RTREE \ -DSQLITE_ENABLE_MATH_FUNCTIONS cp -f sqlite3.dll ../lib/ cp -f sqlite3.h ../include/ cp -f sqlite3ext.h ../include/ - name: Install extension dependencies shell: bash run: | cd .. curl -L "$ICU_URL" | tar -xf - --zstd mv mingw64 icu - name: Compile additional SQLite3 extensions shell: bash run: | cd .. mkdir ext curl -L http://sqlite.org/$SQLITE_RELEASE_YEAR/sqlite-src-$SQLITE_VERSION.zip --output sqlite-src-$SQLITE_VERSION.zip 7z x sqlite-src-$SQLITE_VERSION.zip cd sqlite-src-$SQLITE_VERSION/ext FLAGS="-shared -Os -fpic -DWIN64 -m64 -I../../include -L../../lib -lsqlite3" for f in compress sqlar; do echo "$GCC_COMMAND misc/$f.c -Imisc $FLAGS -lzlib1 -o ../../ext/$f.dll" $GCC_COMMAND misc/$f.c -Imisc $FLAGS -lzlib1 -o ../../ext/$f.dll done for f in csv decimal eval ieee754 percentile rot13 series uint uuid zorder; do echo "$GCC_COMMAND misc/$f.c -Imisc $FLAGS -o ../../ext/$f.dll" $GCC_COMMAND misc/$f.c -Imisc $FLAGS -o ../../ext/$f.dll done for f in icu; do echo "$GCC_COMMAND icu/$f.c -I../../icu/include -L../../icu/lib -licuio -licuin -licuuc -licudt $FLAGS -o ../../ext/$f.dll" $GCC_COMMAND icu/$f.c -I../../icu/include -L../../icu/lib -licuio -licuin -licuuc -licudt $FLAGS -o ../../ext/$f.dll done ls -l ../../ext/ - name: Prepare output dir shell: bash run: mkdir output output/build output/build/Plugins - name: Compile SQLiteStudio3 working-directory: output/build run: | qmake.exe ` CONFIG+=portable ` "QMAKE_CXX=${{ env.GXX_COMMAND }}" ` ..\..\SQLiteStudio3 mingw32-make.exe -j 2 - name: Compile Plugins working-directory: output/build/Plugins run: | qmake.exe ` "QMAKE_CXX=${{ env.GXX_COMMAND }}" ` CONFIG+=portable ` "INCLUDEPATH+=${{ env.pythonLocation }}/include" "LIBS += -L${{ env.pythonLocation }}" ` ..\..\..\Plugins mingw32-make.exe -j 1 - name: Copy SQLite extensions to output dir shell: bash run: | cp -R ../ext output/SQLiteStudio/ - name: Prepare portable dir shell: bash working-directory: output run: | mkdir portable cp -R SQLiteStudio portable/ - name: Clean-up portable dir shell: bash run: | cd ${{ env.PORTABLE_DIR }} rm -f *.a rm -f plugins/*.a rm -f styles/*.a echo "ABSOLUTE_PORTABLE_DIR=`pwd`" >> $GITHUB_ENV - name: Prepare portable distro (Qt) shell: bash working-directory: ${{ env.Qt5_Dir }} run: | for f in Qt5Core Qt5Gui Qt5Network Qt5PrintSupport Qt5Qml Qt5Svg Qt5Widgets Qt5Xml libgcc_s_seh-1 libstdc++-6 libwinpthread-1; do cp bin/$f.dll "$ABSOLUTE_PORTABLE_DIR"; done cp bin/qt.conf "$ABSOLUTE_PORTABLE_DIR" mkdir -p "$ABSOLUTE_PORTABLE_DIR/iconengines" mkdir -p "$ABSOLUTE_PORTABLE_DIR/platforms" mkdir -p "$ABSOLUTE_PORTABLE_DIR/printsupport" mkdir -p "$ABSOLUTE_PORTABLE_DIR/styles" mkdir -p "$ABSOLUTE_PORTABLE_DIR/imageformats" cp plugins/iconengines/qsvgicon.dll "$ABSOLUTE_PORTABLE_DIR/iconengines" cp plugins/platforms/qwindows.dll "$ABSOLUTE_PORTABLE_DIR/platforms" cp plugins/styles/qwindowsvistastyle.dll "$ABSOLUTE_PORTABLE_DIR/styles" cp plugins/printsupport/windowsprintersupport.dll "$ABSOLUTE_PORTABLE_DIR/printsupport" for f in qgif qicns qico qjpeg qsvg qtga qtiff qwbmp; do cp plugins/imageformats/$f.dll "$ABSOLUTE_PORTABLE_DIR/imageformats"; done - name: Prepare portable distro (Deps) shell: bash run: | cd ../lib cp *.dll "$ABSOLUTE_PORTABLE_DIR" cd ../icu/bin cp libicuio$ICU_VER.dll libicuin$ICU_VER.dll libicuuc$ICU_VER.dll libicudt$ICU_VER.dll "$ABSOLUTE_PORTABLE_DIR" - name: Prepare portable distro (Resources) shell: bash run: | cp SQLiteStudio3/guiSQLiteStudio/img/sqlitestudio.ico "$ABSOLUTE_PORTABLE_DIR"/appicon.ico cp SQLiteStudio3/guiSQLiteStudio/img/sqlitestudio.svg "${{ env.PORTABLE_DIR }}"/appicon.svg - name: Determine SQLiteStudio version shell: bash run: | cd $ABSOLUTE_PORTABLE_DIR echo "SQLITESTUDIO_VERSION=$(./sqlitestudiocli.exe --version | cut -f 2 -d ' ')" >> $GITHUB_ENV - name: Assemble portable package shell: bash run: | cd $ABSOLUTE_PORTABLE_DIR/.. 7z a -r sqlitestudio-$SQLITESTUDIO_VERSION.zip SQLiteStudio - name: Install the InstalBuilder shell: bash env: IB_LICENSE: ${{ secrets.INSTALLER_LICENSE }} run: | curl -L ${{ env.INSTALLBUILDER_URL }} --output ib.exe ./ib.exe --mode unattended --prefix ${{ env.INSTALLBUILDER_DIR }} ${{ env.INSTALLBUILDER_DIR }}/bin/builder-cli.exe --version echo "$IB_LICENSE" > lic.xml echo "INSTALLER_SRC_PREFIX=$(pwd)" >> $GITHUB_ENV echo "INSTALLER_BIN_PREFIX=$ABSOLUTE_PORTABLE_DIR" >> $GITHUB_ENV - name: Create installer package shell: bash run: | ${{ env.INSTALLBUILDER_DIR }}/bin/builder-cli.exe build SQLiteStudio-installer.xml \ --license lic.xml \ --setvars project.outputDirectory=$(pwd) \ --setvars project.version=$SQLITESTUDIO_VERSION ls -l - name: Upload package artifact uses: actions/upload-artifact@v1 with: name: sqlitestudio-${{ env.SQLITESTUDIO_VERSION }}.zip path: output/portable/sqlitestudio-${{ env.SQLITESTUDIO_VERSION }}.zip - name: Upload installer artifact uses: actions/upload-artifact@v1 with: name: SQLiteStudio-${{ env.SQLITESTUDIO_VERSION }}-windows-x64-installer.exe path: SQLiteStudio-${{ env.SQLITESTUDIO_VERSION }}-windows-x64-installer.exe