|
@@ -1,4 +1,4 @@
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
#
|
|
|
# Permission to use, copy, modify, and/or distribute this software for any
|
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
@@ -12,11 +12,21 @@
|
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
-.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
|
|
|
+.PHONY: all app apps deps search rel relup docs install-docs check tests clean distclean help erlang-mk
|
|
|
|
|
|
ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
|
|
|
|
|
|
-ERLANG_MK_VERSION = 2.0.0-pre.2-145-gd387560-dirty
|
|
|
+ERLANG_MK_VERSION = 2016.10.21-43-g4f5d8d7-dirty
|
|
|
+
|
|
|
+# Make 3.81 and 3.82 are deprecated.
|
|
|
+
|
|
|
+ifeq ($(MAKE_VERSION),3.81)
|
|
|
+$(warning Please upgrade to GNU Make 4 or later: https://erlang.mk/guide/installation.html)
|
|
|
+endif
|
|
|
+
|
|
|
+ifeq ($(MAKE_VERSION),3.82)
|
|
|
+$(warning Please upgrade to GNU Make 4 or later: https://erlang.mk/guide/installation.html)
|
|
|
+endif
|
|
|
|
|
|
# Core configuration.
|
|
|
|
|
@@ -25,6 +35,7 @@ PROJECT := $(strip $(PROJECT))
|
|
|
|
|
|
PROJECT_VERSION ?= rolling
|
|
|
PROJECT_MOD ?= $(PROJECT)_app
|
|
|
+PROJECT_ENV ?= []
|
|
|
|
|
|
# Verbosity.
|
|
|
|
|
@@ -85,6 +96,8 @@ all:: deps app rel
|
|
|
rel::
|
|
|
$(verbose) :
|
|
|
|
|
|
+relup:: deps app
|
|
|
+
|
|
|
check:: tests
|
|
|
|
|
|
clean:: clean-crashdump
|
|
@@ -102,7 +115,7 @@ distclean-tmp:
|
|
|
help::
|
|
|
$(verbose) printf "%s\n" \
|
|
|
"erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
|
|
|
- "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
|
|
|
+ "Copyright (c) 2013-2016 Loïc Hoguin <essen@ninenines.eu>" \
|
|
|
"" \
|
|
|
"Usage: [V=1] $(MAKE) [target]..." \
|
|
|
"" \
|
|
@@ -110,6 +123,8 @@ help::
|
|
|
" all Run deps, app and rel targets in that order" \
|
|
|
" app Compile the project" \
|
|
|
" deps Fetch dependencies (if needed) and compile them" \
|
|
|
+ " fetch-deps Fetch dependencies recursively (if needed) without compiling them" \
|
|
|
+ " list-deps List dependencies recursively on stdout" \
|
|
|
" search q=... Search for a package in the built-in index" \
|
|
|
" rel Build a release for this project, if applicable" \
|
|
|
" docs Build the documentation for this project" \
|
|
@@ -148,30 +163,7 @@ else
|
|
|
core_native_path = $1
|
|
|
endif
|
|
|
|
|
|
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
|
|
|
-define core_http_get
|
|
|
- wget --no-check-certificate -O $(1) $(2)|| rm $(1)
|
|
|
-endef
|
|
|
-else
|
|
|
-define core_http_get.erl
|
|
|
- ssl:start(),
|
|
|
- inets:start(),
|
|
|
- case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
|
|
|
- {ok, {{_, 200, _}, _, Body}} ->
|
|
|
- case file:write_file("$(1)", Body) of
|
|
|
- ok -> ok;
|
|
|
- {error, R1} -> halt(R1)
|
|
|
- end;
|
|
|
- {error, R2} ->
|
|
|
- halt(R2)
|
|
|
- end,
|
|
|
- halt(0).
|
|
|
-endef
|
|
|
-
|
|
|
-define core_http_get
|
|
|
- $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
|
|
|
-endef
|
|
|
-endif
|
|
|
+core_http_get = curl -Lf$(if $(filter-out 0,$(V)),,s)o $(call core_native_path,$1) $2
|
|
|
|
|
|
core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
|
|
|
|
|
@@ -284,6 +276,14 @@ pkg_apns_fetch = git
|
|
|
pkg_apns_repo = https://github.com/inaka/apns4erl
|
|
|
pkg_apns_commit = master
|
|
|
|
|
|
+PACKAGES += asciideck
|
|
|
+pkg_asciideck_name = asciideck
|
|
|
+pkg_asciideck_description = Asciidoc for Erlang.
|
|
|
+pkg_asciideck_homepage = https://ninenines.eu
|
|
|
+pkg_asciideck_fetch = git
|
|
|
+pkg_asciideck_repo = https://github.com/ninenines/asciideck
|
|
|
+pkg_asciideck_commit = master
|
|
|
+
|
|
|
PACKAGES += azdht
|
|
|
pkg_azdht_name = azdht
|
|
|
pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
|
|
@@ -1597,7 +1597,7 @@ pkg_evum_repo = https://github.com/msantos/evum
|
|
|
pkg_evum_commit = master
|
|
|
|
|
|
PACKAGES += exec
|
|
|
-pkg_exec_name = exec
|
|
|
+pkg_exec_name = erlexec
|
|
|
pkg_exec_description = Execute and control OS processes from Erlang/OTP.
|
|
|
pkg_exec_homepage = http://saleyn.github.com/erlexec
|
|
|
pkg_exec_fetch = git
|
|
@@ -4068,7 +4068,7 @@ pkg_zucchini_fetch = git
|
|
|
pkg_zucchini_repo = https://github.com/devinus/zucchini
|
|
|
pkg_zucchini_commit = master
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: search
|
|
@@ -4095,7 +4095,7 @@ else
|
|
|
$(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: distclean-deps
|
|
@@ -4172,6 +4172,9 @@ endif
|
|
|
ifneq ($(SKIP_DEPS),)
|
|
|
deps::
|
|
|
else
|
|
|
+ifeq ($(ALL_DEPS_DIRS),)
|
|
|
+deps:: apps
|
|
|
+else
|
|
|
deps:: $(ALL_DEPS_DIRS) apps
|
|
|
ifeq ($(IS_APP)$(IS_DEP),)
|
|
|
$(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
|
|
@@ -4191,6 +4194,7 @@ endif
|
|
|
fi \
|
|
|
done
|
|
|
endif
|
|
|
+endif
|
|
|
|
|
|
# Deps related targets.
|
|
|
|
|
@@ -4431,9 +4435,9 @@ define dep_autopatch_rebar.erl
|
|
|
[] -> ok;
|
|
|
_ ->
|
|
|
Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
|
|
|
- PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
|
|
|
+ PortSpecWrite(io_lib:format("ERL_CFLAGS ?= -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
|
|
|
[code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
|
|
|
- PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
|
|
|
+ PortSpecWrite(io_lib:format("ERL_LDFLAGS ?= -L \\"~s\\" -lerl_interface -lei\n",
|
|
|
[code:lib_dir(erl_interface, lib)])),
|
|
|
[PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
|
|
|
FilterEnv = fun(Env) ->
|
|
@@ -4472,7 +4476,7 @@ define dep_autopatch_rebar.erl
|
|
|
"%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
|
|
|
"%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
|
|
|
"%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
|
|
|
- [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
|
|
|
+ [[Output, ": ", K, " += ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
|
|
|
Output, ": $$\(foreach ext,.c .C .cc .cpp,",
|
|
|
"$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
|
|
|
"\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
|
|
@@ -4595,21 +4599,12 @@ define dep_fetch_cp
|
|
|
cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
|
|
|
endef
|
|
|
|
|
|
-define dep_fetch_hex.erl
|
|
|
- ssl:start(),
|
|
|
- inets:start(),
|
|
|
- {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
|
|
|
- {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
|
|
|
- [], [{body_format, binary}]),
|
|
|
- {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
|
|
|
- {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
|
|
|
- ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
|
|
|
- halt()
|
|
|
-endef
|
|
|
-
|
|
|
# Hex only has a package version. No need to look in the Erlang.mk packages.
|
|
|
define dep_fetch_hex
|
|
|
- $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
|
|
|
+ mkdir -p $(ERLANG_MK_TMP)/hex $(DEPS_DIR)/$1; \
|
|
|
+ $(call core_http_get,$(ERLANG_MK_TMP)/hex/$1.tar,\
|
|
|
+ https://s3.amazonaws.com/s3.hex.pm/tarballs/$1-$(strip $(word 2,$(dep_$1))).tar); \
|
|
|
+ tar -xOf $(ERLANG_MK_TMP)/hex/$1.tar contents.tar.gz | tar -C $(DEPS_DIR)/$1 -xzf -;
|
|
|
endef
|
|
|
|
|
|
define dep_fetch_fail
|
|
@@ -4700,6 +4695,15 @@ distclean-deps:
|
|
|
$(gen_verbose) rm -rf $(DEPS_DIR)
|
|
|
endif
|
|
|
|
|
|
+# Forward-declare variables used in core/deps-tools.mk. This is required
|
|
|
+# in case plugins use them.
|
|
|
+
|
|
|
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
|
|
|
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
|
|
|
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
|
|
|
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
|
|
|
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
|
|
|
+
|
|
|
# External plugins.
|
|
|
|
|
|
DEP_PLUGINS ?=
|
|
@@ -4715,7 +4719,7 @@ $(foreach p,$(DEP_PLUGINS),\
|
|
|
$(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
|
|
|
$(call core_dep_plugin,$p/plugins.mk,$p))))
|
|
|
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
# Configuration.
|
|
@@ -4732,31 +4736,38 @@ dtl_verbose = $(dtl_verbose_$(V))
|
|
|
|
|
|
# Core targets.
|
|
|
|
|
|
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
|
|
|
+DTL_PATH := $(abspath $(DTL_PATH))
|
|
|
+DTL_FILES := $(sort $(call core_find,$(DTL_PATH),*.dtl))
|
|
|
|
|
|
ifneq ($(DTL_FILES),)
|
|
|
|
|
|
-ifdef DTL_FULL_PATH
|
|
|
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
|
|
|
-else
|
|
|
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
|
|
|
-endif
|
|
|
+DTL_NAMES = $(addsuffix $(DTL_SUFFIX),$(DTL_FILES:$(DTL_PATH)/%.dtl=%))
|
|
|
+DTL_MODULES = $(if $(DTL_FULL_PATH),$(subst /,_,$(DTL_NAMES)),$(notdir $(DTL_NAMES)))
|
|
|
+BEAM_FILES += $(addsuffix .beam,$(addprefix ebin/,$(DTL_MODULES)))
|
|
|
|
|
|
+ifneq ($(words $(DTL_FILES)),0)
|
|
|
# Rebuild templates when the Makefile changes.
|
|
|
-$(DTL_FILES): $(MAKEFILE_LIST)
|
|
|
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
|
|
|
+ @mkdir -p $(ERLANG_MK_TMP)
|
|
|
+ @if test -f $@; then \
|
|
|
+ touch $(DTL_FILES); \
|
|
|
+ fi
|
|
|
@touch $@
|
|
|
|
|
|
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
|
|
|
+endif
|
|
|
+
|
|
|
define erlydtl_compile.erl
|
|
|
[begin
|
|
|
Module0 = case "$(strip $(DTL_FULL_PATH))" of
|
|
|
"" ->
|
|
|
filename:basename(F, ".dtl");
|
|
|
_ ->
|
|
|
- "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
|
|
|
+ "$(DTL_PATH)/" ++ F2 = filename:rootname(F, ".dtl"),
|
|
|
re:replace(F2, "/", "_", [{return, list}, global])
|
|
|
end,
|
|
|
Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
|
|
|
- case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
|
|
|
+ case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors]) of
|
|
|
ok -> ok;
|
|
|
{ok, _} -> ok
|
|
|
end
|
|
@@ -4766,11 +4777,12 @@ endef
|
|
|
|
|
|
ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
|
|
|
$(if $(strip $?),\
|
|
|
- $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
|
|
|
+ $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$(call core_native_path,$?)),\
|
|
|
+ -pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
|
|
|
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
# Verbosity.
|
|
@@ -4802,7 +4814,7 @@ ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
|
|
|
$(if $(strip $?),$(call compile_proto,$?))
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: clean-app
|
|
@@ -4871,7 +4883,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) $(DEPS))]}
|
|
|
+ {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
|
|
|
+ {env, $(subst \,\\,$(PROJECT_ENV))}$(if $(findstring {,$(PROJECT_APP_EXTRA_KEYS)),$(comma)$(newline)$(tab)$(subst \,\\,$(PROJECT_APP_EXTRA_KEYS)),)
|
|
|
]}.
|
|
|
endef
|
|
|
else
|
|
@@ -4883,7 +4896,8 @@ define app_file
|
|
|
{modules, [$(call comma_list,$(2))]},
|
|
|
{registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
|
|
|
{applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
|
|
|
- {mod, {$(PROJECT_MOD), []}}
|
|
|
+ {mod, {$(PROJECT_MOD), []}},
|
|
|
+ {env, $(subst \,\\,$(PROJECT_ENV))}$(if $(findstring {,$(PROJECT_APP_EXTRA_KEYS)),$(comma)$(newline)$(tab)$(subst \,\\,$(PROJECT_APP_EXTRA_KEYS)),)
|
|
|
]}.
|
|
|
endef
|
|
|
endif
|
|
@@ -4893,8 +4907,10 @@ app-build: ebin/$(PROJECT).app
|
|
|
|
|
|
# Source files.
|
|
|
|
|
|
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
|
|
|
-CORE_FILES = $(sort $(call core_find,src/,*.core))
|
|
|
+ALL_SRC_FILES := $(sort $(call core_find,src/,*))
|
|
|
+
|
|
|
+ERL_FILES := $(filter %.erl,$(ALL_SRC_FILES))
|
|
|
+CORE_FILES := $(filter %.core,$(ALL_SRC_FILES))
|
|
|
|
|
|
# ASN.1 files.
|
|
|
|
|
@@ -4927,16 +4943,16 @@ endif
|
|
|
|
|
|
# Leex and Yecc files.
|
|
|
|
|
|
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
|
|
|
+XRL_FILES := $(filter %.xrl,$(ALL_SRC_FILES))
|
|
|
XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
|
|
|
ERL_FILES += $(XRL_ERL_FILES)
|
|
|
|
|
|
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
|
|
|
+YRL_FILES := $(filter %.yrl,$(ALL_SRC_FILES))
|
|
|
YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
|
|
|
ERL_FILES += $(YRL_ERL_FILES)
|
|
|
|
|
|
$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
|
|
|
- $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
|
|
|
+ $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $(YRL_ERLC_OPTS) $?)
|
|
|
|
|
|
# Erlang and Core Erlang files.
|
|
|
|
|
@@ -5018,13 +5034,23 @@ define makedep.erl
|
|
|
endef
|
|
|
|
|
|
ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
|
|
|
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl)
|
|
|
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
|
|
|
$(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
|
|
|
endif
|
|
|
|
|
|
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
|
|
|
# Rebuild everything when the Makefile changes.
|
|
|
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(MAKEFILE_LIST)
|
|
|
- @touch $@
|
|
|
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
|
|
|
+ $(verbose) mkdir -p $(ERLANG_MK_TMP)
|
|
|
+ $(verbose) if test -f $@; then \
|
|
|
+ touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
|
|
|
+ touch -c $(PROJECT).d; \
|
|
|
+ fi
|
|
|
+ $(verbose) touch $@
|
|
|
+
|
|
|
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
|
|
|
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
|
|
|
+endif
|
|
|
|
|
|
-include $(PROJECT).d
|
|
|
|
|
@@ -5045,7 +5071,7 @@ ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.s
|
|
|
$(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
|
|
|
$(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
|
|
|
ifeq ($(wildcard src/$(PROJECT).app.src),)
|
|
|
- $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
|
|
|
+ $(app_verbose) printf '$(subst %,%%,$(subst $(newline),\n,$(subst ','\'',$(call app_file,$(GITDESCRIBE),$(MODULES)))))' \
|
|
|
> ebin/$(PROJECT).app
|
|
|
else
|
|
|
$(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
|
|
@@ -5069,6 +5095,7 @@ clean-app:
|
|
|
|
|
|
endif
|
|
|
|
|
|
+# Copyright (c) 2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
@@ -5089,7 +5116,7 @@ doc-deps: $(ALL_DOC_DEPS_DIRS)
|
|
|
$(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: rel-deps
|
|
@@ -5109,7 +5136,7 @@ rel-deps: $(ALL_REL_DEPS_DIRS)
|
|
|
$(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: test-deps test-dir test-build clean-test-dir
|
|
@@ -5164,7 +5191,7 @@ ifneq ($(wildcard $(TEST_DIR)/*.beam),)
|
|
|
endif
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: rebar.config
|
|
@@ -5200,54 +5227,88 @@ $(eval export _compat_rebar_config)
|
|
|
rebar.config:
|
|
|
$(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
|
|
|
+ifeq ($(filter asciideck,$(DEPS) $(DOC_DEPS)),asciideck)
|
|
|
|
|
|
-MAN_INSTALL_PATH ?= /usr/local/share/man
|
|
|
-MAN_SECTIONS ?= 3 7
|
|
|
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc-guide distclean-asciidoc-manual
|
|
|
+
|
|
|
+# Core targets.
|
|
|
|
|
|
docs:: asciidoc
|
|
|
|
|
|
+distclean:: distclean-asciidoc-guide distclean-asciidoc-manual
|
|
|
+
|
|
|
+# Plugin-specific targets.
|
|
|
+
|
|
|
asciidoc: asciidoc-guide asciidoc-manual
|
|
|
|
|
|
+# User guide.
|
|
|
+
|
|
|
ifeq ($(wildcard doc/src/guide/book.asciidoc),)
|
|
|
asciidoc-guide:
|
|
|
else
|
|
|
-asciidoc-guide: distclean-asciidoc doc-deps
|
|
|
+asciidoc-guide: distclean-asciidoc-guide doc-deps
|
|
|
a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
|
|
|
a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
|
|
|
+
|
|
|
+distclean-asciidoc-guide:
|
|
|
+ $(gen_verbose) rm -rf doc/html/ doc/guide.pdf
|
|
|
endif
|
|
|
|
|
|
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
|
|
|
+# Man pages.
|
|
|
+
|
|
|
+ASCIIDOC_MANUAL_FILES := $(wildcard doc/src/manual/*.asciidoc)
|
|
|
+
|
|
|
+ifeq ($(ASCIIDOC_MANUAL_FILES),)
|
|
|
asciidoc-manual:
|
|
|
else
|
|
|
-asciidoc-manual: distclean-asciidoc doc-deps
|
|
|
- for f in doc/src/manual/*.asciidoc ; do \
|
|
|
- a2x -v -f manpage $$f ; \
|
|
|
- done
|
|
|
- for s in $(MAN_SECTIONS); do \
|
|
|
- mkdir -p doc/man$$s/ ; \
|
|
|
- mv doc/src/manual/*.$$s doc/man$$s/ ; \
|
|
|
- gzip doc/man$$s/*.$$s ; \
|
|
|
- done
|
|
|
+
|
|
|
+# Configuration.
|
|
|
+
|
|
|
+MAN_INSTALL_PATH ?= /usr/local/share/man
|
|
|
+MAN_SECTIONS ?= 3 7
|
|
|
+MAN_PROJECT ?= $(shell echo $(PROJECT) | sed 's/^./\U&\E/')
|
|
|
+MAN_VERSION ?= $(PROJECT_VERSION)
|
|
|
+
|
|
|
+# Plugin-specific targets.
|
|
|
+
|
|
|
+define asciidoc2man.erl
|
|
|
+try
|
|
|
+ [begin
|
|
|
+ ok = asciideck:to_manpage(asciideck:parse_file(F), #{
|
|
|
+ compress => gzip,
|
|
|
+ outdir => filename:dirname(F),
|
|
|
+ extra2 => "$(MAN_PROJECT) $(MAN_VERSION)",
|
|
|
+ extra3 => "$(MAN_PROJECT) Function Reference"
|
|
|
+ })
|
|
|
+ end || F <- [$(shell echo $(addprefix $(comma)\",$(addsuffix \",$1)) | sed 's/^.//')]],
|
|
|
+ halt(0)
|
|
|
+catch _:_ ->
|
|
|
+ halt(1)
|
|
|
+end.
|
|
|
+endef
|
|
|
+
|
|
|
+asciidoc-manual:: doc-deps
|
|
|
+
|
|
|
+asciidoc-manual:: $(ASCIIDOC_MANUAL_FILES)
|
|
|
+ $(call erlang,$(call asciidoc2man.erl,$?))
|
|
|
+ $(foreach s,$(MAN_SECTIONS),mkdir -p doc/man$s/ && mv doc/src/manual/*.$s.gz doc/man$s/;)
|
|
|
|
|
|
install-docs:: install-asciidoc
|
|
|
|
|
|
install-asciidoc: asciidoc-manual
|
|
|
- for s in $(MAN_SECTIONS); do \
|
|
|
- mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
|
|
|
- install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
|
|
|
- done
|
|
|
-endif
|
|
|
+ $(foreach s,$(MAN_SECTIONS),\
|
|
|
+ mkdir -p $(MAN_INSTALL_PATH)/man$s/ && \
|
|
|
+ install -g `id -u` -o `id -g` -m 0644 doc/man$s/*.gz $(MAN_INSTALL_PATH)/man$s/;)
|
|
|
|
|
|
-distclean:: distclean-asciidoc
|
|
|
-
|
|
|
-distclean-asciidoc:
|
|
|
- $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
|
|
|
+distclean-asciidoc-manual:
|
|
|
+ $(gen_verbose) rm -rf $(addprefix doc/man,$(MAN_SECTIONS))
|
|
|
+endif
|
|
|
+endif
|
|
|
|
|
|
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2014-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
|
|
@@ -5304,7 +5365,7 @@ ifdef SP
|
|
|
define bs_Makefile
|
|
|
PROJECT = $p
|
|
|
PROJECT_DESCRIPTION = New project
|
|
|
-PROJECT_VERSION = 0.0.1
|
|
|
+PROJECT_VERSION = 0.1.0
|
|
|
|
|
|
# Whitespace to be used when creating files from templates.
|
|
|
SP = $(SP)
|
|
@@ -5314,7 +5375,7 @@ else
|
|
|
define bs_Makefile
|
|
|
PROJECT = $p
|
|
|
PROJECT_DESCRIPTION = New project
|
|
|
-PROJECT_VERSION = 0.0.1
|
|
|
+PROJECT_VERSION = 0.1.0
|
|
|
|
|
|
endef
|
|
|
endif
|
|
@@ -5322,7 +5383,7 @@ endif
|
|
|
define bs_apps_Makefile
|
|
|
PROJECT = $p
|
|
|
PROJECT_DESCRIPTION = New project
|
|
|
-PROJECT_VERSION = 0.0.1
|
|
|
+PROJECT_VERSION = 0.1.0
|
|
|
|
|
|
include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
|
|
|
endef
|
|
@@ -5342,7 +5403,7 @@ stop(_State) ->
|
|
|
endef
|
|
|
|
|
|
define bs_relx_config
|
|
|
-{release, {$p_release, "1"}, [$p]}.
|
|
|
+{release, {$p_release, "1"}, [$p, sasl, runtime_tools]}.
|
|
|
{extended_start_script, true}.
|
|
|
{sys_config, "rel/sys.config"}.
|
|
|
{vm_args, "rel/vm.args"}.
|
|
@@ -5708,7 +5769,7 @@ endif
|
|
|
list-templates:
|
|
|
$(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
|
|
|
|
|
|
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2014-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: clean-c_src distclean-c_src-env
|
|
@@ -5943,27 +6004,41 @@ else
|
|
|
$(call render_template,bs_erl_nif,src/$n.erl)
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
-.PHONY: ci ci-setup distclean-kerl
|
|
|
+.PHONY: ci ci-prepare ci-setup distclean-kerl
|
|
|
+
|
|
|
+CI_OTP ?=
|
|
|
+CI_HIPE ?=
|
|
|
+
|
|
|
+ifeq ($(CI_VM),native)
|
|
|
+ERLC_OPTS += +native
|
|
|
+TEST_ERLC_OPTS += +native
|
|
|
+endif
|
|
|
+
|
|
|
+ifeq ($(strip $(CI_OTP) $(CI_HIPE)),)
|
|
|
+ci::
|
|
|
+else
|
|
|
+
|
|
|
+ifeq ($(strip $(KERL)),)
|
|
|
+KERL := $(ERLANG_MK_TMP)/kerl/kerl
|
|
|
+endif
|
|
|
|
|
|
-KERL ?= $(CURDIR)/kerl
|
|
|
export KERL
|
|
|
|
|
|
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
|
|
|
+KERL_GIT ?= https://github.com/kerl/kerl
|
|
|
+KERL_COMMIT ?= master
|
|
|
+
|
|
|
+KERL_MAKEFLAGS ?=
|
|
|
|
|
|
OTP_GIT ?= https://github.com/erlang/otp
|
|
|
|
|
|
CI_INSTALL_DIR ?= $(HOME)/erlang
|
|
|
-CI_OTP ?=
|
|
|
|
|
|
-ifeq ($(strip $(CI_OTP)),)
|
|
|
-ci::
|
|
|
-else
|
|
|
-ci:: $(addprefix ci-,$(CI_OTP))
|
|
|
+ci:: $(addprefix ci-,$(CI_OTP) $(addsuffix -native,$(CI_HIPE)))
|
|
|
|
|
|
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
|
|
|
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP) $(addsuffix -native,$(CI_HIPE)))
|
|
|
|
|
|
ci-setup::
|
|
|
|
|
@@ -5977,23 +6052,38 @@ ci-$(1): $(CI_INSTALL_DIR)/$(1)
|
|
|
PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
|
|
|
CI_OTP_RELEASE="$(1)" \
|
|
|
CT_OPTS="-label $(1)" \
|
|
|
+ CI_VM="$(2)" \
|
|
|
$(MAKE) ci-setup tests
|
|
|
endef
|
|
|
|
|
|
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
|
|
|
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp),otp)))
|
|
|
+$(foreach otp,$(CI_HIPE),$(eval $(call ci_target,$(otp)-native,native)))
|
|
|
|
|
|
define ci_otp_target
|
|
|
ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
|
|
|
$(CI_INSTALL_DIR)/$(1): $(KERL)
|
|
|
- $(KERL) build git $(OTP_GIT) $(1) $(1)
|
|
|
+ MAKEFLAGS="$(KERL_MAKEFLAGS)" $(KERL) build git $(OTP_GIT) $(1) $(1)
|
|
|
$(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
|
|
|
endif
|
|
|
endef
|
|
|
|
|
|
$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
|
|
|
|
|
|
+define ci_hipe_target
|
|
|
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$1-native),)
|
|
|
+$(CI_INSTALL_DIR)/$1-native: $(KERL)
|
|
|
+ KERL_CONFIGURE_OPTIONS=--enable-native-libs \
|
|
|
+ MAKEFLAGS="$(KERL_MAKEFLAGS)" $(KERL) build git $(OTP_GIT) $1 $1-native
|
|
|
+ $(KERL) install $1-native $(CI_INSTALL_DIR)/$1-native
|
|
|
+endif
|
|
|
+endef
|
|
|
+
|
|
|
+$(foreach otp,$(CI_HIPE),$(eval $(call ci_hipe_target,$(otp))))
|
|
|
+
|
|
|
$(KERL):
|
|
|
- $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
|
|
|
+ $(verbose) mkdir -p $(ERLANG_MK_TMP)
|
|
|
+ $(gen_verbose) git clone --depth 1 $(KERL_GIT) $(ERLANG_MK_TMP)/kerl
|
|
|
+ $(verbose) cd $(ERLANG_MK_TMP)/kerl && git checkout $(KERL_COMMIT)
|
|
|
$(verbose) chmod +x $(KERL)
|
|
|
|
|
|
help::
|
|
@@ -6010,7 +6100,7 @@ distclean-kerl:
|
|
|
$(gen_verbose) rm -rf $(KERL)
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: ct apps-ct distclean-ct
|
|
@@ -6018,11 +6108,13 @@ endif
|
|
|
# Configuration.
|
|
|
|
|
|
CT_OPTS ?=
|
|
|
+
|
|
|
ifneq ($(wildcard $(TEST_DIR)),)
|
|
|
- CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
|
|
|
-else
|
|
|
- CT_SUITES ?=
|
|
|
+ifndef CT_SUITES
|
|
|
+CT_SUITES := $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
|
|
|
+endif
|
|
|
endif
|
|
|
+CT_SUITES ?=
|
|
|
|
|
|
# Core targets.
|
|
|
|
|
@@ -6088,7 +6180,7 @@ $(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
|
|
|
distclean-ct:
|
|
|
$(gen_verbose) rm -rf $(CURDIR)/logs/
|
|
|
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: plt distclean-plt dialyze
|
|
@@ -6132,7 +6224,8 @@ define filter_opts.erl
|
|
|
endef
|
|
|
|
|
|
$(DIALYZER_PLT): deps app
|
|
|
- $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
|
|
|
+ $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) \
|
|
|
+ `test -f $(ERLANG_MK_TMP)/deps.log && cat $(ERLANG_MK_TMP)/deps.log`
|
|
|
|
|
|
plt: $(DIALYZER_PLT)
|
|
|
|
|
@@ -6146,7 +6239,7 @@ dialyze: $(DIALYZER_PLT)
|
|
|
endif
|
|
|
$(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
|
|
|
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: distclean-edoc edoc
|
|
@@ -6171,25 +6264,23 @@ edoc: distclean-edoc doc-deps
|
|
|
distclean-edoc:
|
|
|
$(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
|
|
|
|
|
|
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
|
|
|
+# Copyright (c) 2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2014, Dave Cottlehuber <dch@skunkwerks.at>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
-.PHONY: distclean-escript escript
|
|
|
+.PHONY: distclean-escript escript escript-zip
|
|
|
|
|
|
# Configuration.
|
|
|
|
|
|
ESCRIPT_NAME ?= $(PROJECT)
|
|
|
ESCRIPT_FILE ?= $(ESCRIPT_NAME)
|
|
|
|
|
|
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
|
|
|
ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
|
|
|
+ESCRIPT_EMU_ARGS ?= -escript main $(ESCRIPT_NAME)
|
|
|
|
|
|
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
|
|
|
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
|
|
|
-ESCRIPT_EMU_ARGS ?= -pa . \
|
|
|
- -sasl errlog_type error \
|
|
|
- -escript main $(ESCRIPT_NAME)
|
|
|
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
|
|
|
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
|
|
|
+ESCRIPT_ZIP ?= 7z a -tzip -mx=9 -mtc=off $(if $(filter-out 0,$(V)),,> /dev/null)
|
|
|
+ESCRIPT_ZIP_FILE ?= $(ERLANG_MK_TMP)/escript.zip
|
|
|
|
|
|
# Core targets.
|
|
|
|
|
@@ -6202,44 +6293,28 @@ help::
|
|
|
|
|
|
# Plugin-specific targets.
|
|
|
|
|
|
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
|
|
|
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
|
|
|
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
|
|
|
-# Software may only be used for the great good and the true happiness of all
|
|
|
-# sentient beings.
|
|
|
-
|
|
|
-define ESCRIPT_RAW
|
|
|
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
|
|
|
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
|
|
|
-' [F || F <- A, not filelib:is_dir(F) ] end,'\
|
|
|
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
|
|
|
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
|
|
|
-'Ez = fun(Escript) ->'\
|
|
|
-' Static = Files([$(ESCRIPT_STATIC)]),'\
|
|
|
-' Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
|
|
|
-' Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
|
|
|
-' escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
|
|
|
-' {archive, Archive, [memory]},'\
|
|
|
-' {shebang, "$(ESCRIPT_SHEBANG)"},'\
|
|
|
-' {comment, "$(ESCRIPT_COMMENT)"},'\
|
|
|
-' {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
|
|
|
-' ]),'\
|
|
|
-' file:change_mode(Escript, 8#755)'\
|
|
|
-'end,'\
|
|
|
-'Ez("$(ESCRIPT_FILE)"),'\
|
|
|
-'halt().'
|
|
|
-endef
|
|
|
-
|
|
|
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
|
|
|
+escript-zip:: deps app
|
|
|
+ $(verbose) mkdir -p $(dir $(ESCRIPT_ZIP))
|
|
|
+ $(verbose) rm -f $(ESCRIPT_ZIP_FILE)
|
|
|
+ $(gen_verbose) cd .. && $(ESCRIPT_ZIP) $(ESCRIPT_ZIP_FILE) $(PROJECT)/ebin/*
|
|
|
+ifneq ($(DEPS),)
|
|
|
+ $(verbose) cd $(DEPS_DIR) && $(ESCRIPT_ZIP) $(ESCRIPT_ZIP_FILE) \
|
|
|
+ `cat $(ERLANG_MK_TMP)/deps.log | sed 's/^$(subst /,\/,$(DEPS_DIR))\///' | sed 's/$$/\/ebin\/\*/'`
|
|
|
+endif
|
|
|
|
|
|
-escript:: distclean-escript deps app
|
|
|
- $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
|
|
|
+escript:: escript-zip
|
|
|
+ $(gen_verbose) printf "%s\n" \
|
|
|
+ "#!$(ESCRIPT_SHEBANG)" \
|
|
|
+ "%% $(ESCRIPT_COMMENT)" \
|
|
|
+ "%%! $(ESCRIPT_EMU_ARGS)" > $(ESCRIPT_FILE)
|
|
|
+ $(verbose) cat $(ESCRIPT_ZIP_FILE) >> $(ESCRIPT_FILE)
|
|
|
+ $(verbose) chmod +x $(ESCRIPT_FILE)
|
|
|
|
|
|
distclean-escript:
|
|
|
$(gen_verbose) rm -f $(ESCRIPT_NAME)
|
|
|
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is contributed to erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: eunit apps-eunit
|
|
@@ -6307,14 +6382,14 @@ apps-eunit:
|
|
|
endif
|
|
|
endif
|
|
|
|
|
|
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
|
|
|
+.PHONY: relx-rel relx-relup distclean-relx-rel run
|
|
|
|
|
|
# Configuration.
|
|
|
|
|
|
-RELX ?= $(CURDIR)/relx
|
|
|
+RELX ?= $(ERLANG_MK_TMP)/relx
|
|
|
RELX_CONFIG ?= $(CURDIR)/relx.config
|
|
|
|
|
|
RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
|
|
@@ -6332,10 +6407,12 @@ endif
|
|
|
ifeq ($(IS_DEP),)
|
|
|
ifneq ($(wildcard $(RELX_CONFIG)),)
|
|
|
rel:: relx-rel
|
|
|
+
|
|
|
+relup:: relx-relup
|
|
|
endif
|
|
|
endif
|
|
|
|
|
|
-distclean:: distclean-relx-rel distclean-relx
|
|
|
+distclean:: distclean-relx-rel
|
|
|
|
|
|
# Plugin-specific targets.
|
|
|
|
|
@@ -6344,14 +6421,14 @@ $(RELX):
|
|
|
$(verbose) chmod +x $(RELX)
|
|
|
|
|
|
relx-rel: $(RELX) rel-deps app
|
|
|
- $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
|
|
|
+ $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS) release tar
|
|
|
+
|
|
|
+relx-relup: $(RELX) rel-deps app
|
|
|
+ $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS) release relup tar
|
|
|
|
|
|
distclean-relx-rel:
|
|
|
$(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
|
|
|
|
|
|
-distclean-relx:
|
|
|
- $(gen_verbose) rm -rf $(RELX)
|
|
|
-
|
|
|
# Run target.
|
|
|
|
|
|
ifeq ($(wildcard $(RELX_CONFIG)),)
|
|
@@ -6360,15 +6437,17 @@ else
|
|
|
|
|
|
define get_relx_release.erl
|
|
|
{ok, Config} = file:consult("$(RELX_CONFIG)"),
|
|
|
- {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
|
|
|
- io:format("~s", [Name]),
|
|
|
+ {release, {Name, Vsn}, _} = lists:keyfind(release, 1, Config),
|
|
|
+ io:format("~s ~s", [Name, Vsn]),
|
|
|
halt(0).
|
|
|
endef
|
|
|
|
|
|
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
|
|
|
+RELX_REL := $(shell $(call erlang,$(get_relx_release.erl)))
|
|
|
+RELX_REL_NAME := $(word 1,$(RELX_REL))
|
|
|
+RELX_REL_VSN := $(word 2,$(RELX_REL))
|
|
|
|
|
|
run: all
|
|
|
- $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
|
|
|
+ $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/bin/$(RELX_REL_NAME) console
|
|
|
|
|
|
help::
|
|
|
$(verbose) printf "%s\n" "" \
|
|
@@ -6377,8 +6456,8 @@ help::
|
|
|
|
|
|
endif
|
|
|
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is contributed to erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
.PHONY: shell
|
|
@@ -6408,7 +6487,7 @@ build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
|
|
|
shell: build-shell-deps
|
|
|
$(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
|
|
|
|
|
|
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
|
|
@@ -6451,6 +6530,7 @@ triq: test-build
|
|
|
endif
|
|
|
endif
|
|
|
|
|
|
+# Copyright (c) 2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
# Copyright (c) 2015, Erlang Solutions Ltd.
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
@@ -6490,7 +6570,8 @@ xref: deps app $(XREFR)
|
|
|
distclean-xref:
|
|
|
$(gen_verbose) rm -rf $(XREFR)
|
|
|
|
|
|
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
|
|
|
+# Copyright (c) 2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
|
|
|
# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
|
|
|
COVER_REPORT_DIR = cover
|
|
@@ -6611,3 +6692,156 @@ cover-report:
|
|
|
|
|
|
endif
|
|
|
endif # ifneq ($(COVER_REPORT_DIR),)
|
|
|
+
|
|
|
+# Copyright (c) 2016, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
+
|
|
|
+.PHONY: sfx
|
|
|
+
|
|
|
+ifdef RELX_REL
|
|
|
+ifdef SFX
|
|
|
+
|
|
|
+# Configuration.
|
|
|
+
|
|
|
+SFX_ARCHIVE ?= $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/$(RELX_REL_NAME)-$(RELX_REL_VSN).tar.gz
|
|
|
+SFX_OUTPUT_FILE ?= $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME).run
|
|
|
+
|
|
|
+# Core targets.
|
|
|
+
|
|
|
+rel:: sfx
|
|
|
+
|
|
|
+# Plugin-specific targets.
|
|
|
+
|
|
|
+define sfx_stub
|
|
|
+#!/bin/sh
|
|
|
+
|
|
|
+TMPDIR=`mktemp -d`
|
|
|
+ARCHIVE=`awk '/^__ARCHIVE_BELOW__$$/ {print NR + 1; exit 0;}' $$0`
|
|
|
+FILENAME=$$(basename $$0)
|
|
|
+REL=$${FILENAME%.*}
|
|
|
+
|
|
|
+tail -n+$$ARCHIVE $$0 | tar -xzf - -C $$TMPDIR
|
|
|
+
|
|
|
+$$TMPDIR/bin/$$REL console
|
|
|
+RET=$$?
|
|
|
+
|
|
|
+rm -rf $$TMPDIR
|
|
|
+
|
|
|
+exit $$RET
|
|
|
+
|
|
|
+__ARCHIVE_BELOW__
|
|
|
+endef
|
|
|
+
|
|
|
+sfx:
|
|
|
+ $(call render_template,sfx_stub,$(SFX_OUTPUT_FILE))
|
|
|
+ $(gen_verbose) cat $(SFX_ARCHIVE) >> $(SFX_OUTPUT_FILE)
|
|
|
+ $(verbose) chmod +x $(SFX_OUTPUT_FILE)
|
|
|
+
|
|
|
+endif
|
|
|
+endif
|
|
|
+
|
|
|
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
|
|
|
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
|
|
|
+# This file is part of erlang.mk and subject to the terms of the ISC License.
|
|
|
+
|
|
|
+# Fetch dependencies recursively (without building them).
|
|
|
+
|
|
|
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
|
|
|
+ fetch-shell-deps
|
|
|
+
|
|
|
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
|
|
|
+ $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
|
|
|
+ $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
|
|
|
+ $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
|
|
|
+ $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
|
|
|
+
|
|
|
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
|
|
|
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
|
|
|
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
|
|
|
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
|
|
|
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
|
|
|
+
|
|
|
+ifneq ($(SKIP_DEPS),)
|
|
|
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
|
|
|
+ $(verbose) :> $@
|
|
|
+else
|
|
|
+# By default, we fetch "normal" dependencies. They are also included no
|
|
|
+# matter the type of requested dependencies.
|
|
|
+#
|
|
|
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
|
|
|
+
|
|
|
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
|
|
|
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
|
|
|
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
|
|
|
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
|
|
|
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
|
|
|
+
|
|
|
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
|
|
|
+# dependencies with a single target.
|
|
|
+ifneq ($(filter doc,$(DEP_TYPES)),)
|
|
|
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
|
|
|
+endif
|
|
|
+ifneq ($(filter rel,$(DEP_TYPES)),)
|
|
|
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
|
|
|
+endif
|
|
|
+ifneq ($(filter test,$(DEP_TYPES)),)
|
|
|
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
|
|
|
+endif
|
|
|
+ifneq ($(filter shell,$(DEP_TYPES)),)
|
|
|
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
|
|
|
+endif
|
|
|
+
|
|
|
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
|
|
|
+
|
|
|
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
|
|
|
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
|
|
|
+ifeq ($(IS_APP)$(IS_DEP),)
|
|
|
+ $(verbose) mkdir -p $(ERLANG_MK_TMP)
|
|
|
+ $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
|
|
|
+endif
|
|
|
+ifndef IS_APP
|
|
|
+ $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
|
|
|
+ $(MAKE) -C $$dep $@ \
|
|
|
+ IS_APP=1 \
|
|
|
+ ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
|
|
|
+ || exit $$?; \
|
|
|
+ done
|
|
|
+endif
|
|
|
+ $(verbose) for dep in $^ ; do \
|
|
|
+ if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
|
|
|
+ echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
|
|
|
+ if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
|
|
|
+ $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
|
|
|
+ $(MAKE) -C $$dep fetch-deps \
|
|
|
+ IS_DEP=1 \
|
|
|
+ ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
|
|
|
+ || exit $$?; \
|
|
|
+ fi \
|
|
|
+ fi \
|
|
|
+ done
|
|
|
+ifeq ($(IS_APP)$(IS_DEP),)
|
|
|
+ $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
|
|
|
+ $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
|
|
|
+endif
|
|
|
+endif # ifneq ($(SKIP_DEPS),)
|
|
|
+
|
|
|
+# List dependencies recursively.
|
|
|
+
|
|
|
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
|
|
|
+ list-shell-deps
|
|
|
+
|
|
|
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
|
|
|
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
|
|
|
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
|
|
|
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
|
|
|
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
|
|
|
+
|
|
|
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
|
|
|
+ $(verbose) cat $^
|