# SPDX-License-Identifier: Apache-2.0 # 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 is the entire reason it was chosen over nano: nano is GPLv3 and # wants ncurses at runtime, and GPLv3 cannot be combined with Apache-2.0 any # more than GPLv2 can. See ../../docs/licensing.md. # # 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)