# SPDX-License-Identifier: GPL-2.0-or-later
# kilo — BSD-2-Clause: https://github.com/antirez/kilo
#
# SchOS's text editor, installed as sysroot/bin/kilo with `edit` beside it.
#
# It is here because the alternative every small system reaches for is vi, and
# vi is a program you have to be taught before you can use it to fix the file
# that is stopping the machine booting. kilo is the other kind: the arrow keys
# move the cursor, typing inserts, Ctrl-S saves, Ctrl-Q quits, Ctrl-F finds,
# and the bottom line says so while you work. Nobody has to be told any of it.
#
# The whole editor is one 1,300-line C file with no dependencies beyond libc --
# termios and TIOCGWINSZ, both of which SchOS already has because zsh needs
# them. That, and licensing at the time, is why it was chosen over nano: nano
# is GPLv3 and wants ncurses at runtime, and SchOS was then Apache-2.0. Under
# GPL-2.0-or-later nano is possible, but kilo already does the job.
#
# What it does not do: no undo, no multiple buffers, no configuration, no
# mouse, no UTF-8 beyond passing bytes through. It edits one file.

include ../mk/port.mk

# Pinned to a commit rather than a release, because kilo has never had one --
# it was written as the worked example for a tutorial and has been finished
# ever since. A commit is at least an exact thing to name.
#
# The checksum is of GitHub's generated archive. Those are reproducible for a
# given commit, but they are generated rather than uploaded, so if this ever
# fails to verify check that upstream still has the commit before assuming the
# tarball was tampered with.
KILO_COMMIT  := 323d93b29bd89a2cb446de90c4ed4fea1764176e
KILO_URL     := https://github.com/antirez/kilo/archive/$(KILO_COMMIT).tar.gz
KILO_SHA256  := 79e62c23fdf369fa0cbbeaab9fd8ae2848dcc0156faf6efc89ea274528b39723

TARBALL := $(DISTDIR)/kilo-$(KILO_COMMIT).tar.gz

CFLAGS  := -static -Os -D__SCHOS__ -I$(MUSL)/include $(CFLAGS_BT) \
           -D_BSD_SOURCE -std=c99 -Wall
LDFLAGS := -static -L$(MUSL)/lib -lc

$(TARBALL): | $(DISTDIR)
	curl -fsSL -o $@ $(KILO_URL)
	sh $(SHA256CHECK) "$(KILO_SHA256)" "$@"

download: $(TARBALL)

$(SRCDIR): $(TARBALL)
	mkdir -p $(PORTDIR)
	rm -rf $(PORTDIR)/kilo-$(KILO_COMMIT)
	tar -xzf $< -C $(PORTDIR)
	mv $(PORTDIR)/kilo-$(KILO_COMMIT) $@

# One file, so its own Makefile is not worth invoking -- it hardcodes flags
# that assume a hosted glibc and would link against the build host's libc.
$(BUILDDIR)/kilo: | $(SRCDIR)
	mkdir -p $(BUILDDIR)
	$(CC) $(CFLAGS) -o $@ $(SRCDIR)/kilo.c $(LDFLAGS)

build: $(BUILDDIR)/kilo

# `edit` as well as `kilo`.
#
# Two real copies rather than a link, for the reason ports/toybox/Makefile
# gives at length: mkschfs deduplicates by content, so the image holds one copy
# with two names either way, and this needs nothing from the host filesystem.
#
# The second name is not decoration. Somebody who has just arrived at a SchOS
# prompt with a file to fix will type `edit`; they will not guess `kilo`.
$(PORTDIR)/.installed: $(BUILDDIR)/kilo | $(SYSROOT)/bin
	cp $(BUILDDIR)/kilo $(SYSROOT)/bin/kilo
	cp $(BUILDDIR)/kilo $(SYSROOT)/bin/edit
	chmod 755 $(SYSROOT)/bin/kilo $(SYSROOT)/bin/edit
	@mkdir -p $(SYSROOT)/usr/share/licenses/kilo
	cp $(SRCDIR)/LICENSE $(SYSROOT)/usr/share/licenses/kilo/LICENSE
	@touch $@
	@echo "kilo: installed as /bin/kilo and /bin/edit"

install: $(PORTDIR)/.installed

clean:
	rm -rf $(BUILDDIR) $(PORTDIR)/.installed

distclean: clean
	rm -rf $(PORTDIR)
