From ec73e889dcde8665d837edc455ff4b21a6491bf5 Mon Sep 17 00:00:00 2001 From: Renato Mangini Date: Tue, 6 Aug 2024 09:57:20 -0600 Subject: [PATCH] Change bcny-firebase.yml to remove bmi2 support from snappy --- .github/workflows/bcny-firebase.yml | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/.github/workflows/bcny-firebase.yml b/.github/workflows/bcny-firebase.yml index 8638236278..4382d4c799 100644 --- a/.github/workflows/bcny-firebase.yml +++ b/.github/workflows/bcny-firebase.yml @@ -119,6 +119,25 @@ jobs: -D CMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded ` -D FIREBASE_PYTHON_HOST_EXECUTABLE:FILEPATH=${{ steps.python.outputs.python-path }} ` -D FLATBUFFERS_FLATC_EXECUTABLE=${{ github.workspace }}/BinaryCache/flatbuffers/Release/flatc.exe + + # The step below is necessary since Snappy detects if it should use BMI2 instructions on x64 based only on its ability to + # compile BMI2 code on the host machine, but we need to disable BMI2 instructions so that the resulting nuget package + # can be used on target machines without BMI2 support. Unfortunately Snappy is pulled indirectly from + # another dependency (firebase-ios-sdk) in a very involved dependency chain and there is no good way to + # set SNAPPY_HAVE_BMI2 without patching its code since compiler directives have less precendence than + # the result of the host machine's check_cxx_source_compiles (which ends up in the config.h file). + # So, the less messy solution seems to be to patch the config.h file after the configure step, which is what we do below. + - name: Change SNAPPY_HAVE_BMI2 in snappy config.h + # BMI2 instructions are only relevant in amd64 + if: ${{ matrix.arch }} == 'amd64' + run: | + $snappy_config = "${{ github.workspace }}\BinaryCache\firebase\external\src\firestore-build\external\src\snappy-build\config.h" + if (-not (Select-String -Path $snappy_config -Pattern "#define SNAPPY_HAVE_BMI2 1")) { + Write-Error "String '#define SNAPPY_HAVE_BMI2 1' expected but not found in $snappy_config" + exit 1 + } + (Get-Content $snappy_config) -replace '#define SNAPPY_HAVE_BMI2 1', '#define SNAPPY_HAVE_BMI2 0' | Set-Content $snappy_config + - name: Build firebase run: cmake --build ${{ github.workspace }}/BinaryCache/firebase --config RelWithDebInfo - name: Install firebase @@ -137,6 +156,24 @@ jobs: Copy-Item -Path $library.FullName -Destination $destination -Force Write-Host "... copied ${destination}" } + + # We need this library to be used on CPUs without BMI2 support, so we check that snappy.lib was built correctly, + # and fail if it contains BMI2 instructions. + - name: Check for Snappy BMI2 instructions + # BMI2 instructions are only relevant in amd64 + if: ${{ matrix.arch }} == 'amd64' + run: | + Write-Host "Checking for BMI2 instructions on Snappy.lib..." + $snappy_lib = "${{ github.workspace }}/BuildRoot/Library/firebase/usr/libs/windows/snappy.lib" + $output = dumpbin /DISASM "$snappy_lib" | Select-String -Pattern "bzhi" + if ($output) { + Write-Host $output + Write-Error "ERROR: A BMI2 instruction ('bzhi') was not supposed to be found in $snappy_lib." + exit 1 + } else { + Write-Output "Success! No BMI2 instructions were found in snappy.lib." + } + - uses: actions/upload-artifact@v3 with: name: firebase-windows-${{ matrix.arch }}