diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 24f8a8e..fb7d718 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -77,5 +77,5 @@ Target framework is **net10.0** with `InvariantGlobalization=true` and nullable
## CI/CD
- **Build & Test** (`.github/workflows/build-test.yml`): Runs on push/PR to `master` — restore → build → test on `ubuntu-latest` with a .NET SDK matching the csproj target framework (read `dotnet-version` from the workflow; do not assume a fixed number).
-- **Publish** (`.github/workflows/publish.yml`): Triggered by `v*` tags. Publishes self-contained binaries for `win-x64`, `win-arm64`, `linux-x64`, `linux-arm64`, `osx-x64` via `.pubxml` profiles (in `Obj2Tiles/Properties/PublishProfiles/`), zips them, and creates a GitHub Release.
+- **Publish** (`.github/workflows/publish.yml`): Triggered by `v*` tags. Publishes self-contained binaries for `win-x64`, `win-arm64`, `linux-x64`, `linux-arm64`, `osx-x64`, `osx-arm64` via `.pubxml` profiles (in `Obj2Tiles/Properties/PublishProfiles/`), zips them, and creates a GitHub Release.
- **Container image** (`.github/workflows/image.yml`): builds/pushes the `ghcr.io/opendronemap/obj2tiles` image (QEMU multi-arch).
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index dcb36ca..074b593 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -30,6 +30,8 @@ jobs:
run: dotnet publish -p:PublishProfile=linux-arm64.pubxml Obj2Tiles
- name: Publish osx-x64
run: dotnet publish -p:PublishProfile=osx-x64.pubxml Obj2Tiles
+ - name: Publish osx-arm64
+ run: dotnet publish -p:PublishProfile=osx-arm64.pubxml Obj2Tiles
- name: Zip win-x64
run: cd Obj2Tiles/bin/Release/net10.0/publish/win-x64/ && zip -r ../../../../../../Obj2Tiles-Win64.zip *
@@ -41,6 +43,8 @@ jobs:
run: cd Obj2Tiles/bin/Release/net10.0/publish/linux-arm64/ && zip -r ../../../../../../Obj2Tiles-LinuxArm64.zip *
- name: Zip osx-x64
run: cd Obj2Tiles/bin/Release/net10.0/publish/osx-x64/ && zip -r ../../../../../../Obj2Tiles-Osx64.zip *
+ - name: Zip osx-arm64
+ run: cd Obj2Tiles/bin/Release/net10.0/publish/osx-arm64/ && zip -r ../../../../../../Obj2Tiles-OsxArm64.zip *
- name: Release
uses: softprops/action-gh-release@v1
@@ -53,4 +57,5 @@ jobs:
Obj2Tiles-WinArm64.zip
Obj2Tiles-Linux64.zip
Obj2Tiles-LinuxArm64.zip
- Obj2Tiles-Osx64.zip
+ Obj2Tiles-Osx64.zip
+ Obj2Tiles-OsxArm64.zip
diff --git a/Obj2Tiles/Obj2Tiles.csproj b/Obj2Tiles/Obj2Tiles.csproj
index 13f6101..8799196 100644
--- a/Obj2Tiles/Obj2Tiles.csproj
+++ b/Obj2Tiles/Obj2Tiles.csproj
@@ -41,6 +41,7 @@
linux-x64 libktx.so <- KTX-Software-4.4.2-Linux-x86_64.tar.bz2 (lib/libktx.so.4.4.2)
linux-arm64 libktx.so <- KTX-Software-4.4.2-Linux-arm64.tar.bz2 (lib/libktx.so.4.4.2)
osx-x64 libktx.dylib<- KTX-Software-4.4.2-Darwin-x86_64.pkg (lib/libktx.4.4.2.dylib)
+ osx-arm64 libktx.dylib<- KTX-Software-4.4.2-Darwin-arm64.pkg (lib/libktx.4.4.2.dylib)
To refresh these libraries (download + verify + extract for all RIDs), run:
pwsh native/update-libktx.ps1 (use -Version to bump; -? for help)
diff --git a/Obj2Tiles/Properties/PublishProfiles/osx-arm64.pubxml b/Obj2Tiles/Properties/PublishProfiles/osx-arm64.pubxml
new file mode 100644
index 0000000..9898bd3
--- /dev/null
+++ b/Obj2Tiles/Properties/PublishProfiles/osx-arm64.pubxml
@@ -0,0 +1,20 @@
+
+
+
+
+ Release
+ Any CPU
+ bin\Release\net10.0\publish\osx-arm64\
+ FileSystem
+ net10.0
+ osx-arm64
+ true
+ True
+ True
+ partial
+ true
+ false
+
+
diff --git a/Obj2Tiles/native/osx-arm64/libktx.dylib b/Obj2Tiles/native/osx-arm64/libktx.dylib
new file mode 100755
index 0000000..1a7135f
Binary files /dev/null and b/Obj2Tiles/native/osx-arm64/libktx.dylib differ
diff --git a/Obj2Tiles/native/update-libktx.ps1 b/Obj2Tiles/native/update-libktx.ps1
index 9f6b205..f9eb426 100644
--- a/Obj2Tiles/native/update-libktx.ps1
+++ b/Obj2Tiles/native/update-libktx.ps1
@@ -20,6 +20,7 @@
linux-x64 libktx.so <- KTX-Software--Linux-x86_64.tar.bz2 (lib/libktx.so.)
linux-arm64 libktx.so <- KTX-Software--Linux-arm64.tar.bz2 (lib/libktx.so.)
osx-x64 libktx.dylib <- KTX-Software--Darwin-x86_64.pkg (lib/libktx..dylib)
+ osx-arm64 libktx.dylib <- KTX-Software--Darwin-arm64.pkg (lib/libktx..dylib)
Tooling:
* tar - unpacks the Linux .tar.bz2 tarballs (and, where libarchive has xar
@@ -35,7 +36,7 @@
KTX-Software release version to vendor. Default: 4.4.2.
.PARAMETER Rid
- One or more runtime identifiers to refresh. Default: all five supported RIDs.
+ One or more runtime identifiers to refresh. Default: all six supported RIDs.
.PARAMETER SkipChecksum
Skip SHA-256 verification of the downloaded assets (not recommended).
@@ -52,8 +53,8 @@
param(
[string]$Version = '4.4.2',
- [ValidateSet('win-x64', 'win-arm64', 'linux-x64', 'linux-arm64', 'osx-x64')]
- [string[]]$Rid = @('win-x64', 'win-arm64', 'linux-x64', 'linux-arm64', 'osx-x64'),
+ [ValidateSet('win-x64', 'win-arm64', 'linux-x64', 'linux-arm64', 'osx-x64', 'osx-arm64')]
+ [string[]]$Rid = @('win-x64', 'win-arm64', 'linux-x64', 'linux-arm64', 'osx-x64', 'osx-arm64'),
[switch]$SkipChecksum
)
@@ -73,6 +74,7 @@ $Targets = [ordered]@{
'linux-x64' = @{ Asset = "KTX-Software-$Version-Linux-x86_64.tar.bz2"; Find = "libktx.so.$Version"; Out = 'libktx.so' }
'linux-arm64' = @{ Asset = "KTX-Software-$Version-Linux-arm64.tar.bz2"; Find = "libktx.so.$Version"; Out = 'libktx.so' }
'osx-x64' = @{ Asset = "KTX-Software-$Version-Darwin-x86_64.pkg"; Find = "libktx.$Version.dylib"; Out = 'libktx.dylib' }
+ 'osx-arm64' = @{ Asset = "KTX-Software-$Version-Darwin-arm64.pkg"; Find = "libktx.$Version.dylib"; Out = 'libktx.dylib' }
}
function Get-SevenZip {
diff --git a/README.md b/README.md
index 31144c7..faaa595 100644
--- a/README.md
+++ b/README.md
@@ -261,6 +261,7 @@ Encoding runs **in-process** via the KTX-Software C library (libktx v4.4.2, Apac
| Linux x64 | `libktx.so` | 3.25 MB |
| Linux ARM64 | `libktx.so` | 2.91 MB |
| macOS x64 | `libktx.dylib` | 2.67 MB |
+| macOS ARM64 (Apple Silicon) | `libktx.dylib` | 2.38 MB |
For `dotnet build` without a RID (development builds), the library is resolved in order from: `--ktx-path` / `OBJ2TILES_KTX` environment variable, the executable directory, and finally the system `PATH`.
@@ -269,14 +270,14 @@ For `dotnet build` without a RID (development builds), the library is resolved i
To refresh the vendored libraries to a new KTX-Software release, run the PowerShell script bundled in the repository:
```powershell
-# Refresh all 5 platforms to the default version
+# Refresh all 6 platforms to the default version
pwsh Obj2Tiles/native/update-libktx.ps1
# Bump to a new version
pwsh Obj2Tiles/native/update-libktx.ps1 -Version 4.5.0
# Refresh only Linux and macOS (no 7-Zip required)
-pwsh Obj2Tiles/native/update-libktx.ps1 -Rid linux-x64,linux-arm64,osx-x64
+pwsh Obj2Tiles/native/update-libktx.ps1 -Rid linux-x64,linux-arm64,osx-x64,osx-arm64
# Skip checksum verification
pwsh Obj2Tiles/native/update-libktx.ps1 -SkipChecksum