aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdamanalo <[email protected]>2023-05-08 23:45:43 +0800
committerLoïc Hoguin <[email protected]>2023-05-12 13:25:33 +0200
commit7f7db5d1e6a442aee5dba4aa98dd0594f5f3513d (patch)
tree57c7d3d0397eafa40167497dd1413739f4906a09
parent0f3874feae7ec510c1d2704a37c16d5e47fe9c7d (diff)
downloaderlang.mk-7f7db5d1e6a442aee5dba4aa98dd0594f5f3513d.tar.gz
erlang.mk-7f7db5d1e6a442aee5dba4aa98dd0594f5f3513d.tar.bz2
erlang.mk-7f7db5d1e6a442aee5dba4aa98dd0594f5f3513d.zip
Support optional applications
Loïc: Added more info to guide.
-rw-r--r--core/erlc.mk6
-rw-r--r--doc/src/guide/deps.asciidoc12
-rw-r--r--test/core_deps.mk24
3 files changed, 40 insertions, 2 deletions
diff --git a/core/erlc.mk b/core/erlc.mk
index 71ba5b9..7c94907 100644
--- a/core/erlc.mk
+++ b/core/erlc.mk
@@ -65,7 +65,8 @@ define app_file
{id$(comma)$(space)"$(1)"}$(comma))
{modules, [$(call comma_list,$(2))]},
{registered, []},
- {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(foreach dep,$(DEPS),$(call dep_name,$(dep))))]},
+ {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(OPTIONAL_DEPS) $(foreach dep,$(DEPS),$(call dep_name,$(dep))))]},
+ {optional_applications, [$(call comma_list,$(OPTIONAL_DEPS))]},
{env, $(subst \,\\,$(PROJECT_ENV))}$(if $(findstring {,$(PROJECT_APP_EXTRA_KEYS)),$(comma)$(newline)$(tab)$(subst \,\\,$(PROJECT_APP_EXTRA_KEYS)),)
]}.
endef
@@ -77,7 +78,8 @@ define app_file
{id$(comma)$(space)"$(1)"}$(comma))
{modules, [$(call comma_list,$(2))]},
{registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
- {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(foreach dep,$(DEPS),$(call dep_name,$(dep))))]},
+ {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(OPTIONAL_DEPS) $(foreach dep,$(DEPS),$(call dep_name,$(dep))))]},
+ {optional_applications, [$(call comma_list,$(OPTIONAL_DEPS))]},
{mod, {$(PROJECT_MOD), []}},
{env, $(subst \,\\,$(PROJECT_ENV))}$(if $(findstring {,$(PROJECT_APP_EXTRA_KEYS)),$(comma)$(newline)$(tab)$(subst \,\\,$(PROJECT_APP_EXTRA_KEYS)),)
]}.
diff --git a/doc/src/guide/deps.asciidoc b/doc/src/guide/deps.asciidoc
index e5dda80..c46dce6 100644
--- a/doc/src/guide/deps.asciidoc
+++ b/doc/src/guide/deps.asciidoc
@@ -132,6 +132,18 @@ target `deps::` before including 'erlang.mk', for example:
[source,make]
deps:: $(CURDIR)/deps/triq
+Sometimes dependencies are allowed to be missing. However, your application
+may depend on an optional application being started. To ensure that an
+optional dependency is started before your application, the variable
+`OPTIONAL_DEPS` may be used:
+
+[source,make]
+OPTIONAL_DEPS = quicer
+
+The top-level project can then decide whether to include this
+application by adding it to its `BUILD_DEPS` and including
+it in the release dependencies.
+
==== Modifying the dependency source or version
By default, Erlang.mk will look into its package index to
diff --git a/test/core_deps.mk b/test/core_deps.mk
index 27c3b1f..1dbf7b8 100644
--- a/test/core_deps.mk
+++ b/test/core_deps.mk
@@ -1124,6 +1124,30 @@ core-deps-mv-rebar: init
$i "Build the application"
$t $(MAKE) -C $(APP)-moved $v
+core-deps-optional: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Add quicer to the list of optional dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "OPTIONAL_DEPS = quicer\n"}' $(APP)/Makefile
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that no dependencies were fetched"
+ $t test ! -e $(APP)/deps
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -eval " \
+ ok = application:start($(APP)), \
+ {ok, Deps} = application:get_key($(APP), applications), \
+ true = lists:member(quicer, Deps), \
+ {ok, [quicer]} = application:get_key($(APP), optional_applications), \
+ halt()"
+
# A lower-level dependency of the first dependency always
# wins over a lower-level dependency of the second dependency.
core-deps-order-first: init