From 1d12e8778bde982b6456efaabefa239d48d95096 Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Mon, 31 Oct 2022 22:56:44 +0100 Subject: [PATCH 01/12] bindings: Rename dotnet project to UnicornEngine Add a few more properties to prepare a nuget package --- bindings/const_generator.py | 4 ++-- bindings/dotnet/UnicornDotNet.sln | 2 +- .../Binding/BindingFactory.fs | 2 +- .../Binding/IBinding.fs | 2 +- .../Binding/MockBinding.fs | 2 +- .../Binding/NativeBinding.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/Arm.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/Arm64.fs | 2 +- .../Const/Common.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/M68k.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/Mips.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/Ppc.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/Riscv.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/S390x.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/Sparc.fs | 2 +- .../Const/TriCore.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Const/X86.fs | 2 +- .../ConvertUtility.fs | 2 +- .../InternalHooks.fs | 2 +- .../{UnicornManaged => UnicornEngine}/Unicorn.fs | 6 +++--- .../UnicornEngine.fsproj} | 12 +++++++++--- .../UnicornEngineException.fs | 2 +- bindings/dotnet/UnicornSamples/ShellcodeSample.cs | 4 ++-- bindings/dotnet/UnicornSamples/UnicornSamples.csproj | 4 ++-- bindings/dotnet/UnicornSamples/X86Sample32.cs | 4 ++-- 25 files changed, 39 insertions(+), 33 deletions(-) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Binding/BindingFactory.fs (84%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Binding/IBinding.fs (97%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Binding/MockBinding.fs (98%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Binding/NativeBinding.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/Arm.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/Arm64.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/Common.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/M68k.fs (97%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/Mips.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/Ppc.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/Riscv.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/S390x.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/Sparc.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/TriCore.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Const/X86.fs (99%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/ConvertUtility.fs (94%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/InternalHooks.fs (98%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/Unicorn.fs (99%) rename bindings/dotnet/{UnicornManaged/UnicornManaged.fsproj => UnicornEngine/UnicornEngine.fsproj} (79%) rename bindings/dotnet/{UnicornManaged => UnicornEngine}/UnicornEngineException.fs (83%) diff --git a/bindings/const_generator.py b/bindings/const_generator.py index 2a74c864..6d529630 100644 --- a/bindings/const_generator.py +++ b/bindings/const_generator.py @@ -90,10 +90,10 @@ template = { 'comment_close': '', }, 'dotnet': { - 'header': "// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT\n\nnamespace UnicornManaged.Const\n\nopen System\n\n[]\nmodule %s =\n", + 'header': "// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT\n\nnamespace UnicornEngine.Const\n\nopen System\n\n[]\nmodule %s =\n", 'footer': "\n", 'line_format': ' let UC_%s = %s\n', - 'out_file': os.path.join('dotnet', 'UnicornManaged', 'Const', '%s.fs'), + 'out_file': os.path.join('dotnet', 'UnicornEngine', 'Const', '%s.fs'), # prefixes for constant filenames of all archs - case sensitive 'arm.h': 'Arm', 'arm64.h': 'Arm64', diff --git a/bindings/dotnet/UnicornDotNet.sln b/bindings/dotnet/UnicornDotNet.sln index 90aa5b60..abe168e9 100644 --- a/bindings/dotnet/UnicornDotNet.sln +++ b/bindings/dotnet/UnicornDotNet.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnicornSamples", "UnicornSamples\UnicornSamples.csproj", "{B80B5987-1E24-4309-8BF9-C4F91270F21C}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "UnicornManaged", "UnicornManaged\UnicornManaged.fsproj", "{0C21F1C1-2725-4A46-9022-1905F85822A5}" +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "UnicornEngine", "UnicornEngine\UnicornEngine.fsproj", "{0C21F1C1-2725-4A46-9022-1905F85822A5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/bindings/dotnet/UnicornManaged/Binding/BindingFactory.fs b/bindings/dotnet/UnicornEngine/Binding/BindingFactory.fs similarity index 84% rename from bindings/dotnet/UnicornManaged/Binding/BindingFactory.fs rename to bindings/dotnet/UnicornEngine/Binding/BindingFactory.fs index 6ea0b183..30c7f821 100644 --- a/bindings/dotnet/UnicornManaged/Binding/BindingFactory.fs +++ b/bindings/dotnet/UnicornEngine/Binding/BindingFactory.fs @@ -1,4 +1,4 @@ -namespace UnicornManaged.Binding +namespace UnicornEngine.Binding module BindingFactory = diff --git a/bindings/dotnet/UnicornManaged/Binding/IBinding.fs b/bindings/dotnet/UnicornEngine/Binding/IBinding.fs similarity index 97% rename from bindings/dotnet/UnicornManaged/Binding/IBinding.fs rename to bindings/dotnet/UnicornEngine/Binding/IBinding.fs index 7ef6d279..b6c3edc0 100644 --- a/bindings/dotnet/UnicornManaged/Binding/IBinding.fs +++ b/bindings/dotnet/UnicornEngine/Binding/IBinding.fs @@ -1,4 +1,4 @@ -namespace UnicornManaged.Binding +namespace UnicornEngine.Binding open System diff --git a/bindings/dotnet/UnicornManaged/Binding/MockBinding.fs b/bindings/dotnet/UnicornEngine/Binding/MockBinding.fs similarity index 98% rename from bindings/dotnet/UnicornManaged/Binding/MockBinding.fs rename to bindings/dotnet/UnicornEngine/Binding/MockBinding.fs index 7b99c8e5..3eeefe89 100644 --- a/bindings/dotnet/UnicornManaged/Binding/MockBinding.fs +++ b/bindings/dotnet/UnicornEngine/Binding/MockBinding.fs @@ -1,4 +1,4 @@ -namespace UnicornManaged.Binding +namespace UnicornEngine.Binding open System diff --git a/bindings/dotnet/UnicornManaged/Binding/NativeBinding.fs b/bindings/dotnet/UnicornEngine/Binding/NativeBinding.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Binding/NativeBinding.fs rename to bindings/dotnet/UnicornEngine/Binding/NativeBinding.fs index 6be7b2f3..efaccc48 100644 --- a/bindings/dotnet/UnicornManaged/Binding/NativeBinding.fs +++ b/bindings/dotnet/UnicornEngine/Binding/NativeBinding.fs @@ -1,4 +1,4 @@ -namespace UnicornManaged.Binding +namespace UnicornEngine.Binding open System open System.Runtime.InteropServices diff --git a/bindings/dotnet/UnicornManaged/Const/Arm.fs b/bindings/dotnet/UnicornEngine/Const/Arm.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/Arm.fs rename to bindings/dotnet/UnicornEngine/Const/Arm.fs index 08766baf..8a275261 100644 --- a/bindings/dotnet/UnicornManaged/Const/Arm.fs +++ b/bindings/dotnet/UnicornEngine/Const/Arm.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/Arm64.fs b/bindings/dotnet/UnicornEngine/Const/Arm64.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/Arm64.fs rename to bindings/dotnet/UnicornEngine/Const/Arm64.fs index 4c509d03..9e9878a7 100644 --- a/bindings/dotnet/UnicornManaged/Const/Arm64.fs +++ b/bindings/dotnet/UnicornEngine/Const/Arm64.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/Common.fs b/bindings/dotnet/UnicornEngine/Const/Common.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/Common.fs rename to bindings/dotnet/UnicornEngine/Const/Common.fs index 72b5cb3a..73f9663c 100644 --- a/bindings/dotnet/UnicornManaged/Const/Common.fs +++ b/bindings/dotnet/UnicornEngine/Const/Common.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/M68k.fs b/bindings/dotnet/UnicornEngine/Const/M68k.fs similarity index 97% rename from bindings/dotnet/UnicornManaged/Const/M68k.fs rename to bindings/dotnet/UnicornEngine/Const/M68k.fs index b9189d2d..768bc12b 100644 --- a/bindings/dotnet/UnicornManaged/Const/M68k.fs +++ b/bindings/dotnet/UnicornEngine/Const/M68k.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/Mips.fs b/bindings/dotnet/UnicornEngine/Const/Mips.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/Mips.fs rename to bindings/dotnet/UnicornEngine/Const/Mips.fs index 7f85a0cf..d4818783 100644 --- a/bindings/dotnet/UnicornManaged/Const/Mips.fs +++ b/bindings/dotnet/UnicornEngine/Const/Mips.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/Ppc.fs b/bindings/dotnet/UnicornEngine/Const/Ppc.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/Ppc.fs rename to bindings/dotnet/UnicornEngine/Const/Ppc.fs index 1727c157..54a18b3b 100644 --- a/bindings/dotnet/UnicornManaged/Const/Ppc.fs +++ b/bindings/dotnet/UnicornEngine/Const/Ppc.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/Riscv.fs b/bindings/dotnet/UnicornEngine/Const/Riscv.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/Riscv.fs rename to bindings/dotnet/UnicornEngine/Const/Riscv.fs index bf578024..fe61ec2c 100644 --- a/bindings/dotnet/UnicornManaged/Const/Riscv.fs +++ b/bindings/dotnet/UnicornEngine/Const/Riscv.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/S390x.fs b/bindings/dotnet/UnicornEngine/Const/S390x.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/S390x.fs rename to bindings/dotnet/UnicornEngine/Const/S390x.fs index 97f7ec4b..c4bd76e6 100644 --- a/bindings/dotnet/UnicornManaged/Const/S390x.fs +++ b/bindings/dotnet/UnicornEngine/Const/S390x.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/Sparc.fs b/bindings/dotnet/UnicornEngine/Const/Sparc.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/Sparc.fs rename to bindings/dotnet/UnicornEngine/Const/Sparc.fs index 8eb8cc23..8350af5c 100644 --- a/bindings/dotnet/UnicornManaged/Const/Sparc.fs +++ b/bindings/dotnet/UnicornEngine/Const/Sparc.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/TriCore.fs b/bindings/dotnet/UnicornEngine/Const/TriCore.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/TriCore.fs rename to bindings/dotnet/UnicornEngine/Const/TriCore.fs index 0c82fb97..b2c78e2e 100644 --- a/bindings/dotnet/UnicornManaged/Const/TriCore.fs +++ b/bindings/dotnet/UnicornEngine/Const/TriCore.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/Const/X86.fs b/bindings/dotnet/UnicornEngine/Const/X86.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Const/X86.fs rename to bindings/dotnet/UnicornEngine/Const/X86.fs index 8d2fd5b3..5e115b9e 100644 --- a/bindings/dotnet/UnicornManaged/Const/X86.fs +++ b/bindings/dotnet/UnicornEngine/Const/X86.fs @@ -1,6 +1,6 @@ // For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT -namespace UnicornManaged.Const +namespace UnicornEngine.Const open System diff --git a/bindings/dotnet/UnicornManaged/ConvertUtility.fs b/bindings/dotnet/UnicornEngine/ConvertUtility.fs similarity index 94% rename from bindings/dotnet/UnicornManaged/ConvertUtility.fs rename to bindings/dotnet/UnicornEngine/ConvertUtility.fs index 5e455bf7..a453c861 100644 --- a/bindings/dotnet/UnicornManaged/ConvertUtility.fs +++ b/bindings/dotnet/UnicornEngine/ConvertUtility.fs @@ -1,4 +1,4 @@ -namespace UnicornManaged +namespace UnicornEngine open System diff --git a/bindings/dotnet/UnicornManaged/InternalHooks.fs b/bindings/dotnet/UnicornEngine/InternalHooks.fs similarity index 98% rename from bindings/dotnet/UnicornManaged/InternalHooks.fs rename to bindings/dotnet/UnicornEngine/InternalHooks.fs index 36cfc3ce..d9e87954 100644 --- a/bindings/dotnet/UnicornManaged/InternalHooks.fs +++ b/bindings/dotnet/UnicornEngine/InternalHooks.fs @@ -1,4 +1,4 @@ -namespace UnicornManaged +namespace UnicornEngine open System open System.Runtime.InteropServices diff --git a/bindings/dotnet/UnicornManaged/Unicorn.fs b/bindings/dotnet/UnicornEngine/Unicorn.fs similarity index 99% rename from bindings/dotnet/UnicornManaged/Unicorn.fs rename to bindings/dotnet/UnicornEngine/Unicorn.fs index 31decbcd..7d401300 100644 --- a/bindings/dotnet/UnicornManaged/Unicorn.fs +++ b/bindings/dotnet/UnicornEngine/Unicorn.fs @@ -1,11 +1,11 @@ -namespace UnicornManaged +namespace UnicornEngine open System open System.Collections.Generic open System.Runtime.InteropServices open System.Linq -open UnicornManaged.Const -open UnicornManaged.Binding +open UnicornEngine.Const +open UnicornEngine.Binding // exported hooks type CodeHook = delegate of Unicorn * Int64 * Int32 * Object -> unit diff --git a/bindings/dotnet/UnicornManaged/UnicornManaged.fsproj b/bindings/dotnet/UnicornEngine/UnicornEngine.fsproj similarity index 79% rename from bindings/dotnet/UnicornManaged/UnicornManaged.fsproj rename to bindings/dotnet/UnicornEngine/UnicornEngine.fsproj index 1a66562a..c117557c 100644 --- a/bindings/dotnet/UnicornManaged/UnicornManaged.fsproj +++ b/bindings/dotnet/UnicornEngine/UnicornEngine.fsproj @@ -1,11 +1,13 @@  net6.0 - UnicornManaged - UnicornManaged + UnicornEngine.Unicorn + UnicornEngine Copyright © Antonio Parata 2016 https://github.com/unicorn-engine/unicorn - 2.0.0 + .NET bindings for unicorn + 2.0.0 + $(VersionSuffix) 0c21f1c1-2725-4a46-9022-1905f85822a5 true true @@ -15,6 +17,10 @@ 3 + + none + + diff --git a/bindings/dotnet/UnicornManaged/UnicornEngineException.fs b/bindings/dotnet/UnicornEngine/UnicornEngineException.fs similarity index 83% rename from bindings/dotnet/UnicornManaged/UnicornEngineException.fs rename to bindings/dotnet/UnicornEngine/UnicornEngineException.fs index fd582557..68622951 100644 --- a/bindings/dotnet/UnicornManaged/UnicornEngineException.fs +++ b/bindings/dotnet/UnicornEngine/UnicornEngineException.fs @@ -1,4 +1,4 @@ -namespace UnicornManaged +namespace UnicornEngine open System diff --git a/bindings/dotnet/UnicornSamples/ShellcodeSample.cs b/bindings/dotnet/UnicornSamples/ShellcodeSample.cs index 7982e5e4..08ab59b1 100644 --- a/bindings/dotnet/UnicornSamples/ShellcodeSample.cs +++ b/bindings/dotnet/UnicornSamples/ShellcodeSample.cs @@ -3,8 +3,8 @@ using Gee.External.Capstone.X86; using System; using System.Diagnostics; using System.Text; -using UnicornManaged; -using UnicornManaged.Const; +using UnicornEngine; +using UnicornEngine.Const; namespace UnicornSamples { diff --git a/bindings/dotnet/UnicornSamples/UnicornSamples.csproj b/bindings/dotnet/UnicornSamples/UnicornSamples.csproj index bd603441..4ba2d49e 100644 --- a/bindings/dotnet/UnicornSamples/UnicornSamples.csproj +++ b/bindings/dotnet/UnicornSamples/UnicornSamples.csproj @@ -17,9 +17,9 @@ - + {0c21f1c1-2725-4a46-9022-1905f85822a5} - UnicornManaged + UnicornEngine diff --git a/bindings/dotnet/UnicornSamples/X86Sample32.cs b/bindings/dotnet/UnicornSamples/X86Sample32.cs index 24333839..bff69e79 100644 --- a/bindings/dotnet/UnicornSamples/X86Sample32.cs +++ b/bindings/dotnet/UnicornSamples/X86Sample32.cs @@ -3,8 +3,8 @@ using Gee.External.Capstone.X86; using System; using System.Diagnostics; using System.Text; -using UnicornManaged; -using UnicornManaged.Const; +using UnicornEngine; +using UnicornEngine.Const; namespace UnicornSamples { From 9928600584a51855e8c6f8bcfc6a7dc86aa2d1ba Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Mon, 31 Oct 2022 23:43:04 +0100 Subject: [PATCH 02/12] gh: Publish Nuget for dotnet bindings --- .github/workflows/Nuget-publishing.yml | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/Nuget-publishing.yml diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml new file mode 100644 index 00000000..dfc6cd25 --- /dev/null +++ b/.github/workflows/Nuget-publishing.yml @@ -0,0 +1,51 @@ +name: Nuget 📦 Distribution + +on: + push: + branches: + - dev + - master + paths-ignore: + - ".gitignore" + - "docs/**" + - "README" + - "CREDITS.TXT" + - "COPYING_GLIB" + - "COPYING.LGPL2" + - "AUTHORS.TXT" + - "CHANGELOG" + - "COPYING" + +permissions: + packages: write + +jobs: + publish: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: bindings/dotnet/UnicornEngine + + steps: + - uses: actions/checkout@v3 + + - name: Get short sha + id: git_short_sha + run: echo "result=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: 6.0.x + + - name: Authenticate to Github Packages + 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: Package .NET bindings + run: | + [[ "${{ github.ref_name }}" == "master" ]] \ + && dotnet pack -c Release \ + || dotnet pack -c Release --version-suffix="${{ steps.git_short_sha.outputs.result }}" + + - name: 📦 Publish to Github Packages + run: dotnet nuget push "bin/Release/UnicornEngine.Unicorn.*.nupkg" --source "github" --api-key "${{ secrets.GHPR_TOKEN }}" From 5d41b3346f71f04933945a68864c70a478e69c32 Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Mon, 31 Oct 2022 23:50:53 +0100 Subject: [PATCH 03/12] gh: Publish new packages if bindings get modified --- .github/workflows/Nuget-publishing.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index dfc6cd25..463245db 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -5,16 +5,8 @@ on: branches: - dev - master - paths-ignore: - - ".gitignore" - - "docs/**" - - "README" - - "CREDITS.TXT" - - "COPYING_GLIB" - - "COPYING.LGPL2" - - "AUTHORS.TXT" - - "CHANGELOG" - - "COPYING" + paths: + - "bindings/dotnet/UnicornEngine/**" permissions: packages: write From 2e6a88805215a663250756e3ae5513635dcf369c Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 5 Nov 2022 02:40:50 +0100 Subject: [PATCH 04/12] dotnet: Add native unicorn libraries to nuget package --- .github/workflows/Nuget-publishing.yml | 102 +++++++++++++++++- .../dotnet/UnicornEngine/UnicornEngine.fsproj | 4 + 2 files changed, 101 insertions(+), 5 deletions(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index 463245db..ce5450bb 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -1,18 +1,21 @@ name: Nuget 📦 Distribution on: - push: + workflow_run: + workflows: + - "Build UC2" + types: + - completed branches: - dev - master - paths: - - "bindings/dotnet/UnicornEngine/**" permissions: packages: write jobs: publish: + if: ${{ github.event.workflow_run.conclusion == 'success' }} runs-on: ubuntu-latest defaults: @@ -21,10 +24,99 @@ jobs: steps: - uses: actions/checkout@v3 + with: + ref: ${{ github.event.workflow_run.head_branch }} + + - name: 'Download and extract artifacts' + uses: actions/github-script@v6 + with: + script: | + let fs = require('fs'); + const options = {}; + options.cwd = './bindings/dotnet/UnicornEngine'; + + let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + + let sourceDir = ""; + let sourceFile = ""; + let destDir = ""; + let destFile = ""; + for (const artifact of allArtifacts.data.artifacts) { + switch(artifact.name) { + case 'ubuntu-cmake-aarch64.7z': + sourceDir = "lib/"; + sourceFile = "libunicorn.so.*"; + destDir = "runtimes/linux-arm64/native"; + destFile = "libunicorn.so"; + break; + case 'ubuntu-cmake-ppc64le.7z': + sourceDir = "lib/"; + sourceFile = "libunicorn.so.*"; + destDir = "runtimes/linux-ppc64le/native"; + destFile = "libunicorn.so"; + break; + case 'ubuntu-cmake-shared-x64.7z': + sourceDir = "lib/"; + sourceFile = "libunicorn.so.*"; + destDir = "runtimes/linux-x64/native"; + destFile = "libunicorn.so"; + break; + case 'ubuntu-cmake-shared-x86.7z': + sourceDir = "lib/"; + sourceFile = "libunicorn.so.*"; + destDir = "runtimes/linux-x86/native"; + destFile = "libunicorn.so"; + break; + case 'macos-cmake-shared-x64.7z': + sourceDir = "lib/"; + sourceFile = "libunicorn.*.dylib"; + destDir = "runtimes/osx-x64/native"; + destFile = "libunicorn.dylib"; + break; + case 'windows_msvc64_shared.7z': + sourceDir = ""; + sourceFile = "unicorn.dll"; + destDir = "runtimes/win-x64/native"; + destFile = "unicorn.dll"; + break; + case 'windows_msvc32_shared.7z': + sourceDir = ""; + sourceFile = "unicorn.dll"; + destDir = "runtimes/win-x86/native"; + destFile = "unicorn.dll"; + break; + default: + continue; + } + console.log(`Creating destination directory: ${destDir}`); + await exec.exec("mkdir", ["-p", destDir], options); + + console.log(`Downloading artifact: ${artifact.name}.zip`); + let download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: artifact.id, + archive_format: 'zip', + }); + fs.writeFileSync(`/tmp/${artifact.name}.zip`, Buffer.from(download.data)); + + console.log(`Unzipping: /tmp/${artifact.name}.zip`); + await exec.exec("unzip", [`/tmp/${artifact.name}.zip`]); + console.log(`Extracting library from 7z file to: ${destDir}${sourceFile}`); + await exec.exec("7z", ["e", "-o", destDir, `/tmp/${artifact.name}`, `${sourceDir}${sourceFile}`], options); + if (sourceFile != destFile) { + console.log(`Renaming library to: ${destFile}`); + await exec.exec("mv", [`${destDir}/${sourceFile}`, `${destDir}/${destFile}`], options); + } + } - name: Get short sha id: git_short_sha - run: echo "result=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + run: echo "result=$(git rev-parse --short "${{ github.event.workflow_run.head_sha }}")" >> $GITHUB_OUTPUT - uses: actions/setup-dotnet@v3 with: @@ -35,7 +127,7 @@ jobs: - name: Package .NET bindings run: | - [[ "${{ github.ref_name }}" == "master" ]] \ + [[ "${{ github.event.workflow_run.head_branch }}" == "master" ]] \ && dotnet pack -c Release \ || dotnet pack -c Release --version-suffix="${{ steps.git_short_sha.outputs.result }}" diff --git a/bindings/dotnet/UnicornEngine/UnicornEngine.fsproj b/bindings/dotnet/UnicornEngine/UnicornEngine.fsproj index c117557c..f2142473 100644 --- a/bindings/dotnet/UnicornEngine/UnicornEngine.fsproj +++ b/bindings/dotnet/UnicornEngine/UnicornEngine.fsproj @@ -42,4 +42,8 @@ + + + + From a810da70950363110650c6eb2101db231ae714b4 Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 5 Nov 2022 02:56:31 +0100 Subject: [PATCH 05/12] gha: List all native libs before packing .Net distribution --- .github/workflows/Nuget-publishing.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index ce5450bb..420a7026 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -27,7 +27,7 @@ jobs: with: ref: ${{ github.event.workflow_run.head_branch }} - - name: 'Download and extract artifacts' + - name: Download and extract artifacts uses: actions/github-script@v6 with: script: | @@ -125,7 +125,10 @@ jobs: - name: Authenticate to Github Packages 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: Package .NET bindings + - name: List all native libraries + run: find ./runtimes -type f -print + + - name: Package .NET distribution run: | [[ "${{ github.event.workflow_run.head_branch }}" == "master" ]] \ && dotnet pack -c Release \ From 9bb45741b032a98677580a65204c0dbc9d2cbb53 Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 5 Nov 2022 03:38:27 +0100 Subject: [PATCH 06/12] gha: Fix 7zip extraction arguments --- .github/workflows/Nuget-publishing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index 420a7026..604dc778 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -107,7 +107,7 @@ jobs: console.log(`Unzipping: /tmp/${artifact.name}.zip`); await exec.exec("unzip", [`/tmp/${artifact.name}.zip`]); console.log(`Extracting library from 7z file to: ${destDir}${sourceFile}`); - await exec.exec("7z", ["e", "-o", destDir, `/tmp/${artifact.name}`, `${sourceDir}${sourceFile}`], options); + await exec.exec("7z", ["e", `-o${destDir}`, `/tmp/${artifact.name}`, `${sourceDir}${sourceFile}`], options); if (sourceFile != destFile) { console.log(`Renaming library to: ${destFile}`); await exec.exec("mv", [`${destDir}/${sourceFile}`, `${destDir}/${destFile}`], options); From 8275b05ff40f53876302850064340f8a38f1ff44 Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 5 Nov 2022 14:29:23 +0100 Subject: [PATCH 07/12] gha: Try to fix 7zip extraction errors --- .github/workflows/Nuget-publishing.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index 604dc778..156f42ac 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -102,12 +102,12 @@ jobs: artifact_id: artifact.id, archive_format: 'zip', }); - fs.writeFileSync(`/tmp/${artifact.name}.zip`, Buffer.from(download.data)); + fs.writeFileSync(`/home/runner/${artifact.name}.zip`, Buffer.from(download.data)); - console.log(`Unzipping: /tmp/${artifact.name}.zip`); - await exec.exec("unzip", [`/tmp/${artifact.name}.zip`]); - console.log(`Extracting library from 7z file to: ${destDir}${sourceFile}`); - await exec.exec("7z", ["e", `-o${destDir}`, `/tmp/${artifact.name}`, `${sourceDir}${sourceFile}`], options); + console.log(`Unzipping: /home/runner/${artifact.name}.zip`); + await exec.exec("unzip", [`/home/runner/${artifact.name}.zip`]); + console.log(`Extracting library from 7z file to: ${destDir}/${sourceFile}`); + await exec.exec("7z", ["e", `-o${destDir}/`, `/home/runner/${artifact.name}`, `${sourceDir}${sourceFile}`], options); if (sourceFile != destFile) { console.log(`Renaming library to: ${destFile}`); await exec.exec("mv", [`${destDir}/${sourceFile}`, `${destDir}/${destFile}`], options); From 331c11fea1b9d8052889fa673f4cf8e6eeec06f3 Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 5 Nov 2022 16:45:32 +0100 Subject: [PATCH 08/12] gha: Fix unzip extracting to the wrong directory --- .github/workflows/Nuget-publishing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index 156f42ac..53e25218 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -105,7 +105,7 @@ jobs: fs.writeFileSync(`/home/runner/${artifact.name}.zip`, Buffer.from(download.data)); console.log(`Unzipping: /home/runner/${artifact.name}.zip`); - await exec.exec("unzip", [`/home/runner/${artifact.name}.zip`]); + await exec.exec("unzip", [`/home/runner/${artifact.name}.zip`, "-d", "/home/runner/"]); console.log(`Extracting library from 7z file to: ${destDir}/${sourceFile}`); await exec.exec("7z", ["e", `-o${destDir}/`, `/home/runner/${artifact.name}`, `${sourceDir}${sourceFile}`], options); if (sourceFile != destFile) { From d5ea8f675000e70e4dfd9706418ffd0a385a653d Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 5 Nov 2022 17:51:23 +0100 Subject: [PATCH 09/12] gha: Get correct file name before renaming --- .github/workflows/Nuget-publishing.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index 53e25218..9aaff37e 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -45,6 +45,7 @@ jobs: let sourceFile = ""; let destDir = ""; let destFile = ""; + var output = {}; for (const artifact of allArtifacts.data.artifacts) { switch(artifact.name) { case 'ubuntu-cmake-aarch64.7z': @@ -109,7 +110,9 @@ jobs: console.log(`Extracting library from 7z file to: ${destDir}/${sourceFile}`); await exec.exec("7z", ["e", `-o${destDir}/`, `/home/runner/${artifact.name}`, `${sourceDir}${sourceFile}`], options); if (sourceFile != destFile) { - console.log(`Renaming library to: ${destFile}`); + output = await exec.getExecOutput("ls", [destDir], options); + sourceFile = output.stdout.trim(); + console.log(`Renaming ${sourceFile} to ${destFile}`); await exec.exec("mv", [`${destDir}/${sourceFile}`, `${destDir}/${destFile}`], options); } } From dfea3f9e45d47419b5c94982452c7257392730bf Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Tue, 22 Nov 2022 17:48:54 +0100 Subject: [PATCH 10/12] nuget: Build native libraries in jobs --- .github/workflows/Nuget-publishing.yml | 486 ++++++++++++++++++++----- 1 file changed, 385 insertions(+), 101 deletions(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index 9aaff37e..e0edb5f1 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -1,11 +1,17 @@ name: Nuget 📦 Distribution on: - workflow_run: - workflows: - - "Build UC2" - types: - - completed + push: + paths-ignore: + - ".gitignore" + - "docs/**" + - "README" + - "CREDITS.TXT" + - "COPYING_GLIB" + - "COPYING.LGPL2" + - "AUTHORS.TXT" + - "CHANGELOG" + - "COPYING" branches: - dev - master @@ -14,128 +20,406 @@ permissions: packages: write jobs: - publish: - if: ${{ github.event.workflow_run.conclusion == 'success' }} - runs-on: ubuntu-latest + Windows: + runs-on: ${{ matrix.config.os }} + name: ${{ matrix.config.name }} + strategy: + fail-fast: true + matrix: + config: + - { + os: windows-2019, + arch: x64, + python-arch: x64, + python-ver: '3.8', + 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 16 2019' + } + - { + os: windows-2019, + arch: x86, + python-arch: x86, + python-ver: '3.8', + 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 16 2019' + } + compiler: [ gcc ] + steps: + - uses: actions/checkout@v2 - defaults: - run: - working-directory: bindings/dotnet/UnicornEngine + - name: '🛠️ Win MSVC 64 setup' + if: contains(matrix.config.name, 'MSVC 64') + uses: microsoft/setup-msbuild@v1 + + - 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 cmake + ninja --version + cmake --version + mkdir build + 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 --config ${{ matrix.config.build_type }} + ctest -VV -C ${{ matrix.config.build_type }} + mv Release instdir + + - 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_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 -VV -C ${{ matrix.config.build_type }} + mv Release instdir + + - 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@v1 + 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, + python-arch: x64, + python-ver: '3.8', + 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@v2 + + - name: '🚧 Mac build' + if: contains(matrix.config.name, 'macos-x64') + shell: bash + run: | + brew install p7zip cmake ninja + 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 -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@v1 + 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, + python-arch: x64, + python-ver: '3.8', + 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, + python-arch: x86, + python-ver: '3.8', + name: 'ubuntu-x86 cmake shared', + shared: 'yes', + artifact: 'ubuntu-cmake-shared-x86.7z', + build_type: 'Release', + archiver: '7z a', + generators: 'Ninja' + } + - { + os: ubuntu-latest, + arch: aarch64, + python-arch: aarch64, + python-ver: '3.8', + name: 'ubuntu-aarch64 cmake', + artifact: 'ubuntu-cmake-aarch64.7z', + build_type: 'Release', + archiver: '7z a', + generators: 'Ninja', + distro: ubuntu20.04 + } + - { + os: ubuntu-latest, + arch: ppc64le, + python-arch: ppc, + python-ver: '3.8', + name: 'ubuntu-ppc64le cmake', + artifact: 'ubuntu-cmake-ppc64le.7z', + build_type: 'Release', + archiver: '7z a', + generators: 'Ninja', + distro: ubuntu20.04 + } + compiler: [ gcc ] + steps: + - uses: actions/checkout@v2 + + - name: '🚧 Linux x64/x86 build' + if: contains(matrix.config.arch, 'x64') || contains(matrix.config.arch, 'x86') + shell: 'script -q -e -c "bash {0}"' + run: | + if [ ${{ matrix.config.arch }} == 'x64' ]; then + 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 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 -VV -C ${{ matrix.config.build_type }} + + - name: '🚧 Linux ppc64le/aarch64 build' + if: contains(matrix.config.arch, 'ppc64le') || contains(matrix.config.arch, 'aarch64') + uses: uraimo/run-on-arch-action@v2.0.5 + 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 -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@v1 + 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@v3 - with: - ref: ${{ github.event.workflow_run.head_branch }} - - name: Download and extract artifacts - uses: actions/github-script@v6 + - name: Download artifacts + uses: actions/download-artifact@v3 with: - script: | - let fs = require('fs'); - const options = {}; - options.cwd = './bindings/dotnet/UnicornEngine'; - - let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: context.payload.workflow_run.id, - }); - - let sourceDir = ""; - let sourceFile = ""; - let destDir = ""; - let destFile = ""; - var output = {}; - for (const artifact of allArtifacts.data.artifacts) { - switch(artifact.name) { - case 'ubuntu-cmake-aarch64.7z': - sourceDir = "lib/"; - sourceFile = "libunicorn.so.*"; - destDir = "runtimes/linux-arm64/native"; - destFile = "libunicorn.so"; - break; - case 'ubuntu-cmake-ppc64le.7z': - sourceDir = "lib/"; - sourceFile = "libunicorn.so.*"; - destDir = "runtimes/linux-ppc64le/native"; - destFile = "libunicorn.so"; - break; - case 'ubuntu-cmake-shared-x64.7z': - sourceDir = "lib/"; - sourceFile = "libunicorn.so.*"; - destDir = "runtimes/linux-x64/native"; - destFile = "libunicorn.so"; - break; - case 'ubuntu-cmake-shared-x86.7z': - sourceDir = "lib/"; - sourceFile = "libunicorn.so.*"; - destDir = "runtimes/linux-x86/native"; - destFile = "libunicorn.so"; - break; - case 'macos-cmake-shared-x64.7z': - sourceDir = "lib/"; - sourceFile = "libunicorn.*.dylib"; - destDir = "runtimes/osx-x64/native"; - destFile = "libunicorn.dylib"; - break; - case 'windows_msvc64_shared.7z': - sourceDir = ""; - sourceFile = "unicorn.dll"; - destDir = "runtimes/win-x64/native"; - destFile = "unicorn.dll"; - break; - case 'windows_msvc32_shared.7z': - sourceDir = ""; - sourceFile = "unicorn.dll"; - destDir = "runtimes/win-x86/native"; - destFile = "unicorn.dll"; - break; - default: - continue; - } - console.log(`Creating destination directory: ${destDir}`); - await exec.exec("mkdir", ["-p", destDir], options); - - console.log(`Downloading artifact: ${artifact.name}.zip`); - let download = await github.rest.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: artifact.id, - archive_format: 'zip', - }); - fs.writeFileSync(`/home/runner/${artifact.name}.zip`, Buffer.from(download.data)); - - console.log(`Unzipping: /home/runner/${artifact.name}.zip`); - await exec.exec("unzip", [`/home/runner/${artifact.name}.zip`, "-d", "/home/runner/"]); - console.log(`Extracting library from 7z file to: ${destDir}/${sourceFile}`); - await exec.exec("7z", ["e", `-o${destDir}/`, `/home/runner/${artifact.name}`, `${sourceDir}${sourceFile}`], options); - if (sourceFile != destFile) { - output = await exec.getExecOutput("ls", [destDir], options); - sourceFile = output.stdout.trim(); - console.log(`Renaming ${sourceFile} to ${destFile}`); - await exec.exec("mv", [`${destDir}/${sourceFile}`, `${destDir}/${destFile}`], options); - } + 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.event.workflow_run.head_sha }}")" >> $GITHUB_OUTPUT + run: echo "result=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT - uses: actions/setup-dotnet@v3 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.event.workflow_run.head_branch }}" == "master" ]] \ && dotnet pack -c Release \ || dotnet pack -c Release --version-suffix="${{ steps.git_short_sha.outputs.result }}" - name: 📦 Publish to Github Packages + working-directory: bindings/dotnet/UnicornEngine run: dotnet nuget push "bin/Release/UnicornEngine.Unicorn.*.nupkg" --source "github" --api-key "${{ secrets.GHPR_TOKEN }}" From 81baee2b1cd1443e986a4b19f7a404652c5a0ea0 Mon Sep 17 00:00:00 2001 From: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Date: Thu, 15 Dec 2022 17:24:53 +0100 Subject: [PATCH 11/12] gha: Fix master branch check --- .github/workflows/Nuget-publishing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index e0edb5f1..fe8b17de 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -416,7 +416,7 @@ jobs: - name: Package .NET distribution working-directory: bindings/dotnet/UnicornEngine run: | - [[ "${{ github.event.workflow_run.head_branch }}" == "master" ]] \ + [[ "${{ github.ref_name }}" == "master" ]] \ && dotnet pack -c Release \ || dotnet pack -c Release --version-suffix="${{ steps.git_short_sha.outputs.result }}" From cee8e6b5da3af9b699b4af44eb38e4b5ced2bb48 Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sun, 29 Jan 2023 00:47:46 +0100 Subject: [PATCH 12/12] gha: Add steps to upload nupkg as artifact & publish to Nuget --- .github/workflows/Nuget-publishing.yml | 47 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/.github/workflows/Nuget-publishing.yml b/.github/workflows/Nuget-publishing.yml index fe8b17de..75abbf67 100644 --- a/.github/workflows/Nuget-publishing.yml +++ b/.github/workflows/Nuget-publishing.yml @@ -124,7 +124,7 @@ jobs: - name: '📤 Upload artifact' if: always() - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v2 with: path: ./${{ matrix.config.artifact }} name: ${{ matrix.config.artifact }} @@ -182,7 +182,7 @@ jobs: - name: '📤 Upload artifact' if: always() - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v2 with: path: ./${{ matrix.config.artifact }} name: ${{ matrix.config.artifact }} @@ -251,9 +251,9 @@ jobs: shell: 'script -q -e -c "bash {0}"' run: | if [ ${{ matrix.config.arch }} == 'x64' ]; then - sudo apt install -q -y libcmocka-dev ninja-build + sudo apt install -q -y libcmocka-dev ninja-build else - export CFLAGS="-m32" LDFLAGS="-m32" LDFLAGS_STATIC="-m32" UNICORN_QEMU_FLAGS="--cpu=i386" + export CFLAGS="-m32" LDFLAGS="-m32" LDFLAGS_STATIC="-m32" UNICORN_QEMU_FLAGS="--cpu=i386" sudo dpkg --add-architecture i386 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 @@ -307,7 +307,7 @@ jobs: - name: '📤 Upload artifact' if: always() - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v2 with: path: ./${{ matrix.config.artifact }} name: ${{ matrix.config.artifact }} @@ -320,20 +320,20 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Download artifacts + - name: 🛠️ Download artifacts uses: actions/download-artifact@v3 with: path: artifacts - - name: Extract 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/", @@ -372,11 +372,11 @@ jobs: "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) @@ -384,20 +384,20 @@ jobs: 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 + - name: 🛠️ Get short sha id: git_short_sha run: echo "result=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT @@ -405,21 +405,32 @@ jobs: with: dotnet-version: 6.0.x - - name: Authenticate to Github Packages + - 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 + - name: 🛠️ List all native libraries working-directory: bindings/dotnet/UnicornEngine run: find ./runtimes -type f -print - - name: Package .NET distribution + - 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@v2 + with: + path: ${{ github.workspace }}/bindings/dotnet/UnicornEngine/bin/Release/UnicornEngine.Unicorn.*.nupkg + - name: 📦 Publish to Github Packages 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 + 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 }}