diff --git a/.github/workflows/build-native.yml b/.github/workflows/build-native.yml
index 2120f4ae..120027cc 100644
--- a/.github/workflows/build-native.yml
+++ b/.github/workflows/build-native.yml
@@ -7,6 +7,13 @@ name: Build native
# They are committed rather than built during a normal build so that a plain
# `dotnet build src --configuration Release` produces a shippable package on any machine, and
# contributors never need a C++ toolchain. Run this whenever native/ changes.
+#
+# The work is PlatformHeads' build-native workflow, which this one was moved into so that
+# BuildMonitor, built the same way, runs it too: the Linux library built in a manylinux_2_28
+# container and checked for the glibc it needs and the libraries it records as needed, the
+# universal dylib, and the pull request with the binaries. BuildMonitor had a copy of it, and
+# three fixes made here were waiting to be found again there.
+# The tag is the one native/CMakeLists.txt fetches and Directory.Packages.props names.
on:
push:
paths:
@@ -27,210 +34,18 @@ concurrency:
cancel-in-progress: true
jobs:
- build:
- name: ${{ matrix.rid }}
- runs-on: ${{ matrix.os }}
- timeout-minutes: 45
- strategy:
- fail-fast: false
- matrix:
- include:
- # No Windows entries. That head renders with WinForms and loads no native library.
- - rid: linux-x64
- os: ubuntu-24.04
- - rid: linux-arm64
- os: ubuntu-24.04-arm
- # One universal binary covers both macOS RIDs; it is copied into each below.
- - rid: osx
- os: macos-14
- steps:
- - name: Checkout
- uses: actions/checkout@v7
-
- # In a manylinux_2_28 container rather than on the runner, for its glibc 2.28: the floor
- # .NET 10 itself supports, which is RHEL 8. A library records the glibc symbol versions of
- # the headers it was compiled against, and the loader refuses it anywhere older - built on
- # the runner's own Ubuntu 24.04 it needed GLIBC_2.38, so the viewer could not start on
- # Ubuntu 22.04, Debian 12, or RHEL 8 or 9, and every inline snapshot sent to it was lost.
- - name: Build
- if: runner.os == 'Linux'
- run: docker run --rm -v "$PWD:/src" -w /src "quay.io/pypa/manylinux_2_28_$(uname -m)" bash native/build-linux.sh
-
- # The floor the container is there to hold, checked rather than trusted, since nothing else
- # would notice until a user on an older distribution did.
- - name: Check glibc floor
- if: runner.os == 'Linux'
- env:
- GLIBC_FLOOR: GLIBC_2.28
- run: |
- highest=$(objdump -T build/libdiffengine_viewer.so | grep -o 'GLIBC_[0-9][0-9.]*' | sort -uV | tail -n 1)
- echo "Highest glibc symbol version required: $highest"
- if [ "$(printf '%s\n' "$GLIBC_FLOOR" "$highest" | sort -V | tail -n 1)" != "$GLIBC_FLOOR" ]; then
- echo "::error::libdiffengine_viewer.so requires $highest, above the $GLIBC_FLOOR floor"
- exit 1
- fi
- # libGL.so.1 is on every machine with a GL driver; libOpenGL.so.0 is not
- if objdump -p build/libdiffengine_viewer.so | grep -q 'NEEDED.*libOpenGL'; then
- echo "::error::libdiffengine_viewer.so links libOpenGL.so.0 rather than libGL.so.1"
- exit 1
- fi
-
- # Everything recorded as needed has to be on a machine for the library to load at all, so
- # the list is held to what any machine that runs .NET and has a display already has. It grew
- # once without anybody choosing it: the container's linker records every library it is
- # handed, used or not, and raylib hands on libSM and libICE, which a stock Ubuntu lacks.
- # The viewer could not start there, and nothing noticed until somebody ran it on one.
- - name: Check needed libraries
- if: runner.os == 'Linux'
- env:
- ALLOWED: >-
- libc.so.6 libm.so.6 libdl.so.2 libpthread.so.0 librt.so.1 libstdc++.so.6 libgcc_s.so.1
- libX11.so.6 libGL.so.1 ld-linux-x86-64.so.2 ld-linux-aarch64.so.1
- run: |
- needed=$(objdump -p build/libdiffengine_viewer.so | awk '$1 == "NEEDED" { print $2 }')
- echo "Needed:" $needed
- failed=0
- for library in $needed; do
- case " $ALLOWED " in
- *" $library "*) ;;
- *)
- echo "::error::libdiffengine_viewer.so needs $library, which is not in the list of libraries it may need"
- failed=1
- ;;
- esac
- done
- exit $failed
-
- # macOS draws with AppKit and Core Text rather than raylib and ImGui, so it is a Swift
- # package rather than a CMake project. Both --arch flags in one invocation produce a
- # universal binary, so there is no separate lipo step.
- #
- # Nothing of the Swift runtime is shipped: it has been part of macOS since 10.14.4, which is
- # why this dylib is a fraction of the size of the one it replaced.
- - name: Build
- if: matrix.rid == 'osx'
- run: swift build -c release --arch arm64 --arch x86_64 --package-path native/swift
-
- - name: Collect
- shell: bash
- run: |
- # Laid out as src/{head}/runtimes/{rid}/native, so the propose job below can merge every
- # artifact straight into src and the binaries land in the head that loads them.
- collect() {
- mkdir -p "artifacts/$1/runtimes/$2/native"
- cp "$3" "artifacts/$1/runtimes/$2/native/"
- }
- case "${{ matrix.rid }}" in
- linux-*)
- # Already stripped, inside the container that owns the build directory
- collect DiffEngineViewer.Linux "${{ matrix.rid }}" build/libdiffengine_viewer.so
- ;;
- osx)
- # swift build leaves a per architecture dylib in more than one place, so taking the
- # first one found gives a single slice binary that loads on half the Macs in the
- # world. Every candidate is checked, and if none is already universal they are
- # merged, so the only thing that can be collected is a fat binary.
- # The dSYM contains a DWARF file of the same name which is also universal, so the
- # arch check below would happily accept it and ship debug symbols as the library.
- candidates=$(find native/swift/.build -name libdiffengine_viewer.dylib -not -path '*.dSYM/*')
- if [ -z "$candidates" ]; then
- echo "::error::swift build produced no libdiffengine_viewer.dylib"
- exit 1
- fi
-
- echo "$candidates" | while read -r candidate; do
- echo "$candidate: $(lipo -archs "$candidate" 2>/dev/null)"
- done
-
- dylib=""
- for candidate in $candidates; do
- archs=$(lipo -archs "$candidate" 2>/dev/null || echo "")
- if [[ "$archs" == *x86_64* && "$archs" == *arm64* ]]; then
- dylib="$candidate"
- break
- fi
- done
-
- if [ -z "$dylib" ]; then
- dylib=universal/libdiffengine_viewer.dylib
- mkdir -p universal
- # shellcheck disable=SC2086
- lipo -create $candidates -output "$dylib"
- fi
-
- archs=$(lipo -archs "$dylib")
- echo "collecting $dylib: $archs"
- for arch in x86_64 arm64; do
- case " $archs " in
- *" $arch "*) ;;
- *) echo "::error::$dylib is missing the $arch slice"; exit 1 ;;
- esac
- done
-
- strip -x "$dylib"
- # The dylib is universal, so both macOS RIDs get the same file.
- collect DiffEngineViewer.Mac osx-x64 "$dylib"
- collect DiffEngineViewer.Mac osx-arm64 "$dylib"
- ;;
- esac
- ls -lhR artifacts
-
- - name: Upload
- uses: actions/upload-artifact@v7
- with:
- name: native-${{ matrix.rid }}
- path: artifacts/
- retention-days: 7
-
- propose:
- name: propose update
- needs: build
- # Also on push, not just manual dispatch. workflow_dispatch does not appear in the Actions UI
- # until the workflow is on the default branch, so on a feature branch a push is the only way
- # to trigger this, and leaving the binaries as bare artifacts to copy by hand is worse.
- #
- # Branches only. Never on pull_request, which would mean opening a PR from a PR, and never on
- # a tag: a tag checkout is a detached HEAD with no base branch to target, and proposing a
- # binaries PR against a release tag is meaningless anyway.
- if: >-
- github.event_name != 'pull_request' &&
- startsWith(github.ref, 'refs/heads/') &&
- (github.event_name != 'workflow_dispatch' || inputs.commit)
- runs-on: ubuntu-latest
+ native:
+ uses: SimonCropp/PlatformHeads/.github/workflows/build-native.yml@0.1.0
permissions:
contents: write
pull-requests: write
- steps:
- - name: Checkout
- uses: actions/checkout@v7
-
- - name: Download
- uses: actions/download-artifact@v4
- with:
- pattern: native-*
- merge-multiple: true
- path: src
-
- - name: Show what changed
- run: |
- ls -lhR src/DiffEngineViewer.Linux/runtimes src/DiffEngineViewer.Mac/runtimes
- git status --short
-
- # A PR rather than a direct push: these are binaries, so the diff is not reviewable and the
- # change deserves an explicit approval.
- - name: Open pull request
- uses: peter-evans/create-pull-request@v7
- with:
- # Scoped to the triggering branch, which is also the base, so a rebuild on a feature
- # branch does not collide with one on main.
- branch: native-binaries-${{ github.ref_name }}
- title: 'Rebuild native renderer binaries'
- commit-message: 'Rebuild native renderer binaries'
- body: |
- Rebuilt `diffengine_viewer` from `native/` for the four RIDs that load one.
- Windows is not among them: that head renders with WinForms.
-
- Produced by the `build-native` workflow from ${{ github.sha }}.
- add-paths: |
- src/DiffEngineViewer.Linux/runtimes
- src/DiffEngineViewer.Mac/runtimes
+ with:
+ library: diffengine_viewer
+ linux-runtimes: src/DiffEngineViewer.Linux/runtimes
+ swift-package: native/swift
+ mac-runtimes: src/DiffEngineViewer.Mac/runtimes
+ # Also on push, not just manual dispatch. workflow_dispatch does not appear in the Actions
+ # UI until the workflow is on the default branch, so on a feature branch a push is the only
+ # way to trigger this, and leaving the binaries as bare artifacts to copy by hand is worse.
+ propose: ${{ github.event_name != 'workflow_dispatch' || inputs.commit }}
+ pull-request-title: Rebuild native renderer binaries
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0e4e7123..ac60929b 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -75,7 +75,7 @@ jobs:
if-no-files-found: ignore
retention-days: 14
- # DE0001 warns when a RID has no native renderer. Shipping a package that cannot run on a
+ # PH0001 warns when a RID has no native renderer. Shipping a package that cannot run on a
# platform it claims to support is worse than failing the release.
- name: Verify every RID has a native renderer
if: startsWith(github.ref, 'refs/tags/')
diff --git a/claude.md b/claude.md
index 6f56aca6..cd49eaa6 100644
--- a/claude.md
+++ b/claude.md
@@ -603,8 +603,23 @@ the comment there about not caching "nothing staged" asks for.
gate's continuations would need.
**Native shim (`native/`), used by the Mac and Linux heads only:**
-- `raylib` and `imgui` are fetched by CMake (`FetchContent`), pinned by tag in
- `native/CMakeLists.txt`. Deliberately not submodules: nothing in a normal `dotnet build` touches
+- The build and packaging of the heads is PlatformHeads' (`D:\Code\PlatformHeads`,
+ github.com/SimonCropp/PlatformHeads), which BuildMonitor shares: it was worked out here and
+ copied there, and fixes made here did not reach the copy. Three pins name one tag of it and move
+ together: the `uses:` of `.github/workflows/build-native.yml`, the `GIT_TAG` in
+ `native/CMakeLists.txt`, and `PlatformHeads` in `Directory.Packages.props`. The workflow is its
+ reusable `build-native`. Its CMake module pins raylib and Dear ImGui, carries the raylib 6.0
+ option workarounds and links the library, and `native/CMakeLists.txt` names only the picture
+ formats, the source file and the two libraries the viewer links beyond raylib. Its package's
+ targets publish and bundle the `PlatformHead` items of `DiffEngine.csproj` (`PH0001` for a
+ native head with no library, `PH0002` for an apphost that was not staged), staged in
+ `obj\viewer`, where `DiffEngineTray.csproj` takes the two Windows heads from by calling
+ `PlatformHeadsPublish`. A fix to any of that goes there, not here. To build the Linux library by
+ hand, from the repository root: `docker run --rm -v "$PWD:/src" -v
+ "D:/Code/PlatformHeads/native:/ph:ro" -w /src -e LIBRARY=diffengine_viewer
+ "quay.io/pypa/manylinux_2_28_$(uname -m)" bash /ph/build-linux.sh`.
+- `raylib` and `imgui` are fetched by CMake (`FetchContent`), pinned by tag in PlatformHeads'
+ module. Deliberately not submodules: nothing in a normal `dotnet build` touches
this folder, so a recursive clone on every checkout would serve a path almost nobody takes.
- Building it needs CMake 3.24+, a C++17 compiler and network access. Contributors do not need
any of that, because the binaries are committed.
diff --git a/native/CMakeLists.txt b/native/CMakeLists.txt
index 67b1c3a6..4966f233 100644
--- a/native/CMakeLists.txt
+++ b/native/CMakeLists.txt
@@ -1,141 +1,38 @@
cmake_minimum_required(VERSION 3.24)
project(diffengine_viewer LANGUAGES C CXX)
-set(CMAKE_C_STANDARD 11)
-set(CMAKE_CXX_STANDARD 17)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
-set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-set(CMAKE_C_VISIBILITY_PRESET hidden)
-set(CMAKE_CXX_VISIBILITY_PRESET hidden)
-set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
-
-if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
- set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
-endif()
-
#
-# Sources are fetched rather than vendored as submodules.
+# Everything about this build that is not the viewer's own is PlatformHeads', fetched at a tag:
+# the raylib and Dear ImGui it pins, the raylib 6.0 options it switches off, and how the library
+# is compiled and linked. All of it was worked out here first and moved there, so that
+# BuildMonitor, whose Linux head is built the same way, has the one copy too: it had its own, and
+# a window that stayed blank and a library that needed libSM and libICE were each fixed here and
+# then found again there.
#
-# Nothing in a normal `dotnet build` touches this directory: the built binaries are committed to
-# the runtimes folder of the Linux and Mac heads, so only this file's own build needs raylib and
-# imgui. Submodules would have imposed a recursive clone on every checkout to serve a path almost
-# nobody takes.
-#
-# The versions are pinned by tag here, in the same file as the build configuration.
+# The tag is the one .github/workflows/build-native.yml calls and Directory.Packages.props names.
#
include(FetchContent)
-
-# raylib, static so the shipped artifact is a single file per RID.
-set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
-set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
-set(BUILD_GAMES OFF CACHE BOOL "" FORCE)
-set(CUSTOMIZE_BUILD ON CACHE BOOL "" FORCE)
-# raylib 6.0 reads every SUPPORT_ flag in its config.h into an option that defaults to ON, the ones
-# config.h defines as 0 included (raysan5/raylib#5844, fixed after 6.0), and CUSTOMIZE_BUILD skips
-# config.h's own values. So each of those is on unless it is switched off here.
-# SUPPORT_CUSTOM_FRAME_CONTROL was: EndDrawing then never put a frame on the screen, never read
-# input and never waited for the next frame, so the Linux window stayed blank, took no keys and
-# spun a core. A capture draws into a texture and never gets that far, which is why the pixel
-# snapshots passed throughout; PixelTests.PresentWaitsForTheNextFrame is what notices.
-# deview_present has since stopped calling EndDrawing: it puts a frame on the screen only when it
-# differs from the one there, and waits and reads input itself whether it drew or not (Rest in
-# deview.cpp). So nothing rests on this flag any more, and it stays off for whatever ends a frame
-# through raylib next. The busy wait loop was on the same way, and that one still matters: Rest
-# waits with raylib's WaitTime, which would spin through the whole of every frame's wait. The rest
-# are formats and features nothing here uses.
-foreach(flag IN ITEMS
- SUPPORT_CUSTOM_FRAME_CONTROL
- SUPPORT_BUSY_WAIT_LOOP
- SUPPORT_GPU_SKINNING
- SUPPORT_FILEFORMAT_TGA
- SUPPORT_FILEFORMAT_PSD
- SUPPORT_FILEFORMAT_HDR
- SUPPORT_FILEFORMAT_PIC
- SUPPORT_FILEFORMAT_PNM
- SUPPORT_FILEFORMAT_KTX
- SUPPORT_FILEFORMAT_ASTC
- SUPPORT_FILEFORMAT_PKM
- SUPPORT_FILEFORMAT_PVR
- SUPPORT_FILEFORMAT_BDF
- SUPPORT_FILEFORMAT_FLAC)
- set(${flag} OFF CACHE BOOL "" FORCE)
-endforeach()
-# raylib spins for the last part of every frame by default, for timing precision nothing here
-# needs: most of a millisecond of a core per frame, for as long as the viewer is open.
-set(SUPPORT_PARTIALBUSY_WAIT_LOOP OFF CACHE BOOL "" FORCE)
-# F12 saves a screenshot into the working directory, which is wherever the test run that started
-# the viewer was launched from. Unreachable while nothing read input; reachable from here on.
-set(SUPPORT_SCREEN_CAPTURE OFF CACHE BOOL "" FORCE)
-set(SUPPORT_MODULE_RAUDIO OFF CACHE BOOL "" FORCE)
-set(SUPPORT_MODULE_RMODELS OFF CACHE BOOL "" FORCE)
-# The formats the viewer compares as pictures and raylib can decode. WebP and ICO are also
-# compared, and raylib has no decoder for either, so on this platform they draw as their property
-# rows alone — which is what those rows are for.
-set(SUPPORT_FILEFORMAT_PNG ON CACHE BOOL "" FORCE)
-set(SUPPORT_FILEFORMAT_JPG ON CACHE BOOL "" FORCE)
-set(SUPPORT_FILEFORMAT_BMP ON CACHE BOOL "" FORCE)
-set(SUPPORT_FILEFORMAT_GIF ON CACHE BOOL "" FORCE)
-
FetchContent_Declare(
- raylib
- GIT_REPOSITORY https://github.com/raysan5/raylib.git
- GIT_TAG 6.0
+ platformheads
+ GIT_REPOSITORY https://github.com/SimonCropp/PlatformHeads.git
+ GIT_TAG 0.1.0
GIT_SHALLOW ON)
+FetchContent_MakeAvailable(platformheads)
+include(${platformheads_SOURCE_DIR}/cmake/PlatformHeads.cmake)
-# imgui has no CMake build of its own, so it is fetched as plain sources and compiled below.
-FetchContent_Declare(
- imgui
- GIT_REPOSITORY https://github.com/ocornut/imgui.git
- GIT_TAG v1.92.9b
- GIT_SHALLOW ON)
+platformheads_defaults()
-FetchContent_MakeAvailable(raylib)
-FetchContent_MakeAvailable(imgui)
+# The formats the viewer compares as pictures and raylib can decode. WebP and ICO are also
+# compared, and raylib has no decoder for either, so on this platform they draw as their property
+# rows alone — which is what those rows are for.
+platformheads_fetch(FORMATS PNG JPG BMP GIF)
-add_library(diffengine_viewer SHARED
- src/deview.cpp
- ${imgui_SOURCE_DIR}/imgui.cpp
- ${imgui_SOURCE_DIR}/imgui_draw.cpp
- ${imgui_SOURCE_DIR}/imgui_tables.cpp
- ${imgui_SOURCE_DIR}/imgui_widgets.cpp)
+platformheads_add_library(diffengine_viewer SOURCES src/deview.cpp)
-target_include_directories(diffengine_viewer PRIVATE include ${imgui_SOURCE_DIR})
-# ImGui's characters are sixteen bits unless told otherwise, and everything past the basic plane,
-# which is most emoji and the rarer Han characters, is then the replacement character before any
-# font is asked for it.
-target_compile_definitions(diffengine_viewer PRIVATE IMGUI_USE_WCHAR32)
# Threads for the threads pictures are decoded and fonts are found on, and dl for fontconfig,
# which is looked for at run time rather than linked.
find_package(Threads REQUIRED)
-target_link_libraries(diffengine_viewer PRIVATE raylib Threads::Threads ${CMAKE_DL_LIBS})
-
-# Only the libraries something is actually called in are recorded as needed. raylib hands on
-# everything CMake's FindX11 found, which includes libSM and libICE wherever their headers are
-# installed, and nothing here or in raylib calls either. A library recorded as needed has to be
-# on the machine for this one to load at all, and a stock Ubuntu has neither of those two: the
-# viewer could not start, and every inline snapshot sent to it was staged instead of shown.
-# Ubuntu's own compiler passes this by default, which is why the binaries built on the runner
-# never had the problem and the ones built in the manylinux container did.
-if(UNIX AND NOT APPLE)
- target_link_options(diffengine_viewer PRIVATE LINKER:--as-needed)
-endif()
-
-# The managed side probes for a bare name; keep it identical on every platform apart from the
-# platform's own prefix and extension.
-set_target_properties(diffengine_viewer PROPERTIES
- OUTPUT_NAME "diffengine_viewer"
- C_VISIBILITY_PRESET hidden
- CXX_VISIBILITY_PRESET hidden)
-
-if(MSVC)
- target_compile_options(diffengine_viewer PRIVATE /W3 /permissive-)
- target_compile_definitions(diffengine_viewer PRIVATE _CRT_SECURE_NO_WARNINGS)
-else()
- target_compile_options(diffengine_viewer PRIVATE -Wall -Wextra -Wno-unused-parameter)
-endif()
+target_link_libraries(diffengine_viewer PRIVATE Threads::Threads ${CMAKE_DL_LIBS})
-# Kept buildable on macOS for comparison against the Swift renderer that actually ships there,
-# but nothing consumes the result: build-native builds native/swift for the osx RIDs.
-if(APPLE)
- set_target_properties(diffengine_viewer PROPERTIES SUFFIX ".dylib")
-endif()
+# The library stays buildable on macOS, for comparison against the Swift renderer that actually
+# ships there, but nothing consumes the result: build-native builds native/swift for the osx RIDs.
diff --git a/native/build-linux.sh b/native/build-linux.sh
deleted file mode 100755
index 0184de62..00000000
--- a/native/build-linux.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env bash
-# Builds build/libdiffengine_viewer.so inside a manylinux_2_28 container, whose glibc 2.28 is the
-# floor the library then needs - see the Linux build step in .github/workflows/build-native.yml.
-# Runs from the repository root:
-#
-# docker run --rm -v "$PWD:/src" -w /src "quay.io/pypa/manylinux_2_28_$(uname -m)" bash native/build-linux.sh
-set -euo pipefail
-
-# What raylib's bundled GLFW builds against, for both its X11 and Wayland backends: the set the
-# runner used to install, under this distribution's names.
-dnf install -y \
- git pkgconfig \
- libX11-devel libXext-devel libXrandr-devel libXi-devel libXcursor-devel libXinerama-devel \
- mesa-libGL-devel wayland-devel libxkbcommon-devel
-
-# native/CMakeLists.txt needs CMake 3.24, newer than the distribution's own. The image carries
-# current releases through pipx, so these are only installed where it does not.
-export PATH="$HOME/.local/bin:$PATH"
-for tool in cmake ninja; do
- if ! command -v "$tool" > /dev/null 2>&1; then
- pipx install "$tool"
- fi
-done
-
-# LEGACY links libGL.so.1, which every GL driver ships. This distribution's CMake otherwise
-# prefers the GLVND split and links libOpenGL.so.0, which a machine with only libgl1 lacks.
-cmake -S native -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DOpenGL_GL_PREFERENCE=LEGACY
-cmake --build build --config Release
-
-# Here rather than in the workflow's collect step: the build directory belongs to this
-# container's root, and the runner cannot rewrite what is in it.
-strip build/libdiffengine_viewer.so
diff --git a/src/DiffEngine/DiffEngine.csproj b/src/DiffEngine/DiffEngine.csproj
index 99b97237..7ce8fa78 100644
--- a/src/DiffEngine/DiffEngine.csproj
+++ b/src/DiffEngine/DiffEngine.csproj
@@ -30,7 +30,7 @@
-
- $(MSBuildProjectDirectory)\obj\viewer\
- AddViewerToPackage;$(GenerateNuspecDependsOn)
+ $(MSBuildProjectDirectory)\obj\viewer\
+ tools\viewer
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
- <_RidWithoutApphost Include="@(ViewerRid)"
- Condition="!Exists('$(ViewerStageDir)%(ViewerRid.Identity)\%(ViewerRid.Apphost)')" />
-
-
-
-
-
-
- <_ViewerFile Include="$(ViewerStageDir)**\*" />
-
-
- <_PackageFiles Include="@(_ViewerFile)"
- BuildAction="None"
- PackagePath="tools\viewer" />
-
-
diff --git a/src/DiffEngineTray/DiffEngineTray.csproj b/src/DiffEngineTray/DiffEngineTray.csproj
index 52621fb8..718107f8 100644
--- a/src/DiffEngineTray/DiffEngineTray.csproj
+++ b/src/DiffEngineTray/DiffEngineTray.csproj
@@ -49,7 +49,8 @@
@@ -71,7 +72,7 @@
+ Text="No staged Windows viewer under $(TrayViewerStageDir). PlatformHeadsPublish should have produced one." />
false
linux-x64;linux-arm64
+
+ true
+
-
-
-
-
-
-
-
-
-
diff --git a/src/DiffEngineViewer.Linux/runtimes/linux-arm64/native/libdiffengine_viewer.so b/src/DiffEngineViewer.Linux/runtimes/linux-arm64/native/libdiffengine_viewer.so
index 1d57eb20..c0dcdaeb 100644
Binary files a/src/DiffEngineViewer.Linux/runtimes/linux-arm64/native/libdiffengine_viewer.so and b/src/DiffEngineViewer.Linux/runtimes/linux-arm64/native/libdiffengine_viewer.so differ
diff --git a/src/DiffEngineViewer.Linux/runtimes/linux-x64/native/libdiffengine_viewer.so b/src/DiffEngineViewer.Linux/runtimes/linux-x64/native/libdiffengine_viewer.so
index e7c794f4..d514023a 100644
Binary files a/src/DiffEngineViewer.Linux/runtimes/linux-x64/native/libdiffengine_viewer.so and b/src/DiffEngineViewer.Linux/runtimes/linux-x64/native/libdiffengine_viewer.so differ
diff --git a/src/DiffEngineViewer.Mac/DiffEngineViewer.Mac.csproj b/src/DiffEngineViewer.Mac/DiffEngineViewer.Mac.csproj
index a781a1f7..20ff3bba 100644
--- a/src/DiffEngineViewer.Mac/DiffEngineViewer.Mac.csproj
+++ b/src/DiffEngineViewer.Mac/DiffEngineViewer.Mac.csproj
@@ -24,31 +24,24 @@
false
osx;osx-x64;osx-arm64
+
+ true
+
-
-
-
-
-
-
-
-
-
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 7362a048..616549d6 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -19,6 +19,7 @@
-->
+