Update erlang.mk

This commit is contained in:
Jean-Sébastien Pédron 2015-10-28 11:15:54 +01:00
parent 94eb61c0f2
commit 3ac27a0573
1 changed files with 125 additions and 5 deletions

View File

@ -16,7 +16,7 @@
ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
ERLANG_MK_VERSION = 1.2.0-839-g166b155-dirty
ERLANG_MK_VERSION = 1.2.0-845-g2c9e05d-dirty
# Core configuration.
@ -30,9 +30,11 @@ PROJECT_VERSION ?= rolling
V ?= 0
verbose_0 = @
verbose_2 = set -x;
verbose = $(verbose_$(V))
gen_verbose_0 = @echo " GEN " $@;
gen_verbose_2 = set -x;
gen_verbose = $(gen_verbose_$(V))
# Temporary files directory.
@ -4058,6 +4060,7 @@ export NO_AUTOPATCH
# Verbosity.
dep_verbose_0 = @echo " DEP " $(1);
dep_verbose_2 = set -x;
dep_verbose = $(dep_verbose_$(V))
# Core targets.
@ -4758,25 +4761,32 @@ COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST
# Verbosity.
app_verbose_0 = @echo " APP " $(PROJECT);
app_verbose_2 = set -x;
app_verbose = $(app_verbose_$(V))
appsrc_verbose_0 = @echo " APP " $(PROJECT).app.src;
appsrc_verbose_2 = set -x;
appsrc_verbose = $(appsrc_verbose_$(V))
makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
makedep_verbose_2 = set -x;
makedep_verbose = $(makedep_verbose_$(V))
erlc_verbose_0 = @echo " ERLC " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
$(filter %.erl %.core,$(?F)));
erlc_verbose_2 = set -x;
erlc_verbose = $(erlc_verbose_$(V))
xyrl_verbose_0 = @echo " XYRL " $(filter %.xrl %.yrl,$(?F));
xyrl_verbose_2 = set -x;
xyrl_verbose = $(xyrl_verbose_$(V))
asn1_verbose_0 = @echo " ASN1 " $(filter %.asn1,$(?F));
asn1_verbose_2 = set -x;
asn1_verbose = $(asn1_verbose_$(V))
mib_verbose_0 = @echo " MIB " $(filter %.bin %.mib,$(?F));
mib_verbose_2 = set -x;
mib_verbose = $(mib_verbose_$(V))
ifneq ($(wildcard src/),)
@ -4918,14 +4928,22 @@ 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)
$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
@if test -f $@; then \
touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
touch -c $(PROJECT).d; \
fi
@touch $@
ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
endif
-include $(PROJECT).d
ebin/$(PROJECT).app:: ebin/
@ -5704,6 +5722,101 @@ distclean-c_src-env:
-include $(C_SRC_ENV)
endif
# Templates.
define bs_c_nif
#include "erl_nif.h"
static int loads = 0;
static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
/* Initialize private data. */
*priv_data = NULL;
loads++;
return 0;
}
static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
{
/* Convert the private data to the new version. */
*priv_data = *old_priv_data;
loads++;
return 0;
}
static void unload(ErlNifEnv* env, void* priv_data)
{
if (loads == 1) {
/* Destroy the private data. */
}
loads--;
}
static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
if (enif_is_atom(env, argv[0])) {
return enif_make_tuple2(env,
enif_make_atom(env, "hello"),
argv[0]);
}
return enif_make_tuple2(env,
enif_make_atom(env, "error"),
enif_make_atom(env, "badarg"));
}
static ErlNifFunc nif_funcs[] = {
{"hello", 1, hello}
};
ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
endef
define bs_erl_nif
-module($n).
-export([hello/1]).
-on_load(on_load/0).
on_load() ->
PrivDir = case code:priv_dir(?MODULE) of
{error, _} ->
AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
filename:join(AppPath, "priv");
Path ->
Path
end,
erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
hello(_) ->
erlang:nif_error({not_loaded, ?MODULE}).
endef
$(foreach template,bs_c_nif bs_erl_nif, \
$(eval _$(template) = $$(subst $$(tab),$$(WS),$$($(template)))) \
$(eval export _$(template)))
new-nif:
ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
$(error Error: $(C_SRC_DIR)/$n.c already exists)
endif
ifneq ($(wildcard src/$n.erl),)
$(error Error: src/$n.erl already exists)
endif
ifdef in
$(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
else
$(verbose) mkdir -p $(C_SRC_DIR) src/
$(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
$(call render_template,bs_erl_nif,src/$n.erl)
endif
# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
# This file is part of erlang.mk and subject to the terms of the ISC License.
@ -5977,10 +6090,17 @@ else
BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
endif
# Rebuild templates when the Makefile changes.
$(DTL_FILES): $(MAKEFILE_LIST)
ifneq ($(words $(DTL_FILES)),0)
# Rebuild everything when the Makefile changes.
$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
@if test -f $@; then \
touch $(DTL_FILES); \
fi
@touch $@
ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
endif
ebin/$(PROJECT).app:: $(DTL_FILES)
$(if $(strip $?),\
$(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))