release.mk 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. PROJECT_NAME ?= project
  2. # versioning
  3. BUMP_VERSION_CONFIG ?= .bumpversion.cfg
  4. # allow missing "patch" number
  5. BUMP_VERSION_PARSE_REGEX = (?P<major>\d+)\.(?P<minor>\d+)(?:\.(?P<patch>\d+))?
  6. CURRENT_VERSION_FILE ?= VERSION
  7. DIR_RELEASE_ARCHIVES ?= .
  8. RELEASE_TAR_COMPRESSION_BIN = gzip
  9. ifeq ($(RELEASE_TAR_COMPRESSION_BIN),gzip)
  10. RELEASE_TAR_COMPRESSION_EXTENSION = gz
  11. else ifeq ($(RELEASE_TAR_COMPRESSION_BIN),bzip2)
  12. RELEASE_TAR_COMPRESSION_EXTENSION = bz2
  13. else ifeq ($(RELEASE_TAR_COMPRESSION_BIN),xz)
  14. RELEASE_TAR_COMPRESSION_EXTENSION = xz
  15. else
  16. $(error Invalid RELEASE_TAR_COMPRESSION specified: should be one of gzip / bzip2 / xz)
  17. endif
  18. RELEASE_TAR_FILENAME = $(DIR_RELEASE_ARCHIVES)/$(PROJECT_NAME)-$(call get_current_version).tar.$(RELEASE_TAR_COMPRESSION_EXTENSION)
  19. RELEASE_TAR_SIGN_FILENAME = $(RELEASE_TAR_FILENAME).asc
  20. RELEASE_TAR_HASH_FUNC ?= sha256sum
  21. RELEASE_TAR_HASH_FILENAME = $(RELEASE_TAR_FILENAME).$(RELEASE_TAR_HASH_FUNC)
  22. IS_VERSION_WITH_BUMPVERSION = $(wildcard $(BUMP_VERSION_CONFIG))
  23. IS_VERSION_WITH_GIT = $(wildcard .git)
  24. IS_VERSION_WITH_DEB = $(wildcard debian/changelog)
  25. # assemble the list of files to be committed during "make release-*"
  26. BUMP_VERSION_FILES ?= $(BUMP_VERSION_CONFIG)
  27. ifneq ($(IS_VERSION_WITH_BUMPVERSION),)
  28. BUMP_VERSION_FILES += $(shell sed -n 's/^\[bumpversion:file:\(.*\)\]$$/\1/p' "$(BUMP_VERSION_CONFIG)")
  29. else
  30. BUMP_VERSION_FILES =
  31. endif
  32. ifneq ($(IS_VERSION_WITH_DEB),)
  33. BUMP_VERSION_FILES += debian/changelog
  34. endif
  35. define IS_RELEASE_CURRENT_COMMIT_TEST =
  36. [ "$$(git show -s --format=%H "v$(call get_current_version)^{commit}" --)" = "$$(git show -s --format=%H)" ]
  37. endef
  38. get_current_version = $(shell if ! cat "$(CURRENT_VERSION_FILE)" 2>/dev/null; then echo >&2 "Missing '$(CURRENT_VERSION_FILE)' file (see variable 'CURRENT_VERSION_FILE)'"; echo "unknown"; fi)
  39. .PHONY: help
  40. help: help-release
  41. .PHONY: help-release
  42. help-release:
  43. @echo "Release-related packaging targets:"
  44. @echo " release-major"
  45. @echo " release-minor"
  46. @echo " release-patch"
  47. @echo " release-undo"
  48. @echo " release-push"
  49. @echo " release-tar"
  50. @echo " release-tar-sign"
  51. @echo
  52. release-major: VERSION_BUMP=major
  53. release-minor: VERSION_BUMP=minor
  54. release-patch: VERSION_BUMP=patch
  55. .PHONY: release-major release-minor release-patch
  56. release-major release-minor release-patch: release-generic
  57. .PHONY: release-generic
  58. # prevent duplicate tags for successive commits
  59. release-generic:: | release-check-current-commit-is-not-release
  60. ifneq ($(IS_VERSION_WITH_BUMPVERSION),)
  61. release-generic:: | release-bumpversion
  62. endif
  63. ifneq ($(IS_VERSION_WITH_DEB),)
  64. release-generic:: | release-debchange
  65. endif
  66. # take care for the ordering: 'release-git' needs to run before '-debchange' and '-bumpversion'
  67. ifneq ($(IS_VERSION_WITH_GIT),)
  68. release-generic:: release-git
  69. endif
  70. .PHONY: release-check-current-commit-is-not-release
  71. release-check-current-commit-is-not-release:
  72. @$(IS_RELEASE_CURRENT_COMMIT_TEST) && { echo >&2 "ERROR: current commit is a release"; false; } || true
  73. .PHONY: release-check-current-commit-is-release
  74. release-check-current-commit-is-release:
  75. @$(IS_RELEASE_CURRENT_COMMIT_TEST) || { echo >&2 "ERROR: current commit is not a release"; false; }
  76. .PHONY: release-bumpversion
  77. release-bumpversion:
  78. @if [ ! -e "$(BUMP_VERSION_CONFIG)" ]; then \
  79. echo >&2 "Configuration file '$(BUMP_VERSION_CONFIG)' missing"; \
  80. exit 1; \
  81. fi
  82. @# bump version without committing (done after updating debian/changelog)
  83. @bumpversion --config-file "$(BUMP_VERSION_CONFIG)" \
  84. --parse "$(BUMP_VERSION_PARSE_REGEX)" \
  85. --current-version "$(call get_current_version)" \
  86. "$(VERSION_BUMP)"
  87. .PHONY: release-debchange
  88. release-debchange:
  89. debchange --newversion "$(call get_current_version)-1" "New upstream release"
  90. debchange --release ""
  91. .PHONY: release-git
  92. release-git:
  93. if [ -n "$(BUMP_VERSION_FILES)" ]; then git add $(BUMP_VERSION_FILES); fi
  94. @# add other version-related files
  95. git add $(BUMP_VERSION_COMMIT_FILES)
  96. git commit -m "Bump version: $$(git show "HEAD:$(CURRENT_VERSION_FILE)") -> $(call get_current_version)"
  97. git tag -a "v$(call get_current_version)" -m "Bump version: $(VERSION_BUMP)"
  98. .PHONY: release-undo
  99. release-undo: release-check-current-commit-is-release
  100. $(IS_RELEASE_CURRENT_COMMIT_TEST)
  101. [ -z "$$(git status -s)" ]; # refuse to run in a non-clean working directory
  102. git tag -d "v$(call get_current_version)"
  103. git reset --hard HEAD~
  104. .PHONY: release-push
  105. release-push:
  106. git push --follow-tags
  107. .PHONY: release-tar
  108. release-tar: $(RELEASE_TAR_FILENAME) $(RELEASE_TAR_HASH_FILENAME)
  109. $(RELEASE_TAR_FILENAME):
  110. $(IS_RELEASE_CURRENT_COMMIT_TEST)
  111. git archive --prefix=$(PROJECT_NAME)-$(RELEASE)/ --format=tar HEAD \
  112. | "$(RELEASE_TAR_COMPRESSION_BIN)" > "$(RELEASE_TAR_FILENAME).tmp"
  113. mv "$(RELEASE_TAR_FILENAME).tmp" "$(RELEASE_TAR_FILENAME)"
  114. $(RELEASE_TAR_HASH_FILENAME): $(RELEASE_TAR_FILENAME)
  115. $(RELEASE_TAR_HASH_FUNC) "$<" >"$@"
  116. .PHONY: release-tar-sign
  117. release-tar-sign: $(RELEASE_TAR_SIGN_FILENAME)
  118. $(RELEASE_TAR_SIGN_FILENAME): $(RELEASE_TAR_FILENAME)
  119. gpg --armor --detach-sign --sign "$<"