#
#  Makefile for tapview
#
# Copyright (c) 2026 Large Scale Systems Museum
# By Dave McGuire <mcguire@lssmuseum.org>
#

PREFIX   = /usr/local

# Optional libraries for viewing compressed blocks in HET (.het) images.
# Both are on by default; set either to "no" to build without it (blocks
# using that compression are then shown still compressed), e.g.
#     make clean; make WITH_BZIP2=no
WITH_ZLIB  = yes
WITH_BZIP2 = yes

CC       = cc
CFLAGS   = -O2 -Wall -Wextra -Wpedantic
CPPFLAGS =
LDLIBS   = -lncurses -lm
PROGNAME = tapview
SRCDIR   = src
DOCDIR   = docs
FMTS     = tap aws raw
OBJS     = $(SRCDIR)/tapview.o $(SRCDIR)/tape.o $(SRCDIR)/ui.o \
           $(SRCDIR)/screen.o $(FMTS:%=$(SRCDIR)/fmt_%.o)
SRCS     = $(OBJS:.o=.c)
HDRS     = $(SRCDIR)/tape.h $(SRCDIR)/tapefmt.h $(SRCDIR)/ui.h \
           $(SRCDIR)/screen.h $(SRCDIR)/xlate.h $(SRCDIR)/version.h
MANPAGE  = $(DOCDIR)/$(PROGNAME).1
MANTMPL  = $(MANPAGE).in
DOCS     = $(DOCDIR)/LICENSE.md $(DOCDIR)/USAGE.md $(DOCDIR)/CHANGELOG.txt \
           $(MANTMPL)
VERSION  = $(shell sed -n 's/.*VERSION[ \t]*"\(.*\)".*/\1/p' $(SRCDIR)/version.h)
DISTDIR  = $(PROGNAME)-$(VERSION)

ifeq ($(WITH_ZLIB),yes)
CPPFLAGS += -DHAVE_ZLIB
LDLIBS   += -lz
endif

ifeq ($(WITH_BZIP2),yes)
CPPFLAGS += -DHAVE_BZIP2
LDLIBS   += -lbz2
endif

.PHONY: all clean install dist clangd test

all: $(PROGNAME) $(MANPAGE)

$(PROGNAME): $(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDLIBS)

$(SRCDIR)/%.o: $(SRCDIR)/%.c $(HDRS)
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

# Automated tests of the tape image formats.  They build all their images
# at run time, so no tape image files are involved.  For a memory check:
#     make clean; make test CFLAGS="-g -fsanitize=address,undefined"
TESTDIR  = tests
TESTSRCS = $(TESTDIR)/test_formats.c $(filter-out $(SRCDIR)/tapview.c \
           $(SRCDIR)/ui.c $(SRCDIR)/screen.c,$(SRCS))

test: $(TESTDIR)/test_formats
	$(TESTDIR)/test_formats

$(TESTDIR)/test_formats: $(TESTSRCS) $(HDRS)
	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $(TESTSRCS) $(LDLIBS)

# The man page is generated from its template; the version comes from
# version.h.
$(MANPAGE): $(MANTMPL) $(SRCDIR)/version.h
	sed 's/@VERSION@/$(VERSION)/g' $(MANTMPL) > $@.tmp
	mv $@.tmp $@

install: $(PROGNAME) $(MANPAGE) $(MANPAGE)
	install -d $(PREFIX)/bin
	install -m 755 $(PROGNAME) $(PREFIX)/bin
	install -d $(PREFIX)/share/man/man1
	install -m 644 $(MANPAGE) $(PREFIX)/share/man/man1

clangd:
	bear -- make

dist:
	@rm -rf $(DISTDIR)
	@rm -f $(DISTDIR).tar.bz2
	@mkdir $(DISTDIR) $(DISTDIR)/$(SRCDIR) $(DISTDIR)/$(DOCDIR) \
	       $(DISTDIR)/$(TESTDIR)
	@cp Makefile README.md $(DISTDIR)
	@cp $(SRCS) $(HDRS) $(DISTDIR)/$(SRCDIR)
	@cp $(TESTDIR)/test_formats.c $(DISTDIR)/$(TESTDIR)
	@cp $(DOCS) $(DISTDIR)/$(DOCDIR)
	@tar -cjf $(DISTDIR).tar.bz2 $(DISTDIR)
	@rm -rf $(DISTDIR)
	@echo Distribution file $(DISTDIR).tar.bz2 created.

clean:
	@echo Cleaning
	rm -f $(PROGNAME) $(OBJS) $(TESTDIR)/test_formats $(MANPAGE) $(MANPAGE).tmp *~ $(SRCDIR)/*~ $(DISTDIR).tar.bz2
