diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 7046bdc..db1770b 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -13,6 +13,10 @@ jobs: build: name: Build runs-on: ${{ matrix.os }} + env: + VCPKG_DEFAULT_TRIPLET: ${{ matrix.arch == 'Win32' && 'x86' || matrix.arch == 'Win64' && 'x64' }}-windows-static + SQLCIPHER_NMAKE_VARS: USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe + SQLCIPHER_NMAKE_OPT_FEATURE_FLAGS: -DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 permissions: contents: write strategy: @@ -24,7 +28,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup OpenSSL + - name: Setup OpenSSL 1.1.1 for Win32 if: matrix.arch == 'Win32' # https://github.com/actions/runner-images/blob/main/images/windows/scripts/build/Install-OpenSSL.ps1 & Win32OpenSSL.exe /? & Win32OpenSSL.exe /LOG="a.log" /SAVEINF="inf.inf" run: | @@ -38,51 +42,73 @@ jobs: with: arch: ${{ matrix.arch == 'Win32' && 'amd64_x86' || matrix.arch == 'Win64' && 'amd64'}} - - name: Clear SQLite and temp files + - name: Setup vcpkg cache + # https://learn.microsoft.com/zh-cn/vcpkg/users/binarycaching#gha + uses: actions/github-script@v7 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Setup OpenSSL (static) + # https://blog.hamaluik.ca/posts/statically-linking-sqlcipher-on-windows + run: | + vcpkg install openssl:${{ env.VCPKG_DEFAULT_TRIPLET }} --binarysource="clear;x-gha,readwrite" + + - name: Init folders continue-on-error: true run: | mkdir -p C:\temp\${{ matrix.arch }}\ mkdir -p C:\dev - - name: Install SQLite - run: | - $htmlContent = Invoke-WebRequest -Uri "https://sqlite.org/download.html" | Select-Object -ExpandProperty Content - $regex = [regex]::new('PRODUCT,(\d+\.\d+\.\d+),(\d+/sqlite-amalgamation-\d+\.zip),\d+,(.+)') - $match = $regex.Match($htmlContent) - $relativeUrl = $match.Groups[2].Value - $downloadLink = "https://sqlite.org/$relativeUrl" - Invoke-WebRequest -Uri $downloadLink -OutFile 'C:\temp\${{ matrix.arch }}\sqlite.zip' - Expand-Archive -Path C:\temp\${{ matrix.arch }}\sqlite.zip -DestinationPath C:\temp\${{ matrix.arch }} - Move-Item -Path C:\temp\${{ matrix.arch }}\sqlite-amalgamation-* C:\dev\SQLite-${{ matrix.arch }} - cd C:\dev\SQLite-${{ matrix.arch }} - cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_SOUNDEX -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_MAX_ATTACHED=125 -DSQLITE_API="__declspec(dllexport)" -link -dll -out:sqlite3.dll + # - name: Install SQLite + # run: | + # $htmlContent = Invoke-WebRequest -Uri "https://sqlite.org/download.html" | Select-Object -ExpandProperty Content + # $regex = [regex]::new('PRODUCT,(\d+\.\d+\.\d+),(\d+/sqlite-amalgamation-\d+\.zip),\d+,(.+)') + # $match = $regex.Match($htmlContent) + # $relativeUrl = $match.Groups[2].Value + # $downloadLink = "https://sqlite.org/$relativeUrl" + # Invoke-WebRequest -Uri $downloadLink -OutFile 'C:\temp\${{ matrix.arch }}\sqlite.zip' + # Expand-Archive -Path C:\temp\${{ matrix.arch }}\sqlite.zip -DestinationPath C:\temp\${{ matrix.arch }} + # Move-Item -Path C:\temp\${{ matrix.arch }}\sqlite-amalgamation-* C:\dev\SQLite-${{ matrix.arch }} + # cd C:\dev\SQLite-${{ matrix.arch }} + # cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_SOUNDEX -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_MAX_ATTACHED=125 -DSQLITE_API="__declspec(dllexport)" -link -dll -out:sqlite3.dll - - name: Install SQLite Extensions - run: | - cp .\src\extensions\extension-formats.c C:\dev\SQLite-${{ matrix.arch}}\ - cp .\src\extensions\extension-formats.def C:\dev\SQLite-${{ matrix.arch}}\ - cp .\src\extensions\extension-functions.c C:\dev\SQLite-${{ matrix.arch}}\ - cp .\src\extensions\extension-functions.def C:\dev\SQLite-${{ matrix.arch}}\ - cd C:\dev\SQLite-${{ matrix.arch}}\ - cl /MD extension-formats.c -link -dll -def:extension-formats.def -out:formats.dll - cl /MD extension-functions.c -link -dll -def:extension-functions.def -out:math.dll - # FIXME: Disable building the 'fileio' extension for now (#3488) - # If this issue is resolved, be sure to delete the related patch for WiX - # curl -L -o fileio.c "https://sqlite.org/src/raw?filename=ext/misc/fileio.c&ci=trunk" - # curl -L -o test_windirent.c "https://sqlite.org/src/raw?filename=src/test_windirent.c&ci=trunk" - # curl -L -o test_windirent.h "https://sqlite.org/src/raw?filename=src/test_windirent.h&ci=trunk" - # cl /MD fileio.c test_windirent.c -link sqlite3.lib -dll -out:fileio.dll + # - name: Build SQLite Extensions + # run: | + # cp .\src\extensions\extension-formats.c C:\dev\SQLite-${{ matrix.arch}}\ + # cp .\src\extensions\extension-formats.def C:\dev\SQLite-${{ matrix.arch}}\ + # cp .\src\extensions\extension-functions.c C:\dev\SQLite-${{ matrix.arch}}\ + # cp .\src\extensions\extension-functions.def C:\dev\SQLite-${{ matrix.arch}}\ + # cd C:\dev\SQLite-${{ matrix.arch}}\ + # cl /MD extension-formats.c -link -dll -def:extension-formats.def -out:formats.dll + # cl /MD extension-functions.c -link -dll -def:extension-functions.def -out:math.dll + # # FIXME: Disable building the 'fileio' extension for now (#3488) + # # If this issue is resolved, be sure to delete the related patch for WiX + # # curl -L -o fileio.c "https://sqlite.org/src/raw?filename=ext/misc/fileio.c&ci=trunk" + # # curl -L -o test_windirent.c "https://sqlite.org/src/raw?filename=src/test_windirent.c&ci=trunk" + # # curl -L -o test_windirent.h "https://sqlite.org/src/raw?filename=src/test_windirent.h&ci=trunk" + # # cl /MD fileio.c test_windirent.c -link sqlite3.lib -dll -out:fileio.dll - - name: Install SQLCipher + - name: Build SQLCipher (dynamically linked) # ref: https://github.com/actions/runner-images/blob/main/images/windows/scripts/build/Install-OpenSSL.ps1#L12 run: | mkdir -p C:\dev\SQLCipher-${{ matrix.arch }} cd C:\dev\SQLCipher-${{ matrix.arch }} git clone -q https://github.com/sqlcipher/sqlcipher.git . git reset --hard $(git describe --tags --abbrev=0) - nmake /f Makefile.msc USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="`"$env:ProgramFiles\OpenSSL\lib\libcrypto.lib`"" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 `"-I$env:ProgramFiles\OpenSSL\include`"" + nmake /f Makefile.msc ${{ env.SQLCIPHER_NMAKE_VARS }} LTLINKOPTS="`"$env:ProgramFiles\OpenSSL\lib\libcrypto.lib`"" OPT_FEATURE_FLAGS="${{ env.SQLCIPHER_NMAKE_OPT_FEATURE_FLAGS }} `"-I$env:ProgramFiles\OpenSSL\include`"" mkdir sqlcipher - copy sqlite3.c,sqlite3.h,sqlcipher.dll,sqlcipher.lib,sqlcipher.exe,"$env:ProgramFiles\OpenSSL\libcrypto-*" sqlcipher + move sqlcipher.exe sqlcipher-dynamic.exe + copy sqlite3.c,sqlite3.h,sqlcipher.dll,sqlcipher.lib,sqlcipher-dynamic.exe,"$env:ProgramFiles\OpenSSL\libcrypto-*" sqlcipher + + - name: Build SQLCipher (statically linked) + # ref: https://github.com/actions/runner-images/blob/main/images/windows/scripts/build/Install-OpenSSL.ps1#L12 + run: | + cd C:\dev\SQLCipher-${{ matrix.arch }} + nmake /f Makefile.msc clean + nmake /f Makefile.msc ${{ env.SQLCIPHER_NMAKE_VARS }} LTLINKOPTS="`"$env:VCPKG_INSTALLATION_ROOT\packages\openssl_${{ env.VCPKG_DEFAULT_TRIPLET }}\lib\libcrypto.lib`"" TCC="`"-I$env:VCPKG_INSTALLATION_ROOT\packages\openssl_${{ env.VCPKG_DEFAULT_TRIPLET }}\include`"" RCC="`"-I$env:VCPKG_INSTALLATION_ROOT\packages\openssl_${{ env.VCPKG_DEFAULT_TRIPLET }}\include`"" LTLIBPATHS="`"-I$env:VCPKG_INSTALLATION_ROOT\packages\openssl_${{ env.VCPKG_DEFAULT_TRIPLET }}\lib`"" OPT_FEATURE_FLAGS="${{ env.SQLCIPHER_NMAKE_OPT_FEATURE_FLAGS }} `"-I$env:VCPKG_INSTALLATION_ROOT\packages\openssl_${{ env.VCPKG_DEFAULT_TRIPLET }}\include`"" LTLIBS="libcrypto.lib libssl.lib WS2_32.Lib Gdi32.Lib AdvAPI32.Lib Crypt32.Lib User32.Lib" + copy sqlcipher.exe,"$env:ProgramFiles\OpenSSL\libcrypto-*" sqlcipher - name: Prepare artifacts run: | @@ -99,4 +125,4 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: latest - files: build-artifacts-${{ matrix.arch }}.zip + files: dynamic-${{ matrix.arch }}.zip