#
#  Makefile - v620asm, a cross-assembler for the Varian 620/L
#
# Copyright (c) 2026 Large Scale Systems Museum
# By Dave McGuire <mcguire@lssmuseum.org>
#
#
# Targets:
#   all (default)  build the assembler, src/v620asm, and its man page,
#                  docs/v620asm.1 (from docs/v620asm.1.in, with the version
#                  number filled in from src/version.h)
#   test           build, then run the test suite in tests/
#   install        install the assembler into $(PREFIX)/bin, its man page
#                  into $(PREFIX)/share/man/man1, and its manual and
#                  license into $(PREFIX)/share/doc/<progname>; PREFIX
#                  defaults to /usr/local, and DESTDIR is honored
#   clangd         build under bear to generate compile_commands.json
#   dist           create <progname>-<version>.tar.bz2
#   clean          remove everything the other targets build
#

CC = cc
CFLAGS = -Wall -Wextra -std=c99 -O2 -D_POSIX_C_SOURCE=200809L
LDFLAGS =
LDLIBS = -lm
PYTHON = python3
INSTALL = install

PREFIX = /usr/local
BINDIR = $(PREFIX)/bin
MANDIR = $(PREFIX)/share/man/man1
DOCINSTDIR = $(PREFIX)/share/doc/$(PROGNAME)

SRCDIR = src
TESTDIR = tests
DOCDIR = docs
EXDIR = examples

PROGNAME := $(shell sed -n 's/.*PROGNAME[ \t]*"\(.*\)".*/\1/p' $(SRCDIR)/version.h)
VERSION  := $(shell sed -n 's/.*VERSION[ \t]*"\(.*\)".*/\1/p' $(SRCDIR)/version.h)
DISTDIR  = $(PROGNAME)-$(VERSION)

PROG = $(SRCDIR)/v620asm
SRCS = $(SRCDIR)/main.c $(SRCDIR)/source.c $(SRCDIR)/expr.c \
       $(SRCDIR)/symtab.c $(SRCDIR)/opcodes.c $(SRCDIR)/assemble.c \
       $(SRCDIR)/output.c
HDRS = $(SRCDIR)/v620asm.h $(SRCDIR)/version.h
OBJS = $(SRCS:.c=.o)
MANPAGE = $(DOCDIR)/$(PROGNAME).1

DOCS = README.md
DOC_FILES = $(DOCDIR)/MANUAL.md $(DOCDIR)/GETTING-STARTED.md $(DOCDIR)/LICENSE.md
EXAMPLE_FILES = $(EXDIR)/README.md $(EXDIR)/add_two.das $(EXDIR)/sum_table.das \
                $(EXDIR)/squares.das $(EXDIR)/teletype_hello.das \
                $(EXDIR)/teletype_echo.das
TEST_FILES = $(TESTDIR)/README.md $(TESTDIR)/test_v620asm.py $(TESTDIR)/bld2.das \
             $(TESTDIR)/bld2.oct $(TESTDIR)/instructions.das
MAINTAIN = mainii prelim inspt1 inspt2 mempt1 mempt2 tytest pwrfai pimtst \
           rtctst mttest
MAINTAIN_FILES = $(MAINTAIN:%=$(TESTDIR)/maintain2/%.das) \
                 $(MAINTAIN:%=$(TESTDIR)/maintain2/%.oct) \
                 $(MAINTAIN:%=$(TESTDIR)/maintain2/%.sym)
EDITORDIR = editor_support

all: $(PROG) $(MANPAGE)

$(PROG): $(OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

$(MANPAGE): $(MANPAGE).in $(SRCDIR)/version.h
	sed 's/@VERSION@/$(VERSION)/g' $(MANPAGE).in > $@

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

$(OBJS): $(HDRS)

test: all
	cd $(TESTDIR) && $(PYTHON) -m unittest discover -s . -p "test_*.py" -v

install: all
	$(INSTALL) -d $(DESTDIR)$(BINDIR) $(DESTDIR)$(MANDIR) $(DESTDIR)$(DOCINSTDIR)
	$(INSTALL) -m 755 $(PROG) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 644 $(MANPAGE) $(DESTDIR)$(MANDIR)
	$(INSTALL) -m 644 $(DOC_FILES) $(DESTDIR)$(DOCINSTDIR)

clangd:
	bear -- make

dist:
	@rm -rf $(DISTDIR)
	@rm -f $(DISTDIR).tar.bz2
	@mkdir -p $(DISTDIR)/$(SRCDIR) $(DISTDIR)/$(TESTDIR)/maintain2 \
		$(DISTDIR)/$(DOCDIR) $(DISTDIR)/$(EXDIR) \
		$(DISTDIR)/$(EDITORDIR)/emacs $(DISTDIR)/$(EDITORDIR)/kate \
		$(DISTDIR)/$(EDITORDIR)/vim/ftdetect \
		$(DISTDIR)/$(EDITORDIR)/vim/ftplugin \
		$(DISTDIR)/$(EDITORDIR)/vim/syntax
	@cp Makefile $(DOCS) $(DISTDIR)
	@cp $(SRCS) $(HDRS) $(DISTDIR)/$(SRCDIR)
	@cp $(TEST_FILES) $(DISTDIR)/$(TESTDIR)
	@cp $(MAINTAIN_FILES) $(DISTDIR)/$(TESTDIR)/maintain2
	@if [ -n "$(EXAMPLE_FILES)" ]; then cp $(EXAMPLE_FILES) $(DISTDIR)/$(EXDIR); fi
	@cp $(DOC_FILES) $(MANPAGE).in $(DISTDIR)/$(DOCDIR)
	@cp $(EDITORDIR)/README.md $(DISTDIR)/$(EDITORDIR)
	@cp $(EDITORDIR)/emacs/v620asm-mode.el $(DISTDIR)/$(EDITORDIR)/emacs
	@cp $(EDITORDIR)/kate/v620asm.xml $(DISTDIR)/$(EDITORDIR)/kate
	@cp $(EDITORDIR)/vim/ftdetect/v620asm.vim $(DISTDIR)/$(EDITORDIR)/vim/ftdetect
	@cp $(EDITORDIR)/vim/ftplugin/v620asm.vim $(DISTDIR)/$(EDITORDIR)/vim/ftplugin
	@cp $(EDITORDIR)/vim/syntax/v620asm.vim $(DISTDIR)/$(EDITORDIR)/vim/syntax
	@tar -cjf $(DISTDIR).tar.bz2 $(DISTDIR)
	@rm -rf $(DISTDIR)
	@echo Distribution file $(DISTDIR).tar.bz2 created.

clean:
	rm -f $(PROG) $(OBJS) $(MANPAGE)
	rm -rf $(TESTDIR)/__pycache__

.PHONY: all test install clangd dist clean
