From 724521b68c19f107437db9fa2ee8def6ff604e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?= Date: Fri, 12 May 2017 10:19:24 +0200 Subject: Support plugins local to the application If the application's Makefile specify either: DEP_PLUGINS = $(PROJECT) or e.g.: DEP_PLUGINS = $(PROJECT)/mk/dist.mk then load the plugin from the application instead of a dependency. This helps when you have an application with common Erlang modules and Erlang.mk plugins: your common application can load Erlang.mk plugins exactly like other applications depending on the common application. --- core/deps.mk | 4 +++ doc/src/guide/external_plugins.asciidoc | 28 +++++++++++++++++++++ test/core_plugins.mk | 44 ++++++++++++++++++++++++++++++++- 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/core/deps.mk b/core/deps.mk index 2c6f6d5..96270a1 100644 --- a/core/deps.mk +++ b/core/deps.mk @@ -25,9 +25,13 @@ export REBAR_DEPS_DIR # They both use the core_dep_plugin macro. define core_dep_plugin +ifeq ($(2),$(PROJECT)) +-include $$(patsubst $(PROJECT)/%,%,$(1)) +else -include $(DEPS_DIR)/$(1) $(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ; +endif endef DEP_EARLY_PLUGINS ?= diff --git a/doc/src/guide/external_plugins.asciidoc b/doc/src/guide/external_plugins.asciidoc index c398c59..68deb82 100644 --- a/doc/src/guide/external_plugins.asciidoc +++ b/doc/src/guide/external_plugins.asciidoc @@ -101,3 +101,31 @@ DEP_EARLY_PLUGINS = common_deps DEPS += cowboy TEST_DEPS = ct_helper dep_ct_helper = git https://github.com/ninenines/ct_helper master + +=== Loading plugins local to the application + +If the Erlang.mk plugin lives in the same directory or repository as your +application or library, then you can load it exactly like an external +plugin: the dependency name is simply the name of your application or +library. + +For example, the following Makefile loads a plugin in the 'mk' +subdirectory: + +[source,make] +DEP_PLUGINS = $(PROJECT)/mk/dist.mk + +This also works with early-stage plugins: + +[source,make] +DEP_EARLY_PLUGINS = $(PROJECT)/mk/variables.mk + +Like external plugins, if you do not specify the path to the plugin, it +defaults to 'plugins.mk' or 'early-plugins.mk', located at the root of +your application: + +[source,make] +# Loads ./early-plugins.mk +DEP_EARLY_PLUGINS = $(PROJECT) +# Loads ./plugins.mk +DEP_PLUGINS = $(PROJECT) diff --git a/test/core_plugins.mk b/test/core_plugins.mk index 060999a..508012b 100644 --- a/test/core_plugins.mk +++ b/test/core_plugins.mk @@ -1,6 +1,6 @@ # Core: External plugins. -CORE_PLUGINS_CASES = all early one templates test +CORE_PLUGINS_CASES = all early early-local local one templates test CORE_PLUGINS_TARGETS = $(addprefix core-plugins-,$(CORE_PLUGINS_CASES)) .PHONY: core-plugins $(CORE_PLUGINS_TARGETS) @@ -65,6 +65,48 @@ core-plugins-early: build clean $t test -e $(APP)/deps/cowlib $t test -e $(APP)/deps/ranch +core-plugins-early-local: build clean + + $i "Bootstrap a new OTP library named $(APP)" + $t mkdir $(APP)/ + $t cp ../erlang.mk $(APP)/ + $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v + + $i "Create two internal plugin makefiles" + $t mkdir -p $(APP)/mk + $t echo "plugin1: ; @echo \$$@" > $(APP)/mk/plugin1.mk + $t echo "plugin2: ; @echo \$$@" > $(APP)/early-plugins.mk + + $i "Add dependency and plugins to the Makefile" + $t perl -ni.bak -e 'print;if ($$.==1) {print "DEP_EARLY_PLUGINS = \$$(PROJECT) \$$(PROJECT)/mk/plugin1.mk\n"}' $(APP)/Makefile + + $i "Run 'make plugin1' and check that it prints plugin1" + $t $(MAKE) --no-print-directory -C $(APP) plugin1 | grep -qw plugin1 + + $i "Run 'make plugin2' and check that it prints plugin2" + $t $(MAKE) --no-print-directory -C $(APP) plugin2 | grep -qw plugin2 + +core-plugins-local: build clean + + $i "Bootstrap a new OTP library named $(APP)" + $t mkdir $(APP)/ + $t cp ../erlang.mk $(APP)/ + $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v + + $i "Create two internal plugin makefiles" + $t mkdir -p $(APP)/mk + $t echo "plugin1: ; @echo \$$@" > $(APP)/mk/plugin1.mk + $t echo "plugin2: ; @echo \$$@" > $(APP)/plugins.mk + + $i "Add dependency and plugins to the Makefile" + $t perl -ni.bak -e 'print;if ($$.==1) {print "DEP_PLUGINS = \$$(PROJECT) \$$(PROJECT)/mk/plugin1.mk\n"}' $(APP)/Makefile + + $i "Run 'make plugin1' and check that it prints plugin1" + $t $(MAKE) --no-print-directory -C $(APP) plugin1 | grep -qw plugin1 + + $i "Run 'make plugin2' and check that it prints plugin2" + $t $(MAKE) --no-print-directory -C $(APP) plugin2 | grep -qw plugin2 + core-plugins-one: build clean $i "Bootstrap a new OTP library named $(APP)" -- cgit v1.2.3