Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 67 additions & 17 deletions Assets/EmuHawkMono.sh
Original file line number Diff line number Diff line change
@@ -1,24 +1,74 @@
#!/bin/sh
cd "$(dirname "$(realpath "$0")")"
libpath=""
if [ "$(command -v lsb_release)" ]; then
case "$(lsb_release -i | head -n1 | cut -c17- | tr A-Z a-z)" in
"arch"|"artix"|"manjarolinux") libpath="/usr/lib";;
"fedora"|"gentoo"|"nobaralinux"|"opensuse") libpath="/usr/lib64";;
"nixos") libpath="/usr/lib"; printf "Running on NixOS? Why aren't you using the Nix expr?\n" >&2;;
"debian"|"linuxmint"|"pop"|"ubuntu") libpath="/usr/lib/x86_64-linux-gnu";;
esac
else
printf "Distro does not provide LSB release info API! (You've met with a terrible fate, haven't you?)\n" >&2
fi
if [ -z "$libpath" ]; then
printf "%s\n" "Unknown distro, assuming system-wide libraries are in /usr/lib..." >&2
libpath="/usr/lib"
fi
export LD_LIBRARY_PATH="$PWD/dll:$PWD:$libpath"
case "$(uname -s)" in
Darwin)
# macOS (x86_64; natively on Intel or via Rosetta 2 on Apple silicon). Mono's WinForms is
# X11-based, so XQuartz must be running; see the macOS section in the readme. The display
# method defaults to GdiPlus on macOS (in Config.cs) since XQuartz's OpenGL is unusable.
#
# BizHawk's P/Invokes and Mono load some libraries by Linux/soname-style names, and the
# Homebrew/XQuartz deps have their own versioned names. We can't ship those symlinks (they
# point at the user's Homebrew install), so (re)create them in ./dll at launch, similar to
# the NixOS launch script. They all resolve to ONE Homebrew libX11 so that the X11 clients
# (WinForms, cairo/libgdiplus, SDL) agree.
dll="$PWD/dll"
ln_dep() { [ -e "$1" ] && ln -sf "$1" "$dll/$2"; } # silently skip optional libs that aren't installed
ln_dep /usr/local/opt/lua@5.4/lib/liblua5.4.dylib liblua54.dylib
ln_dep /usr/local/opt/openal-soft/lib/libopenal.dylib libopenal.dylib
ln_dep /usr/local/opt/openal-soft/lib/libopenal.1.dylib libopenal.1.dylib
ln_dep /usr/local/opt/zstd/lib/libzstd.1.dylib libzstd.so.1
ln_dep /usr/local/opt/sqlite/lib/libsqlite3.dylib libe_sqlite3.dylib
ln_dep /usr/local/opt/libx11/lib/libX11.6.dylib libX11.6.dylib
ln_dep /usr/local/opt/libxext/lib/libXext.6.dylib libXext.6.dylib
ln_dep /usr/local/opt/libxrender/lib/libXrender.1.dylib libXrender.1.dylib
ln_dep /usr/local/opt/libxcursor/lib/libXcursor.1.dylib libXcursor.1.dylib
ln_dep /usr/local/opt/libxinerama/lib/libXinerama.1.dylib libXinerama.1.dylib
ln_dep /usr/local/opt/libxi/lib/libXi.6.dylib libXi.6.dylib
ln_dep /usr/local/opt/libxrandr/lib/libXrandr.2.dylib libXrandr.2.dylib
ln_dep /usr/local/opt/libxtst/lib/libXtst.6.dylib libXtst.6.dylib
ln_dep /usr/local/opt/libxfixes/lib/libXfixes.3.dylib libXfixes.3.dylib
ln_dep /usr/local/opt/libxscrnsaver/lib/libXss.1.dylib libXss.1.dylib
ln_dep /usr/local/opt/libxau/lib/libXau.6.dylib libXau.6.dylib
ln_dep /usr/local/opt/libxdmcp/lib/libXdmcp.6.dylib libXdmcp.6.dylib
ln_dep /usr/local/opt/libxcb/lib/libxcb.1.dylib libxcb.1.dylib
# soname/unversioned aliases hardcoded by BizHawk's P/Invokes and Mono (resolve within ./dll)
[ -e "$dll/libX11.6.dylib" ] && { ln -sf libX11.6.dylib "$dll/libX11.dylib"; ln -sf libX11.6.dylib "$dll/libX11.so.6"; }
[ -e "$dll/libXi.6.dylib" ] && ln -sf libXi.6.dylib "$dll/libXi.so.6"
[ -e "$dll/libXfixes.3.dylib" ] && ln -sf libXfixes.3.dylib "$dll/libXfixes.so.3"
[ -e "$dll/libgdiplus.0.dylib" ] && ln -sf libgdiplus.0.dylib "$dll/libgdiplus.dylib"
# Let the loader find ./dll, the Homebrew deps under /usr/local, and XQuartz under /opt/X11.
export DYLD_LIBRARY_PATH="$dll:$PWD:/usr/local/lib:/opt/X11/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}"
export DYLD_FALLBACK_LIBRARY_PATH="$dll:$PWD:/usr/local/lib:/opt/X11/lib:/usr/lib${DYLD_FALLBACK_LIBRARY_PATH:+:$DYLD_FALLBACK_LIBRARY_PATH}"
# Prefer the x86_64 Homebrew Mono via PATH (so a Nix Mono etc. is still respected). Don't run
# Mono through `arch` — it's SIP-protected and strips the DYLD_* vars.
[ -d /usr/local/bin ] && export PATH="/usr/local/bin:$PATH"
export MONO_MWF_MAC_FORCE_X11=1 # the default macOS WinForms driver (Carbon) is unported to 64-bit
[ -z "$DISPLAY" ] && export DISPLAY=:0
export MONO_GC_PARAMS="nursery-size=256m${MONO_GC_PARAMS:+,}$MONO_GC_PARAMS"
;;
*)
# GNU+Linux (and other Unix)
libpath=""
if [ "$(command -v lsb_release)" ]; then
case "$(lsb_release -i | head -n1 | cut -c17- | tr A-Z a-z)" in
"arch"|"artix"|"manjarolinux") libpath="/usr/lib";;
"fedora"|"gentoo"|"nobaralinux"|"opensuse") libpath="/usr/lib64";;
"nixos") libpath="/usr/lib"; printf "Running on NixOS? Why aren't you using the Nix expr?\n" >&2;;
"debian"|"linuxmint"|"pop"|"ubuntu") libpath="/usr/lib/x86_64-linux-gnu";;
esac
else
printf "Distro does not provide LSB release info API! (You've met with a terrible fate, haven't you?)\n" >&2
fi
if [ -z "$libpath" ]; then
printf "%s\n" "Unknown distro, assuming system-wide libraries are in /usr/lib..." >&2
libpath="/usr/lib"
fi
export LD_LIBRARY_PATH="$PWD/dll:$PWD:$libpath"
;;
esac
export MONO_CRASH_NOFILE=1
export MONO_WINFORMS_XIM_STYLE=disabled # see https://bugzilla.xamarin.com/show_bug.cgi?id=28047#c9
if (ps -C "mono" -o "cmd" --no-headers | grep -Fq "EmuHawk.exe"); then
if (ps -A -o command= | grep -F "EmuHawk.exe" | grep -Fvq "grep"); then
printf "(it seems EmuHawk is already running, NOT capturing output)\n" >&2
exec mono EmuHawk.exe "$@"
fi
Expand Down
2 changes: 1 addition & 1 deletion Dist/.InvokeCLIOnMainSln.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ config="$1"
shift
if [ -z "$NUGET_PACKAGES" ]; then export NUGET_PACKAGES="$HOME/.nuget/packages"; fi
printf "running 'dotnet %s' in %s configuration, extra args: %s\n" "$cmd" "$config" "$*"
version=$(grep -Po "MainVersion = \"\K(.*)(?=\")" src/BizHawk.Common/VersionInfo.cs)
version=$(sed -n 's/.*MainVersion = "\([^"]*\)";.*/\1/p' src/BizHawk.Common/VersionInfo.cs)
git_hash="$(git rev-parse --verify HEAD 2>/dev/null || printf "0000000000000000000000000000000000000000")"
dotnet "$cmd" BizHawk.sln -c "$config" -m -clp:NoSummary -p:Version="$version" -p:SourceRevisionId="$git_hash" "$@"
33 changes: 25 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Jump to:
* Installing
* [Windows](#windows)
* [Unix](#unix)
* [macOS](#macos-legacy-bizhawk)
* [macOS](#macos-experimental-x86_64-port)
* [Nix/NixOS](#nixnixos)
* [Development builds](#development-builds)
* [Building](#building)
Expand Down Expand Up @@ -172,14 +172,31 @@ As with Apple silicon Macs, not available.

If you were looking to emulate iOS apps, see [#3956](https://github.com/TASEmulators/BizHawk/issues/3956).

#### macOS (legacy BizHawk)
#### macOS (experimental x86_64 port)

EmuHawk depends on certain libraries for graphics, and these don't work on macOS. Users on macOS have three options:
* Use another machine with Windows or Linux, or install either in an x86_64 VM (Wine is not a VM).
* Use an older 1.x release, which was ported to macOS by @Sappharad (with replacements for the missing libraries), via Rosetta. Links and more details are in [this TASVideos forum thread](https://tasvideos.org/Forum/Topics/12659) (jump to last page for latest binaries). See [#3697](https://github.com/TASEmulators/BizHawk/issues/3697) for details.
* For the technically-minded, download the [source](https://github.com/Sappharad/BizHawk/tree/MacUnixMonoCompat) of an older 2.x release. @Sappharad put a lot of work into it but ultimately decided to stop.
* ...or use the Nix expression as a starting point instead.
* Either way, this probably won't work on Apple silicon without a lot more effort. You'll probably want to build for x86_64 and run Mono via Rosetta. See [#4052](https://github.com/TASEmulators/BizHawk/issues/4052) re: Linux AArch64.
> [!WARNING]
> **This macOS port is EXPERIMENTAL and community-maintained — it is *not* officially supported by the BizHawk team.**
> It runs the **x86_64** build under Mono + XQuartz (natively on Intel Macs, via Rosetta 2 on Apple silicon). Expect rough edges: software (GdiPlus) video only, no hardware OpenGL (so no HD/upscaled rendering or GL shader filters), and it needs a manual dependency setup.
> **Please do not open issues about this port on the main tracker** unless you can also reproduce them on Windows/Linux — most of the dev team is on Windows and cannot support it. Discuss macOS-specific problems in the relevant macOS thread instead.

Requirements: **macOS 14 (Sonoma) or newer** (this is the floor imposed by the Homebrew dependencies; the bundled native libraries themselves target macOS 11). x86_64 only — on Apple silicon everything runs through **Rosetta 2**.

Setup (all the brew commands must be the **x86_64** Homebrew under `/usr/local`):

1. Apple silicon only: install Rosetta 2 — `softwareupdate --install-rosetta --agree-to-license`.
2. Install an **x86_64 Homebrew** at `/usr/local`. On Intel Macs the normal Homebrew is already x86_64. On Apple silicon, install a second one under Rosetta:
`arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`
(prefix every command below with `arch -x86_64` and use `/usr/local/bin/brew`).
3. Install the runtime dependencies:
`brew install mono mono-libgdiplus sdl2 openal-soft lua@5.4 zstd sqlite libx11 libxext libxrender libxcursor libxinerama libxi libxrandr libxtst libxfixes libxscrnsaver libxau libxdmcp libxcb`
`brew install --cask xquartz` (then log out/in so the X server is registered)
4. Get a build: either download the macOS dev build, or build from source (see [*Building*](#building)).

Run `EmuHawkMono.sh` to start EmuHawk. **XQuartz must be running.** The script forces the X11 WinForms driver and symlinks the Homebrew/XQuartz dependencies into `dll/` on each launch; the display method defaults to GdiPlus (software) on macOS. It takes the same command-line arguments as on Windows: see [*Passing command-line arguments*](#passing-command-line-arguments), e.g. `./EmuHawkMono.sh --lua=/path/to/script.lua /path/to/rom.nds`.

What works: most non-GL cores including **Game Boy/Color (Gambatte)**, **GBA (mGBA)**, and **Nintendo DS (melonDS)**, plus Lua scripting. Cores that require host OpenGL fall back to their software renderers. N64 and other GL-only paths are not expected to work.

If you need an older 1.x macOS build instead, @Sappharad's Rosetta port is described in [this TASVideos forum thread](https://tasvideos.org/Forum/Topics/12659); see also [#3697](https://github.com/TASEmulators/BizHawk/issues/3697) and [#1430](https://github.com/TASEmulators/BizHawk/issues/1430).

#### Nix/NixOS

Expand Down
10 changes: 8 additions & 2 deletions src/BizHawk.Bizware.Graphics/OpenGL/SDL2OpenGLContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,15 @@ public class SDL2OpenGLContext : IDisposable
#pragma warning disable CA1065 // not sure how else to handle failure other than throwing with a good message
static SDL2OpenGLContext()
{
if (OSTailoredCode.IsUnixHost)
if (OSTailoredCode.CurrentOS is OSTailoredCode.DistinctOS.macOS)
{
// mono winforms uses x11 (via XQuartz) on macOS too, so use the x11 video driver,
// but XQuartz only provides GLX (not EGL), so don't force EGL like on Linux
SDL_SetHintWithPriority("SDL_VIDEODRIVER", "x11", SDL_HintPriority.SDL_HINT_OVERRIDE);
}
else if (OSTailoredCode.IsUnixHost)
{
// make sure that Linux uses the x11 video driver
// make sure that we use the x11 video driver
// we need this as mono winforms uses x11
// and the user could potentially try to force the wayland video driver via env vars
SDL_SetHintWithPriority("SDL_VIDEODRIVER", "x11", SDL_HintPriority.SDL_HINT_OVERRIDE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ internal static class KeyMouseInputFactory
public static IKeyMouseInput CreateKeyMouseInput() => OSTailoredCode.CurrentOS switch
{
OSTailoredCode.DistinctOS.Linux => new X11KeyMouseInput(),
OSTailoredCode.DistinctOS.macOS => new QuartzKeyMouseInput(),
// macOS EmuHawk runs under XQuartz (Mono WinForms is X11), so read the keyboard/mouse
// through X11 like Linux. The Quartz path (CGEventSourceKeyState) needs Accessibility
// permission and Mac HID keycodes, and doesn't integrate with the XQuartz window.
OSTailoredCode.DistinctOS.macOS => new X11KeyMouseInput(),
OSTailoredCode.DistinctOS.Windows => new RawKeyMouseInput(),
_ => throw new InvalidOperationException("Unknown OS"),
};
Expand Down
11 changes: 3 additions & 8 deletions src/BizHawk.Bizware.Input/KeyMouseInput/X11KeyMouseInput.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
#nullable enable
#nullable enable

using System.Collections.Generic;
using System.Runtime.InteropServices;

using BizHawk.Common;

using static BizHawk.Common.XInput2Imports;
using static BizHawk.Common.XlibImports;

Expand All @@ -23,11 +21,8 @@ internal sealed class X11KeyMouseInput : IKeyMouseInput

public X11KeyMouseInput()
{
if (OSTailoredCode.CurrentOS != OSTailoredCode.DistinctOS.Linux)
{
throw new NotSupportedException("X11 is Linux only");
}

// no OS check: X11 may work on any host with an X server (e.g. macOS via XQuartz);
// XOpenDisplay below fails cleanly otherwise, and Windows uses RawKeyMouseInput
Display = XOpenDisplay(null);

if (Display == IntPtr.Zero)
Expand Down
4 changes: 3 additions & 1 deletion src/BizHawk.Client.Common/config/Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,9 @@ public void SetWindowScaleFor(string sysID, int windowScale)

public int DispPrescale { get; set; } = 1;

public EDispMethod DispMethod { get; set; } = HostCapabilityDetector.HasD3D11 ? EDispMethod.D3D11 : EDispMethod.OpenGL;
public EDispMethod DispMethod { get; set; } = HostCapabilityDetector.HasD3D11
? EDispMethod.D3D11
: OSTailoredCode.CurrentOS is OSTailoredCode.DistinctOS.macOS ? EDispMethod.GdiPlus : EDispMethod.OpenGL;

public int DispChromeFrameWindowed { get; set; } = 2;
public bool DispChromeStatusBarWindowed { get; set; } = true;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using BizHawk.Bizware.Graphics;
using BizHawk.Common;
using BizHawk.Emulation.Common;

namespace BizHawk.Client.EmuHawk
Expand All @@ -9,7 +10,11 @@ namespace BizHawk.Client.EmuHawk
public class OpenGLProvider : IOpenGLProvider
{
public bool SupportsGLVersion(int major, int minor)
=> OpenGLVersion.SupportsVersion(major, minor);
// On macOS the only GL available (XQuartz/GLX) is the legacy Apple bridge, which is
// capped at GL 2.1 and aborts under Rosetta; probing it crashes. Report no host GL so
// cores (melonDS, N64, ...) fall back to their software renderers.
=> OSTailoredCode.CurrentOS != OSTailoredCode.DistinctOS.macOS
Comment thread
YoshiRulz marked this conversation as resolved.
&& OpenGLVersion.SupportsVersion(major, minor);

public object RequestGLContext(int major, int minor, bool coreProfile)
=> new SDL2OpenGLContext(major, minor, coreProfile);
Expand Down
13 changes: 13 additions & 0 deletions src/BizHawk.Common/IImportResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,19 @@ public interface IImportResolver

public class DynamicLibraryImportResolver : IDisposable, IImportResolver
{
/// <summary>
/// Maps a bare library name (as you'd pass to <see cref="DllImportAttribute">[DllImport]</see>) to
/// the host's conventional filename: <c>name.dll</c> on Windows, <c>libname.dylib</c> on macOS, and
/// <c>libname.so</c> on Linux/BSD. Use this instead of hardcoding <c>IsUnixHost ? "lib…so" : "….dll"</c>
/// at each call site.
/// </summary>
public static string PlatformFileName(string baseName) => OSTailoredCode.CurrentOS switch
{
OSTailoredCode.DistinctOS.Windows => $"{baseName}.dll",
OSTailoredCode.DistinctOS.macOS => $"lib{baseName}.dylib",
_ => $"lib{baseName}.so", // Linux/BSD
};

private IntPtr _p;

public readonly bool HasLimitedLifetime;
Expand Down
7 changes: 6 additions & 1 deletion src/BizHawk.Common/MemoryBlock/MemoryBlockLinuxPal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ namespace BizHawk.Common
{
internal sealed class MemoryBlockLinuxPal : IMemoryBlockPal
{
private const int MAP_PRIVATE = 0x2;

// MAP_ANON is 0x20 on Linux/BSD but 0x1000 on macOS
private static readonly int MAP_ANON = OSTailoredCode.CurrentOS is OSTailoredCode.DistinctOS.macOS ? 0x1000 : 0x20;

public ulong Start { get; }
private readonly ulong _size;
private bool _disposed;
Expand All @@ -19,7 +24,7 @@ internal sealed class MemoryBlockLinuxPal : IMemoryBlockPal
/// </exception>
public MemoryBlockLinuxPal(ulong size)
{
var ptr = mmap(IntPtr.Zero, Z.UU(size), MemoryProtection.None, 0x22 /* MAP_PRIVATE | MAP_ANON */, -1, IntPtr.Zero);
var ptr = mmap(IntPtr.Zero, Z.UU(size), MemoryProtection.None, MAP_PRIVATE | MAP_ANON, -1, IntPtr.Zero);
if (ptr == new IntPtr(-1))
{
throw new InvalidOperationException($"{nameof(mmap)}() failed with error {Marshal.GetLastWin32Error()}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public sealed class CIAInstallThrowable(string message) : Exception(message);
private static void ResetEncoreResolver()
{
_resolver?.Dispose();
_resolver = new(OSTailoredCode.IsUnixHost ? "libencore.so" : "encore.dll", hasLimitedLifetime: true);
_resolver = new(DynamicLibraryImportResolver.PlatformFileName("encore"), hasLimitedLifetime: true);
_core = BizInvoker.GetInvoker<LibEncore>(_resolver, CallingConventionAdapters.Native);
}

Expand Down
4 changes: 3 additions & 1 deletion src/BizHawk.Emulation.Cores/Waterbox/WaterboxHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,9 @@ public sealed class WaterboxHost : IMonitor, IImportResolver, IStatable, IDispos
static WaterboxHost()
{
NativeImpl = BizInvoker.GetInvoker<WaterboxHostNative>(
new DynamicLibraryImportResolver(OSTailoredCode.IsUnixHost ? "libwaterboxhost.so" : "waterboxhost.dll", hasLimitedLifetime: false),
new DynamicLibraryImportResolver(
DynamicLibraryImportResolver.PlatformFileName("waterboxhost"),
hasLimitedLifetime: false),
CallingConventionAdapters.Native);
#if !DEBUG
NativeImpl.wbx_set_always_evict_blocks(false);
Expand Down
40 changes: 40 additions & 0 deletions waterbox/waterboxhost/build-release-macos.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/bin/sh
# Build libwaterboxhost for macOS as an x86_64 Mach-O dylib (runs under Rosetta 2 on
# Apple Silicon). Cross-compiles from any host; only needs rustup + the x86_64-apple-darwin
# std for a compatible nightly. See build-release.sh for the Linux/.so equivalent.
#
# NOTE: this builds the host. Guest-entry on macOS is not yet fully correct; see the
# TODO[macOS] in src/context/mod.rs (the %gs / TLS scratch mechanism still needs work).
set -e
if [ -z "$BIZHAWKBUILD_HOME" ]; then export BIZHAWKBUILD_HOME="$(realpath "$(dirname "$0")/../..")"; fi
cd "$(dirname "$0")"

# This crate predates several nightly API changes (try_trait_v2, unsafe intrinsics), so pin
# a known-good nightly rather than the floating channel in rust-toolchain.toml.
TOOLCHAIN="${WBX_NIGHTLY:-nightly-2024-10-18}"
TARGET="x86_64-apple-darwin"
# Build for an older baseline so the dylib loads on older Macs, not just the build host.
# (The overall floor is set by the Homebrew deps, currently macOS 14.)
export MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET:-11.0}"

rustup toolchain install "$TOOLCHAIN" --profile minimal
rustup target add --toolchain "$TOOLCHAIN" "$TARGET"

# cargo invokes a bare `rustc`; if another rustc (e.g. Homebrew's) precedes ~/.cargo/bin on
# PATH it gets picked and lacks the cross std. Pin RUSTC to the toolchain's rustc explicitly.
RUSTC_BIN="$(rustup which --toolchain "$TOOLCHAIN" rustc)"

# Regenerate the interop blobs (needs nasm: `brew install nasm`). The macOS variant
# (interop_macos.bin) handles %gs differently — see src/context/interop_macos.s.
if command -v nasm >/dev/null 2>&1; then
make -C src/context
fi

RUSTC="$RUSTC_BIN" cargo "+$TOOLCHAIN" build --release --target "$TARGET"

OUT="target/$TARGET/release/libwaterboxhost.dylib"
cp "$OUT" "$BIZHAWKBUILD_HOME/Assets/dll/libwaterboxhost.dylib"
if [ -e "$BIZHAWKBUILD_HOME/output" ]; then
cp "$OUT" "$BIZHAWKBUILD_HOME/output/dll/libwaterboxhost.dylib"
fi
printf "copied libwaterboxhost.dylib (%s) into Assets/dll\n" "$TARGET"
9 changes: 7 additions & 2 deletions waterbox/waterboxhost/src/context/Makefile
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
interop.bin: interop.s
nasm -f bin -Wall -o $@ $<
all: interop.bin interop_macos.bin

interop.bin: interop.s
nasm -f bin -Wall -o $@ $<

interop_macos.bin: interop_macos.s
nasm -f bin -Wall -o $@ $<
Binary file not shown.
Loading