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 @@ --> +