blob: 7b44c1199bdaf0d4fd2ad03baaf4427ec9a5439f [file] [log] [blame]
# This Makefile uses ocamlbuild but does not rely on ocamlfind or the Opam
# package manager to build. However, Opam package management is available
# optionally through the check/install/uninstall targets.
#
# The $(JSLIB) target requires node.js and BuckleScript.
#
# See README.me for instructions.
# Configuration
NAME = wasm
UNOPT = $(NAME).debug
OPT = $(NAME)
LIB = $(NAME)
ZIP = $(NAME).zip
JSLIB = wast.js
WINMAKE = winmake.bat
DIRS = util syntax binary text valid runtime exec script host main
LIBS = bigarray
FLAGS = -cflags '-w +a-4-27-42-44-45 -warn-error +a'
OCB = ocamlbuild $(FLAGS) $(DIRS:%=-I %) $(LIBS:%=-libs %)
JS = # set to JS shell command to run JS tests
# Main targets
.PHONY: default opt unopt libopt libunopt jslib all land zip
default: opt
debug: unopt
opt: $(OPT)
unopt: $(UNOPT)
libopt: _build/$(LIB).cmx
libunopt: _build/$(LIB).cmo
jslib: $(JSLIB)
all: unopt opt libunopt libopt test
land: all $(WINMAKE)
zip: $(ZIP)
# Building executable
empty =
space = $(empty) $(empty)
comma = ,
.INTERMEDIATE: _tags
_tags:
echo >$@ "true: bin_annot"
echo >>$@ "true: debug"
echo >>$@ "<{$(subst $(space),$(comma),$(DIRS))}/*.cmx>: for-pack($(PACK))"
$(UNOPT): main.byte
mv $< $@
$(OPT): main.native
mv $< $@
.PHONY: main.byte main.native
main.byte: _tags
$(OCB) -quiet $@
main.native: _tags
$(OCB) -quiet $@
# Building library
PACK = $(shell echo `echo $(LIB) | sed 's/^\(.\).*$$/\\1/g' | tr [:lower:] [:upper:]``echo $(LIB) | sed 's/^.\(.*\)$$/\\1/g'`)
.INTERMEDIATE: $(LIB).mlpack
$(LIB).mlpack: $(DIRS)
ls $(DIRS:%=%/*.ml*) \
| sed 's:\(.*/\)\{0,1\}\(.*\)\.[^\.]*:\2:' \
| grep -v main \
| sort | uniq \
>$@
_build/$(LIB).cmo: $(LIB).mlpack _tags
$(OCB) -quiet $(LIB).cmo
_build/$(LIB).cmx: $(LIB).mlpack _tags
$(OCB) -quiet $(LIB).cmx
# Building JavaScript library
.PHONY: $(JSLIB)
$(JSLIB): $(UNOPT)
mkdir -p _build/jslib/src
cp meta/jslib/* _build/jslib
cp $(DIRS:%=_build/%/*.ml*) meta/jslib/*.ml _build/jslib/src
rm _build/jslib/src/*.ml[^i]
(cd _build/jslib; ./build.sh ../../$@)
# Building Windows build file
$(WINMAKE): clean
echo rem Auto-generated from Makefile! >$@
echo set NAME=$(NAME) >>$@
echo if \'%1\' neq \'\' set NAME=%1 >>$@
$(OCB) main.d.byte \
| grep -v ocamldep \
| grep -v mkdir \
| sed s:`which ocaml`:ocaml:g \
| sed s:main/main.d.byte:%NAME%.exe: \
>>$@
# Executing test suite
.PHONY: test debugtest
test: $(OPT)
../test/core/run.py --wasm `pwd`/$(OPT) $(if $(JS),--js '$(JS)',)
debugtest: $(UNOPT)
../test/core/run.py --wasm `pwd`/$(UNOPT) $(if $(JS),--js '$(JS)',)
test/%: $(OPT)
../test/core/run.py --wasm `pwd`/$(OPT) $(if $(JS),--js '$(JS)',) $(@:test/%=../test/core/%.wast)
debugtest/%: $(UNOPT)
../test/core/run.py --wasm `pwd`/$(UNOPT) $(if $(JS),--js '$(JS)',) $(@:debugtest/%=../test/core/%.wast)
run/%: $(OPT)
./$(OPT) $(@:run/%=../test/core/%.wast)
debug/%: $(UNOPT)
./$(UNOPT) $(@:debug/%=../test/core/%.wast)
# Miscellaneous targets
.PHONY: clean
$(ZIP): $(WINMAKE)
git archive --format=zip --prefix=$(NAME)/ -o $@ HEAD
clean:
rm -rf _build/jslib $(LIB).mlpack _tags
$(OCB) -clean
# Opam support
.PHONY: check install uninstall
check:
# Check that we can find all relevant libraries
# when using ocamlfind
ocamlfind query $(LIBS)
install: _build/$(LIB).cmx _build/$(LIB).cmo
ocamlfind install $(LIB) meta/findlib/META _build/$(LIB).o \
$(wildcard _build/$(LIB).cm*) \
$(wildcard $(DIRS:%=%/*.mli))
uninstall:
ocamlfind remove $(LIB)