D3761: packaging: dynamically define make targets

2018-06-25 Thread indygreg (Gregory Szorc)
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG7f738edc4a27: packaging: dynamically define make targets 
(authored by indygreg, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D3761?vs=9113=9287

REVISION DETAIL
  https://phab.mercurial-scm.org/D3761

AFFECTED FILES
  contrib/packaging/Makefile

CHANGE DETAILS

diff --git a/contrib/packaging/Makefile b/contrib/packaging/Makefile
--- a/contrib/packaging/Makefile
+++ b/contrib/packaging/Makefile
@@ -1,21 +1,44 @@
 $(eval HGROOT := $(shell cd ../..; pwd))
 
+DEBIAN_CODENAMES := \
+  jessie \
+  stretch \
+  buster
+
+UBUNTU_CODENAMES := \
+  trusty \
+  xenial \
+  artful \
+  bionic \
+
+FEDORA_RELEASES := \
+  20 \
+  21
+
+CENTOS_RELEASES := \
+  5 \
+  6 \
+  7
+
+# Build a Python for these CentOS releases.
+CENTOS_WITH_PYTHON_RELEASES := 5 6
+
 help:
@echo 'Packaging Make Targets'
@echo ''
-   @echo 'docker-centos-{5, 6, 7}'
+   @echo 'docker-centos-{$(strip $(CENTOS_RELEASES))}'
@echo '   Build an RPM for a specific CentOS version using Docker.'
@echo ''
-   @echo 'docker-debian-{jessie, stretch}'
+   @echo 'docker-debian-{$(strip $(DEBIAN_CODENAMES))}'
@echo '   Build Debian packages specific to a Debian distro using 
Docker.'
@echo ''
-   @echo 'docker-fedora-{20, 21}'
+   @echo 'docker-fedora-{$(strip $(FEDORA_RELEASES))}'
@echo '   Build an RPM for a specific Fedora version using Docker.'
@echo ''
-   @echo 'docker-ubuntu-{trusty, xenial, artful, bionic}'
+   @echo 'docker-ubuntu-{$(strip $(UBUNTU_CODENAMES))}'
@echo '   Build Debian package specific to an Ubuntu distro using 
Docker.'
@echo ''
-   @echo 'docker-ubuntu-{trusty, xenial, artful, bionic}-ppa'
+   @echo 'docker-ubuntu-{$(strip $(UBUNTU_CODENAMES))}-ppa'
@echo '   Build a source-only Debian package specific to an Ubuntu 
distro'
@echo '   using Docker.'
@echo ''
@@ -31,10 +54,10 @@
@echo 'ppa'
@echo '   Build a Debian source package locally targeting the current 
system'
@echo ''
-   @echo 'centos-{5, 6, 7}'
+   @echo 'centos-{$(strip $(CENTOS_RELEASES))}'
@echo '   Build an RPM for a specific CentOS version locally'
@echo ''
-   @echo 'fedora-{20, 21}'
+   @echo 'fedora-{$(strip $(FEDORA_RELEASES))}'
@echo '   Build an RPM for a specific Fedora version locally'
 
 .PHONY: help
@@ -47,107 +70,66 @@
 ppa:
./builddeb --source-only
 
-.PHONY: docker-debian-jessie
-docker-debian-jessie:
-   ./dockerdeb debian jessie
+# Debian targets.
+define debian_targets =
+.PHONY: docker-debian-$(1)
+docker-debian-$(1):
+   ./dockerdeb debian $(1)
 
-.PHONY: docker-debian-stretch
-docker-debian-stretch:
-   ./dockerdeb debian stretch
+endef
 
-.PHONY: docker-ubuntu-trusty
-docker-ubuntu-trusty:
-   ./dockerdeb ubuntu trusty
+$(foreach codename,$(DEBIAN_CODENAMES),$(eval $(call 
debian_targets,$(codename
 
-.PHONY: docker-ubuntu-trusty-ppa
-docker-ubuntu-trusty-ppa:
-   ./dockerdeb ubuntu trusty --source-only
-
-.PHONY: docker-ubuntu-xenial
-docker-ubuntu-xenial:
-   ./dockerdeb ubuntu xenial
+# Ubuntu targets.
+define ubuntu_targets =
+.PHONY: docker-ubuntu-$(1)
+docker-ubuntu-$(1):
+   ./dockerdeb ubuntu $(1)
 
-.PHONY: docker-ubuntu-xenial-ppa
-docker-ubuntu-xenial-ppa:
-   ./dockerdeb ubuntu xenial --source-only
+.PHONY: docker-ubuntu-$(1)-ppa
+docker-ubuntu-$(1)-ppa:
+   ./dockerdeb ubuntu $(1) --source-only
 
-.PHONY: docker-ubuntu-artful
-docker-ubuntu-artful:
-   ./dockerdeb ubuntu artful
+endef
 
-.PHONY: docker-ubuntu-artful-ppa
-docker-ubuntu-artful-ppa:
-   ./dockerdeb ubuntu artful --source-only
+$(foreach codename,$(UBUNTU_CODENAMES),$(eval $(call 
ubuntu_targets,$(codename
 
-.PHONY: docker-ubuntu-bionic
-docker-ubuntu-bionic:
-   ./dockerdeb ubuntu bionic
-
-.PHONY: docker-ubuntu-bionic-ppa
-docker-ubuntu-bionic-ppa:
-   ./dockerdeb ubuntu bionic --source-only
-
-.PHONY: fedora20
-fedora20:
-   mkdir -p $(HGROOT)/packages/fedora20
+# Fedora targets.
+define fedora_targets =
+.PHONY: fedora$(1)
+fedora$(1):
+   mkdir -p $$(HGROOT)/packages/fedora$(1)
./buildrpm
-   cp $(HGROOT)/rpmbuild/RPMS/*/* $(HGROOT)/packages/fedora20
-   cp $(HGROOT)/rpmbuild/SRPMS/* $(HGROOT)/packages/fedora20
+   cp $$(HGROOT)/rpmbuild/RPMS/*/* $$(HGROOT)/packages/fedora$(1)
+   cp $$(HGROOT)/rpmbuild/SRPMS/* $$(HGROOT)/packages/fedora$(1)
rm -rf $(HGROOT)/rpmbuild
 
-.PHONY: docker-fedora20
-docker-fedora20:
-   mkdir -p $(HGROOT)/packages/fedora20
-   ./dockerrpm fedora20
+.PHONY: docker-fedora$(1)
+docker-fedora$(1):
+   mkdir -p $$(HGROOT)/packages/fedora($1)
+   ./dockerrpm fedora$(1)
 
-.PHONY: fedora21
-fedora21:
-   mkdir -p $(HGROOT)/packages/fedora21
-   ./buildrpm
- 

D3761: packaging: dynamically define make targets

2018-06-16 Thread indygreg (Gregory Szorc)
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We currently have make boilerplate for each instance of a distro's
  release. This is redundant, annoying to maintain, and prone to errors.
  
  This commit defines variables holding available releases for
  various distros. We then iterate through the list and dynamically
  define make targets.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D3761

AFFECTED FILES
  contrib/packaging/Makefile

CHANGE DETAILS

diff --git a/contrib/packaging/Makefile b/contrib/packaging/Makefile
--- a/contrib/packaging/Makefile
+++ b/contrib/packaging/Makefile
@@ -1,21 +1,44 @@
 $(eval HGROOT := $(shell cd ../..; pwd))
 
+DEBIAN_CODENAMES := \
+  jessie \
+  stretch \
+  buster
+
+UBUNTU_CODENAMES := \
+  trusty \
+  xenial \
+  artful \
+  bionic \
+
+FEDORA_RELEASES := \
+  20 \
+  21
+
+CENTOS_RELEASES := \
+  5 \
+  6 \
+  7
+
+# Build a Python for these CentOS releases.
+CENTOS_WITH_PYTHON_RELEASES := 5 6
+
 help:
@echo 'Packaging Make Targets'
@echo ''
-   @echo 'docker-centos-{5, 6, 7}'
+   @echo 'docker-centos-{$(strip $(CENTOS_RELEASES))}'
@echo '   Build an RPM for a specific CentOS version using Docker.'
@echo ''
-   @echo 'docker-debian-{jessie, stretch}'
+   @echo 'docker-debian-{$(strip $(DEBIAN_CODENAMES))}'
@echo '   Build Debian packages specific to a Debian distro using 
Docker.'
@echo ''
-   @echo 'docker-fedora-{20, 21}'
+   @echo 'docker-fedora-{$(strip $(FEDORA_RELEASES))}'
@echo '   Build an RPM for a specific Fedora version using Docker.'
@echo ''
-   @echo 'docker-ubuntu-{trusty, xenial, artful, bionic}'
+   @echo 'docker-ubuntu-{$(strip $(UBUNTU_CODENAMES))}'
@echo '   Build Debian package specific to an Ubuntu distro using 
Docker.'
@echo ''
-   @echo 'docker-ubuntu-{trusty, xenial, artful, bionic}-ppa'
+   @echo 'docker-ubuntu-{$(strip $(UBUNTU_CODENAMES))}-ppa'
@echo '   Build a source-only Debian package specific to an Ubuntu 
distro'
@echo '   using Docker.'
@echo ''
@@ -31,10 +54,10 @@
@echo 'ppa'
@echo '   Build a Debian source package locally targeting the current 
system'
@echo ''
-   @echo 'centos-{5, 6, 7}'
+   @echo 'centos-{$(strip $(CENTOS_RELEASES))}'
@echo '   Build an RPM for a specific CentOS version locally'
@echo ''
-   @echo 'fedora-{20, 21}'
+   @echo 'fedora-{$(strip $(FEDORA_RELEASES))}'
@echo '   Build an RPM for a specific Fedora version locally'
 
 .PHONY: help
@@ -47,107 +70,66 @@
 ppa:
./builddeb --source-only
 
-.PHONY: docker-debian-jessie
-docker-debian-jessie:
-   ./dockerdeb debian jessie
+# Debian targets.
+define debian_targets =
+.PHONY: docker-debian-$(1)
+docker-debian-$(1):
+   ./dockerdeb debian $(1)
 
-.PHONY: docker-debian-stretch
-docker-debian-stretch:
-   ./dockerdeb debian stretch
+endef
 
-.PHONY: docker-ubuntu-trusty
-docker-ubuntu-trusty:
-   ./dockerdeb ubuntu trusty
+$(foreach codename,$(DEBIAN_CODENAMES),$(eval $(call 
debian_targets,$(codename
 
-.PHONY: docker-ubuntu-trusty-ppa
-docker-ubuntu-trusty-ppa:
-   ./dockerdeb ubuntu trusty --source-only
-
-.PHONY: docker-ubuntu-xenial
-docker-ubuntu-xenial:
-   ./dockerdeb ubuntu xenial
+# Ubuntu targets.
+define ubuntu_targets =
+.PHONY: docker-ubuntu-$(1)
+docker-ubuntu-$(1):
+   ./dockerdeb ubuntu $(1)
 
-.PHONY: docker-ubuntu-xenial-ppa
-docker-ubuntu-xenial-ppa:
-   ./dockerdeb ubuntu xenial --source-only
+.PHONY: docker-ubuntu-$(1)-ppa
+docker-ubuntu-$(1)-ppa:
+   ./dockerdeb ubuntu $(1) --source-only
 
-.PHONY: docker-ubuntu-artful
-docker-ubuntu-artful:
-   ./dockerdeb ubuntu artful
+endef
 
-.PHONY: docker-ubuntu-artful-ppa
-docker-ubuntu-artful-ppa:
-   ./dockerdeb ubuntu artful --source-only
+$(foreach codename,$(UBUNTU_CODENAMES),$(eval $(call 
ubuntu_targets,$(codename
 
-.PHONY: docker-ubuntu-bionic
-docker-ubuntu-bionic:
-   ./dockerdeb ubuntu bionic
-
-.PHONY: docker-ubuntu-bionic-ppa
-docker-ubuntu-bionic-ppa:
-   ./dockerdeb ubuntu bionic --source-only
-
-.PHONY: fedora20
-fedora20:
-   mkdir -p $(HGROOT)/packages/fedora20
+# Fedora targets.
+define fedora_targets =
+.PHONY: fedora$(1)
+fedora$(1):
+   mkdir -p $$(HGROOT)/packages/fedora$(1)
./buildrpm
-   cp $(HGROOT)/rpmbuild/RPMS/*/* $(HGROOT)/packages/fedora20
-   cp $(HGROOT)/rpmbuild/SRPMS/* $(HGROOT)/packages/fedora20
+   cp $$(HGROOT)/rpmbuild/RPMS/*/* $$(HGROOT)/packages/fedora$(1)
+   cp $$(HGROOT)/rpmbuild/SRPMS/* $$(HGROOT)/packages/fedora$(1)
rm -rf $(HGROOT)/rpmbuild
 
-.PHONY: docker-fedora20
-docker-fedora20:
-   mkdir -p $(HGROOT)/packages/fedora20
-   ./dockerrpm fedora20
+.PHONY: docker-fedora$(1)
+docker-fedora$(1):
+   mkdir -p