1# 2# Copyright (C) 2007-2009 OpenWrt.org 3# 4# This is free software, licensed under the GNU General Public License v2. 5# See /LICENSE for more information. 6 7ifneq ($(if $(DUMP),1,$(__quilt_inc)),1) 8__quilt_inc:=1 9 10ifeq ($(TARGET_BUILD),1) 11 PKG_BUILD_DIR:=$(LINUX_DIR)/sourcecode 12endif 13PATCH_DIR?=./patches 14FILES_DIR?=./files 15HOST_PATCH_DIR?=$(PATCH_DIR) 16HOST_FILES_DIR?=$(FILES_DIR) 17 18ifeq ($(MAKECMDGOALS),refresh) 19 override QUILT=1 20endif 21 22QUILT_CMD:=quilt --quiltrc=- 23 24define filter_series 25sed -e s,\\\#.*,, $(1) | grep -E \[a-zA-Z0-9\] 26endef 27 28define PatchDir/Quilt 29 @mkdir -p "$(1)/patches$(if $(3),/$(patsubst %/,%,$(3)))" 30 @if [ -s "$(2)/series" ]; then \ 31 mkdir -p "$(1)/patches/$(3)"; \ 32 cp "$(2)/series" "$(1)/patches/$(3)"; \ 33 fi 34 @for patch in $$$$( (cd "$(2)" && if [ -f series ]; then $(call filter_series,series); else ls | sort; fi; ) 2>/dev/null ); do ( \ 35 cp "$(2)/$$$$patch" "$(1)/patches/$(3)"; \ 36 echo "$(3)$$$$patch" >> "$(1)/patches/series"; \ 37 ); done 38 $(if $(3),@echo $(3) >> "$(1)/patches/.subdirs") 39endef 40 41define PatchDir/Default 42 @if [ -d "$(2)" ] && [ "$$$$(ls $(2) | wc -l)" -gt 0 ]; then \ 43 export PATCH="$(PATCH)"; \ 44 if [ -s "$(2)/series" ]; then \ 45 $(call filter_series,$(2)/series) | xargs -n1 \ 46 $(KPATCH) "$(1)" "$(2)"; \ 47 else \ 48 $(KPATCH) "$(1)" "$(2)"; \ 49 fi; \ 50 fi 51endef 52 53define PatchDir 54$(call PatchDir/$(if $(strip $(QUILT)),Quilt,Default),$(strip $(1)),$(strip $(2)),$(strip $(3))) 55endef 56 57define HostPatchDir 58$(call PatchDir/$(if $(strip $(HOST_QUILT)),Quilt,Default),$(strip $(1)),$(strip $(2)),$(strip $(3))) 59endef 60 61ifneq ($(PKG_BUILD_DIR),) 62 QUILT?=$(if $(wildcard $(PKG_BUILD_DIR)/.quilt_used),y) 63 ifneq ($(QUILT),) 64 STAMP_CHECKED:=$(PKG_BUILD_DIR)/.quilt_checked 65 override CONFIG_AUTOREBUILD= 66 quilt-check: $(STAMP_CHECKED) 67 endif 68endif 69 70ifneq ($(HOST_BUILD_DIR),) 71 HOST_QUILT?=$(if $(findstring command,$(origin QUILT)),$(QUILT),$(if $(wildcard $(HOST_BUILD_DIR)/.quilt_used),y)) 72 ifneq ($(HOST_QUILT),) 73 HOST_STAMP_CHECKED:=$(HOST_BUILD_DIR)/.quilt_checked 74 override CONFIG_AUTOREBUILD= 75 host-quilt-check: $(HOST_STAMP_CHECKED) 76 endif 77endif 78 79define Host/Patch/Default 80 $(if $(HOST_QUILT),rm -rf $(HOST_BUILD_DIR)/patches; mkdir -p $(HOST_BUILD_DIR)/patches) 81 $(call HostPatchDir,$(HOST_BUILD_DIR),$(HOST_PATCH_DIR),) 82 $(if $(HOST_QUILT),touch $(HOST_BUILD_DIR)/.quilt_used) 83endef 84 85define Build/Patch/Default 86 $(if $(QUILT),rm -rf $(PKG_BUILD_DIR)/patches; mkdir -p $(PKG_BUILD_DIR)/patches) 87 $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR),) 88 $(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used) 89endef 90 91kernel_files=$(foreach fdir,$(GENERIC_FILES_DIR) $(FILES_DIR),$(fdir)/.) 92define Kernel/Patch/Default 93 rm -rf $(PKG_BUILD_DIR)/patches; mkdir -p $(PKG_BUILD_DIR)/patches 94 if [ -d ./files ]; then $(CP) ./files/* $(LINUX_DIR)/; fi 95 case $(CUSTOMER) in \ 96 dni) \ 97 ;; \ 98 netgear) \ 99 ;; \ 100 *) \ 101 $(if $(kernel_files),$(CP) $(kernel_files) $(LINUX_DIR)/); \ 102 find $(LINUX_DIR)/ -name \*.rej -or -name \*.orig | $(XARGS) rm -f; \ 103 ;; \ 104 esac 105 $(call PatchGenericDir,$(PKG_BUILD_DIR),$(GENERIC_PATCH_DIR),$(CUSTOMER)) 106 $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR),platform/) 107endef 108 109define Quilt/RefreshDir 110 mkdir -p $(2) 111 -rm -f $(2)/* 2>/dev/null >/dev/null 112 @( \ 113 for patch in $$$$($(if $(3),grep "^$(3)",cat) $(1)/patches/series | awk '{print $$$$1}'); do \ 114 $(CP) -v "$(1)/patches/$$$$patch" $(2); \ 115 done; \ 116 ) 117endef 118 119define Quilt/Refresh/Host 120 $(call Quilt/RefreshDir,$(HOST_BUILD_DIR),$(PATCH_DIR)) 121endef 122 123define Quilt/Refresh/Package 124 $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)) 125endef 126 127define Quilt/Refresh/Kernel 128 @[ -z "$$(grep -v '^generic/' $(PKG_BUILD_DIR)/patches/series | grep -v '^platform/')" ] || { \ 129 echo "All kernel patches must start with either generic/ or platform/"; \ 130 false; \ 131 } 132 $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(GENERIC_PATCH_DIR),generic/) 133 $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR),platform/) 134endef 135 136define Quilt/Template 137 $($(2)STAMP_CONFIGURED): $($(2)STAMP_CHECKED) 138 $(if $(NO_RECONFIGURE),$($(2)STAMP_BUILT),$($(2)STAMP_CONFIGURED)): FORCE 139 $($(2)STAMP_CHECKED): $($(2)STAMP_PREPARED) 140 if [ -s "$(1)/patches/series" ]; then \ 141 (cd "$(1)"; \ 142 if $(QUILT_CMD) next >/dev/null 2>&1; then \ 143 $(QUILT_CMD) push -a; \ 144 else \ 145 $(QUILT_CMD) top >/dev/null 2>&1; \ 146 fi \ 147 ); \ 148 fi 149 touch "$$@" 150 151 $(3)quilt-check: $($(2)STAMP_PREPARED) FORCE 152 @[ -f "$(1)/.quilt_used" ] || { \ 153 echo "The source directory was not unpacked using quilt. Please rebuild with QUILT=1"; \ 154 false; \ 155 } 156 @[ -f "$(1)/patches/series" ] || { \ 157 echo "The source directory contains no quilt patches."; \ 158 false; \ 159 } 160 @[ -n "$$$$(ls $(1)/patches/series)" -o "$$$$(cat $(1)/patches/series | md5sum)" = "$$(sort $(1)/patches/series | md5sum)" ] || { \ 161 echo "The patches are not sorted in the right order. Please fix."; \ 162 false; \ 163 } 164 165 $(3)refresh: $(3)quilt-check 166 @cd "$(1)"; $(QUILT_CMD) pop -a -f >/dev/null 2>/dev/null 167 @cd "$(1)"; while $(QUILT_CMD) next 2>/dev/null >/dev/null && $(QUILT_CMD) push; do \ 168 QUILT_DIFF_OPTS="-p" $(QUILT_CMD) refresh -p ab --no-index --no-timestamps; \ 169 done; ! $(QUILT_CMD) next 2>/dev/null >/dev/null 170 $(Quilt/Refresh/$(4)) 171 172 $(3)update: $(3)quilt-check 173 $(Quilt/Refresh/$(4)) 174endef 175 176Build/Quilt=$(call Quilt/Template,$(PKG_BUILD_DIR),,,$(if $(TARGET_BUILD),Kernel,Package)) 177Host/Quilt=$(call Quilt/Template,$(HOST_BUILD_DIR),HOST_,host-,Host) 178 179endif 180