From 2b7e434f7327b7fdda72950e27f8fc0a27de2547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?= Date: Tue, 25 Jun 2019 14:18:43 +0200 Subject: Accept a list of deps to forcibly rebuild in `$(FORCE_REBUILD)` ... in addition to the `$(force_rebuild_dep)` function. It's easier for the common use case than specify a function. --- core/deps.mk | 19 +++++++++++++++++++ test/core_deps.mk | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/core/deps.mk b/core/deps.mk index 4146cc0..8c5543a 100644 --- a/core/deps.mk +++ b/core/deps.mk @@ -120,6 +120,25 @@ ifeq ($(IS_APP)$(IS_DEP),) $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log $(ERLANG_MK_TMP)/deps.log endif +# Erlang.mk does not rebuild dependencies after they were compiled +# once. If a developer is working on the top-level project and some +# dependencies at the same time, he may want to change this behavior. +# There are two solutions: +# 1. Set `FULL=1` so that all dependencies are visited and +# recursively recompiled if necessary. +# 2. Set `FORCE_REBUILD=` to the specific list of dependencies that +# should be recompiled (instead of the whole set). + +FORCE_REBUILD ?= + +ifeq ($(origin FULL),undefined) +ifneq ($(strip $(force_rebuild_dep)$(FORCE_REBUILD)),) +define force_rebuild_dep +echo "$(FORCE_REBUILD)" | grep -qw "$$(basename "$1")" +endef +endif +endif + ifneq ($(SKIP_DEPS),) deps:: else diff --git a/test/core_deps.mk b/test/core_deps.mk index dcb84b6..b96af8d 100644 --- a/test/core_deps.mk +++ b/test/core_deps.mk @@ -210,6 +210,36 @@ core-deps-dep-built-force-full: init $t find $(APP)/deps/cowlib -type f -newer $(APP)/EXPECT | grep -v ".git" | sort | diff $(APP)/EXPECT - $t rm $(APP)/EXPECT + $i "Touch one cowlib file to mark it for recompilation" + $t $(SLEEP) + $t touch $(APP)/deps/cowlib/src/cow_http.erl + + $i "Check that cowlib is not rebuilt if \`FORCE_REBUILD\` is empty" + $t touch $(APP)/EXPECT + $t $(SLEEP) + $t $(MAKE) -C $(APP) FORCE_REBUILD= $v + $t find $(APP)/deps/cowlib -type f -newer $(APP)/EXPECT | sort | diff $(APP)/EXPECT - + $t rm $(APP)/EXPECT + + $i "Check that cowlib is not rebuilt if \`FORCE_REBUILD\` does not mention cowlib" + $t touch $(APP)/EXPECT + $t $(SLEEP) + $t $(MAKE) -C $(APP) FORCE_REBUILD='other_dep' $v + $t find $(APP)/deps/cowlib -type f -newer $(APP)/EXPECT | sort | diff $(APP)/EXPECT - + $t rm $(APP)/EXPECT + + $i "Check that cowlib is rebuilt if \`FORCE_REBUILD\` contains cowlib" + $t printf "%s\n" \ + $(APP)/deps/cowlib/cowlib.d \ + $(APP)/deps/cowlib/ebin/cowlib.app \ + $(APP)/deps/cowlib/ebin/cow_http.beam \ + $(APP)/deps/cowlib/ebin/dep_built | sort > $(APP)/EXPECT + $t $(SLEEP) + $t $(MAKE) -C $(APP) FORCE_REBUILD='other_dep cowlib' $v +# Files in .git might end up modified due to the id generation in the .app file. + $t find $(APP)/deps/cowlib -type f -newer $(APP)/EXPECT | grep -v ".git" | sort | diff $(APP)/EXPECT - + $t rm $(APP)/EXPECT + core-deps-dep-built-ln: init $i "Bootstrap a new OTP library named $(APP)" @@ -1015,8 +1045,8 @@ core-deps-dep-makefile-change: init $t $(MAKE) -C $(APP)/my_dep/ -f erlang.mk bootstrap-lib $v $i "Add my_dep to the list of dependencies" -# We use force_rebuild_dep to ensure it gets rebuilt even on Windows. - $t perl -ni.bak -e "print;if ($$.==1) {print \"DEPS = my_dep\ndep_my_dep = ln $(CURDIR)/$(APP)/my_dep/\nforce_rebuild_dep = test \";print '\$$1';print \" = $(CURDIR)/$(APP)/deps/my_dep\n\"}" $(APP)/Makefile +# We use FORCE_REBUILD to ensure it gets rebuilt even on Windows. + $t perl -ni.bak -e "print;if ($$.==1) {print \"DEPS = my_dep\ndep_my_dep = ln $(CURDIR)/$(APP)/my_dep/\nFORCE_REBUILD = my_dep\n\"}" $(APP)/Makefile ifdef LEGACY $i "Add my_dep to the applications key in the .app.src file" -- cgit v1.2.3