summaryrefslogtreecommitdiffstats
path: root/patch.mk
blob: c036784d4e4fe1e15975dea4a6604e8e70c24518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# This file is part of MXE. See LICENSE.md for licensing 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'
    # rename existing .git directories if any
    find '$(call GIT_DIR,$(1))' -name .git -prune -exec sh -c 'mv "$$0" "$$0"_' {} \;
    # 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. See LICENSE.md for licensing 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))

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))

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))

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))