TARGET =

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

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

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

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

	EXE =
endif

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

### Rules
OBJS = src/main.o
OBJS += external/duktape/duktape.o external/stb/stb_ds.o

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

all: pmake$(EXE)

include mk/compiler.mk

mk/compiler.mk:
	find src/compiler -name "*.js" | while read js; do \
		name="compiler_`echo $$js | rev | cut -d/ -f1 | rev | cut -d. -f1`" ; \
		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/compiler.mk

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 "" >> $@
	echo "#define COMPILERS \\" >> $@
	find src/compiler -name "*.js" | while read js; do \
		echo "	X(`echo $$js | rev | cut -d/ -f1 | rev | cut -d. -f1`) \\" ; \
	done >> $@
	echo "" >> $@
	echo "#endif" >> $@

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

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

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