aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Sébastien Pédron <[email protected]>2019-06-25 14:18:43 +0200
committerLoïc Hoguin <[email protected]>2019-06-28 14:17:12 +0200
commit2b7e434f7327b7fdda72950e27f8fc0a27de2547 (patch)
tree036973281d96547c12c614f791d99f446dfba86a
parent5e8c5fa7a0e009b7d73b26937ea23f3b685a3f2f (diff)
downloaderlang.mk-2b7e434f7327b7fdda72950e27f8fc0a27de2547.tar.gz
erlang.mk-2b7e434f7327b7fdda72950e27f8fc0a27de2547.tar.bz2
erlang.mk-2b7e434f7327b7fdda72950e27f8fc0a27de2547.zip
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.
-rw-r--r--core/deps.mk19
-rw-r--r--test/core_deps.mk34
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"