From c04e38ee469ff4f6b00db9b9561af407671a4e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Bj=C3=B6rklund?= Date: Mon, 7 Sep 2020 15:47:31 +0200 Subject: [PATCH 1/2] An attempt to optionally use the compile server in erlc. We use the env var ERLC_USE_SERVER to control the behaviour, since erlc already uses that variable. Although this seems to work fine for our project, I am not sure that it works correctly with files generated from .yrl etc. --- core/erlc.mk | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/core/erlc.mk b/core/erlc.mk index d102cd029..a380ae83c 100644 --- a/core/erlc.mk +++ b/core/erlc.mk @@ -32,8 +32,13 @@ makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d; makedep_verbose_2 = set -x; makedep_verbose = $(makedep_verbose_$(V)) +ifeq ($(ERLC_USE_SERVER), true) +erlc_verbose_0 = @echo " ERLC " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\ + $(filter %.erl %.core,$(^F))); +else erlc_verbose_0 = @echo " ERLC " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\ $(filter %.erl %.core,$(?F))); +endif erlc_verbose_2 = set -x; erlc_verbose = $(erlc_verbose_$(V)) @@ -265,16 +270,25 @@ define makedep.erl endef ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),) + +ifeq ($(ERLC_USE_SERVER), true) +$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST) + erlc -M -MG $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \ + -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1)) $(ERL_FILES) > $@ +else $(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST) $(makedep_verbose) $(call erlang,$(call makedep.erl,$@)) endif +endif + ifeq ($(IS_APP)$(IS_DEP),) -ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0) +ORIG_ERL_FILES = $(filter-out $(GENERATED_ERL_FILES), $(ERL_FILES)) +ifneq ($(words $(ORIG_ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0) # Rebuild everything when the Makefile changes. $(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST) | $(ERLANG_MK_TMP) $(verbose) if test -f $@; then \ - touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \ + touch $(ORIG_ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \ touch -c $(PROJECT).d; \ fi $(verbose) touch $@ @@ -306,9 +320,21 @@ define validate_app_file end endef +ifeq ($(ERLC_USE_SERVER), true) +ebin/%.beam: src/%.erl + $(verbose) mkdir -p $(dir $@) + $(call compile_erl, $<) + +ERL_BEAM_FILES += $(patsubst src/%.erl, ebin/%.beam, $(ERL_FILES)) + +app:: $(ERL_BEAM_FILES) +endif + ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src) $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?)) +ifneq ($(ERLC_USE_SERVER), true) $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE))) +endif # Older git versions do not have the --first-parent flag. Do without in that case. $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null \ || git describe --dirty --abbrev=7 --tags --always 2>/dev/null || true)) From d37687516967849445a27d4512fbe323e33f25f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Bj=C3=B6rklund?= Date: Thu, 29 Oct 2020 20:11:19 +0100 Subject: [PATCH 2/2] keep track of ORIG_ERL_FILES (which doesn't include all generated erl files); ensure .app depends on beam files --- core/erlc.mk | 4 ++++ plugins/eunit.mk | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/erlc.mk b/core/erlc.mk index a380ae83c..dd7715048 100644 --- a/core/erlc.mk +++ b/core/erlc.mk @@ -89,14 +89,17 @@ define app_file endef endif +ifneq ($(ERLC_USE_SERVER), true) app-build: ebin/$(PROJECT).app $(verbose) : +endif # Source files. ALL_SRC_FILES := $(sort $(call core_find,src/,*)) ERL_FILES := $(filter %.erl,$(ALL_SRC_FILES)) +ORIG_ERL_FILES := $(ERL_FILES) CORE_FILES := $(filter %.core,$(ALL_SRC_FILES)) # ASN.1 files. @@ -328,6 +331,7 @@ ebin/%.beam: src/%.erl ERL_BEAM_FILES += $(patsubst src/%.erl, ebin/%.beam, $(ERL_FILES)) app:: $(ERL_BEAM_FILES) +app-build: ebin/$(PROJECT).app $(ERL_BEAM_FILES) endif ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src) diff --git a/plugins/eunit.mk b/plugins/eunit.mk index aa4cc9a6d..647a522ee 100644 --- a/plugins/eunit.mk +++ b/plugins/eunit.mk @@ -42,7 +42,7 @@ eunit: test-build cover-data-dir $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS)) endif else -EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES))) +EUNIT_EBIN_MODS = $(notdir $(basename $(ORIG_ERL_FILES) $(BEAM_FILES))) EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl))) EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \