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

CC = cc
CFLAGS = -std=c99 -Wall -Wextra -Wpedantic -O2
SRC = src/opcodes.c src/symtab.c src/lexer.c src/eval.c src/macro.c \
      src/assemble.c src/listing.c src/wordmap.c src/tapewrite.c \
      src/hexwrite.c src/main.c
OBJ = $(SRC:.c=.o)
HDRS = $(wildcard src/*.h)
PROGNAME = p50asm
MANPAGE  = docs/$(PROGNAME).1
DOCS     = $(PROGNAME).1.in GETTING-STARTED.md LICENSE.md TAPE-FORMAT.md
DOCS    += UNRESOLVED.md
TESTS    = tests/README.md $(wildcard tests/run*.sh tests/*.p50 tests/*.expected)
EXAMPLES = $(wildcard examples/*.p50)
EDITORS  = editor_support/README.md editor_support/emacs/p50asm-mode.el \
	   editor_support/kate/p50asm.xml \
	   editor_support/vim/ftdetect/p50asm.vim \
	   editor_support/vim/ftplugin/p50asm.vim \
	   editor_support/vim/syntax/p50asm.vim
DISTFILES = README.md Makefile $(SRC) $(HDRS) $(addprefix docs/,$(DOCS)) \
	    $(TESTS) $(EXAMPLES) $(EDITORS)
VERSION  = $(shell sed -n 's/.*VERSION[ \t]*"\(.*\)".*/\1/p' src/version.h)
DISTDIR  = $(PROGNAME)-$(VERSION)

PREFIX = /usr/local
BINDIR = $(PREFIX)/bin
MANDIR = $(PREFIX)/share/man/man1
INSTALL = install

.PHONY: all clean test dist install

all: $(PROGNAME) $(MANPAGE)

$(PROGNAME): $(OBJ)
	$(CC) $(CFLAGS) -o $(PROGNAME) $(OBJ)

$(MANPAGE): docs/$(PROGNAME).1.in src/version.h
	sed 's/@VERSION@/$(VERSION)/g' docs/$(PROGNAME).1.in > $@

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

test: $(PROGNAME)
	for t in tests/run*.sh; do \
		echo "=== $$t ==="; \
		"$$t" || exit 1; \
	done

dist:
	@rm -rf $(DISTDIR)
	@rm -f $(DISTDIR).tar.bz2
	@mkdir $(DISTDIR)
	@for f in $(DISTFILES); do \
		mkdir -p $(DISTDIR)/`dirname $$f` && \
		cp -p $$f $(DISTDIR)/$$f || exit 1; \
	done
	@tar -cjf $(DISTDIR).tar.bz2 $(DISTDIR)
	@rm -rf $(DISTDIR)
	@echo Distribution file $(DISTDIR).tar.bz2 created.

install: $(PROGNAME) $(MANPAGE)
	$(INSTALL) -d $(BINDIR)
	$(INSTALL) -d $(MANDIR)
	$(INSTALL) -m 755 $(PROGNAME) $(BINDIR)/$(PROGNAME)
	$(INSTALL) -m 644 $(MANPAGE) $(MANDIR)/$(PROGNAME).1

clean:
	rm -f $(PROGNAME) $(MANPAGE) $(OBJ) *.p50tap *.hex *.lst
