From 0e1b95fc24b02bd757afaeb3043b71166563d319 Mon Sep 17 00:00:00 2001
From: Tony Theodore <tonyt@logyst.com>
Date: Sat, 25 Nov 2017 19:55:44 +1100
Subject: Improve handling of virtual packages and build messages

  - add metadata to distinguish virtual package types
  - improve build order and status messages for empty packages
        print pkg type or `disabled` instead of `no-build`
  - add BUILD_DRY_RUN option and fixup make -t
  - update build-matrix rule to identify virtual pkgs
---
 Makefile                         | 123 +++++++++++++++++++++++----------------
 docs/assets/build-matrix.css     |   4 ++
 plugins/native/glib2-macports.mk |   1 +
 src/autotools.mk                 |   1 +
 src/googlemock.mk                |   1 +
 src/googletest.mk                |   1 +
 src/mingw-w64.mk                 |   1 +
 src/qt5.mk                       |   1 +
 8 files changed, 84 insertions(+), 49 deletions(-)

diff --git a/Makefile b/Makefile
index 35bcc84..5298506 100644
--- a/Makefile
+++ b/Makefile
@@ -416,21 +416,24 @@ $(PREFIX)/installed/print-git-oneline-$(GIT_HEAD): | $(PREFIX)/installed/.gitkee
 	@rm -f '$(PREFIX)/installed/print-git-oneline-'*
 	@touch '$@'
 
+# distinguish between deliberately empty rules and disabled ones
+VIRTUAL_PKG_TYPES := archive meta
+
 # include files from MXE_PLUGIN_DIRS, set base filenames and `all-<plugin>` target
 PLUGIN_FILES := $(realpath $(wildcard $(addsuffix /*.mk,$(MXE_PLUGIN_DIRS))))
-PLUGIN_PKGS  := $(basename $(notdir $(PLUGIN_FILES)))
+PKGS         := $(sort $(basename $(notdir $(PLUGIN_FILES))))
 $(foreach FILE,$(PLUGIN_FILES),\
     $(eval $(basename $(notdir $(FILE)))_MAKEFILE  ?= $(FILE)) \
     $(eval $(basename $(notdir $(FILE)))_TEST_FILE ?= $(wildcard $(basename $(FILE))-test.*)) \
     $(eval all-$(lastword $(call split,/,$(dir $(FILE)))): $(basename $(notdir $(FILE)))))
 include $(PLUGIN_FILES)
-PKGS := $(sort $(MXE_CONF_PKGS) $(PLUGIN_PKGS))
 
 # create target sets for PKG_TARGET_RULE loop to avoid creating empty rules
 # and having to explicitly disable $(BUILD) for most packages
 CROSS_TARGETS := $(filter-out $(BUILD),$(MXE_TARGETS))
 $(foreach PKG,$(PKGS), \
-    $(foreach TARGET,$(or $(sort $($(PKG)_TARGETS)),$(CROSS_TARGETS)), \
+    $(if $($(PKG)_TARGETS),,$(eval $(PKG)_TARGETS := $(CROSS_TARGETS))) \
+    $(foreach TARGET,$($(PKG)_TARGETS), \
         $(eval $(TARGET)_PKGS += $(PKG)) \
         $(eval FILTERED_PKGS  += $(PKG))))
 
@@ -526,6 +529,7 @@ download-$(1): $(addprefix download-,$($(1)_DEPS)) download-only-$(1)
 # or dependencies (see bfd/binutils openscenegraph/openthreads qwt/qwt_qt4).
 # Use a double-colon rule to allow multiple definitions:
 # https://www.gnu.org/software/make/manual/html_node/Double_002dColon.html
+.PHONY: download-only-$($(1)_FILE)
 download-only-$(1): download-only-$($(1)_FILE)
 download-only-$($(1)_FILE)::
 	$(and $($(1)_URL),
@@ -576,7 +580,7 @@ endif
 
 $(NONET_LIB): $(TOP_DIR)/tools/nonetwork.c | $(PREFIX)/$(BUILD)/lib/.gitkeep
 	@echo '[build nonetwork lib]'
-	@$(BUILD_CC) -shared -fPIC $(NONET_CFLAGS) -o $@ $<
+	+@$(BUILD_CC) -shared -fPIC $(NONET_CFLAGS) -o $@ $<
 
 .PHONY: shell
 shell: $(NONET_LIB)
@@ -597,33 +601,42 @@ $(PREFIX)/$(3)/installed/$(1): $(PKG_MAKEFILES) \
                           $(NONET_LIB) \
                           $(PREFIX)/$(3)/installed/.gitkeep \
                           print-git-oneline
-	@[ -d '$(LOG_DIR)/$(TIMESTAMP)' ] || mkdir -p '$(LOG_DIR)/$(TIMESTAMP)'
-	$(if $(value $(call LOOKUP_PKG_RULE,$(1),BUILD,$(3))),
-	    @$(PRINTF_FMT) '[build]'    '$(1)' '$(3)' | $(RTRIM)
-	,
-	    @$(PRINTF_FMT) '[no-build]' '$(1)' '$(3)' | $(RTRIM)
-	)
 	$(if $(value $(call LOOKUP_PKG_RULE,$(1),MESSAGE,$(3))),
 	    @$(PRINTF_FMT) '[message]'  '$(1)' '$(3) $($(call LOOKUP_PKG_RULE,$(1),MESSAGE,$(3)))' \
 	    | $(RTRIM)
 	)
-	@touch '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)'
-	@ln -sf '$(TIMESTAMP)/$(1)_$(3)' '$(LOG_DIR)/$(1)_$(3)'
-	@if ! (time $(PRELOAD) WINEPREFIX='$(2)/readonly' $(MAKE) -f '$(MAKEFILE)' 'build-only-$(1)_$(3)' WGET=false) &> '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)'; then \
-	    echo; \
-	    echo 'Failed to build package $(1) for target $(3)!'; \
-	    echo '------------------------------------------------------------'; \
-	    $(if $(findstring undefined, $(origin MXE_VERBOSE)),\
-	        tail -n 10 '$(LOG_DIR)/$(1)_$(3)' | $(SED) -n '/./p';, \
-	        $(SED) -n '/./p' '$(LOG_DIR)/$(1)_$(3)';) \
-	    echo '------------------------------------------------------------'; \
-	    echo '[log]      $(LOG_DIR)/$(1)_$(3)'; \
-	    echo; \
-	    exit 1; \
-	fi
 	$(if $(value $(call LOOKUP_PKG_RULE,$(1),BUILD,$(3))),
-	    @$(PRINTF_FMT) '[done]' '$(1)' '$(3)' "`grep -a '^du:.*KiB$$\' '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)' | cut -d ':' -f2 | tail -1`" \
-	                                          "`grep -a '^real.*m.*s$$\' '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)' | tr '\t' ' ' | cut -d ' ' -f2 | tail -1`")
+	    $(if $(BUILD_DRY_RUN), \
+	        @$(PRINTF_FMT) '[dry-run]' '$(1)' '$(3)' | $(RTRIM)
+	        @touch '$(PREFIX)/$(3)/installed/$(1)'
+	    $(else),
+	        @$(PRINTF_FMT) '[build]'    '$(1)' '$(3)' | $(RTRIM)
+	        @[ -d '$(LOG_DIR)/$(TIMESTAMP)' ] || mkdir -p '$(LOG_DIR)/$(TIMESTAMP)'
+	        @touch '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)'
+	        @ln -sf '$(TIMESTAMP)/$(1)_$(3)' '$(LOG_DIR)/$(1)_$(3)'
+	        @if ! (time $(PRELOAD) WINEPREFIX='$(2)/readonly' \
+	               $(MAKE) -f '$(MAKEFILE)' \
+	                   'build-only-$(1)_$(3)' \
+	                   WGET=false \
+	               ) &> '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)'; then \
+	            echo; \
+	            echo 'Failed to build package $(1) for target $(3)!'; \
+	            echo '------------------------------------------------------------'; \
+	            $(if $(findstring undefined, $(origin MXE_VERBOSE)),\
+	                tail -n 10 '$(LOG_DIR)/$(1)_$(3)' | $(SED) -n '/./p';, \
+	                $(SED) -n '/./p' '$(LOG_DIR)/$(1)_$(3)';) \
+	            echo '------------------------------------------------------------'; \
+	            echo '[log]      $(LOG_DIR)/$(1)_$(3)'; \
+	            echo; \
+	            exit 1; \
+	        fi
+	        @$(PRINTF_FMT) '[done]' '$(1)' '$(3)' "`grep -a '^du:.*KiB$$\' '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)' | cut -d ':' -f2 | tail -1`" \
+	                                          "`grep -a '^real.*m.*s$$\' '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)' | tr '\t' ' ' | cut -d ' ' -f2 | tail -1`"
+	    )
+	$(else),
+	    @$(PRINTF_FMT) '[$(or $($(PKG)_TYPE),disabled)]' '$(1)' '$(3)' | $(RTRIM)
+	    @touch '$(PREFIX)/$(3)/installed/$(1)'
+	)
 
 
 .PHONY: build-only-$(1)_$(3)
@@ -867,29 +880,41 @@ docs/build-matrix.html: $(foreach 1,$(PKGS),$(PKG_MAKEFILES))
 #     $(eval $(VIRTUAL_PKGCOUNT += x))
 # vs
 #     $(eval $(VIRTUAL_PKGCOUNT := $(call int_inc,$(VIRTUAL_PKGCOUNT))))
-	@$(foreach PKG,$(PKGS),                      \
-	    $(eval $(PKG)_VIRTUAL := $(true))        \
-	    $(eval $(PKG)_BUILD_ONLY := $(true))     \
-	    echo -e '<tr>\n                          \
-	        <th class="row">$(PKG)</th>\n        \
-	        <td>$(call substr,$($(PKG)_VERSION),1,12)$(if $(call gt,$(call strlen,$($(PKG)_VERSION)),12),&hellip;)</td>\n\
-	    $(foreach TARGET,$(MXE_TARGET_LIST),     \
-	        $(if $(value $(call LOOKUP_PKG_RULE,$(PKG),BUILD,$(TARGET))), \
-	            $(eval $(TARGET)_PKGCOUNT += x) \
-	            $(eval $(PKG)_VIRTUAL := $(false)) \
-	            $(eval $(PKG)_BUILD_ONLY := $(false)) \
-	            <td class="supported">&#x2713;</td>,            \
-	            <td class="unsupported">&#x2717;</td>)\n)       \
-	    $(if $(and $(call set_is_member,$(PKG),$($(BUILD)_PKGS)), \
-	               $(value $(call LOOKUP_PKG_RULE,$(PKG),BUILD,$(BUILD)))), \
-	        $(eval $(PKG)_VIRTUAL := $(false))   \
-	        <td class="supported">&#x2713;</td>, \
-	        <td class="unsupported">&#x2717;</td>)\n \
-	        </tr>\n' >> $@ $(newline)            \
-	    $(if $($(PKG)_VIRTUAL),                  \
-	       $(eval VIRTUAL_PKGCOUNT += x) \
-	        $(eval $(PKG)_BUILD_ONLY := $(false))) \
-	    $(if $($(PKG)_BUILD_ONLY),               \
+	@$(foreach PKG,$(PKGS), \
+	    $(eval $(PKG)_VIRTUAL := $(true)) \
+	    $(eval $(PKG)_BUILD_ONLY := $(true)) \
+	    echo -e '<tr>\n \
+	        <th class="row" \
+	            title="$($(PKG)_MESSAGE)"> \
+	            $(PKG) \
+	            $(if $($(PKG)_TYPE), [$($(PKG)_TYPE)-pkg]) \
+	            $(if $($(PKG)_MESSAGE), **)\
+	        </th>\n \
+	        <td>$(call substr,$($(PKG)_VERSION),1,12) \
+	            $(if $(call gt,$(call strlen,$($(PKG)_VERSION)),12),&hellip;)</td>\n\
+	    $(foreach TARGET,$(MXE_TARGET_LIST), \
+	        $(if $(filter $(VIRTUAL_PKG_TYPES),$($(PKG)_TYPE)), \
+	            $(if $(filter $(TARGET),$($(PKG)_TARGETS)), \
+	                <td class="neutral">&bull;</td>, \
+	                <td></td>), \
+	            $(if $(filter $(TARGET),$($(PKG)_TARGETS)), \
+	                $(if $(value $(call LOOKUP_PKG_RULE,$(PKG),BUILD,$(TARGET))), \
+	                    $(eval $(TARGET)_PKGCOUNT += x) \
+	                    <td class="supported">&#x2713;</td>, \
+	                    <td class="unsupported">&#x2717;</td>),\
+	                	<td></td>))\n) \
+	    $(if $(filter $(VIRTUAL_PKG_TYPES),$($(PKG)_TYPE)), \
+	        $(eval VIRTUAL_PKGCOUNT += x) \
+	        $(if $(filter $(BUILD),$($(PKG)_TARGETS)), \
+	            <td class="neutral">&bull;</td>, \
+	            <td></td>), \
+	        $(if $(filter $(BUILD),$($(PKG)_TARGETS)), \
+	            $(if $(value $(call LOOKUP_PKG_RULE,$(PKG),BUILD,$(BUILD))), \
+	                <td class="supported">&#x2713;</td>, \
+	                <td class="unsupported">&#x2717;</td>), \
+	                <td></td>))\n \
+	        </tr>\n' >> $@ $(newline) \
+	    $(if $(call seq,$(BUILD),$($(PKG)_TARGETS)), \
 	        $(eval BUILD_ONLY_PKGCOUNT += x)))
 	@echo '<tr>'                            >> $@
 	@echo '<th class="row" colspan="2">'    >> $@
diff --git a/docs/assets/build-matrix.css b/docs/assets/build-matrix.css
index 49850b6..fe47d12 100644
--- a/docs/assets/build-matrix.css
+++ b/docs/assets/build-matrix.css
@@ -12,3 +12,7 @@ td.unsupported {
     background-color: #f99;
     text-align: center;
 }
+td.neutral {
+    background-color: #d1d1d1;
+    text-align: center;
+}
diff --git a/plugins/native/glib2-macports.mk b/plugins/native/glib2-macports.mk
index 6e8ae04..3ae26a9 100644
--- a/plugins/native/glib2-macports.mk
+++ b/plugins/native/glib2-macports.mk
@@ -11,6 +11,7 @@ $(PKG)_FILE     := glib2-$($(PKG)_VERSION)_0.darwin_16.x86_64.tbz2
 $(PKG)_URL      := https://packages.macports.org/glib2/glib2-$($(PKG)_VERSION)_0.darwin_16.x86_64.tbz2
 $(PKG)_DEPS     :=
 $(PKG)_TARGETS  := $(BUILD)
+$(PKG)_TYPE     := archive
 
 define $(PKG)_UPDATE
     echo 'manually update glib2-macports as necessary' >&2;
diff --git a/src/autotools.mk b/src/autotools.mk
index 7f200a3..475f912 100644
--- a/src/autotools.mk
+++ b/src/autotools.mk
@@ -6,3 +6,4 @@ $(PKG)_DESCR    := Dependency package to ensure the autotools work
 $(PKG)_VERSION  := 1
 $(PKG)_DEPS     := libtool pkgconf
 $(PKG)_TARGETS  := $(BUILD)
+$(PKG)_TYPE     := meta
diff --git a/src/googlemock.mk b/src/googlemock.mk
index 31d15fd..3bd5e65 100644
--- a/src/googlemock.mk
+++ b/src/googlemock.mk
@@ -9,3 +9,4 @@ $(PKG)_CHECKSUM := 3f20b6acb37e5a98e8c4518165711e3e35d47deb6cdb5a4dd4566563b5efd
 $(PKG)_GH_CONF  := google/googlemock/tags, release-
 $(PKG)_DEPS     :=
 $(PKG)_TARGETS  := $(BUILD) $(MXE_TARGETS)
+$(PKG)_TYPE     := archive
diff --git a/src/googletest.mk b/src/googletest.mk
index f60c44a..d3171a7 100644
--- a/src/googletest.mk
+++ b/src/googletest.mk
@@ -9,3 +9,4 @@ $(PKG)_CHECKSUM := f73a6546fdf9fce9ff93a5015e0333a8af3062a152a9ad6bcb772c9668701
 $(PKG)_GH_CONF  := google/googletest/tags, release-
 $(PKG)_DEPS     :=
 $(PKG)_TARGETS  := $(BUILD) $(MXE_TARGETS)
+$(PKG)_TYPE     := archive
diff --git a/src/mingw-w64.mk b/src/mingw-w64.mk
index f2ec142..87f5ff5 100644
--- a/src/mingw-w64.mk
+++ b/src/mingw-w64.mk
@@ -9,6 +9,7 @@ $(PKG)_CHECKSUM := 2a601db99ef579b9be69c775218ad956a24a09d7dabc9ff6c5bd60da9ccc9
 $(PKG)_SUBDIR   := $(PKG)-v$($(PKG)_VERSION)
 $(PKG)_FILE     := $(PKG)-v$($(PKG)_VERSION).tar.bz2
 $(PKG)_URL      := https://$(SOURCEFORGE_MIRROR)/project/$(PKG)/$(PKG)/$(PKG)-release/$($(PKG)_FILE)
+$(PKG)_TYPE     := archive
 $(PKG)_DEPS     :=
 
 define $(PKG)_UPDATE
diff --git a/src/qt5.mk b/src/qt5.mk
index f26c7c2..ba11a1f 100644
--- a/src/qt5.mk
+++ b/src/qt5.mk
@@ -4,6 +4,7 @@ PKG             := qt5
 $(PKG)_WEBSITE  := https://www.qt.io/
 $(PKG)_DESCR    := Qt
 $(PKG)_VERSION   = $(qtbase_VERSION)
+$(PKG)_TYPE     := meta
 $(PKG)_DEPS     := $(subst qt5, qtbase, \
                       $(patsubst $(dir $(lastword $(MAKEFILE_LIST)))/%.mk,%,\
                           $(shell grep -l 'qtbase_VERSION' \
-- 
cgit v0.12