bs-batteries
Version:
Ocaml batteries for bucklescript
293 lines (223 loc) • 9.08 kB
Plain Text
# A basic Makefile for building and installing Batteries Included
# It punts to ocamlbuild for all the heavy lifting.
NAME = batteries
VERSION := $(shell grep "^Version:" _oasis | cut -c 15-)
OCAML_MAJOR_VERSION := $(firstword $(subst ., , $(shell ocamlfind ocamlc -version)))
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
# Define variables and export them for mkconf.ml
DOCROOT ?= /usr/share/doc/ocaml-batteries
export DOCROOT
BROWSER_COMMAND ?= x-www-browser
export BROWSER_COMMAND
OCAMLBUILD ?= ocamlbuild
OCAMLBUILDFLAGS ?= -no-links -use-ocamlfind
ifeq ($(uname_S),Darwin)
BATTERIES_NATIVE ?= yes
BATTERIES_NATIVE_SHLIB ?= no
else
BATTERIES_NATIVE ?= yes
BATTERIES_NATIVE_SHLIB ?= $(BATTERIES_NATIVE)
endif
# Directory where to build the qtest suite
QTESTDIR ?= qtest
ifeq ($(shell ocamlfind query -p-format qcheck),qcheck)
QTESTPKG = qcheck
else
QTESTPKG = QTest2Lib
endif
INSTALL_FILES = _build/META _build/src/*.cma \
battop.ml _build/src/*.cmi _build/src/*.mli \
_build/src/batteriesHelp.cmo _build/src/batteriesConfig.cmo _build/src/batteriesPrint.cmo \
ocamlinit build/ocaml
# the bin_annot flag in _tags is not handled by versions of ocamlbuild < 4.01.0
# hence we only install *.cmt{i} files if they were produced
ifneq ($(wildcard _build/src/*.cmt),)
INSTALL_FILES += _build/src/*.cmt
endif
ifneq ($(wildcard _build/src/*.cmti),)
INSTALL_FILES += _build/src/*.cmti
endif
OPT_INSTALL_FILES = _build/src/*.cmx _build/src/*.a _build/src/*.cmxa \
_build/src/*.cmxs _build/src/*.lib
# What to build
TARGETS = src/batteries.cma
TARGETS += src/batteriesHelp.cmo
TARGETS += src/batteriesThread.cma
TARGETS += META
BENCH_TARGETS = benchsuite/bench_int.native
BENCH_TARGETS += benchsuite/flip.native
BENCH_TARGETS += benchsuite/deque.native
BENCH_TARGETS += benchsuite/lines_of.native
BENCH_TARGETS += benchsuite/bitset.native
BENCH_TARGETS += benchsuite/bench_map.native
BENCH_TARGETS += benchsuite/bench_nreplace.native
TEST_TARGET = test-byte
ifeq ($(BATTERIES_NATIVE_SHLIB), yes)
EXT = native
MODE = shared
TARGETS += src/batteries.cmxs src/batteriesThread.cmxs
TEST_TARGET = test-native
else
ifeq ($(BATTERIES_NATIVE), yes)
EXT = native
MODE = native
TARGETS += src/batteries.cmxa src/batteriesThread.cmxa
TEST_TARGET = test-native
else
EXT = byte
MODE = bytecode
endif
endif
all:
@echo "Build mode:" $(MODE)
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) $(TARGETS)
clean:
@${RM} src/batteriesConfig.ml src/batUnix.mli batteries.odocl \
bench.log $(QTESTDIR)/all_tests.ml
@${RM} -r man/
@$(OCAMLBUILD) $(OCAMLBUILDFLAGS) -clean
@echo " Cleaned up working copy" # Note: ocamlbuild eats the first char!
batteries.odocl: src/batteries.mllib src/batteriesThread.mllib
cat $^ > $@
doc: batteries.odocl
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) batteries.docdir/index.html
man: all batteries.odocl
-mkdir man
ocamlfind ocamldoc -package threads.posix -sort -man -hide-warnings -d man -I _build/libs -I _build/src libs/uniclib.mli src/*.mli
install: all uninstall_packages
ocamlfind install $(NAME) $(INSTALL_FILES) \
-optional $(OPT_INSTALL_FILES)
test_install:
./scripts/test_install.sh
uninstall_packages:
ocamlfind remove $(NAME)
uninstall: uninstall_packages
${RM} -r $(DOCROOT)
install-doc: doc
mkdir -p $(DOCROOT)
mkdir -p $(DOCROOT)/html/api
cp _build/batteries.docdir/* $(DOCROOT)/html/api
cp LICENSE README.md FAQ $(DOCROOT)
install-man: man
install man/* /usr/local/man/man3/
reinstall:
$(MAKE) uninstall
$(MAKE) install
###############################################################################
# Pre-Processing of Source Code
###############################################################################
# the prefilter logic has moved to myocamlbuild.ml
# we keep the two void rules below for backward-compatibility for now
# (devs may have scripts calling them)
#
# For the record, and the ease of porting the build system to
# something else, the "prefilter" step preprocessed each file whose
# extension ends with a 'v', for example '.mliv', using the command
# build/prefilter.byte foo.mliv > foo.mli
prefilter:
clean-prefilter:
###############################################################################
# BUILDING AND RUNNING UNIT TESTS
###############################################################################
### List of source files that it's okay to try to test
# TESTABLE contains the source files as the user sees them,
# as a mix of .ml and .mlv files in the src/ directory
# TESTDEPS represents the file whose changes Makefile should watch to
# decide to reprocess the test results. It is identical to TESTABLE.
# TESTFILES contains the OCaml source files as `qtest` wants to see
# them, that is after preprocessing. We ask ocamlbuild to build the
# $(TESTFILES) from $(TESTABLE), and pass them to qtest from the
# `_build` directory.
DONTTEST=src/batteriesHelp.ml \
src/batConcreteQueue_402.ml src/batConcreteQueue_403.ml
TESTABLE ?= $(filter-out $(DONTTEST),\
$(wildcard src/*.ml) $(wildcard src/*.mlv))
TESTDEPS = $(TESTABLE)
TESTFILES = $(TESTABLE:.mlv=.ml)
### Test suite: "offline" unit tests
##############################################
_build/testsuite/main.byte: $(TESTDEPS) $(wildcard testsuite/*.ml)
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) testsuite/main.byte
_build/testsuite/main.native: $(TESTDEPS) $(wildcard testsuite/*.ml)
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) testsuite/main.native
### qtest: "inline" unit tests
##############################################
# extract all qtest unit tests into a single ml file
$(QTESTDIR)/all_tests.ml: $(TESTABLE)
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) $(TESTFILES)
(cd _build; qtest -o ../$@ --shuffle \
--preamble-file ../qtest/qtest_preamble.ml \
extract $(TESTFILES))
_build/$(QTESTDIR)/all_tests.byte: $(QTESTDIR)/all_tests.ml
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) -cflags -warn-error,+26\
-pkg oUnit,$(QTESTPKG) $(QTESTDIR)/all_tests.byte
_build/$(QTESTDIR)/all_tests.native: $(QTESTDIR)/all_tests.ml
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) -cflags -warn-error,+26\
-pkg oUnit,$(QTESTPKG) $(QTESTDIR)/all_tests.native
### qtest: quick run of inline unit tests
##############################################
# $ make qtest TESTABLE=foo.ml
# will only test the module Foo.
qtest-byte-clean:
@${RM} $(QTESTDIR)/all_tests.ml
@${MAKE} _build/$(QTESTDIR)/all_tests.byte
qtest-byte: qtest-byte-clean
@_build/$(QTESTDIR)/all_tests.byte
qtest-native-clean:
@${RM} $(QTESTDIR)/all_tests.ml
@${MAKE} _build/$(QTESTDIR)/all_tests.native
qtest-native: prefilter qtest-native-clean
@_build/$(QTESTDIR)/all_tests.native
qtest-clean:
@${RM} $(QTESTDIR)/all_tests.ml
@${MAKE} _build/$(QTESTDIR)/all_tests.$(EXT)
qtest: qtest-clean
@_build/$(QTESTDIR)/all_tests.$(EXT)
### run all unit tests
##############################################
testsuite-only-byte: _build/testsuite/main.byte
@_build/testsuite/main.byte
@echo "" # newline after "OK"
testsuite-only-native: _build/testsuite/main.native
@_build/testsuite/main.native
@echo "" # newline after "OK"
test-byte: qtest-byte testsuite-only-byte
test-native: qtest-native testsuite-only-native
full-test: $(TEST_TARGET)
test-compat: src/batteries_compattest.ml
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) src/batteries_compattest.byte
test-build-from-install:
$(MAKE) -C test-build
test: test-byte test-compat
###############################################################################
# BENCHMARK SUITE
###############################################################################
bench:
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) $(TARGETS) $(BENCH_TARGETS)
$(RM) bench.log
$(foreach BENCH, $(BENCH_TARGETS), _build/$(BENCH) | tee -a bench.log; )
@echo "Benchmarking results are written to bench.log"
###############################################################################
# PREPARING RELEASE FILES
###############################################################################
release:
$(MAKE) clean
git stash save "stashing local modifications before release"
$(MAKE) release-cleaned
# assumes irreproachably pristine working directory
release-cleaned: setup.ml doc test
git archive --format=tar --prefix=batteries-$(VERSION)/ HEAD \
| gzip > batteries-$(VERSION).tar.gz
setup.ml: _oasis
oasis setup
git commit setup.ml -m"Update setup.ml based on _oasis"
# uploads the current documentation to github hdoc2/ directory
upload-docs:
make doc && git checkout gh-pages && rm -f hdoc2/*.html && cp _build/batteries.docdir/*.html hdoc2/ && git add hdoc2/*.html && git commit -a -m"Update to latest documentation" && git push github gh-pages
###############################################################################
# CODE COVERAGE REPORTS
###############################################################################
coverage/index.html: $(TESTDEPS) $(QTESTDIR)/all_tests.ml
$(OCAMLBUILD) $(OCAMLBUILDFLAGS) coverage/index.html
coverage: coverage/index.html