From 869b6bb684165a9435db03a64458514a6d109309 Mon Sep 17 00:00:00 2001 From: Per Andersson Date: Mon, 24 Jul 2023 00:34:44 +0200 Subject: [PATCH 1/2] Add phony targets for deps when building deterministically The paths for dependencies in the generated dependency Makefiles are removed when using the +deterministic erlc option. This makes subsequent builds fail because the dependency Makefile is read. Adding the -MP erlc option to generate phony targets when building deterministically enables several subsequent builds. Fixes #465 --- applications/chat/src/Makefile.am | 2 +- applications/mail/src/Makefile.am | 2 +- applications/wiki/src/Makefile.am | 2 +- applications/yapp/src/Makefile.am | 2 +- configure.ac | 3 +++ examples/src/Makefile.am | 2 +- include.mk.in | 1 + src/Makefile.am | 2 +- testsuite/Makefile.am | 2 +- www/code/Makefile.am | 2 +- www/shoppingcart/Makefile.am | 2 +- 11 files changed, 13 insertions(+), 9 deletions(-) diff --git a/applications/chat/src/Makefile.am b/applications/chat/src/Makefile.am index 0e63a158b..9da1c5e8f 100644 --- a/applications/chat/src/Makefile.am +++ b/applications/chat/src/Makefile.am @@ -17,7 +17,7 @@ clean-local: $(AM_V_at)rm -f $(EBIN_FILES) $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< diff --git a/applications/mail/src/Makefile.am b/applications/mail/src/Makefile.am index 9d41343a6..6843b93ba 100644 --- a/applications/mail/src/Makefile.am +++ b/applications/mail/src/Makefile.am @@ -17,7 +17,7 @@ clean-local: $(AM_V_at)rm -f $(EBIN_FILES) $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< diff --git a/applications/wiki/src/Makefile.am b/applications/wiki/src/Makefile.am index 7a7c8b2d5..02c07cb99 100644 --- a/applications/wiki/src/Makefile.am +++ b/applications/wiki/src/Makefile.am @@ -29,7 +29,7 @@ clean-local: $(AM_V_at)rm -f $(EBIN_FILES) $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< diff --git a/applications/yapp/src/Makefile.am b/applications/yapp/src/Makefile.am index 98f6e7d29..cbd3d19b4 100644 --- a/applications/yapp/src/Makefile.am +++ b/applications/yapp/src/Makefile.am @@ -61,7 +61,7 @@ $(EBIN_DIR)/yapp.appup: @srcdir@/yapp.appup.src $(AM_V_GEN)sed -e "s/%VSN%/@YAPP_VSN@/g" < $< > $@ $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< diff --git a/configure.ac b/configure.ac index 7840ede4b..9afaf1069 100644 --- a/configure.ac +++ b/configure.ac @@ -97,6 +97,7 @@ DETERMINISTIC_MACRO= if test "x${YAWS_DETERMINISTIC_BUILD}" != "x"; then DEBUGINFO_OR_DETERMINISTIC=+deterministic DETERMINISTIC_MACRO=-DDETERMINISTIC + PHONY_DEPS=-MP fi AC_ARG_ENABLE(deterministic_build, AS_HELP_STRING([--enable-deterministic-build], @@ -104,11 +105,13 @@ AC_ARG_ENABLE(deterministic_build, if test "x${enable_deterministic_build}" = "xyes"; then DEBUGINFO_OR_DETERMINISTIC=+deterministic DETERMINISTIC_MACRO=-DDETERMINISTIC + PHONY_DEPS=-MP YAWS_DETERMINISTIC_BUILD=true fi AC_SUBST(YAWS_DETERMINISTIC_BUILD) AC_SUBST(DETERMINISTIC_MACRO) AC_SUBST(DEBUGINFO_OR_DETERMINISTIC) +AC_SUBST(PHONY_DEPS) if test "x${SOURCE_DATE_EPOCH}" = "x"; then SOURCE_DATE_EPOCH= diff --git a/examples/src/Makefile.am b/examples/src/Makefile.am index 138470f6c..57b060d82 100644 --- a/examples/src/Makefile.am +++ b/examples/src/Makefile.am @@ -18,7 +18,7 @@ include @top_srcdir@/erlang_deps.mk all-local: $(EBIN_FILES) $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< diff --git a/include.mk.in b/include.mk.in index a12cb87fb..f32323e4d 100644 --- a/include.mk.in +++ b/include.mk.in @@ -7,6 +7,7 @@ WARNINGS_AS_ERRORS = -Werror DEBUGINFO_OR_DETERMINISTIC = @DEBUGINFO_OR_DETERMINISTIC@ DETERMINISTIC_MACRO = @DETERMINISTIC_MACRO@ +PHONY_DEPS = @PHONY_DEPS@ SOURCE_DATE_EPOCH ?= @SOURCE_DATE_EPOCH@ ERLC_GENERIC_BASE_FLAGS = $(WARNINGS_AS_ERRORS) $(DEBUG_ERLC_FLAGS) \ diff --git a/src/Makefile.am b/src/Makefile.am index 4032fab7e..3029bb8d0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -132,7 +132,7 @@ $(EBIN_DIR)/yaws.appup: @srcdir@/yaws.appup.src $(AM_V_GEN)sed -e "s/%VSN%/@YAWS_VSN@/g" < $< > $@ $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am index b5259e96b..fbe0b2db6 100644 --- a/testsuite/Makefile.am +++ b/testsuite/Makefile.am @@ -42,7 +42,7 @@ clean-local: $(EBIN_DIR)/%.beam: %.erl $(AM_V_at)$(MKDIR_P) $(shell dirname $@) - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(shell dirname $@) $< distclean-local: diff --git a/www/code/Makefile.am b/www/code/Makefile.am index 05b774943..7d459ac7d 100644 --- a/www/code/Makefile.am +++ b/www/code/Makefile.am @@ -37,7 +37,7 @@ include @top_srcdir@/erlang_deps.mk all-local: $(EBIN_FILES) $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< distclean-local: diff --git a/www/shoppingcart/Makefile.am b/www/shoppingcart/Makefile.am index d480eefd1..b172c1302 100644 --- a/www/shoppingcart/Makefile.am +++ b/www/shoppingcart/Makefile.am @@ -37,7 +37,7 @@ include @top_srcdir@/erlang_deps.mk all-local: $(EBIN_FILES) $(EBIN_DIR)/%.beam: %.erl - $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< + $(AM_V_at)$(ERLC) $(ERLC_FLAGS) -M $(PHONY_DEPS) -MF $(@:$(EBIN_DIR)/%.beam=$(DEPDIR)/%.Pbeam) -MT $@ $< $(AM_V_ERLC)$(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $< distclean-local: From 8f633eed10f2862ff83a851925f2525cbd5a00c2 Mon Sep 17 00:00:00 2001 From: Per Andersson Date: Mon, 24 Jul 2023 00:42:18 +0200 Subject: [PATCH 2/2] Add smoke test to PR for deterministic build --- .github/workflows/main.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0efb4e660..94840d5d0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -49,6 +49,12 @@ jobs: autoreconf -vfi ./configure make all -j4 + - name: Deterministically Build Yaws + run: | + autoreconf -vfi + ./configure --enable-deterministic-build --with-source-date-epoch=$EPOCHSECONDS + make all -j4 + make all -j4 - name: Run test suite run: | make check