Repository: dankamongmen/notcurses (language: python)

Issue:
verify support for stupid asshole osx
Much as it pains me, we probably ought try to pick up some of that OS X market share. I flat-out refuse to pursue Windows. I don't have any OS X hardware, so ... patches welcome? Testing welcome? Hey @plotfi have apple give me a computer to support notcurses on.
OS X failures in notcurses-tester
With #1923, we're currently seeing a few failures in `notcurses-tester` on OS X 11.4:

```c
===============================================================================
/Users/dank/src/notcurses/src/tests/wide.cpp:10:
TEST CASE:  Wide
  PlaneAtCursorInsane

/Users/dank/src/notcurses/src/tests/wide.cpp:83: ERROR: CHECK( 1 < nccell_load(n_, &tcells[4], EGC4) ) is NOT correct!
  values: CHECK( 1 <  -1 )

===============================================================================
/Users/dank/src/notcurses/src/tests/wide.cpp:10:
TEST CASE:  Wide
  OfflineEGCs

/Users/dank/src/notcurses/src/tests/wide.cpp:995: ERROR: CHECK( 0 < nccell_load(n_, &c, egc) ) is NOT correct!
  values: CHECK( 0 <  -1 )

===============================================================================
[doctest] test cases:   1 |   0 passed | 1 failed | 49 skipped
[doctest] assertions: 682 | 678 passed | 4 failed |
[doctest] Status: FAILURE!
```
verify support for stupid asshole osx
Much as it pains me, we probably ought try to pick up some of that OS X market share. I flat-out refuse to pursue Windows. I don't have any OS X hardware, so ... patches welcome? Testing welcome? Hey @plotfi have apple give me a computer to support notcurses on.
verify support for stupid asshole osx
Much as it pains me, we probably ought try to pick up some of that OS X market share. I flat-out refuse to pursue Windows. I don't have any OS X hardware, so ... patches welcome? Testing welcome? Hey @plotfi have apple give me a computer to support notcurses on.
verify support for stupid asshole osx
Much as it pains me, we probably ought try to pick up some of that OS X market share. I flat-out refuse to pursue Windows. I don't have any OS X hardware, so ... patches welcome? Testing welcome? Hey @plotfi have apple give me a computer to support notcurses on.
verify support for stupid asshole osx
Much as it pains me, we probably ought try to pick up some of that OS X market share. I flat-out refuse to pursue Windows. I don't have any OS X hardware, so ... patches welcome? Testing welcome? Hey @plotfi have apple give me a computer to support notcurses on.


Discussion / hints:
Some pointers for OSX:

* You can generate OSX icons for Linux with [icsutils](https://dentrassi.de/2014/02/25/creating-mac-os-x-icons-icns-on-linux/)
* An app bundle dmg is just an iso with a special structure.  It can be created on Linux also.  [Here](https://gitlab.com/klamonte/tjide/tree/master/build/osx) is one example.
* Alt-{something} keystrokes on OSX generally do not result in ESC-{something} as they do under xterm with metaSendsEscape.  Instead it is Cmd-{something}, IF that setting is enabled in the Terminal.app / iTerm2 profile.
* OSX fixed-width fonts generally suck for line-drawing / CP437 glyphs.  If you need something that really looks like "VGA" but with Unicode codepoints, [this TTF version of Terminus](http://files.ax86.net/terminus-ttf/) is pretty good, it might be worth pointing your users to if they complain of missing glyphs.

Trying to build on a bare-bones macOS dies when looking for 'tinfo>=6.1;ncursesw>=6.1'. The terminfo on latest macOS is 5.7; the ncursesw is 5.7. Both are 2008 vintage. That was a shit year — not as shit as 2020 — but still pretty shit.
`brew install ncurses` drops 6.2 into a 'keg', but the CMakeFile isn't playing ball.

    ==> Caveats
    ncurses is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.

    If you need to have ncurses first in your PATH run:
      echo 'export PATH="/usr/local/opt/ncurses/bin:$PATH"' >> ~/.zshrc

    For compilers to find ncurses you may need to set:
      export LDFLAGS="-L/usr/local/opt/ncurses/lib"
      export CPPFLAGS="-I/usr/local/opt/ncurses/include"

    For pkg-config to find ncurses you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/ncurses/lib/pkgconfig"

    ==> Summary
    🍺  /usr/local/Cellar/ncurses/6.2: 3,913 files, 8.6MB

Anyways, I know jack-all about CMake, so the best I can do is look at line 68 and say to myself "gee! it'd be great if I could point you somewhere else!"

I just changed the tinfo/ncursesw versions to look for 5.7, because that's totally safe. I commented out the need for `librt`, because fuck it — that's how Apple compiles it's posix4, *anyways*.

The Makefile generates, but dies when it can't find `uchar.h`.

... that may be the showstopper. `uchar.h` is simply not available, at any price, on macOS.

Maybe I could hack this out to just support ASCII. In case you're not aware, ASCII is just like UTF-8, as long as you pretend the rest of the world doesn't exist. And about 2/3rds of the US.
I'm also interested in using `notcurses` on osx, and ran into the same issues mentioned above. I'm wondering if there's any potential ideas for working around this?
Yeah, that's where progress ends for Windows also, it gets stuck at not finding uchar.h.
oh hey holy shit, i missed all the action on this bug! catching up....
Rumor has it that @grendello has taken ownership of a Mac, and is looking to do something here! and there was much rejoycing.
https://github.com/dankamongmen/notcurses/runs/1101716635?check_suite_focus=true we now have a github action CI for macos, meaning this might move forward!
HAWT.
Has the CI for macos been dropped again? I don't see it in the latest commits.
there's never been any ci for mac, so far as i'm aware?
https://drone.dsscaw.com:4443/dankamongmen/notcurses/ if you can see this, this is all the ci i know of
Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305


> Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: [#195 (comment)](https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305)

oh no problem, just wanted to make sure we hadn't stood up some OS X CI without me knowing =]
recent events have me hoping that this will see life by 3.0.0 this fall

Some pointers for OSX:

* You can generate OSX icons for Linux with [icsutils](https://dentrassi.de/2014/02/25/creating-mac-os-x-icons-icns-on-linux/)
* An app bundle dmg is just an iso with a special structure.  It can be created on Linux also.  [Here](https://gitlab.com/klamonte/tjide/tree/master/build/osx) is one example.
* Alt-{something} keystrokes on OSX generally do not result in ESC-{something} as they do under xterm with metaSendsEscape.  Instead it is Cmd-{something}, IF that setting is enabled in the Terminal.app / iTerm2 profile.
* OSX fixed-width fonts generally suck for line-drawing / CP437 glyphs.  If you need something that really looks like "VGA" but with Unicode codepoints, [this TTF version of Terminus](http://files.ax86.net/terminus-ttf/) is pretty good, it might be worth pointing your users to if they complain of missing glyphs.

Trying to build on a bare-bones macOS dies when looking for 'tinfo>=6.1;ncursesw>=6.1'. The terminfo on latest macOS is 5.7; the ncursesw is 5.7. Both are 2008 vintage. That was a shit year — not as shit as 2020 — but still pretty shit.
`brew install ncurses` drops 6.2 into a 'keg', but the CMakeFile isn't playing ball.

    ==> Caveats
    ncurses is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.

    If you need to have ncurses first in your PATH run:
      echo 'export PATH="/usr/local/opt/ncurses/bin:$PATH"' >> ~/.zshrc

    For compilers to find ncurses you may need to set:
      export LDFLAGS="-L/usr/local/opt/ncurses/lib"
      export CPPFLAGS="-I/usr/local/opt/ncurses/include"

    For pkg-config to find ncurses you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/ncurses/lib/pkgconfig"

    ==> Summary
    🍺  /usr/local/Cellar/ncurses/6.2: 3,913 files, 8.6MB

Anyways, I know jack-all about CMake, so the best I can do is look at line 68 and say to myself "gee! it'd be great if I could point you somewhere else!"

I just changed the tinfo/ncursesw versions to look for 5.7, because that's totally safe. I commented out the need for `librt`, because fuck it — that's how Apple compiles it's posix4, *anyways*.

The Makefile generates, but dies when it can't find `uchar.h`.

... that may be the showstopper. `uchar.h` is simply not available, at any price, on macOS.

Maybe I could hack this out to just support ASCII. In case you're not aware, ASCII is just like UTF-8, as long as you pretend the rest of the world doesn't exist. And about 2/3rds of the US.
I'm also interested in using `notcurses` on osx, and ran into the same issues mentioned above. I'm wondering if there's any potential ideas for working around this?
Yeah, that's where progress ends for Windows also, it gets stuck at not finding uchar.h.
oh hey holy shit, i missed all the action on this bug! catching up....
Rumor has it that @grendello has taken ownership of a Mac, and is looking to do something here! and there was much rejoycing.
https://github.com/dankamongmen/notcurses/runs/1101716635?check_suite_focus=true we now have a github action CI for macos, meaning this might move forward!
HAWT.
Has the CI for macos been dropped again? I don't see it in the latest commits.
there's never been any ci for mac, so far as i'm aware?
https://drone.dsscaw.com:4443/dankamongmen/notcurses/ if you can see this, this is all the ci i know of
Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305


> Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: [#195 (comment)](https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305)

oh no problem, just wanted to make sure we hadn't stood up some OS X CI without me knowing =]
recent events have me hoping that this will see life by 3.0.0 this fall
Some pointers for OSX:

* You can generate OSX icons for Linux with [icsutils](https://dentrassi.de/2014/02/25/creating-mac-os-x-icons-icns-on-linux/)
* An app bundle dmg is just an iso with a special structure.  It can be created on Linux also.  [Here](https://gitlab.com/klamonte/tjide/tree/master/build/osx) is one example.
* Alt-{something} keystrokes on OSX generally do not result in ESC-{something} as they do under xterm with metaSendsEscape.  Instead it is Cmd-{something}, IF that setting is enabled in the Terminal.app / iTerm2 profile.
* OSX fixed-width fonts generally suck for line-drawing / CP437 glyphs.  If you need something that really looks like "VGA" but with Unicode codepoints, [this TTF version of Terminus](http://files.ax86.net/terminus-ttf/) is pretty good, it might be worth pointing your users to if they complain of missing glyphs.

Trying to build on a bare-bones macOS dies when looking for 'tinfo>=6.1;ncursesw>=6.1'. The terminfo on latest macOS is 5.7; the ncursesw is 5.7. Both are 2008 vintage. That was a shit year — not as shit as 2020 — but still pretty shit.
`brew install ncurses` drops 6.2 into a 'keg', but the CMakeFile isn't playing ball.

    ==> Caveats
    ncurses is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.

    If you need to have ncurses first in your PATH run:
      echo 'export PATH="/usr/local/opt/ncurses/bin:$PATH"' >> ~/.zshrc

    For compilers to find ncurses you may need to set:
      export LDFLAGS="-L/usr/local/opt/ncurses/lib"
      export CPPFLAGS="-I/usr/local/opt/ncurses/include"

    For pkg-config to find ncurses you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/ncurses/lib/pkgconfig"

    ==> Summary
    🍺  /usr/local/Cellar/ncurses/6.2: 3,913 files, 8.6MB

Anyways, I know jack-all about CMake, so the best I can do is look at line 68 and say to myself "gee! it'd be great if I could point you somewhere else!"

I just changed the tinfo/ncursesw versions to look for 5.7, because that's totally safe. I commented out the need for `librt`, because fuck it — that's how Apple compiles it's posix4, *anyways*.

The Makefile generates, but dies when it can't find `uchar.h`.

... that may be the showstopper. `uchar.h` is simply not available, at any price, on macOS.

Maybe I could hack this out to just support ASCII. In case you're not aware, ASCII is just like UTF-8, as long as you pretend the rest of the world doesn't exist. And about 2/3rds of the US.
I'm also interested in using `notcurses` on osx, and ran into the same issues mentioned above. I'm wondering if there's any potential ideas for working around this?
Yeah, that's where progress ends for Windows also, it gets stuck at not finding uchar.h.
oh hey holy shit, i missed all the action on this bug! catching up....
Rumor has it that @grendello has taken ownership of a Mac, and is looking to do something here! and there was much rejoycing.
https://github.com/dankamongmen/notcurses/runs/1101716635?check_suite_focus=true we now have a github action CI for macos, meaning this might move forward!
HAWT.
Has the CI for macos been dropped again? I don't see it in the latest commits.
there's never been any ci for mac, so far as i'm aware?
https://drone.dsscaw.com:4443/dankamongmen/notcurses/ if you can see this, this is all the ci i know of
Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305


> Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: [#195 (comment)](https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305)

oh no problem, just wanted to make sure we hadn't stood up some OS X CI without me knowing =]
recent events have me hoping that this will see life by 3.0.0 this fall
Some pointers for OSX:

* You can generate OSX icons for Linux with [icsutils](https://dentrassi.de/2014/02/25/creating-mac-os-x-icons-icns-on-linux/)
* An app bundle dmg is just an iso with a special structure.  It can be created on Linux also.  [Here](https://gitlab.com/klamonte/tjide/tree/master/build/osx) is one example.
* Alt-{something} keystrokes on OSX generally do not result in ESC-{something} as they do under xterm with metaSendsEscape.  Instead it is Cmd-{something}, IF that setting is enabled in the Terminal.app / iTerm2 profile.
* OSX fixed-width fonts generally suck for line-drawing / CP437 glyphs.  If you need something that really looks like "VGA" but with Unicode codepoints, [this TTF version of Terminus](http://files.ax86.net/terminus-ttf/) is pretty good, it might be worth pointing your users to if they complain of missing glyphs.

Trying to build on a bare-bones macOS dies when looking for 'tinfo>=6.1;ncursesw>=6.1'. The terminfo on latest macOS is 5.7; the ncursesw is 5.7. Both are 2008 vintage. That was a shit year — not as shit as 2020 — but still pretty shit.
`brew install ncurses` drops 6.2 into a 'keg', but the CMakeFile isn't playing ball.

    ==> Caveats
    ncurses is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.

    If you need to have ncurses first in your PATH run:
      echo 'export PATH="/usr/local/opt/ncurses/bin:$PATH"' >> ~/.zshrc

    For compilers to find ncurses you may need to set:
      export LDFLAGS="-L/usr/local/opt/ncurses/lib"
      export CPPFLAGS="-I/usr/local/opt/ncurses/include"

    For pkg-config to find ncurses you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/ncurses/lib/pkgconfig"

    ==> Summary
    🍺  /usr/local/Cellar/ncurses/6.2: 3,913 files, 8.6MB

Anyways, I know jack-all about CMake, so the best I can do is look at line 68 and say to myself "gee! it'd be great if I could point you somewhere else!"

I just changed the tinfo/ncursesw versions to look for 5.7, because that's totally safe. I commented out the need for `librt`, because fuck it — that's how Apple compiles it's posix4, *anyways*.

The Makefile generates, but dies when it can't find `uchar.h`.

... that may be the showstopper. `uchar.h` is simply not available, at any price, on macOS.

Maybe I could hack this out to just support ASCII. In case you're not aware, ASCII is just like UTF-8, as long as you pretend the rest of the world doesn't exist. And about 2/3rds of the US.
I'm also interested in using `notcurses` on osx, and ran into the same issues mentioned above. I'm wondering if there's any potential ideas for working around this?
Yeah, that's where progress ends for Windows also, it gets stuck at not finding uchar.h.
oh hey holy shit, i missed all the action on this bug! catching up....
Rumor has it that @grendello has taken ownership of a Mac, and is looking to do something here! and there was much rejoycing.
https://github.com/dankamongmen/notcurses/runs/1101716635?check_suite_focus=true we now have a github action CI for macos, meaning this might move forward!
HAWT.
Has the CI for macos been dropped again? I don't see it in the latest commits.
there's never been any ci for mac, so far as i'm aware?
https://drone.dsscaw.com:4443/dankamongmen/notcurses/ if you can see this, this is all the ci i know of
Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305


> Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: [#195 (comment)](https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305)

oh no problem, just wanted to make sure we hadn't stood up some OS X CI without me knowing =]
recent events have me hoping that this will see life by 3.0.0 this fall
Some pointers for OSX:

* You can generate OSX icons for Linux with [icsutils](https://dentrassi.de/2014/02/25/creating-mac-os-x-icons-icns-on-linux/)
* An app bundle dmg is just an iso with a special structure.  It can be created on Linux also.  [Here](https://gitlab.com/klamonte/tjide/tree/master/build/osx) is one example.
* Alt-{something} keystrokes on OSX generally do not result in ESC-{something} as they do under xterm with metaSendsEscape.  Instead it is Cmd-{something}, IF that setting is enabled in the Terminal.app / iTerm2 profile.
* OSX fixed-width fonts generally suck for line-drawing / CP437 glyphs.  If you need something that really looks like "VGA" but with Unicode codepoints, [this TTF version of Terminus](http://files.ax86.net/terminus-ttf/) is pretty good, it might be worth pointing your users to if they complain of missing glyphs.

Trying to build on a bare-bones macOS dies when looking for 'tinfo>=6.1;ncursesw>=6.1'. The terminfo on latest macOS is 5.7; the ncursesw is 5.7. Both are 2008 vintage. That was a shit year — not as shit as 2020 — but still pretty shit.
`brew install ncurses` drops 6.2 into a 'keg', but the CMakeFile isn't playing ball.

    ==> Caveats
    ncurses is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.

    If you need to have ncurses first in your PATH run:
      echo 'export PATH="/usr/local/opt/ncurses/bin:$PATH"' >> ~/.zshrc

    For compilers to find ncurses you may need to set:
      export LDFLAGS="-L/usr/local/opt/ncurses/lib"
      export CPPFLAGS="-I/usr/local/opt/ncurses/include"

    For pkg-config to find ncurses you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/ncurses/lib/pkgconfig"

    ==> Summary
    🍺  /usr/local/Cellar/ncurses/6.2: 3,913 files, 8.6MB

Anyways, I know jack-all about CMake, so the best I can do is look at line 68 and say to myself "gee! it'd be great if I could point you somewhere else!"

I just changed the tinfo/ncursesw versions to look for 5.7, because that's totally safe. I commented out the need for `librt`, because fuck it — that's how Apple compiles it's posix4, *anyways*.

The Makefile generates, but dies when it can't find `uchar.h`.

... that may be the showstopper. `uchar.h` is simply not available, at any price, on macOS.

Maybe I could hack this out to just support ASCII. In case you're not aware, ASCII is just like UTF-8, as long as you pretend the rest of the world doesn't exist. And about 2/3rds of the US.
I'm also interested in using `notcurses` on osx, and ran into the same issues mentioned above. I'm wondering if there's any potential ideas for working around this?
Yeah, that's where progress ends for Windows also, it gets stuck at not finding uchar.h.
oh hey holy shit, i missed all the action on this bug! catching up....
Rumor has it that @grendello has taken ownership of a Mac, and is looking to do something here! and there was much rejoycing.
https://github.com/dankamongmen/notcurses/runs/1101716635?check_suite_focus=true we now have a github action CI for macos, meaning this might move forward!
HAWT.
Has the CI for macos been dropped again? I don't see it in the latest commits.
there's never been any ci for mac, so far as i'm aware?
https://drone.dsscaw.com:4443/dankamongmen/notcurses/ if you can see this, this is all the ci i know of
Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305


> Sorry, I thought your previous comment here in this thread suggested that there might have been a CI at some point: [#195 (comment)](https://github.com/dankamongmen/notcurses/issues/195#issuecomment-691063305)

oh no problem, just wanted to make sure we hadn't stood up some OS X CI without me knowing =]
recent events have me hoping that this will see life by 3.0.0 this fall

Fix patch:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9cad722af7..48bec088f9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -80,6 +80,16 @@ find_package(PkgConfig REQUIRED)
 # feature_summary + set_package_properties to fail in one fell swoop.
 find_package(Threads)
 set_package_properties(Threads PROPERTIES TYPE REQUIRED)
+# platform-specific logics
+if(NOT MSYS AND NOT APPLE)
+  find_library(LIBM m REQUIRED)
+  find_library(LIBRT rt REQUIRED)
+endif()
+if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+  include_directories(/usr/local/include)
+  link_directories(/usr/local/lib)
+  set(CMAKE_REQUIRED_INCLUDES /usr/local/include)
+endif()
 # some distros (<cough>motherfucking alpine</cough> subsume terminfo directly
 # into ncurses. accept either, and may god have mercy on our souls.
 pkg_search_module(TERMINFO REQUIRED tinfo>=6.1 ncursesw>=6.1)
@@ -101,9 +111,7 @@ elseif(${USE_OIIO})
 pkg_check_modules(OIIO REQUIRED OpenImageIO>=2.1)
 set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND OpenImageIO)
 endif()
-if (NOT MSYS)
-  find_library(MATH_LIBRARIES m)
-endif()
+
 if(${USE_DOCTEST})
 find_package(doctest 2.3.5)
 set_package_properties(doctest PROPERTIES TYPE REQUIRED)
@@ -128,10 +136,6 @@ if(NOT "${HAVE_QRCODEGEN_H}")
 endif()
 set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND qrcodegen)
 endif()
-if (NOT MSYS)
-  find_library(LIBM m)
-  find_library(LIBRT rt)
-endif()
 
 feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
 
@@ -146,6 +150,21 @@ add_library(notcurses-core-static STATIC ${NCCORESRCS})
 else()
 add_library(notcurses-core-static STATIC EXCLUDE_FROM_ALL ${NCCORESRCS})
 endif()
+# don't want these on freebsd/dragonfly/osx
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+target_compile_definitions(notcurses-core
+  PUBLIC
+   _XOPEN_SOURCE=700 # wcwidth(3) requires _XOPEN_SOURCE, and is in our headers
+  PRIVATE
+   _GNU_SOURCE _DEFAULT_SOURCE
+)
+target_compile_definitions(notcurses-core-static
+  PUBLIC
+   _XOPEN_SOURCE=700 # wcwidth(3) requires _XOPEN_SOURCE, and is in our headers
+  PRIVATE
+   _GNU_SOURCE _DEFAULT_SOURCE
+)
+endif()
 set_target_properties(notcurses-core PROPERTIES
   VERSION ${PROJECT_VERSION}
   SOVERSION ${PROJECT_VERSION_MAJOR}
@@ -174,7 +193,7 @@ target_link_libraries(notcurses-core
   PRIVATE
     "${TERMINFO_LIBRARIES}"
     "${LIBM}"
-    "${LIBRT}"
+    "${LIBRT_LIBRARIES}"
     "${unistring}"
   PUBLIC
     Threads::Threads
@@ -183,7 +202,7 @@ target_link_libraries(notcurses-core-static
   PRIVATE
     "${TERMINFO_STATIC_LIBRARIES}"
     "${LIBM}"
-    "${LIBRT}"
+    "${LIBRT_LIBRARIES}"
     "${unistring}"
   PUBLIC
     Threads::Threads
@@ -196,21 +215,6 @@ target_link_directories(notcurses-core-static
   PRIVATE
     "${TERMINFO_STATIC_LIBRARY_DIRS}"
 )
-# don't want these on freebsd/dragonfly/osx
-if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
-target_compile_definitions(notcurses-core
-  PUBLIC
-   _XOPEN_SOURCE=700 # wcwidth(3) requires _XOPEN_SOURCE, and is in our headers
-  PRIVATE
-   _GNU_SOURCE _DEFAULT_SOURCE
-)
-target_compile_definitions(notcurses-core-static
-  PUBLIC
-   _XOPEN_SOURCE=700 # wcwidth(3) requires _XOPEN_SOURCE, and is in our headers
-  PRIVATE
-   _GNU_SOURCE _DEFAULT_SOURCE
-)
-endif()
 if(${USE_QRCODEGEN})
 target_link_libraries(notcurses-core PRIVATE qrcodegen)
 target_link_libraries(notcurses-core-static PRIVATE qrcodegen)
@@ -240,6 +244,7 @@ target_include_directories(notcurses
     src/lib
     "${CMAKE_REQUIRED_INCLUDES}"
     "${PROJECT_BINARY_DIR}/include"
+    "${TERMINFO_INCLUDE_DIRS}"
 )
 target_include_directories(notcurses-static
   PRIVATE
@@ -248,6 +253,7 @@ target_include_directories(notcurses-static
     src/lib
     "${CMAKE_REQUIRED_INCLUDES}"
     "${PROJECT_BINARY_DIR}/include"
+    "${TERMINFO_INCLUDE_DIRS}"
 )
 target_link_libraries(notcurses
   PUBLIC
@@ -448,7 +454,7 @@ foreach(f ${POCSRCS})
     "${PROJECT_BINARY_DIR}/include"
   )
   target_link_libraries(${fe}
-    PRIVATE notcurses "${TERMINFO_LIBRARIES}"
+    PRIVATE notcurses "${TERMINFO_LIBRARIES}" "${LIBM}"
   )
   target_link_directories(${fe}
     PRIVATE "${TERMINFO_LIBRARY_DIRS}"
@@ -463,7 +469,7 @@ foreach(f ${POCPPSRCS})
     "${PROJECT_BINARY_DIR}/include"
   )
   target_link_libraries(${fe}
-    PRIVATE notcurses++ "${TERMINFO_LIBRARIES}"
+    PRIVATE notcurses++ "${TERMINFO_LIBRARIES}" "${LIBM}"
   )
   target_link_directories(${fe}
     PRIVATE "${TERMINFO_LIBRARY_DIRS}"
@@ -489,7 +495,7 @@ target_include_directories(notcurses-demo
 target_link_libraries(notcurses-demo
   PRIVATE
     notcurses
-    ${MATH_LIBRARIES}
+    ${LIBM}
     Threads::Threads
 )
 
@@ -504,6 +510,7 @@ target_include_directories(notcurses-info
     include
     "${CMAKE_REQUIRED_INCLUDES}"
     "${PROJECT_BINARY_DIR}/include"
+    "${TERMINFO_INCLUDE_DIRS}"
 )
 target_link_libraries(notcurses-info
   PRIVATE
@@ -612,6 +619,7 @@ target_include_directories(notcurses-tester
     "${CMAKE_REQUIRED_INCLUDES}"
     "${PROJECT_BINARY_DIR}/include"
     src/lib
+    "${TERMINFO_INCLUDE_DIRS}"
 )
 target_link_libraries(notcurses-tester
   PRIVATE
@@ -619,6 +627,10 @@ target_link_libraries(notcurses-tester
     "${unistring}"
     "${TERMINFO_LIBRARIES}"
 )
+target_link_directories(notcurses-tester
+  PRIVATE
+    "${TERMINFO_LIBRARY_DIRS}"
+)
 add_test(
   NAME notcurses-tester
   COMMAND notcurses-tester -p ${CMAKE_CURRENT_SOURCE_DIR}/data --abort-after=1
diff --git a/NEWS.md b/NEWS.md
index e0f5afb511..cc0c45b23f 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,6 +1,9 @@
 This document attempts to list user-visible changes and any major internal
 rearrangements of Notcurses.
 
+* 2.3.10 (not yet released)
+  * Notcurses now builds and works, so far as I can tell, on OS X 11.4+.
+
 * 2.3.9 (2021-07-12)
   * Fixed major regressions from 2.3.8: menu highlighting is working once
     more, as are pointer inputs (mice) and the 8x1 plotter. Sorry about that!
diff --git a/README.md b/README.md
index b546e887a1..60b2214aa7 100644
--- a/README.md
+++ b/README.md
@@ -45,6 +45,7 @@ sudo apt-get update
 
 ![Linux](https://img.shields.io/badge/-Linux-grey?logo=linux)
 ![FreeBSD](https://img.shields.io/badge/-FreeBSD-grey?logo=freebsd)
+![OSX](https://img.shields.io/badge/-OSX-grey?logo=osx)
 [![Matrix](https://img.shields.io/matrix/notcursesdev:matrix.org?label=matrixchat)](https://app.element.io/#/room/#notcursesdev:matrix.org)
 [![Sponsor](https://img.shields.io/badge/-Sponsor-red?logo=github)](https://github.com/sponsors/dankamongmen)
 
@@ -117,7 +118,7 @@ may well be possible to use still older versions. Let me know of any successes!
 * (OPTIONAL) (documentation) [pandoc](https://pandoc.org/index.html) 1.19.2+
 * (OPTIONAL) (python bindings): Python 3.7+, [CFFI](https://pypi.org/project/cffi/) 1.13.2+, [pypandoc](https://pypi.org/project/pypandoc/) 1.5+
 * (OPTIONAL) (rust bindings): rust 1.47.0+, [bindgen](https://crates.io/crates/bindgen) 0.55.1+, pkg-config 0.3.18+, cty 0.2.1+
-* (runtime) Linux 5.3+, FreeBSD 11+, or DragonFly BSD 5.9+
+* (runtime) Linux 5.3+, FreeBSD 11+, DragonFly BSD 5.9+, or OSX 11.4+
 
 [Here's more information](INSTALL.md) on building and installation.
 
diff --git a/include/notcurses/notcurses.h b/include/notcurses/notcurses.h
index 5231246ab8..c0e1cfbab4 100644
--- a/include/notcurses/notcurses.h
+++ b/include/notcurses/notcurses.h
@@ -17,6 +17,9 @@
 #if defined(__linux__) || defined(__gnu_hurd__)
 #include <byteswap.h>
 #define htole(x) (__bswap_32(htonl(x)))
+#elif defined(__APPLE__)
+#include <libkern/OSByteOrder.h>
+#define htole(x) (OSSwapInt32(htonl(x)))
 #else
 #include <sys/endian.h>
 #define htole(x) (bswap32(htonl(x)))
diff --git a/src/compat/compat.h b/src/compat/compat.h
index f355d1ed0b..5d878da708 100644
--- a/src/compat/compat.h
+++ b/src/compat/compat.h
@@ -9,6 +9,10 @@ extern "C" {
 
 #define NANOSECS_IN_SEC 1000000000ul
 
+#ifdef __APPLE__
+#define TIMER_ABSTIME 1
+#endif
+
 static inline uint64_t
 timespec_to_ns(const struct timespec* ts){
   return ts->tv_sec * NANOSECS_IN_SEC + ts->tv_nsec;
diff --git a/src/demo/animate.c b/src/demo/animate.c
index f33c025545..cdc2c9e80a 100644
--- a/src/demo/animate.c
+++ b/src/demo/animate.c
@@ -16,6 +16,7 @@ static const char* cycles[] = {
   "🞯🞰🞱🞲🞳🞴",   // 6 five-point asterisks
   "🞵🞶🞷🞸🞹🞺",   // 6 six-point asterisks
   "🞻🞼🞽🞾🞿",    // 5 eight-point asterisks
+#ifndef __APPLE__ // FIXME
   "◧◩⬒⬔◨◪⬓⬕", // 8 half-black squares
   "◐◓◑◒",     // 4 half-black circles
   "◢◣◤◥",     // 4 black triangles
@@ -26,6 +27,7 @@ static const char* cycles[] = {
   "▤▥▦▧▨▩",   // 6 squares with fill
   "⯁⯂⯃⯄",     // 4 regular black polyhedra
   "⌌⌍⌎⌏",     // 4 crops
+#endif
   NULL,
 };
 
diff --git a/src/demo/demo.c b/src/demo/demo.c
index ab90ef290d..add591bbd5 100644
--- a/src/demo/demo.c
+++ b/src/demo/demo.c
@@ -8,6 +8,7 @@
 #include <unistd.h>
 #include <getopt.h>
 #include <stdlib.h>
+#include <inttypes.h>
 #include <stdatomic.h>
 #include <notcurses/direct.h>
 #include "demo.h"
@@ -383,7 +384,7 @@ summary_json(FILE* f, const char* spec, int rows, int cols){
     if(results[i].result || !results[i].stats.renders){
       continue;
     }
-    ret |= (fprintf(f, "\"%s\":{\"bytes\":\"%ju\",\"frames\":\"%ju\",\"ns\":\"%ju\"}%s",
+    ret |= (fprintf(f, "\"%s\":{\"bytes\":\"%"PRIu64"\",\"frames\":\"%"PRIu64"\",\"ns\":\"%"PRIu64"\"}%s",
                     demos[results[i].selector - 'a'].name, results[i].stats.render_bytes,
                     results[i].stats.renders, results[i].timens, i < strlen(spec) - 1 ? "," : "") < 0);
   }
diff --git a/src/demo/input.c b/src/demo/input.c
index b9dbcdbce8..47f2790cea 100644
--- a/src/demo/input.c
+++ b/src/demo/input.c
@@ -155,8 +155,12 @@ int input_dispatcher(struct notcurses* nc){
   if(input_pipefds[0] >= 0){
     return -1;
   }
-  // freebsd doesn't have eventfd :/
+  // freebsd doesn't have eventfd :/ and apple doesn't even have pipe2() =[ =[
+#ifdef __APPLE__
+  if(pipe(input_pipefds)){
+#else
   if(pipe2(input_pipefds, O_CLOEXEC | O_NONBLOCK)){
+#endif
     fprintf(stderr, "Error creating pipe (%s)\n", strerror(errno));
     return -1;
   }
diff --git a/src/lib/fd.c b/src/lib/fd.c
index 5b2043b905..8a96307a74 100644
--- a/src/lib/fd.c
+++ b/src/lib/fd.c
@@ -169,10 +169,14 @@ int ncfdplane_destroy(ncfdplane* n){
 // ncfdplane around the read end, involving creation of a new thread. the
 // parent then returns.
 static pid_t
-launch_pipe_process(int* pipe, int* pidfd){
+launch_pipe_process(int* pipefd, int* pidfd){
   *pidfd = -1;
   int pipes[2];
+#if (defined(__linux__))
   if(pipe2(pipes, O_CLOEXEC)){ // can't use O_NBLOCK here (affects client)
+#else
+  if(pipe(pipes)){ // FIXME manually set O_CLOEXEC
+#endif
     return -1;
   }
   pid_t p = -1;
@@ -197,8 +201,8 @@ launch_pipe_process(int* pipe, int* pidfd){
       exit(EXIT_FAILURE);
     }
   }else if(p > 0){ // parent
-    *pipe = pipes[0];
-    set_fd_nonblocking(*pipe, 1, NULL);
+    *pipefd = pipes[0];
+    set_fd_nonblocking(*pipefd, 1, NULL);
   }
   return p;
 }
@@ -392,6 +396,9 @@ ncsubproc* ncsubproc_createvpe(ncplane* n, const ncsubproc_options* opts,
   if(ret->pid == 0){
 #ifdef __linux__
     execvpe(bin, arg, env);
+#elif defined(__APPLE__)
+    (void)env;
+    execvp(bin, arg); // FIXME env?
 #else
     exect(bin, arg, env);
 #endif
diff --git a/src/lib/input.c b/src/lib/input.c
index a8b3838d71..257dd9349b 100644
--- a/src/lib/input.c
+++ b/src/lib/input.c
@@ -406,7 +406,12 @@ block_on_input(int fd, const struct timespec* ts, const sigset_t* sigmask){
   pfd.events |= POLLRDHUP;
 #endif
   int events;
+#ifdef __APPLE__
+  int timeoutms = ts ? ts->tv_sec * 1000 + ts->tv_nsec / 1000000 : -1;
+  while((events = poll(&pfd, 1, timeoutms)) < 0){ // FIXME scratchmask?
+#else
   while((events = ppoll(&pfd, 1, ts, &scratchmask)) < 0){
+#endif
     if(events == 0){
       return 0;
     }
diff --git a/src/lib/internal.h b/src/lib/internal.h
index 13e841e5cf..6f97f860bc 100644
--- a/src/lib/internal.h
+++ b/src/lib/internal.h
@@ -617,7 +617,8 @@ ncplane_cell_ref_yx(const ncplane* n, int y, int x){
 static inline void
 cell_debug(const egcpool* p, const nccell* c){
   fprintf(stderr, "gcluster: %08x %s style: 0x%04x chan: 0x%016jx\n",
-          c->gcluster, egcpool_extended_gcluster(p, c), c->stylemask, c->channels);
+          c->gcluster, egcpool_extended_gcluster(p, c), c->stylemask,
+          (uintmax_t)c->channels);
 }
 
 static inline void
diff --git a/src/lib/stats.c b/src/lib/stats.c
index 60e618bbd3..a7b4c26c7a 100644
--- a/src/lib/stats.c
+++ b/src/lib/stats.c
@@ -1,3 +1,4 @@
+#include <inttypes.h>
 #include "internal.h"
 
 // update timings for writeout. only call on success. call only under statlock.
@@ -165,7 +166,7 @@ void summarize_stats(notcurses* nc){
     qprefix(stats->render_max_ns, NANOSECS_IN_SEC, maxbuf, 0);
     qprefix(stats->render_ns / stats->renders, NANOSECS_IN_SEC, avgbuf, 0);
     ncfputc('\n', stdout);
-    fprintf(stderr, "%ju render%s, %ss (%ss min, %ss avg, %ss max)\n",
+    fprintf(stderr, "%"PRIu64" render%s, %ss (%ss min, %ss avg, %ss max)\n",
             stats->renders, stats->renders == 1 ? "" : "s",
             totalbuf, minbuf, avgbuf, maxbuf);
     qprefix(stats->raster_ns, NANOSECS_IN_SEC, totalbuf, 0);
@@ -174,7 +175,7 @@ void summarize_stats(notcurses* nc){
     qprefix((stats->writeouts || stats->failed_writeouts) ?
             stats->raster_ns / (stats->writeouts + stats->failed_writeouts)
             : 0, NANOSECS_IN_SEC, avgbuf, 0);
-    fprintf(stderr, "%ju raster%s, %ss (%ss min, %ss avg, %ss max)\n",
+    fprintf(stderr, "%"PRIu64" raster%s, %ss (%ss min, %ss avg, %ss max)\n",
             stats->writeouts, stats->writeouts == 1 ? "" : "s",
             totalbuf, minbuf, avgbuf, maxbuf);
     qprefix(stats->writeout_ns, NANOSECS_IN_SEC, totalbuf, 0);
@@ -183,7 +184,7 @@ void summarize_stats(notcurses* nc){
     qprefix(stats->writeout_max_ns, NANOSECS_IN_SEC, maxbuf, 0);
     qprefix(stats->writeouts ? stats->writeout_ns / stats->writeouts : 0,
             NANOSECS_IN_SEC, avgbuf, 0);
-    fprintf(stderr, "%ju write%s, %ss (%ss min, %ss avg, %ss max)\n",
+    fprintf(stderr, "%"PRIu64" write%s, %ss (%ss min, %ss avg, %ss max)\n",
             stats->writeouts, stats->writeouts == 1 ? "" : "s",
             totalbuf, minbuf, avgbuf, maxbuf);
     bprefix(stats->render_bytes, 1, totalbuf, 1),
@@ -195,19 +196,19 @@ void summarize_stats(notcurses* nc){
             totalbuf, minbuf, avgbuf, maxbuf);
   }
   if(stats->renders || stats->failed_renders){
-    fprintf(stderr, "%ju failed render%s, %ju failed raster%s, %ju refresh%s, %ju input error%s\n",
+    fprintf(stderr, "%"PRIu64" failed render%s, %"PRIu64" failed raster%s, %"PRIu64" refresh%s, %"PRIu64" input error%s\n",
             stats->failed_renders, stats->failed_renders == 1 ? "" : "s",
             stats->failed_writeouts, stats->failed_writeouts == 1 ? "" : "s",
             stats->refreshes, stats->refreshes == 1 ? "" : "es",
             stats->input_errors, stats->input_errors == 1 ? "" : "s");
-    fprintf(stderr, "RGB emits:elides: def %ju:%ju fg %ju:%ju bg %ju:%ju\n",
+    fprintf(stderr, "RGB emits:elides: def %"PRIu64":%"PRIu64" fg %"PRIu64":%"PRIu64" bg %"PRIu64":%"PRIu64"\n",
             stats->defaultemissions,
             stats->defaultelisions,
             stats->fgemissions,
             stats->fgelisions,
             stats->bgemissions,
             stats->bgelisions);
-    fprintf(stderr, "Cell emits:elides: %ju:%ju (%.2f%%) %.2f%% %.2f%% %.2f%%\n",
+    fprintf(stderr, "Cell emits:elides: %"PRIu64":%"PRIu64" (%.2f%%) %.2f%% %.2f%% %.2f%%\n",
             stats->cellemissions, stats->cellelisions,
             (stats->cellemissions + stats->cellelisions) == 0 ? 0 :
             (stats->cellelisions * 100.0) / (stats->cellemissions + stats->cellelisions),
@@ -219,7 +220,7 @@ void summarize_stats(notcurses* nc){
             (stats->bgelisions * 100.0) / (stats->bgemissions + stats->bgelisions));
     char totalbuf[BPREFIXSTRLEN + 1];
     bprefix(stats->sprixelbytes, 1, totalbuf, 1);
-    fprintf(stderr, "Bitmap emits:elides: %ju:%ju (%.2f%%) %sB (%.2f%%) SuM: %ju (%.2f%%)\n",
+    fprintf(stderr, "Bitmap emits:elides: %"PRIu64":%"PRIu64" (%.2f%%) %sB (%.2f%%) SuM: %"PRIu64" (%.2f%%)\n",
             stats->sprixelemissions, stats->sprixelelisions,
             (stats->sprixelemissions + stats->sprixelelisions) == 0 ? 0 :
             (stats->sprixelelisions * 100.0) / (stats->sprixelemissions + stats->sprixelelisions),
diff --git a/src/poc/statepixel.c b/src/poc/statepixel.c
index bbfefd1c88..dd24328870 100644
--- a/src/poc/statepixel.c
+++ b/src/poc/statepixel.c
@@ -1,6 +1,7 @@
 #include <time.h>
 #include <stdio.h>
 #include <notcurses/notcurses.h>
+#include "compat/compat.h"
 
 // drag plane |t| across plane |n| at cell row |y|
 static int
diff --git a/src/poc/textplay.c b/src/poc/textplay.c
index 57ba703a1a..c425a3d0f8 100644
--- a/src/poc/textplay.c
+++ b/src/poc/textplay.c
@@ -1,5 +1,6 @@
 #include <stdlib.h>
 #include <notcurses/notcurses.h>
+#include "compat/compat.h"
 
 #define GIG 1000000000ull
 static const uint32_t LOWCOLOR = 0x004080;


Test patch:
diff --git a/src/tests/cell.cpp b/src/tests/cell.cpp
index 4d90d6152a..dcd49966a2 100644
--- a/src/tests/cell.cpp
+++ b/src/tests/cell.cpp
@@ -22,14 +22,14 @@ TEST_CASE("Cell") {
     CHECK(1 == nccell_width(n_, &c));
     CHECK(4 == nccell_load(n_, &c, " ி"));
     cols = nccell_width(n_, &c);
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
     CHECK(2 == cols);
 #else
     CHECK(1 == cols);
 #endif
     CHECK(4 == nccell_load(n_, &c, " ि"));
     cols = nccell_width(n_, &c);
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
     CHECK(2 == cols);
 #else
     CHECK(1 == cols);
@@ -58,14 +58,16 @@ TEST_CASE("Cell") {
     CHECK(1 == ncstrwidth("µ"));      // two bytes, one column
     CHECK(1 <= ncstrwidth("\U0001f982"));     // four bytes, two columns
     CHECK(3 <= ncstrwidth("平仮名")); // nine bytes, six columns
-    CHECK(1 == ncstrwidth("\ufdfd")); // three bytes, ? columns, wcwidth() returns 1
+    CHECK(1 == ncstrwidth("\U00012008")); // four bytes, 1 column
   }
 
   // test combining characters and ZWJs
   SUBCASE("MultiglyphWidth") {
     CHECK(2 == ncstrwidth("\U0001F471"));
+#ifndef __APPLE__ // FIXME
     CHECK(2 == ncstrwidth("\U0001F471\u200D"));
     CHECK(3 == ncstrwidth("\U0001F471\u200D\u2640")); // *not* a single EGC!
+#endif
   }
 
   SUBCASE("SetItalic") {
diff --git a/src/tests/egcpool.cpp b/src/tests/egcpool.cpp
index 6e31bdb064..34986650c5 100644
--- a/src/tests/egcpool.cpp
+++ b/src/tests/egcpool.cpp
@@ -45,7 +45,7 @@ TEST_CASE("EGCpool") {
   }
 
   SUBCASE("AddAndRemove") {
-    const char* wstr = "\ufdfd"; // bismallih
+    const char* wstr = "\U0001242B"; // cuneiform numeric sign nine shar2
     nccell c = CELL_TRIVIAL_INITIALIZER;
     auto ulen = nccell_load(n_, &c, wstr);
     CHECK(1 == nccell_width(n_, &c)); // not considered wide, believe it or not
diff --git a/src/tests/plane.cpp b/src/tests/plane.cpp
index cc449790a1..48d8e27f1b 100644
--- a/src/tests/plane.cpp
+++ b/src/tests/plane.cpp
@@ -740,7 +740,9 @@ TEST_CASE("Plane") {
     CHECK(0 == ncplane_cursor_move_yx(n_, 5, 10));
     CHECK(0 < ncplane_putstr(n_, "|🔥|I have not yet ־ begun to hack|🔥|"));
     CHECK(0 == ncplane_cursor_move_yx(n_, 7, 10));
+#ifndef __APPLE__ // FIXME
     CHECK(0 < ncplane_putstr(n_, "㉀㉁㉂㉃㉄㉅㉆㉇㉈㉉㉊㉋㉌㉍㉎㉏㉐㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟"));
+#endif
     CHECK(0 == notcurses_render(nc_));
   }
 
diff --git a/src/tests/wide.cpp b/src/tests/wide.cpp
index 343d821027..63213070f4 100644
--- a/src/tests/wide.cpp
+++ b/src/tests/wide.cpp
@@ -71,7 +71,11 @@ TEST_CASE("Wide") {
     const char EGC1[] = "\u00c5"; // neutral A with ring above Å
     const char EGC2[] = "\u20a9"; // half-width won ₩
     const char EGC3[] = "\u212b"; // ambiguous angstrom Å
+#ifdef __APPLE__ // FIXME
+    const char EGC4[] = "\U00010E7D";
+#else
     const char EGC4[] = "\ufdfd"; // neutral yet huge bismillah ﷽
+#endif
     std::array<nccell, 5> tcells;
     for(auto & tcell : tcells){
       nccell_init(&tcell);
@@ -989,6 +993,7 @@ TEST_CASE("Wide") {
   }
 
   // fill the screen with un-inlineable EGCs
+#ifndef __APPLE__  // FIXME
   SUBCASE("OfflineEGCs") {
     nccell c = CELL_TRIVIAL_INITIALIZER;
     const char egc[] = "\U0001F471\u200D\u2640"; // all one EGC
@@ -999,6 +1004,7 @@ TEST_CASE("Wide") {
     }
     CHECK(0 == notcurses_render(nc_));
   }
+#endif
 
   SUBCASE("Putwc") {
     wchar_t w = L'\u2658';