diff options
-rw-r--r-- | erlang.mk | 90 |
1 files changed, 73 insertions, 17 deletions
@@ -21,10 +21,10 @@ PROJECT ?= $(notdir $(CURDIR)) PKG_FILE ?= $(CURDIR)/.erlang.mk.packages.v1 export PKG_FILE -PKG_FILE_URL ?= https://raw.github.com/extend/erlang.mk/master/packages.v1.txt +PKG_FILE_URL ?= https://raw.github.com/extend/erlang.mk/master/packages.v1.tsv define get_pkg_file - wget -O $(PKG_FILE) $(PKG_FILE_URL) + wget --no-check-certificate -O $(PKG_FILE) $(PKG_FILE_URL) || rm $(PKG_FILE) endef # Verbosity and tweaks. @@ -46,8 +46,36 @@ dtl_verbose = $(dtl_verbose_$(V)) gen_verbose_0 = @echo " GEN " $@; gen_verbose = $(gen_verbose_$(V)) -.PHONY: all clean-all app clean deps clean-deps docs clean-docs \ - build-tests tests build-plt dialyze +.PHONY: rel clean-rel all clean-all app clean deps clean-deps \ + docs clean-docs build-tests tests build-plt dialyze + +# Release. + +RELX_CONFIG ?= $(CURDIR)/relx.config + +ifneq ($(wildcard $(RELX_CONFIG)),) + +RELX ?= $(CURDIR)/relx +export RELX + +RELX_URL ?= https://github.com/erlware/relx/releases/download/v0.5.2/relx +RELX_OPTS ?= + +define get_relx + wget -O $(RELX) $(RELX_URL) || rm $(RELX) + chmod +x $(RELX) +endef + +rel: clean-rel all $(RELX) + @$(RELX) -c $(RELX_CONFIG) $(RELX_OPTS) + +$(RELX): + @$(call get_relx) + +clean-rel: + @rm -rf _rel + +endif # Deps directory. @@ -62,6 +90,9 @@ ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS)) # Application. +ERL_LIBS ?= $(DEPS_DIR) +export ERL_LIBS + ERLC_OPTS ?= -Werror +debug_info +warn_export_all +warn_export_vars \ +warn_shadow_vars +warn_obsolete_guard # +bin_opt_info +warn_missing_spec COMPILE_FIRST ?= @@ -73,14 +104,14 @@ clean-all: clean clean-deps clean-docs $(gen_verbose) rm -rf .$(PROJECT).plt $(DEPS_DIR) logs app: ebin/$(PROJECT).app - $(eval MODULES := $(shell find ebin -name \*.beam \ + $(eval MODULES := $(shell find ebin -type f -name \*.beam \ | sed 's/ebin\///;s/\.beam/,/' | sed '$$s/.$$//')) $(appsrc_verbose) cat src/$(PROJECT).app.src \ - | sed 's/{modules, \[\]}/{modules, \[$(MODULES)\]}/' \ + | sed 's/{modules,[[:space:]]*\[\]}/{modules, \[$(MODULES)\]}/' \ > ebin/$(PROJECT).app define compile_erl - $(erlc_verbose) ERL_LIBS=$(DEPS_DIR) erlc -v $(ERLC_OPTS) -o ebin/ \ + $(erlc_verbose) erlc -v $(ERLC_OPTS) -o ebin/ \ -pa ebin/ -I include/ $(COMPILE_FIRST_PATHS) $(1) endef @@ -101,9 +132,11 @@ define compile_dtl init:stop()' endef -ebin/$(PROJECT).app: src/*.erl $(wildcard src/*.core) \ - $(wildcard src/*.xrl) $(wildcard src/*.yrl) \ - $(wildcard templates/*.dtl) +ebin/$(PROJECT).app: $(shell find src -type f -name \*.erl) \ + $(shell find src -type f -name \*.core) \ + $(shell find src -type f -name \*.xrl) \ + $(shell find src -type f -name \*.yrl) \ + $(shell find templates -type f -name \*.dtl 2>/dev/null) @mkdir -p ebin/ $(if $(strip $(filter %.erl %.core,$?)), \ $(call compile_erl,$(filter %.erl %.core,$?))) @@ -147,13 +180,21 @@ deps: $(ALL_DEPS_DIRS) done clean-deps: - @for dep in $(ALL_DEPS_DIRS) ; do $(MAKE) -C $$dep clean; done + @for dep in $(ALL_DEPS_DIRS) ; do \ + if [ -f $$dep/Makefile ] ; then \ + $(MAKE) -C $$dep clean ; \ + else \ + echo "include $(CURDIR)/erlang.mk" | $(MAKE) -f - -C $$dep clean ; \ + fi ; \ + done # Documentation. +EDOC_OPTS ?= + docs: clean-docs $(gen_verbose) erl -noshell \ - -eval 'edoc:application($(PROJECT), ".", []), init:stop().' + -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), init:stop().' clean-docs: $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info @@ -166,24 +207,39 @@ build-test-deps: $(ALL_TEST_DEPS_DIRS) @for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep; done build-tests: build-test-deps - $(gen_verbose) ERL_LIBS=$(DEPS_DIR) erlc -v $(ERLC_OPTS) -o test/ \ + $(gen_verbose) erlc -v $(ERLC_OPTS) -o test/ \ $(wildcard test/*.erl test/*/*.erl) -pa ebin/ CT_RUN = ct_run \ -no_auto_compile \ -noshell \ - -pa ebin $(DEPS_DIR)/*/ebin \ + -pa $(realpath ebin) $(DEPS_DIR)/*/ebin \ -dir test \ -logdir logs # -cover test/cover.spec CT_SUITES ?= -CT_SUITES_FULL = $(addsuffix _SUITE,$(CT_SUITES)) + +define test_target +test_$(1): ERLC_OPTS += -DTEST=1 +'{parse_transform, eunit_autoexport}' +test_$(1): clean deps app build-tests + @if [ -d "test" ] ; \ + then \ + mkdir -p logs/ ; \ + $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) ; \ + fi + $(gen_verbose) rm -f test/*.beam +endef + +$(foreach test,$(CT_SUITES),$(eval $(call test_target,$(test)))) tests: ERLC_OPTS += -DTEST=1 +'{parse_transform, eunit_autoexport}' tests: clean deps app build-tests - @mkdir -p logs/ - @$(CT_RUN) -suite $(CT_SUITES_FULL) + @if [ -d "test" ] ; \ + then \ + mkdir -p logs/ ; \ + $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) ; \ + fi $(gen_verbose) rm -f test/*.beam # Dialyzer. |