TARGET =

ifeq ($(TARGET),)
	TARGET = $(shell uname -s)
endif

### Platforms
ifeq ($(TARGET),Linux)
	IS_UNIX = 1
endif

ifeq ($(TARGET),NetBSD)
	IS_UNIX = 1
endif

ifeq ($(TARGET),Windows)
	IS_MINGW = 1
	IS_UNIX = 1
endif

ifeq ($(TARGET),Watcom)
	IS_WATCOM = 1
	IS_WINDOWS = 1
endif

### Stuff
ifeq ($(IS_UNIX),1)
	CC = gcc
	CFLAGS = -c
	LDFLAGS =
	LIBS = -lm

	EXE =
endif

ifeq ($(IS_WINDOWS),1)
	EXE = .exe
endif

ifeq ($(IS_WATCOM),1)
	CC = owcc
	CFLAGS = -c
	LDFLAGS =
	LIBS =

	ifeq ($(IS_WINDOWS),1)
		CC += -bnt
	endif
endif

ifeq ($(IS_MINGW),1)
	CC = gcc
	CFLAGS = -c
	LDFLAGS =
	LIBS =
endif

ifeq ($(IS_MUSL_CROSS),1)
	CC = musl-gcc
endif

### Common flags
CFLAGS += -Iexternal/duktape -Iexternal/stb

### Rules
OBJS = src/main.o src/js.o src/js_console.o src/js_process.o src/js_fs.o
OBJS += external/duktape/duktape.o external/stb/stb_ds.o

NAME = rev | cut -d/ -f1 | rev | cut -d. -f1

.PHONY: all clean mk format maint
.SUFFIXES: .c .o

all: pmake$(EXE)

include mk/js.mk

mk/js.mk:
	find src/compiler src/system src/js -name "*.js" | while read js; do \
		name="`echo $$js | cut -d/ -f2`_`echo $$js | $(NAME)`" ; \
		c="`echo $$js | sed 's/\.js$$/.c/'`" ; \
		o="`echo $$js | sed 's/\.js$$/.o/'`" ; \
		echo "OBJS += $$o" ; \
		echo "$$c: $$js" ; \
		echo "	xxd -n$$name -i $$js > $$c" ; \
		echo "" ; \
	done > $@

mk: mk/js.mk

format:
	clang-format --verbose -i `find pmake.js external src "(" -name "*.c" -or -name "*.h" -or -name "*.js" ")" -and -not -name "duk*" -and -not -name "stb_*.h"`

maint:
	rm -f mk/*.mk
	$(MAKE) mk
	rm -f src/config.h
	$(MAKE) src/config.h

src/config.h:
	echo "#ifndef __CONFIG_H__" > $@
	echo "#define __CONFIG_H__" >> $@
	echo "" >> $@
	for i in compiler system; do \
		echo "#define `echo $$i | tr '[:lower:]' '[:upper:]'`S \\" >> $@ ; \
		find src/$$i -name "*.js" | while read js; do \
			echo "	X(`echo $$js | $(NAME)`, $$i) \\" ; \
		done >> $@ ; \
		echo "" >> $@ ; \
	done
	echo "#define JS \\" >> $@
	echo "	COMPILERS \\" >> $@
	echo "	SYSTEMS" >> $@
	echo "" >> $@
	echo "#endif" >> $@

pmake$(EXE): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)

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

clean:
	rm -f pmake pmake.exe
	find . -name "*.o" >/dev/null && rm -f $(shell find . -name "*.o")
	rm -f src/compiler/*.c src/system/*.c src/js/*.c
