Merge pull request #1975 from tonytheodore/updater

Makefile: add generic updater function
This commit is contained in:
Tony Theodore 2017-11-18 16:25:44 +11:00 committed by GitHub
commit ee36fd0550
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 48 deletions

View File

@ -784,50 +784,6 @@ clean-pkg:
clean-junk: clean-pkg
rm -rf $(LOG_DIR) $(call TMP_DIR,*)
COMPARE_VERSIONS = $(strip \
$(if $($(1)_BRANCH),$(call seq,$($(1)_VERSION),$(2)),\
$(filter $(2),$(shell printf '$($(1)_VERSION)\n$(2)' | $(SORT) -V | head -1))))
.PHONY: update
define UPDATE
$(if $(2),
$(if $(filter $($(1)_IGNORE),$(2)),
$(info IGNORED $(1) $(2)),
$(if $(COMPARE_VERSIONS),
$(if $(filter $(2),$($(1)_VERSION)),
$(info . $(1) $(2)),
$(info OLD $(1) $($(1)_VERSION) --> $(2) ignoring)),
$(info NEW $(1) $($(1)_VERSION) --> $(2))
$(if $(findstring undefined, $(origin UPDATE_DRYRUN)),
$(SED) -i 's/^\([^ ]*_VERSION *:=\).*/\1 $(2)/' '$($(1)_MAKEFILE)'
$(MAKE) -f '$(MAKEFILE)' 'update-checksum-$(1)' \
|| { $(SED) -i 's/^\([^ ]*_VERSION *:=\).*/\1 $($(1)_VERSION)/' '$($(1)_MAKEFILE)'; \
exit 1; }))),
$(info Unable to update version number of package $(1) \
$(newline)$(newline)$($(1)_UPDATE)$(newline)))
endef
update:
$(foreach PKG,$(PKGS),\
$(and $($(PKG)_UPDATE),$(call UPDATE,$(PKG),$(shell $($(PKG)_UPDATE)))))
update-package-%:
$(if $(call set_is_member,$*,$(PKGS)), \
$(and $($*_UPDATE),$(call UPDATE,$*,$(shell $($*_UPDATE)))), \
$(error Package $* not found))
@echo -n
check-update-package-%: UPDATE_DRYRUN = true
check-update-package-%: update-package-% ;
update-checksum-%: MXE_NO_BACKUP_DL = true
update-checksum-%: SKIP_CHECHSUM = true
update-checksum-%:
$(if $(call set_is_member,$*,$(PKGS)), \
$(call DOWNLOAD_PKG_ARCHIVE,$*) && \
$(SED) -i 's/^\([^ ]*_CHECKSUM *:=\).*/\1 '"`$(call PKG_CHECKSUM,$*)`"'/' '$($*_MAKEFILE)', \
$(error Package $* not found))
.PHONY: cleanup-style
define CLEANUP_STYLE
@$(SED) ' \
@ -965,6 +921,6 @@ docs/packages.json: $(foreach 1,$(PKGS),$(PKG_MAKEFILES))
@echo ' "": null' >> $@
@echo '}' >> $@
# for patch-tool-mxe
# for other mxe functions
include patch.mk
include updates.mk

View File

@ -47,9 +47,18 @@ $(PKG)_URL := %(file_url_template)s
UPDATE = r'''
define $(PKG)_UPDATE
echo 'TODO: write update script for %(name)s.' >&2;
echo $(%(name)s_VERSION)
$(call GET_LATEST_VERSION, %(update_url_template)s)
endef
# $(call GET_LATEST_VERSION, base url[, prefix, ext, filter, separator])
# base url : required page returning list of versions
# e.g https://ftp.gnu.org/gnu/libfoo
# prefix : segment before version
# defaults to lastword of url with dash i.e. `libfoo-`
# ext : segment ending version - default `\.tar`
# filter : `grep -i` filter-out pattern - default alpha\|beta\|rc
# separator: transform char to `.` - typically `_`
# test with make check-update-package-%(name)s and delete comments
'''
CMAKE_BUILD = r'''
@ -177,6 +186,7 @@ def make_skeleton(
filename = get_filename(file_url)
filename_template = filename.replace(version, '$($(PKG)_VERSION)')
file_url_template = file_url.replace(version, '$($(PKG)_VERSION)')
update_url_template = file_url.replace('/' + filename,'')
subdir_template = subdir.replace(version, '$($(PKG)_VERSION)')
libname = name
if libname.startswith('lib'):
@ -188,6 +198,7 @@ def make_skeleton(
'libname': libname,
'website': website,
'file_url_template': file_url_template,
'update_url_template': update_url_template,
'gh_conf': gh_conf,
'checksum': checksum,
'version': version,

79
updates.mk Normal file
View File

@ -0,0 +1,79 @@
# This file is part of MXE. See LICENSE.md for licensing information.
# Generic updater
# $(call GET_LATEST_VERSION, base url[, prefix, ext, filter, separator])
# base url : required page returning list of versions
# e.g https://ftp.gnu.org/gnu/libfoo
# prefix : segment before version
# defaults to lastword of url with dash i.e. `libfoo-`
# ext : segment ending version - default `\.tar`
# filter : `grep -i` filter-out pattern - default alpha\|beta\|rc
# separator: transform char to `.` - typically `_`
#
# test changes with:
# make check-get-latest-version
#
# and update tools/skeleton.py with usage notes
define GET_LATEST_VERSION
$(WGET) -q -O- '$(strip $(1))' | \
$(SED) -n 's,.*<a href=".*$(strip $(or $(2),$(lastword $(subst /,$(space),$(1)))-))\([0-9][^"]*\)$(strip $(or $(3),\.tar)).*,\1,p' | \
grep -vi '$(strip $(or $(4),alpha\|beta\|rc))' | \
tr '$(strip $(5))' '.' | \
$(SORT) -V | \
tail -1
endef
ALL_DIRS := $(MXE_PLUGIN_DIRS) $(shell find $(realpath $(TOP_DIR)/plugins) -type d)
GET_LATEST_VERSION_PKGS := $(sort \
$(basename $(notdir $(shell grep -l GET_LATEST_VERSION -r $(ALL_DIRS)))))
.PHONY: check-get-latest-version
check-get-latest-version:
@$(MAKE) -f '$(MAKEFILE)' \
$(addprefix check-update-package-,$(GET_LATEST_VERSION_PKGS)) \
MXE_PLUGIN_DIRS='$(ALL_DIRS)'
COMPARE_VERSIONS = $(strip \
$(if $($(1)_BRANCH),$(call seq,$($(1)_VERSION),$(2)),\
$(filter $(2),$(shell printf '$($(1)_VERSION)\n$(2)' | $(SORT) -V | head -1))))
.PHONY: update
define UPDATE
$(if $(2),
$(if $(filter $($(1)_IGNORE),$(2)),
$(info IGNORED $(1) $(2)),
$(if $(COMPARE_VERSIONS),
$(if $(filter $(2),$($(1)_VERSION)),
$(info . $(1) $(2)),
$(info OLD $(1) $($(1)_VERSION) --> $(2) ignoring)),
$(info NEW $(1) $($(1)_VERSION) --> $(2))
$(if $(findstring undefined, $(origin UPDATE_DRYRUN)),
$(SED) -i 's/^\([^ ]*_VERSION *:=\).*/\1 $(2)/' '$($(1)_MAKEFILE)'
$(MAKE) -f '$(MAKEFILE)' 'update-checksum-$(1)' \
|| { $(SED) -i 's/^\([^ ]*_VERSION *:=\).*/\1 $($(1)_VERSION)/' '$($(1)_MAKEFILE)'; \
exit 1; }))),
$(info Unable to update version number of package $(1) \
$(newline)$(newline)$($(1)_UPDATE)$(newline)))
endef
update:
$(foreach PKG,$(PKGS),\
$(and $($(PKG)_UPDATE),$(call UPDATE,$(PKG),$(shell $($(PKG)_UPDATE)))))
update-package-%:
$(if $(call set_is_member,$*,$(PKGS)), \
$(and $($*_UPDATE),$(call UPDATE,$*,$(shell $($*_UPDATE)))), \
$(error Package $* not found))
@echo -n
check-update-package-%: UPDATE_DRYRUN = true
check-update-package-%: update-package-% ;
update-checksum-%: MXE_NO_BACKUP_DL = true
update-checksum-%: SKIP_CHECHSUM = true
update-checksum-%:
$(if $(call set_is_member,$*,$(PKGS)), \
$(call DOWNLOAD_PKG_ARCHIVE,$*) && \
$(SED) -i 's/^\([^ ]*_CHECKSUM *:=\).*/\1 '"`$(call PKG_CHECKSUM,$*)`"'/' '$($*_MAKEFILE)', \
$(error Package $* not found))