~mgedmin/imgdiff/master

« back to all changes in this revision

Viewing changes to release.mk

  • Committer: Marius Gedminas
  • Date: 2020-10-11 11:02:38 UTC
  • Revision ID: git-v1:75662ff3199877f494df2a6d4beb6e6e69134c33
Cleaned up makefile, added 'make help', newer release.mk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# release.mk version 1.3 (2018-11-03)
 
1
# release.mk version 2.0 (2020-10-11)
2
2
#
3
3
# Helpful Makefile rules for releasing Python packages.
4
4
# https://github.com/mgedmin/python-project-skel
8
8
FILE_WITH_CHANGELOG ?= CHANGES.rst
9
9
CHANGELOG_DATE_FORMAT ?= %Y-%m-%d
10
10
CHANGELOG_FORMAT ?= $(changelog_ver) ($(changelog_date))
 
11
DISTCHECK_DIFF_OPTS ?= $(DISTCHECK_DIFF_DEFAULT_OPTS)
11
12
 
12
13
# These should be fine
13
 
PYTHON ?= python
 
14
PYTHON ?= python3
14
15
PYPI_PUBLISH ?= rm -rf dist && $(PYTHON) setup.py -q sdist bdist_wheel && twine check dist/* && twine upload dist/*
15
16
LATEST_RELEASE_MK_URL = https://raw.githubusercontent.com/mgedmin/python-project-skel/master/release.mk
 
17
DISTCHECK_DIFF_DEFAULT_OPTS = -x PKG-INFO -x setup.cfg -x '*.egg-info' -x .github -I'^\#'
16
18
 
17
19
# These should be fine, as long as you use Git
18
20
VCS_GET_LATEST ?= git pull
25
27
changelog_ver = `$(PYTHON) setup.py --version`
26
28
changelog_date = `LC_ALL=C date +'$(CHANGELOG_DATE_FORMAT)'`
27
29
 
 
30
# Tweaking the look of 'make help'; most of these are awk literals and need the quotes
 
31
HELP_INDENT = ""
 
32
HELP_PREFIX = "make "
 
33
HELP_WIDTH = 24
 
34
HELP_SEPARATOR = " \# "
 
35
HELP_SECTION_SEP = "\n"
 
36
 
 
37
.PHONY: help
 
38
help:
 
39
        @grep -Eh -e '^[a-zA-Z0-9_ -]+:.*?##: .*$$' -e '^##:' $(MAKEFILE_LIST) \
 
40
            | awk 'BEGIN {FS = "(^|:[^#]*)##: "; section=""}; \
 
41
                  /^##:/ {printf "%s%s\n%s", section, $$2, $(HELP_SECTION_SEP); section=$(HELP_SECTION_SEP)} \
 
42
                  /^[^#]/ {printf "%s\033[36m%-$(HELP_WIDTH)s\033[0m%s%s\n", \
 
43
                           $(HELP_INDENT), $(HELP_PREFIX) $$1, $(HELP_SEPARATOR), $$2}'
28
44
 
29
45
.PHONY: dist
30
46
dist:
31
47
        $(PYTHON) setup.py -q sdist bdist_wheel
32
48
 
 
49
# Provide a default 'make check' to be the same as 'make test', since that's
 
50
# what 80% of my projects use, but make it possible to override.  Now
 
51
# overriding Make rules is painful, so instead of a regular rule definition
 
52
# you'll have to override the check_recipe macro.
 
53
.PHONY: check
 
54
check:
 
55
        $(check_recipe)
 
56
 
 
57
ifndef check_recipe
 
58
define check_recipe =
 
59
        @$(MAKE) test
 
60
endef
 
61
endif
 
62
 
33
63
.PHONY: distcheck
34
64
distcheck: distcheck-vcs distcheck-sdist
35
65
 
36
66
.PHONY: distcheck-vcs
37
67
distcheck-vcs:
 
68
ifndef FORCE
38
69
        # Bit of a chicken-and-egg here, but if the tree is unclean, make
39
70
        # distcheck-sdist will fail.
40
 
ifndef FORCE
41
71
        @test -z "`$(VCS_STATUS) 2>&1`" || { echo; echo "Your working tree is not clean:" 1>&2; $(VCS_STATUS) 1>&2; exit 1; }
42
72
endif
43
73
 
44
 
# NB: do not use $(MAKE) because then make -n distcheck will actually run
45
 
# it instead of just printing what it does
 
74
# NB: do not use $(MAKE) in rules with multiple shell commands joined by &&
 
75
# because then make -n distcheck will actually run those instead of just
 
76
# printing what it does
46
77
 
47
78
# TBH this could (and probably should) be replaced by check-manifest
48
79
 
49
80
.PHONY: distcheck-sdist
50
 
distcheck-sdist:
51
 
        make dist
 
81
distcheck-sdist: dist
52
82
        pkg_and_version=`$(PYTHON) setup.py --name`-`$(PYTHON) setup.py --version` && \
53
83
          rm -rf tmp && \
54
84
          mkdir tmp && \
55
85
          $(VCS_EXPORT) && \
56
86
          cd tmp && \
57
87
          tar -xzf ../dist/$$pkg_and_version.tar.gz && \
58
 
          diff -ur $$pkg_and_version tree -x PKG-INFO -x setup.cfg -x '*.egg-info' -I'^#' && \
 
88
          diff -ur $$pkg_and_version tree $(DISTCHECK_DIFF_OPTS) && \
59
89
          cd $$pkg_and_version && \
60
90
          make dist check && \
61
91
          cd .. && \
95
125
            grep -q "^$$ver_and_date$$" $(FILE_WITH_CHANGELOG) || { \
96
126
                echo "$(FILE_WITH_CHANGELOG) has no entry for $$ver_and_date"; exit 1; }
97
127
 
98
 
# NB: do not use $(MAKE) because then make -n releasechecklist will
99
 
# actually run the distcheck instead of just printing what it does
 
128
 
 
129
# NB: the Makefile that includes release.mk may want to add additional
 
130
# dependencies to the releasechecklist target, but I want 'make distcheck' to
 
131
# happen last, so that's why I put it into the recipe and not at the end of the
 
132
# list of dependencies.
100
133
 
101
134
.PHONY: releasechecklist
102
135
releasechecklist: check-latest-rules check-latest-version check-version-number check-long-description check-changelog
103
 
        make distcheck
 
136
        $(MAKE) distcheck
104
137
 
105
138
.PHONY: release
106
 
release: releasechecklist do-release
 
139
release: releasechecklist do-release    ##: prepare a new PyPI release
107
140
 
108
141
.PHONY: do-release
109
142
do-release:
110
143
        $(release_recipe)
111
144
 
 
145
ifndef release_recipe
112
146
define release_recipe =
113
147
        # I'm chicken so I won't actually do these things yet
114
148
        @echo "Please run"
122
156
        @echo '  $(VCS_COMMIT_AND_PUSH)'
123
157
        @echo
124
158
endef
 
159
endif