Complete QEMU 7.2.22 migration #37
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Nuget 📦 Distribution | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| on: | |
| push: | |
| paths-ignore: | |
| - ".gitignore" | |
| - "docs/**" | |
| - "README" | |
| - "CREDITS.TXT" | |
| - "COPYING_GLIB" | |
| - "COPYING.LGPL2" | |
| - "AUTHORS.TXT" | |
| - "CHANGELOG" | |
| - "COPYING" | |
| workflow_dispatch: | |
| inputs: | |
| forceRelease: | |
| description: 'Force release' | |
| required: false | |
| default: '' | |
| type: choice | |
| options: | |
| - '0' | |
| - '1' | |
| permissions: | |
| packages: write | |
| jobs: | |
| Windows: | |
| runs-on: ${{ matrix.config.os }} | |
| name: ${{ matrix.config.name }} | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| config: | |
| - { | |
| os: windows-2022, | |
| arch: x64, | |
| name: 'windows-x64 MSVC 64bit shared', | |
| msvc-arch: x64, | |
| artifact: 'windows-msvc64-shared.7z', | |
| shared: 'yes', | |
| build_type: 'Release', | |
| archiver: '7z a', | |
| generators: 'Visual Studio 17 2022' | |
| } | |
| - { | |
| os: windows-2022, | |
| arch: x86, | |
| name: 'windows-x86 MSVC 32bit shared', | |
| msvc-arch: x86, | |
| artifact: 'windows-msvc32-shared.7z', | |
| shared: 'yes', | |
| build_type: 'Release', | |
| archiver: '7z a', | |
| generators: 'Visual Studio 17 2022' | |
| } | |
| compiler: [ gcc ] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: 'Determine test parallelism' | |
| shell: pwsh | |
| run: | | |
| "CTEST_PARALLEL_LEVEL=$([Environment]::ProcessorCount)" | | |
| Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
| - name: '🛠️ Win MSVC 64 setup' | |
| if: contains(matrix.config.name, 'MSVC 64') | |
| uses: microsoft/setup-msbuild@v2 | |
| - name: '🛠️ Win MSVC 64 dev cmd setup' | |
| if: contains(matrix.config.name, 'MSVC 64') | |
| uses: ilammy/msvc-dev-cmd@v1 | |
| with: | |
| arch: x64 | |
| - name: '🚧 Win MSVC 64 build' | |
| if: contains(matrix.config.name, 'MSVC 64') | |
| shell: bash | |
| run: | | |
| choco install ninja | |
| ninja --version | |
| cmake --version | |
| mkdir build | |
| cmake \ | |
| -S . \ | |
| -B . \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ | |
| -G "${{ matrix.config.generators }}" \ | |
| -DCMAKE_C_FLAGS="//MT" \ | |
| -DCMAKE_INSTALL_PREFIX:PATH=instdir \ | |
| -DBUILD_SHARED_LIBS=${{ matrix.config.shared }} | |
| cmake --build . --config ${{ matrix.config.build_type }} | |
| cmake --install . --strip --config ${{ matrix.config.build_type }} | |
| ctest --parallel "$CTEST_PARALLEL_LEVEL" -VV -C ${{ matrix.config.build_type }} | |
| # vctip.exe (MSVC telemetry) and antivirus scans may transiently hold | |
| # handles inside the build directory and make the rename fail, so | |
| # retry for a while, killing vctip on each attempt | |
| tries=0 | |
| until mv Release instdir; do | |
| tries=$((tries+1)) | |
| if [ $tries -ge 12 ]; then echo "mv keeps failing, giving up"; exit 1; fi | |
| taskkill //IM vctip.exe //F || true | |
| sleep 5 | |
| done | |
| - name: '🛠️ Win MSVC 32 setup' | |
| if: contains(matrix.config.name, 'MSVC 32') | |
| uses: ilammy/msvc-dev-cmd@v1 | |
| with: | |
| arch: x86 | |
| - name: '🚧 Win MSVC 32 build' | |
| if: contains(matrix.config.name, 'MSVC 32') | |
| shell: bash | |
| run: | | |
| choco install ninja cmake | |
| ninja --version | |
| cmake --version | |
| mkdir build | |
| cmake \ | |
| -S . \ | |
| -B . \ | |
| -A "win32" \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ | |
| -G "${{ matrix.config.generators }}" \ | |
| -DCMAKE_C_FLAGS="//MT" \ | |
| -DCMAKE_INSTALL_PREFIX:PATH=instdir \ | |
| -DBUILD_SHARED_LIBS=${{ matrix.config.shared }} | |
| cmake --build . --config ${{ matrix.config.build_type }} | |
| cmake --install . --strip --config ${{ matrix.config.build_type }} | |
| ctest --parallel "$CTEST_PARALLEL_LEVEL" -VV -C ${{ matrix.config.build_type }} | |
| # vctip.exe (MSVC telemetry) and antivirus scans may transiently hold | |
| # handles inside the build directory and make the rename fail, so | |
| # retry for a while, killing vctip on each attempt | |
| tries=0 | |
| until mv Release instdir; do | |
| tries=$((tries+1)) | |
| if [ $tries -ge 12 ]; then echo "mv keeps failing, giving up"; exit 1; fi | |
| taskkill //IM vctip.exe //F || true | |
| sleep 5 | |
| done | |
| - name: '📦 Pack artifact' | |
| if: always() | |
| shell: bash | |
| working-directory: instdir | |
| run: | | |
| ls -laR | |
| ${{ matrix.config.archiver }} ../${{ matrix.config.artifact }} . ../test* | |
| - name: '📤 Upload artifact' | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| path: ./${{ matrix.config.artifact }} | |
| name: ${{ matrix.config.artifact }} | |
| Macos: | |
| runs-on: ${{ matrix.config.os }} | |
| name: ${{ matrix.config.name }} - ${{ matrix.compiler }} | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| config: | |
| - { | |
| os: macos-latest, | |
| arch: x64, | |
| name: 'macos-x64 cmake shared', | |
| shared: 'yes', | |
| artifact: 'macos-cmake-shared-x64.7z', | |
| build_type: 'Release', | |
| archiver: '7za a', | |
| generators: 'Ninja' | |
| } | |
| compiler: [ gcc ] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: 'Determine test parallelism' | |
| shell: bash | |
| run: echo "CTEST_PARALLEL_LEVEL=$(sysctl -n hw.logicalcpu)" >> "$GITHUB_ENV" | |
| - name: '🚧 Mac build' | |
| if: contains(matrix.config.name, 'macos-x64') | |
| shell: bash | |
| run: | | |
| ninja --version | |
| cmake --version | |
| mkdir build | |
| mkdir instdir | |
| cmake \ | |
| -S . \ | |
| -B . \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ | |
| -G "${{ matrix.config.generators }}" \ | |
| -DCMAKE_INSTALL_PREFIX:PATH=instdir \ | |
| -DBUILD_SHARED_LIBS=${{ matrix.config.shared }} | |
| cmake --build . --config ${{ matrix.config.build_type }} | |
| cmake --install . --strip | |
| ctest --parallel "$CTEST_PARALLEL_LEVEL" -VV -C ${{ matrix.config.build_type }} | |
| - name: '📦 Pack artifact' | |
| if: always() | |
| shell: bash | |
| working-directory: instdir | |
| run: | | |
| ls -laR | |
| ${{ matrix.config.archiver }} ../${{ matrix.config.artifact }} . ../test* | |
| - name: '📤 Upload artifact' | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| path: ./${{ matrix.config.artifact }} | |
| name: ${{ matrix.config.artifact }} | |
| Linux: | |
| runs-on: ${{ matrix.config.os }} | |
| name: ${{ matrix.config.name }} - ${{ matrix.compiler }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| config: | |
| - { | |
| os: ubuntu-latest, | |
| arch: x64, | |
| name: 'ubuntu-x64 cmake shared', | |
| shared: 'yes', | |
| artifact: 'ubuntu-cmake-shared-x64.7z', | |
| build_type: 'Release', | |
| archiver: '7z a', | |
| generators: 'Ninja' | |
| } | |
| - { | |
| os: ubuntu-latest, | |
| arch: x86, | |
| name: 'ubuntu-x86 cmake shared', | |
| shared: 'yes', | |
| artifact: 'ubuntu-cmake-shared-x86.7z', | |
| build_type: 'Release', | |
| archiver: '7z a', | |
| generators: 'Ninja' | |
| } | |
| - { | |
| os: ubuntu-24.04-arm, | |
| arch: aarch64, | |
| name: 'ubuntu-aarch64 cmake', | |
| artifact: 'ubuntu-cmake-aarch64.7z', | |
| build_type: 'Release', | |
| archiver: '7z a', | |
| generators: 'Ninja', | |
| distro: ubuntu24.04 | |
| } | |
| - { | |
| os: ubuntu-22.04, | |
| arch: ppc64le, | |
| name: 'ubuntu-ppc64le cmake', | |
| artifact: 'ubuntu-cmake-ppc64le.7z', | |
| build_type: 'Release', | |
| archiver: '7z a', | |
| generators: 'Ninja', | |
| distro: ubuntu22.04 | |
| } | |
| compiler: [ gcc ] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: 'Determine test parallelism' | |
| shell: bash | |
| run: echo "CTEST_PARALLEL_LEVEL=$(getconf _NPROCESSORS_ONLN)" >> "$GITHUB_ENV" | |
| - name: '🚧 Linux x64/x86 build' | |
| if: contains(matrix.config.arch, 'x64') || contains(matrix.config.arch, 'x86') | |
| shell: bash | |
| run: | | |
| if [ ${{ matrix.config.arch }} == 'x64' ]; then | |
| sudo apt update -q -y | |
| sudo apt install -q -y libcmocka-dev ninja-build | |
| else | |
| export CFLAGS="-m32" LDFLAGS="-m32" LDFLAGS_STATIC="-m32" UNICORN_QEMU_FLAGS="--cpu=i386" | |
| sudo dpkg --add-architecture i386 | |
| sudo apt update -q -y | |
| sudo apt install -q -y lib32ncurses-dev lib32z1-dev lib32gcc-9-dev libc6-dev-i386 gcc-multilib \ | |
| libcmocka-dev:i386 libcmocka0:i386 libc6:i386 libgcc-s1:i386 ninja-build | |
| fi | |
| mkdir build | |
| mkdir instdir | |
| cmake \ | |
| -S . \ | |
| -B . \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ | |
| -G "${{ matrix.config.generators }}" \ | |
| -DCMAKE_INSTALL_PREFIX:PATH=instdir \ | |
| -DBUILD_SHARED_LIBS=${{ matrix.config.shared }} | |
| cmake --build . --config ${{ matrix.config.build_type }} | |
| cmake --install . --strip | |
| ctest --parallel "$CTEST_PARALLEL_LEVEL" -VV -C ${{ matrix.config.build_type }} | |
| - name: '🚧 Linux aarch64 build' | |
| if: contains(matrix.config.arch, 'aarch64') | |
| shell: bash | |
| run: | | |
| sudo apt-get update -q -y | |
| sudo apt-get install -q -y git cmake build-essential automake libcmocka-dev pkg-config ${{ matrix.compiler }} ninja-build | |
| mkdir build | |
| mkdir instdir | |
| cmake \ | |
| -S . \ | |
| -B . \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ | |
| -G "${{ matrix.config.generators }}" \ | |
| -DCMAKE_INSTALL_PREFIX:PATH=instdir | |
| cmake --build . --config ${{ matrix.config.build_type }} | |
| cmake --install . --strip | |
| ctest --parallel "$CTEST_PARALLEL_LEVEL" -VV -C ${{ matrix.config.build_type }} | |
| - name: '🚧 Linux ppc64le build' | |
| if: contains(matrix.config.arch, 'ppc64le') | |
| uses: uraimo/run-on-arch-action@v3 | |
| with: | |
| arch: ${{ matrix.config.arch }} | |
| distro: ${{ matrix.config.distro }} | |
| setup: | | |
| mkdir -p "${PWD}/instdir" | |
| dockerRunArgs: | | |
| --volume "${PWD}/instdir:/instdir" | |
| shell: /bin/sh | |
| install: | | |
| apt-get update -q -y | |
| apt-get install -q -y git cmake build-essential automake libcmocka-dev pkg-config ${{ matrix.compiler }} ninja-build | |
| run: | | |
| mkdir build | |
| cmake \ | |
| -S . \ | |
| -B . \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \ | |
| -G "${{ matrix.config.generators }}" \ | |
| -DCMAKE_INSTALL_PREFIX:PATH=/instdir | |
| cmake --build . --config ${{ matrix.config.build_type }} | |
| cmake --install . --strip | |
| ctest --parallel "$(getconf _NPROCESSORS_ONLN)" -VV -C ${{ matrix.config.build_type }} | |
| - name: '📦 Pack artifact' | |
| if: always() | |
| shell: bash | |
| working-directory: instdir | |
| run: | | |
| ls -laR | |
| ${{ matrix.config.archiver }} ../${{ matrix.config.artifact }} . ../test* | |
| - name: '📤 Upload artifact' | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| path: ./${{ matrix.config.artifact }} | |
| name: ${{ matrix.config.artifact }} | |
| publish: | |
| needs: [ "Windows", "Macos", "Linux" ] | |
| if: ${{ needs.Windows.result == 'success' && needs.Macos.result == 'success' && needs.Linux.result == 'success' }} | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: 🛠️ Download artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| - name: 🛠️ Extract artifacts | |
| shell: python | |
| run: | | |
| import subprocess | |
| import os | |
| artifactPath = os.path.join(os.getcwd(), "artifacts") | |
| bindingsPath = os.path.join(os.getcwd(), "bindings", "dotnet", "UnicornEngine") | |
| ARTIFACT_CONFIG = { | |
| "ubuntu-cmake-aarch64.7z": { | |
| "sourceDir": "lib/", | |
| "sourceFile": "libunicorn.so.*", | |
| "destDir": "runtimes/linux-arm64/native", | |
| "destFile": "libunicorn.so" | |
| }, | |
| "ubuntu-cmake-ppc64le.7z": { | |
| "sourceDir": "lib/", | |
| "sourceFile": "libunicorn.so.*", | |
| "destDir": "runtimes/linux-ppc64le/native", | |
| "destFile": "libunicorn.so" | |
| }, | |
| "ubuntu-cmake-shared-x86.7z": { | |
| "sourceDir": "lib/", | |
| "sourceFile": "libunicorn.so.*", | |
| "destDir": "runtimes/linux-x64/native", | |
| "destFile": "libunicorn.so" | |
| }, | |
| "macos-cmake-shared-x64.7z": { | |
| "sourceDir": "lib/", | |
| "sourceFile": "libunicorn.*.dylib", | |
| "destDir": "runtimes/osx-x64/native", | |
| "destFile": "libunicorn.dylib" | |
| }, | |
| "windows-msvc64-shared.7z": { | |
| "sourceDir": "", | |
| "sourceFile": "unicorn.dll", | |
| "destDir": "runtimes/win-x64/native", | |
| "destFile": "unicorn.dll" | |
| }, | |
| "windows-msvc32-shared.7z": { | |
| "sourceDir": "", | |
| "sourceFile": "unicorn.dll", | |
| "destDir": "runtimes/win-x86/native", | |
| "destFile": "unicorn.dll" | |
| } | |
| } | |
| if len(os.listdir(artifactPath)) < len(ARTIFACT_CONFIG.keys()): | |
| print("Some artifacts are missing. Aborting.") | |
| exit(1) | |
| for artifact in os.listdir(artifactPath): | |
| if artifact in ARTIFACT_CONFIG.keys(): | |
| print("Working on:", artifact) | |
| config = ARTIFACT_CONFIG[artifact] | |
| destDir = os.path.join(bindingsPath, config["destDir"]) | |
| print("Creating dir:", destDir) | |
| os.makedirs(destDir, exist_ok=True) | |
| print(f"Extracting library from 7z file to: {config['destDir']}/{config['sourceFile']}") | |
| result = subprocess.run(["7z", "e", f"-o{destDir}/", os.path.join(artifactPath, artifact), f"{config['sourceDir']}{config['sourceFile']}"]) | |
| result.check_returncode() | |
| if config["sourceFile"] != config["destFile"]: | |
| output = subprocess.run(["ls", destDir], stdout=subprocess.PIPE) | |
| sourceFile = output.stdout.decode().strip() | |
| print(f"Renaming {sourceFile} to {config['destFile']}") | |
| os.rename(os.path.join(destDir, sourceFile), os.path.join(destDir, config["destFile"])) | |
| print("Done!") | |
| - name: 🛠️ Get short sha | |
| id: git_short_sha | |
| run: echo "result=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT | |
| - uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: 6.0.x | |
| - name: 🛠️ Authenticate to Github Packages | |
| working-directory: bindings/dotnet/UnicornEngine | |
| run: dotnet nuget add source --username "${{ github.repository_owner }}" --password "${{ secrets.GITHUB_TOKEN }}" --store-password-in-clear-text --name github "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" | |
| - name: 🛠️ List all native libraries | |
| working-directory: bindings/dotnet/UnicornEngine | |
| run: find ./runtimes -type f -print | |
| - name: 🚧 Package .NET distribution | |
| working-directory: bindings/dotnet/UnicornEngine | |
| run: | | |
| [[ "${{ github.ref_name }}" == "master" ]] \ | |
| && dotnet pack -c Release \ | |
| || dotnet pack -c Release --version-suffix="${{ steps.git_short_sha.outputs.result }}" | |
| - name: '📤 Upload artifact' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| path: ${{ github.workspace }}/bindings/dotnet/UnicornEngine/bin/Release/UnicornEngine.Unicorn.*.nupkg | |
| # We always reach billing limit, allow it fails | |
| - name: 📦 Publish to Github Packages | |
| if: (inputs.forceRelease != '' && inputs.forceRelease == 1) || (startsWith(github.ref, 'refs/tags') && !startsWith(github.ref, 'refs/tags/v')) | |
| continue-on-error: true | |
| working-directory: bindings/dotnet/UnicornEngine | |
| run: dotnet nuget push "bin/Release/UnicornEngine.Unicorn.*.nupkg" --source "github" --api-key "${{ secrets.GHPR_TOKEN }}" | |
| - name: 📦 Publish Nuget package | |
| if: (inputs.forceRelease != '' && inputs.forceRelease == 1) || (startsWith(github.ref, 'refs/tags') && !startsWith(github.ref, 'refs/tags/v')) | |
| working-directory: bindings/dotnet/UnicornEngine | |
| run: dotnet nuget push "bin/Release/UnicornEngine.Unicorn.*.nupkg" -k "$NUGET_AUTH_TOKEN" -s https://api.nuget.org/v3/index.json | |
| env: | |
| NUGET_AUTH_TOKEN: ${{ secrets.NUGET_KEY }} |