deb.mk 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. # all assignemts need to work gracefully even on a non-Debian host
  2. DEBIAN_VERSION = $(shell sed -n '1s/^[^(]*(\([^)]\+\)).*/\1/p' debian/changelog 2>/dev/null || echo "0.0-1")
  3. DEBIAN_UPSTREAM_VERSION = $(shell echo "$(DEBIAN_VERSION)" | cut -f 1 -d -)
  4. DEBIAN_SOURCE_PACKAGE_NAME := $(shell sed -n '1s/^\([^ ]\+\).*/\1/p' debian/changelog 2>/dev/null || echo "unnamed")
  5. DEBIAN_CHANGES_FILE = $(DIR_DEBIAN_BUILD)/$(DEBIAN_SOURCE_PACKAGE_NAME)_$(DEBIAN_VERSION)_$(DEBIAN_BUILD_ARCH).changes
  6. # we can tolerate that "debhelper" is not installed at this moment (no need for warnings)
  7. DEBIAN_BINARY_PACKAGE_NAMES := $(shell dh_listpackages 2>/dev/null || true)
  8. DEBIAN_SIMPLIFIED_PACKAGE_FILES := $(patsubst %,$(DIR_DEBIAN_SIMPLIFIED_PACKAGE_FILES)/%.deb,$(DEBIAN_BINARY_PACKAGE_NAMES))
  9. DEBIAN_BUILD_STAMP = $(DIR_BUILD)/.debian-build-$(BUILD_ID)-$(DEBIAN_BUILD_ARCH).stamp
  10. DEBIAN_SOURCE_ARCHIVE_STAMP = $(DIR_BUILD)/.debian-source-archive-$(BUILD_ID).stamp
  11. DEBIAN_SOURCE_ARCHIVE = $(abspath $(DIR_DIST)/$(DEBIAN_SOURCE_PACKAGE_NAME)_$(DEBIAN_UPSTREAM_VERSION).orig.tar.gz)
  12. # determine the suitable Makefile target for the given Debian package source format
  13. DEBIAN_BUILD_MAKEFILE_TARGET = $(shell grep -qF "(git)" debian/source/format && echo "dist-deb-simple-git-package" || echo "dist-deb-git-submodules-package")
  14. # command and arguments used when calling dpkg-buildpackage
  15. # e.g. "dpkg-buildpackage --no-sign"
  16. DEBIAN_BUILDPACKAGE_COMMAND ?= dpkg-buildpackage
  17. # command and arguments used when uploading the package(s) to a deb repository
  18. # e.g. "dput --unchecked"
  19. DEB_UPLOAD_COMMAND ?= dput
  20. # override this variable for potential git submodule directories
  21. DEBIAN_PACKAGE_SUBMODULE_DIRECTORIES ?=
  22. .PHONY: help
  23. help: help-deb
  24. .PHONY: help-deb
  25. help-deb:
  26. @echo "Debian-specific packaging targets:"
  27. @echo " dist-deb"
  28. @echo " clean-deb"
  29. @echo " upload-deb"
  30. @echo
  31. .PHONY: dist
  32. dist: dist-deb
  33. .PHONY: dist-deb
  34. dist-deb: $(DEBIAN_CHANGES_FILE) $(DEBIAN_BUILD_STAMP)
  35. $(DEBIAN_CHANGES_FILE): Makefile debian/control debian/rules $(DEBIAN_BUILD_STAMP)
  36. $(DEBIAN_BUILD_STAMP):
  37. $(MAKE) "$(DEBIAN_BUILD_MAKEFILE_TARGET)"
  38. mkdir -p "$$(dirname "$(DEBIAN_BUILD_STAMP)")"
  39. touch "$(DEBIAN_BUILD_STAMP)"
  40. .PHONY: prep-source
  41. # double-colon rules allow for multiple independent targets with
  42. # the same name. another makefile may define another target
  43. # with the same name to do pre-source-archive work
  44. prep-source::
  45. true
  46. # Building a debian source archive is required for repositories containing submodules required for
  47. # the build process.
  48. $(DEBIAN_SOURCE_ARCHIVE_STAMP):
  49. $(MAKE) prep-source
  50. mkdir -p "$$(dirname "$(DEBIAN_SOURCE_ARCHIVE)")"
  51. rm -f "$(DEBIAN_SOURCE_ARCHIVE)" "$(basename $(DEBIAN_SOURCE_ARCHIVE))"
  52. git archive --prefix=$(DEBIAN_SOURCE_PACKAGE_NAME)-$(DEBIAN_UPSTREAM_VERSION)/ \
  53. -o "$(basename $(DEBIAN_SOURCE_ARCHIVE))" HEAD
  54. # We also need the code from potential submodules.
  55. # The flags directive ensures that the transform is only applied to regular files and
  56. # hardlinks but not symlinks.
  57. # see https://www.gnu.org/software/tar/manual/html_section/tar_52.html#transform
  58. if [ -n "$(DEBIAN_PACKAGE_SUBMODULE_DIRECTORIES)" ]; then \
  59. tar --append --transform='flags=rSh;s#^#$(DEBIAN_SOURCE_PACKAGE_NAME)-$(DEBIAN_UPSTREAM_VERSION)/#' \
  60. -f "$(basename $(DEBIAN_SOURCE_ARCHIVE))" \
  61. $(DEBIAN_PACKAGE_SUBMODULE_DIRECTORIES); fi
  62. gzip -f "$(basename $(DEBIAN_SOURCE_ARCHIVE))"
  63. mkdir -p "$$(dirname "$(DEBIAN_SOURCE_ARCHIVE_STAMP)")"
  64. touch "$(DEBIAN_SOURCE_ARCHIVE_STAMP)"
  65. .PHONY: dist-deb-git-submodules-package
  66. dist-deb-git-submodules-package: $(DEBIAN_SOURCE_ARCHIVE_STAMP)
  67. $(RM) -r "$(DIR_DEBIAN_BUILD)"
  68. mkdir -p "$(DIR_DEBIAN_BUILD)"
  69. ln -s "$(DEBIAN_SOURCE_ARCHIVE)" "$(DIR_DEBIAN_BUILD)"
  70. tar xzf "$(DEBIAN_SOURCE_ARCHIVE)" -C "$(DIR_DEBIAN_BUILD)"
  71. cd "$(DIR_DEBIAN_BUILD)/$(DEBIAN_SOURCE_PACKAGE_NAME)-$(DEBIAN_UPSTREAM_VERSION)" \
  72. && $(DEBIAN_BUILDPACKAGE_COMMAND)
  73. @# Remove the out-of-tree build directory.
  74. @# It serves no purpose and should not end up in artifacts.
  75. $(RM) -r "$(DIR_DEBIAN_BUILD)/$(DEBIAN_SOURCE_PACKAGE_NAME)-$(DEBIAN_UPSTREAM_VERSION)"
  76. .PHONY: dist-deb-simple-git-package
  77. dist-deb-simple-git-package:
  78. $(DEBIAN_BUILDPACKAGE_COMMAND)
  79. mkdir -p "$(DIR_DEBIAN_BUILD)"
  80. sed -n '/^Files:$$/,/^$$/p' "../$(notdir $(DEBIAN_CHANGES_FILE))" \
  81. | grep "^ " | awk '{print $$5}' | while read fname; do \
  82. mv "../$$fname" "$(DIR_DEBIAN_BUILD)/"; \
  83. done
  84. mv "../$(notdir $(DEBIAN_CHANGES_FILE))" "$(DEBIAN_CHANGES_FILE)"
  85. # copy deb packages created via dpkg-buildpackage to the simplified debian export directory
  86. $(DEBIAN_SIMPLIFIED_PACKAGE_FILES): $(DIR_DEBIAN_SIMPLIFIED_PACKAGE_FILES)/%.deb: $(DEBIAN_BUILD_STAMP)
  87. @mkdir -p "$(DIR_DEBIAN_SIMPLIFIED_PACKAGE_FILES)"
  88. cp $(DIR_DEBIAN_BUILD)/$*_$(DEBIAN_VERSION)_*.deb "$@"
  89. .PHONY: dist-deb-packages-directory
  90. dist-deb-packages-directory: $(DEBIAN_SIMPLIFIED_PACKAGE_FILES)
  91. .PHONY: upload
  92. upload: upload-deb
  93. .PHONY: upload-deb
  94. upload-deb: $(DEBIAN_CHANGES_FILE) check-dput-config
  95. $(DEB_UPLOAD_COMMAND) "$(DEBIAN_UPLOAD_TARGET)" "$(DEBIAN_CHANGES_FILE)"
  96. .PHONY: clean
  97. clean: clean-deb
  98. .PHONY: clean-deb
  99. clean-deb:
  100. @# remove only debhelper-related build files (without calling "make clean")
  101. dh_clean || true