Notcurses-Native.git | scripts/ci/ | build-ncurses.sh edit


#!/usr/bin/env bash
# Build + install ncurses for the macOS x86_64 prebuilt lane.
# macOS ships ncurses 5.7 in /usr/lib (very old — predates notcurses'
# terminfo extension usage). Homebrew x86_64 ncurses bottles target
# macOS 14+ which fails our 10.15 deployment-target floor, so we
# source-build with MACOSX_DEPLOYMENT_TARGET=10.15 in env.
#
# Currently macOS-only. Linux manylinux_2_28 has ncurses-devel in dnf
# (the build-linux-glibc.sh path installs that directly).
#
# Configuration choices:
#   * --with-shared / --without-static — bundleable .dylibs.
#   * --enable-widec — wide-char ncurses (libncursesw), required by
#     notcurses for Unicode handling.
#   * --enable-pc-files + --with-pkg-config-libdir=$PREFIX/lib/pkgconfig
#     so cmake's pkg_search_module finds it.
#   * --with-default-terminfo-dir=/usr/share/terminfo so the shipped
#     dylib falls back to the user's system terminfo database at
#     runtime (every Intel Mac has /usr/share/terminfo populated by
#     macOS itself). We could ship our own terminfo dir but it's
#     ~5 MB of mostly-redundant data.
#   * --without-debug / --without-tests / --without-tack — strip
#     non-essential build outputs.
set -euxo pipefail

VERSION='6.5'
# ftpmirror.gnu.org redirects to a random mirror and intermittently
# 502s; retry it, then fall back to the canonical (slower) host.
URL="https://ftpmirror.gnu.org/ncurses/ncurses-${VERSION}.tar.gz"
FALLBACK_URL="https://ftp.gnu.org/gnu/ncurses/ncurses-${VERSION}.tar.gz"
PREFIX="${PREFIX:-/usr/local}"
mkdir -p "$PREFIX"

JOBS="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)"

cd /tmp
curl -fSL --retry 5 --retry-delay 10 -o ncurses.tar.gz "$URL" \
    || curl -fSL --retry 5 --retry-delay 10 -o ncurses.tar.gz "$FALLBACK_URL"
tar -xzf ncurses.tar.gz
cd "ncurses-${VERSION}"

./configure \
    --prefix="$PREFIX" \
    --with-shared \
    --without-debug \
    --without-tests \
    --without-tack \
    --without-manpages \
    --enable-widec \
    --enable-pc-files \
    --with-pkg-config-libdir="$PREFIX/lib/pkgconfig" \
    --with-default-terminfo-dir=/usr/share/terminfo \
    --without-progs \
    --without-cxx-binding \
    --without-ada

make -j"$JOBS"

# Install ONLY the libs + headers + pkg-config files. Skip
# `make install`'s default `install.data` target — that runs `tic`
# to populate $ticdir with terminfo entries, and on macOS that
# resolves to `/usr/share/terminfo` (per the configure flag above),
# which is SIP-protected and cannot be written to even by root.
# We don't need our own terminfo data anyway: every macOS install
# ships `/usr/share/terminfo` already-populated by Apple, and our
# bundled libncursesw.dylib reads from there at runtime via the
# baked-in --with-default-terminfo-dir path.
make install.libs install.includes

PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig:${PKG_CONFIG_PATH:-}" \
    pkg-config --modversion ncursesw

cd /
rm -rf "/tmp/ncurses-${VERSION}" /tmp/ncurses.tar.gz