#
# This Makefile takes .st files in the jtalk/st directory and produces compiled
# javascript files from them, for both debug and deployment.
#
# Where we find the current runnable code and where we put our js files on install
JS	:= ../js/

# The compiler script
JTALKC	:= ../bin/jtalkc

# Generic flags to JTALKC
FLAGS   := -d

# All corresponding js filenames for every st file available
# In other words, if we have Kernel.st and Parser.st, then OBJECTS will be "Kernel.js Parser.js"
OBJECTS := $(patsubst %.st,%.js,$(wildcard *.st))

# Default make target since it is the first target in this Makefile
all: Examples.js

# Step by step
#
# First we copy the core javascript files from current working files
# into this directory. These files are hand written. $@ is the target name.
boot.js init.js:
	cp ../js/$@ .

# Then we compile Kernel.st depending on having using boot.js and init.js
# $< means the first dependency - in other words Kernel.st
Kernel.js: Kernel.st boot.js init.js
	$(JTALKC) $(FLAGS) $<

# ...then Parser, but using the new Kernel from step above.
# We only need to depend on Kernel.js since it in turn depends on boot.js and init.js.
Parser.js: Parser.st Kernel.js
	$(JTALKC) $(FLAGS) $<

# ...and Compiler, but using the new Parser and Kernel from above.
# We only need to depend on Parser.js since it in turn depends on Kernel.js, boot.js etc
Compiler.js: Compiler.st Parser.js
	$(JTALKC) $(FLAGS) $<

# ...now that we have a new Kernel/Parser/Compiler we use them
# to compile the rest of st files presuming that they only depend on Compiler, like
# for example Canvas.js and Benchfib.js.
%.js: %.st Compiler.js 
	$(JTALKC) $(FLAGS) $<

# But for some libraries there are dependencies to care for. Then
# we need to use -l so that the compiler first loads that library
# before compiling the .st file. Otherwise bindings will fail.
#
# JQuery uses Canvas
JQuery.js: JQuery.st Canvas.js
	$(JTALKC) $(FLAGS) -l Canvas $<

# IDE uses JQuery
IDE.js: IDE.st JQuery.js
	$(JTALKC) $(FLAGS) -l Canvas,JQuery $<

# The SUnit TestRunner uses UI stuff from IDE.
SUnit.js: SUnit.st IDE.js
	$(JTALKC) $(FLAGS) -l Canvas,JQuery,IDE $<

# Some Examples use SUnit
Examples.js: Examples.st SUnit.js
	$(JTALKC) $(FLAGS) -l Canvas,JQuery,IDE,SUnit $<;


# Installing is simply copying all js files to js directory.
install: all
	cp *.js $(JS)

# And cleaning is trivial also
clean:
	rm -f *.js; 

# These three are phony
.PHONY: all install clean