Merge pull request #1134 from LuaAndC/fix-patch-tool

reimplement patch-tool-mxe in Makefile
This commit is contained in:
Tony Theodore 2016-01-09 00:12:24 +11:00
commit 9ed7e2d92e
4 changed files with 108 additions and 105 deletions

View File

@ -45,6 +45,7 @@ REQUIREMENTS := autoconf automake autopoint bash bison bzip2 flex \
PREFIX := $(PWD)/usr
LOG_DIR := $(PWD)/log
GITS_DIR := $(PWD)/gits
GIT_HEAD := $(shell git rev-parse HEAD)
TIMESTAMP := $(shell date +%Y%m%d_%H%M%S)
PKG_DIR := $(PWD)/pkg
@ -154,7 +155,8 @@ endef
PRELOAD_VARS := LD_PRELOAD DYLD_FORCE_FLAT_NAMESPACE DYLD_INSERT_LIBRARIES
# use a minimal whitelist of safe environment variables
ENV_WHITELIST := PATH LANG MAKE% MXE% %PROXY %proxy LD_LIBRARY_PATH $(PRELOAD_VARS) ACLOCAL_PATH
# HOME is needed for ~/.gitconfig for patch-tool-mxe
ENV_WHITELIST := PATH HOME LANG MAKE% MXE% %PROXY %proxy LD_LIBRARY_PATH $(PRELOAD_VARS) ACLOCAL_PATH
unexport $(filter-out $(ENV_WHITELIST),$(shell env | cut -d '=' -f1))
# disable wine with readonly directory (created by mxe-conf)
@ -793,3 +795,7 @@ versions.json: $(foreach PKG,$(PKGS), $(TOP_DIR)/src/$(PKG).mk)
"$($(PKG)_VERSION)",';)} >> $@
@echo ' "": null' >> $@
@echo '}' >> $@
# for patch-tool-mxe
include patch.mk

88
patch.mk Normal file
View File

@ -0,0 +1,88 @@
# This file is part of MXE.
# See index.html for further information.
GIT_DIR = $(if $(patsubst .,,$($(1)_SUBDIR)) \
,$(GITS_DIR)/$($(1)_SUBDIR),$(GITS_DIR)/$(1))
GIT_CMD = git \
--work-tree='$(call GIT_DIR,$(1))' \
--git-dir='$(call GIT_DIR,$(1))'/.git
PATCH_NAME = 1-fixes
# can't use PKG_PATCHES here, because it returns existing patches
# while export-patch creates new patch
PATCH_BY_NAME = $(patsubst %.mk,%-$(2).patch,$(PKG_MAKEFILES))
define INIT_GIT
# unpack to gits/tmp/pkg
rm -rf '$(GITS_DIR)/tmp'
mkdir -p '$(GITS_DIR)/tmp/$(1)'
cd '$(GITS_DIR)/tmp/$(1)' && $(call UNPACK_PKG_ARCHIVE,$(1))
# if PKG_SUBDIR is ".", the following will move gits/tmp/pkg
mv '$(abspath $(GITS_DIR)/tmp/$(1)/$($(1)_SUBDIR))' '$(call GIT_DIR,$(1))'
rm -rf '$(GITS_DIR)/tmp'
# initialize git
$(call GIT_CMD,$(1)) init
$(call GIT_CMD,$(1)) add -A
$(call GIT_CMD,$(1)) commit -m "init"
$(call GIT_CMD,$(1)) tag dist
endef
define IMPORT_PATCH
cd '$(call GIT_DIR,$(1))' \
&& cat '$(2)' \
| sed '/^From/,$$ !d' \
| sed s/'^From: MXE'/"From: fix@me"/'g;' \
| $(call GIT_CMD,$(1)) am --keep-cr ;
endef
define EXPORT_PATCH
cd '$(call GIT_DIR,$(1))' \
&& ( \
echo 'This file is part of MXE.'; \
echo 'See index.html for further information.'; \
echo ''; \
echo 'Contains ad hoc patches for cross building.'; \
echo ''; \
$(call GIT_CMD,$(1)) format-patch \
--no-numbered \
-p \
--no-signature \
--stdout \
--text \
-M9 \
dist..HEAD \
| sed 's/^From [0-9a-f]\{40\} /From 0000000000000000000000000000000000000000 /' \
| sed 's/^index .......\.\......../index 1111111..2222222/' \
) > '$(PATCH_BY_NAME)'
endef
init-git-%: download-only-%
$(if $(call set_is_member,$*,$(PKGS)), \
$(if $(wildcard $(call GIT_DIR,$*)), \
$(error $(call GIT_DIR,$*) already exists), \
$(call INIT_GIT,$*)), \
$(error Package $* not found in index.html))
import-patch-%:
$(if $(call set_is_member,$*,$(PKGS)), \
$(if $(wildcard $(call GIT_DIR,$*)), \
$(call IMPORT_PATCH,$*,$(call PATCH_BY_NAME,$*,$(PATCH_NAME))), \
$(error $(call GIT_DIR,$*) does not exist)), \
$(error Package $* not found in index.html))
import-all-patches-%:
$(if $(call set_is_member,$*,$(PKGS)), \
$(if $(wildcard $(call GIT_DIR,$*)), \
$(foreach PKG_PATCH,$(call PKG_PATCHES,$*), \
$(call IMPORT_PATCH,$*,$(PKG_PATCH))), \
$(error $(call GIT_DIR,$*) does not exist)), \
$(error Package $* not found in index.html))
export-patch-%:
$(if $(call set_is_member,$*,$(PKGS)), \
$(if $(wildcard $(call GIT_DIR,$*)), \
$(call EXPORT_PATCH,$*,$(PATCH_NAME)), \
$(error $(call GIT_DIR,$*) does not exist)), \
$(error Package $* not found in index.html))

View File

@ -800,6 +800,7 @@ local function makeMxeSourcePackage()
'CNAME',
'LICENSE.md',
'Makefile',
'patch.mk',
'README.md',
'assets',
'doc',

View File

@ -10,122 +10,26 @@ patch_name=${3:-1-fixes}
setupEnv() {
# MXE directory
export mxedir=$(cd $(dirname $0) && cd .. && pwd)
# directory for unpacked tarballs/git repos
export gitsdir=${mxedir}/gits
mkdir -p ${gitsdir}
export pkg_version=`grep '^$(PKG)_VERSION' $mxedir/src/$pkg.mk | \
sed 's/.*:= \(.*\)/\1/'`
export pkg_short_version=`echo $pkg_version | sed s/'\(.*\)\.[^.]*$'/'\1'/`
export pkg_subdir=`grep '^$(PKG)_SUBDIR' $mxedir/src/$pkg.mk | \
sed 's/.*:= \(.*\)/\1/' | \
sed s/'$($(PKG)_VERSION)'/$pkg_version/ | \
sed s/'$(call SHORT_PKG_VERSION,$(PKG))'/$pkg_short_version/ | \
sed s/'$(PKG)'/$pkg/;`
export pkg_file=`grep '^$(PKG)_FILE\>' $mxedir/src/$pkg.mk | \
sed 's/.*:= \(.*\)/\1/' | \
sed s/'$($(PKG)_VERSION)'/$pkg_version/ | \
sed s/'$(call SHORT_PKG_VERSION,$(PKG))'/$pkg_short_version/ | \
sed s/'$($(PKG)_SUBDIR)'/$pkg_subdir/ | \
sed s/'$(PKG)'/$pkg/;`
#echo $pkg
#echo $pkg_version
#echo $pkg_subdir
#echo $pkg_file
}
# init
function init_git {
setupEnv
cd $gitsdir
if [ -d $gitsdir/$pkg_subdir ]; then
echo "Error: $gitsdir/$pkg_subdir already exists. Cancelling init." >&2
exit 1
fi
echo "Checking for cached $pkg_file"
if [ ! -f $mxedir/pkg/$pkg_file ]; then
make -C "$mxedir" download-only-$pkg
echo "Building the mxe Makefile target 'download-only-$pkg' to get missing file"
if [ ! $? -eq 0 ]; then
echo "Could not build target download-only-$pkg - cancelling init." >&2
exit 1
fi
fi
echo "Unpacking archive..."
(echo $pkg_file | grep "\.tar\.gz") || (echo $pkg_file | grep "\.tgz") \
>> /dev/null && tar xf $mxedir/pkg/$pkg_file
(echo $pkg_file | grep "\.tar\.bz2") || (echo $pkg_file | grep "\.tbz2") \
>> /dev/null && tar xf $mxedir/pkg/$pkg_file
(echo $pkg_file | grep "\.tar\.xz") || (echo $pkg_file | grep "\.txz") \
>> /dev/null && xz -dc $mxedir/pkg/$pkg_file | tar xf -
echo $pkg_file | grep "\.zip" >> /dev/null && unzip $mxedir/pkg/$pkg_file >> /dev/null
echo "Initializing repo and adding all as first commit"
cd $gitsdir/$pkg_subdir && \
(git init; git add -A; git commit -m "init") > /dev/null
echo "Creating 'dist' tag for distribution tarball state"
git tag dist
echo "Repository ready in $gitsdir/$pkg_subdir"
make -C $mxedir init-git-$pkg
}
function export_patch {
setupEnv
if [ ! -d $gitsdir/$pkg_subdir ]; then
echo "Error: $gitsdir/$pkg_subdir does not exist, so cannot export patches. Cancelling export." >&2
exit 1
fi
cd $gitsdir/$pkg_subdir && \
(
echo 'This file is part of MXE.'
echo 'See index.html for further information.'
echo ''
echo 'Contains ad hoc patches for cross building.'
echo ''
git format-patch \
--no-numbered \
-p \
--no-signature \
--stdout \
--text \
dist..HEAD | \
sed 's/^From [0-9a-f]\{40\} /From 0000000000000000000000000000000000000000 /' | \
sed 's/^index .......\.\......../index 1111111..2222222/'
) > $mxedir/src/${pkg}-${patch_name}.patch && \
echo "Generated ${mxedir}/src/${pkg}-${patch_name}.patch"
make -C $mxedir export-patch-$pkg PATCH_NAME=${patch_name}
}
function import_patch {
setupEnv
if [ ! -d $gitsdir/$pkg_subdir ]; then
echo "Error: $gitsdir/$pkg_subdir does not exist, so cannot import patches. Cancelling import - try 'init' first." >&2
exit 1
fi
make -C $mxedir import-patch-$pkg PATCH_NAME=${patch_name}
}
if [ -f ${mxedir}/src/${pkg}-${patch_name}.patch ]; then
cd $gitsdir/$pkg_subdir && \
cat ${mxedir}/src/${pkg}-${patch_name}.patch | \
sed '/^From/,$ !d' | \
sed s/'^From: MXE'/"From: fix@me"/'g;' | \
git am --keep-cr && \
echo "Imported ${mxedir}/src/${pkg}-${patch_name}.patch"
else
echo "patch file ${mxedir}/src/${pkg}-${patch_name}.patch not found."
echo "Cancelling import." >&2
exit 1
fi
function import_all_patches {
setupEnv
make -C $mxedir import-all-patches-$pkg
}
case "$cmd" in
@ -135,6 +39,9 @@ case "$cmd" in
import)
import_patch $pkg
;;
import-all)
import_all_patches $pkg
;;
export)
export_patch $pkg
;;
@ -145,6 +52,7 @@ case "$cmd" in
where COMMAND is one of:
init - create a git directory for the package with the raw source
import - apply the "pkgname-PATCHNAME.patch" patch commits
import-all - apply commits from all the patches of the package
export - create/replace the "pkgname-PATCHNAME.patch" patch with a patch of all commits since init.
If PATCHNAME is not set, it is default to "1-fixes".