diff options
-rw-r--r-- | README.md | 17 | ||||
-rw-r--r-- | build.config | 1 | ||||
-rw-r--r-- | erlang.mk | 72 | ||||
-rw-r--r-- | plugins/eunit.mk | 71 |
4 files changed, 161 insertions, 0 deletions
@@ -385,6 +385,23 @@ There are a number of optional configuration parameters: Refer to http://www.erlang.org/doc/man/escript.html for more information on `escript` functionality in general. +EUnit plugin +------------ + +This plugin is available by default. It adds the following +target: + +`eunit` which runs all the EUnit tests found in `ebin` and +any of the additional EUnit directories specified in +`EUNIT_DIR`. + +`EUNIT_OPTS` can be used to specify EUnit-specific options +(e.g. `verbose`) that will be used when calling +`eunit:test/2`. This configuration parameter defaults to +`verbose`. Note +that EUnit options are specified as a comma-separated +list of options. + Relx plugin ----------- diff --git a/build.config b/build.config index a166e01..8b6e721 100644 --- a/build.config +++ b/build.config @@ -17,5 +17,6 @@ plugins/edoc plugins/elvis plugins/erlydtl plugins/escript +plugins/eunit plugins/relx plugins/shell @@ -954,6 +954,78 @@ escript:: distclean-escript deps app distclean-escript: $(gen_verbose) rm -f $(ESCRIPT_NAME) +# Copyright (c) 2014, Enrique Fernandez <[email protected]> +# This file is contributed to erlang.mk and subject to the terms of the ISC License. + +.PHONY: help-eunit build-eunit eunit distclean-eunit + +# Configuration + +EUNIT_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard -DTEST=1 -DEXTRA=1 + +EUNIT_DIR ?= +EUNIT_DIRS = $(sort $(EUNIT_DIR) ebin) + +ifeq ($(strip $(EUNIT_DIR)),) +TAGGED_EUNIT_TESTS = {dir,"ebin"} +else +# All modules in EUNIT_DIR +EUNIT_DIR_MODS = $(notdir $(basename $(shell find $(EUNIT_DIR) -type f -name *.beam))) +# All modules in 'ebin' +EUNIT_EBIN_MODS = $(notdir $(basename $(shell find ebin -type f -name *.beam))) +# Only those modules in EUNIT_DIR with no matching module in 'ebin'. +# This is done to avoid some tests being executed twice. +EUNIT_MODS = $(filter-out $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_DIR_MODS)) +TAGGED_EUNIT_TESTS = {dir,"ebin"} $(foreach mod,$(EUNIT_MODS),$(shell echo $(mod) | sed -e 's/\(.*\)/{module,\1}/g')) +endif + +EUNIT_OPTS ?= verbose + +# Utility functions + +define str-join + $(shell echo '$(strip $(1))' | sed -e "s/ /,/g") +endef + +# Core targets. + +help:: help-eunit + +tests:: eunit + +clean:: clean-eunit + +# Plugin-specific targets. + +EUNIT_RUN = erl \ + -no_auto_compile \ + -noshell \ + -pa $(realpath $(EUNIT_DIR)) $(DEPS_DIR)/*/ebin \ + -pz $(realpath ebin) \ + -eval 'case eunit:test([$(call str-join,$(TAGGED_EUNIT_TESTS))], [$(EUNIT_OPTS)]) of ok -> erlang:halt(0); error -> erlang:halt(1) end.' + +help-eunit: + @printf "%s\n" "" \ + "EUnit targets:" \ + " eunit Run all the EUnit tests for this project" + +ifeq ($(strip $(EUNIT_DIR)),) +build-eunit: +else ifeq ($(strip $(EUNIT_DIR)),ebin) +build-eunit: +else +build-eunit: + $(gen_verbose) erlc -v $(EUNIT_ERLC_OPTS) -I include/ -o $(EUNIT_DIR) \ + $(wildcard $(EUNIT_DIR)/*.erl $(EUNIT_DIR)/*/*.erl) -pa ebin/ +endif + +eunit: ERLC_OPTS = $(EUNIT_ERLC_OPTS) +eunit: clean deps app build-eunit + $(gen_verbose) $(EUNIT_RUN) + +clean-eunit: + $(gen_verbose) $(foreach dir,$(EUNIT_DIRS),rm -rf $(dir)/*.beam) + # Copyright (c) 2013-2014, Loïc Hoguin <[email protected]> # This file is part of erlang.mk and subject to the terms of the ISC License. diff --git a/plugins/eunit.mk b/plugins/eunit.mk new file mode 100644 index 0000000..75aab0c --- /dev/null +++ b/plugins/eunit.mk @@ -0,0 +1,71 @@ +# Copyright (c) 2014, Enrique Fernandez <[email protected]> +# This file is contributed to erlang.mk and subject to the terms of the ISC License. + +.PHONY: help-eunit build-eunit eunit distclean-eunit + +# Configuration + +EUNIT_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard -DTEST=1 -DEXTRA=1 + +EUNIT_DIR ?= +EUNIT_DIRS = $(sort $(EUNIT_DIR) ebin) + +ifeq ($(strip $(EUNIT_DIR)),) +TAGGED_EUNIT_TESTS = {dir,"ebin"} +else +# All modules in EUNIT_DIR +EUNIT_DIR_MODS = $(notdir $(basename $(shell find $(EUNIT_DIR) -type f -name *.beam))) +# All modules in 'ebin' +EUNIT_EBIN_MODS = $(notdir $(basename $(shell find ebin -type f -name *.beam))) +# Only those modules in EUNIT_DIR with no matching module in 'ebin'. +# This is done to avoid some tests being executed twice. +EUNIT_MODS = $(filter-out $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_DIR_MODS)) +TAGGED_EUNIT_TESTS = {dir,"ebin"} $(foreach mod,$(EUNIT_MODS),$(shell echo $(mod) | sed -e 's/\(.*\)/{module,\1}/g')) +endif + +EUNIT_OPTS ?= verbose + +# Utility functions + +define str-join + $(shell echo '$(strip $(1))' | sed -e "s/ /,/g") +endef + +# Core targets. + +help:: help-eunit + +tests:: eunit + +clean:: clean-eunit + +# Plugin-specific targets. + +EUNIT_RUN = erl \ + -no_auto_compile \ + -noshell \ + -pa $(realpath $(EUNIT_DIR)) $(DEPS_DIR)/*/ebin \ + -pz $(realpath ebin) \ + -eval 'case eunit:test([$(call str-join,$(TAGGED_EUNIT_TESTS))], [$(EUNIT_OPTS)]) of ok -> erlang:halt(0); error -> erlang:halt(1) end.' + +help-eunit: + @printf "%s\n" "" \ + "EUnit targets:" \ + " eunit Run all the EUnit tests for this project" + +ifeq ($(strip $(EUNIT_DIR)),) +build-eunit: +else ifeq ($(strip $(EUNIT_DIR)),ebin) +build-eunit: +else +build-eunit: + $(gen_verbose) erlc -v $(EUNIT_ERLC_OPTS) -I include/ -o $(EUNIT_DIR) \ + $(wildcard $(EUNIT_DIR)/*.erl $(EUNIT_DIR)/*/*.erl) -pa ebin/ +endif + +eunit: ERLC_OPTS = $(EUNIT_ERLC_OPTS) +eunit: clean deps app build-eunit + $(gen_verbose) $(EUNIT_RUN) + +clean-eunit: + $(gen_verbose) $(foreach dir,$(EUNIT_DIRS),rm -rf $(dir)/*.beam) |