1# 2# Copyright (C) 2006-2008 OpenWrt.org 3# 4# This is free software, licensed under the GNU General Public License v2. 5# See /LICENSE for more information. 6# 7 8__package_mk:=1 9 10all: $(if $(DUMP),dumpinfo,compile) 11 12include $(INCLUDE_DIR)/download.mk 13 14PKG_BUILD_DIR ?= $(BUILD_DIR)/$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION)) 15PKG_INSTALL_DIR ?= $(PKG_BUILD_DIR)/ipkg-install 16PKG_BUILD_PARALLEL ?= 17PKG_USE_MIPS16 ?= 1 18PKG_IREMAP ?= 1 19 20ifneq ($(CONFIG_PKG_BUILD_USE_JOBSERVER),) 21 MAKE_J:=$(if $(MAKE_JOBSERVER),$(MAKE_JOBSERVER) $(if $(filter 3.% 4.0 4.1,$(MAKE_VERSION)),-j)) 22else 23 MAKE_J:=-j$(CONFIG_PKG_BUILD_JOBS) 24endif 25 26ifeq ($(strip $(PKG_BUILD_PARALLEL)),0) 27PKG_JOBS?=-j1 28else 29PKG_JOBS?=$(if $(PKG_BUILD_PARALLEL)$(CONFIG_PKG_DEFAULT_PARALLEL),\ 30 $(if $(CONFIG_PKG_BUILD_PARALLEL),$(MAKE_J),-j1),-j1) 31endif 32ifdef CONFIG_USE_MIPS16 33 ifeq ($(strip $(PKG_USE_MIPS16)),1) 34 TARGET_ASFLAGS_DEFAULT = $(filter-out -mips16 -minterlink-mips16,$(TARGET_CFLAGS)) 35 TARGET_CFLAGS += -mips16 -minterlink-mips16 36 endif 37endif 38ifeq ($(strip $(PKG_IREMAP)),1) 39 IREMAP_CFLAGS = $(call iremap,$(PKG_BUILD_DIR),$(notdir $(PKG_BUILD_DIR))) 40 TARGET_CFLAGS += $(IREMAP_CFLAGS) 41endif 42 43include $(INCLUDE_DIR)/hardening.mk 44include $(INCLUDE_DIR)/prereq.mk 45include $(INCLUDE_DIR)/host.mk 46include $(INCLUDE_DIR)/unpack.mk 47include $(INCLUDE_DIR)/depends.mk 48 49find_library_dependencies = $(wildcard $(patsubst %,$(STAGING_DIR)/pkginfo/%.version, \ 50 $(filter-out $(BUILD_PACKAGES),$(foreach dep, \ 51 $(filter-out @%, $(patsubst +%,%,$(1))), \ 52 $(if $(findstring :,$(dep)), \ 53 $(word 2,$(subst :,$(space),$(dep))), \ 54 $(dep) \ 55 ) \ 56 )))) 57 58PKG_DIR_NAME:=$(lastword $(subst /,$(space),$(CURDIR))) 59STAMP_NO_AUTOREBUILD=$(wildcard $(PKG_BUILD_DIR)/.no_autorebuild) 60PREV_STAMP_PREPARED:=$(if $(STAMP_NO_AUTOREBUILD),$(wildcard $(PKG_BUILD_DIR)/.prepared*)) 61ifneq ($(PREV_STAMP_PREPARED),) 62 STAMP_PREPARED:=$(PREV_STAMP_PREPARED) 63 CONFIG_AUTOREBUILD:= 64else 65 STAMP_PREPARED=$(PKG_BUILD_DIR)/.prepared$(if $(QUILT)$(DUMP),,_$(shell $(call find_md5,${CURDIR} $(PKG_FILE_DEPENDS),))$(call confvar,$(PKG_PREPARED_DEPENDS))) 66endif 67STAMP_CONFIGURED=$(PKG_BUILD_DIR)/.configured$(if $(DUMP),,_$(call confvar,$(PKG_CONFIG_DEPENDS))) 68STAMP_CONFIGURED_WILDCARD=$(patsubst %_$(call confvar,$(PKG_CONFIG_DEPENDS)),%_*,$(STAMP_CONFIGURED)) 69STAMP_BUILT:=$(PKG_BUILD_DIR)/.built 70STAMP_INSTALLED:=$(STAGING_DIR)/stamp/.$(PKG_DIR_NAME)$(if $(BUILD_VARIANT),.$(BUILD_VARIANT),)_installed 71 72STAGING_FILES_LIST:=$(PKG_DIR_NAME)$(if $(BUILD_VARIANT),.$(BUILD_VARIANT),).list 73 74define CleanStaging 75 rm -f $(STAMP_INSTALLED) 76 @-(\ 77 cd "$(STAGING_DIR)"; \ 78 if [ -f packages/$(STAGING_FILES_LIST) ]; then \ 79 cat packages/$(STAGING_FILES_LIST) | xargs -r rm -f 2>/dev/null; \ 80 fi; \ 81 ) 82endef 83 84ifneq ($(if $(CONFIG_SRC_TREE_OVERRIDE),$(wildcard ./git-src)),) 85 USE_GIT_TREE:=1 86 QUILT:=1 87endif 88ifdef USE_SOURCE_DIR 89 QUILT:=1 90endif 91ifneq ($(wildcard $(PKG_BUILD_DIR)/.source_dir),) 92 QUILT:=1 93endif 94 95PKG_INSTALL_STAMP:=$(PKG_INFO_DIR)/$(PKG_DIR_NAME).$(if $(BUILD_VARIANT),$(BUILD_VARIANT),default).install 96 97include $(INCLUDE_DIR)/quilt.mk 98include $(INCLUDE_DIR)/package-defaults.mk 99include $(INCLUDE_DIR)/package-dumpinfo.mk 100include $(INCLUDE_DIR)/package-ipkg.mk 101include $(INCLUDE_DIR)/package-bin.mk 102include $(INCLUDE_DIR)/autotools.mk 103 104override MAKEFLAGS= 105CONFIG_SITE:=$(INCLUDE_DIR)/site/$(ARCH) 106CUR_MAKEFILE:=$(filter-out Makefile,$(firstword $(MAKEFILE_LIST))) 107SUBMAKE:=$(NO_TRACE_MAKE) $(if $(CUR_MAKEFILE),-f $(CUR_MAKEFILE)) 108PKG_CONFIG_PATH=$(STAGING_DIR)/usr/lib/pkgconfig:$(STAGING_DIR)/usr/share/pkgconfig 109unexport QUIET CONFIG_SITE 110 111ifeq ($(DUMP)$(filter prereq clean refresh update,$(MAKECMDGOALS)),) 112 ifneq ($(if $(QUILT),,$(CONFIG_AUTOREBUILD)),) 113 define Build/Autoclean 114 $(PKG_BUILD_DIR)/.dep_files: $(STAMP_PREPARED) 115 $(call rdep,${CURDIR} $(PKG_FILE_DEPENDS),$(STAMP_PREPARED),$(PKG_BUILD_DIR)/.dep_files,-x "*/.dep_*") 116 $(if $(filter prepare,$(MAKECMDGOALS)),,$(call rdep,$(PKG_BUILD_DIR),$(STAMP_BUILT),,-x "*/.dep_*" -x "*/ipkg*")) 117 endef 118 endif 119endif 120 121ifdef USE_GIT_TREE 122 define Build/Prepare/Default 123 mkdir -p $(PKG_BUILD_DIR) 124 ln -s $(CURDIR)/git-src $(PKG_BUILD_DIR)/.git 125 ( cd $(PKG_BUILD_DIR); git checkout .) 126 endef 127endif 128ifdef USE_SOURCE_DIR 129 define Build/Prepare/Default 130 rm -rf $(PKG_BUILD_DIR) 131 $(if $(wildcard $(USE_SOURCE_DIR)/*),,@echo "Error: USE_SOURCE_DIR=$(USE_SOURCE_DIR) path not found"; false) 132 ln -snf $(USE_SOURCE_DIR) $(PKG_BUILD_DIR) 133 touch $(PKG_BUILD_DIR)/.source_dir 134 endef 135endif 136 137define Build/Exports/Default 138 $(1) : export ACLOCAL_INCLUDE=$$(foreach p,$$(wildcard $$(STAGING_DIR)/usr/share/aclocal $$(STAGING_DIR)/usr/share/aclocal-* $$(STAGING_DIR)/host/share/aclocal $$(STAGING_DIR)/host/share/aclocal-*),-I $$(p)) 139 $(1) : export STAGING_PREFIX=$$(STAGING_DIR)/usr 140 $(1) : export PATH=$$(TARGET_PATH_PKG) 141 $(1) : export CONFIG_SITE:=$$(CONFIG_SITE) 142 $(1) : export PKG_CONFIG_PATH:=$$(PKG_CONFIG_PATH) 143 $(1) : export PKG_CONFIG_LIBDIR:=$$(PKG_CONFIG_PATH) 144 $(1) : export CCACHE_DIR:=$(STAGING_DIR)/ccache 145endef 146Build/Exports=$(Build/Exports/Default) 147 148define Build/DefaultTargets 149 $(if $(QUILT),$(Build/Quilt)) 150 $(if $(USE_SOURCE_DIR)$(USE_GIT_TREE),,$(if $(strip $(PKG_SOURCE_URL)),$(call Download,default))) 151 $(call Build/Autoclean) 152 153 download: 154 $(foreach hook,$(Hooks/Download), 155 $(call $(hook))$(sep) 156 ) 157 158 $(STAMP_PREPARED) : export PATH=$$(TARGET_PATH_PKG) 159 $(STAMP_PREPARED): 160 @-rm -rf $(PKG_BUILD_DIR) 161 @mkdir -p $(PKG_BUILD_DIR) 162 $(foreach hook,$(Hooks/Prepare/Pre),$(call $(hook))$(sep)) 163 $(Build/Prepare) 164 $(foreach hook,$(Hooks/Prepare/Post),$(call $(hook))$(sep)) 165 touch $$@ 166 167 $(call Build/Exports,$(STAMP_CONFIGURED)) 168 $(STAMP_CONFIGURED): $(STAMP_PREPARED) 169 $(CleanStaging) 170 $(foreach hook,$(Hooks/Configure/Pre),$(call $(hook))$(sep)) 171 $(Build/Configure) 172 $(foreach hook,$(Hooks/Configure/Post),$(call $(hook))$(sep)) 173 rm -f $(STAMP_CONFIGURED_WILDCARD) 174 touch $$@ 175 176 $(call Build/Exports,$(STAMP_BUILT)) 177 $(STAMP_BUILT): $(STAMP_CONFIGURED) 178 $(foreach hook,$(Hooks/Compile/Pre),$(call $(hook))$(sep)) 179 $(Build/Compile) 180 $(foreach hook,$(Hooks/Compile/Post),$(call $(hook))$(sep)) 181 $(Build/Install) 182 $(foreach hook,$(Hooks/Install/Post),$(call $(hook))$(sep)) 183 touch $$@ 184 185 $(STAMP_INSTALLED) : export PATH=$$(TARGET_PATH_PKG) 186 $(STAMP_INSTALLED): $(STAMP_BUILT) 187 rm -rf $(TMP_DIR)/stage-$(PKG_DIR_NAME) 188 mkdir -p $(TMP_DIR)/stage-$(PKG_DIR_NAME)/host $(STAGING_DIR)/packages $(STAGING_DIR_HOST)/packages 189 $(foreach hook,$(Hooks/InstallDev/Pre),\ 190 $(call $(hook),$(TMP_DIR)/stage-$(PKG_DIR_NAME),$(TMP_DIR)/stage-$(PKG_DIR_NAME)/host)$(sep)\ 191 ) 192 $(call Build/InstallDev,$(TMP_DIR)/stage-$(PKG_DIR_NAME),$(TMP_DIR)/stage-$(PKG_DIR_NAME)/host) 193 $(foreach hook,$(Hooks/InstallDev/Post),\ 194 $(call $(hook),$(TMP_DIR)/stage-$(PKG_DIR_NAME),$(TMP_DIR)/stage-$(PKG_DIR_NAME)/host)$(sep)\ 195 ) 196 if [ -f $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) ]; then \ 197 $(SCRIPT_DIR)/clean-package.sh \ 198 "$(STAGING_DIR)/packages/$(STAGING_FILES_LIST)" \ 199 "$(STAGING_DIR)"; \ 200 fi 201 if [ -d $(TMP_DIR)/stage-$(PKG_DIR_NAME) ]; then \ 202 (cd $(TMP_DIR)/stage-$(PKG_DIR_NAME); find ./ > $(TMP_DIR)/stage-$(PKG_DIR_NAME).files); \ 203 $(call locked, \ 204 mv $(TMP_DIR)/stage-$(PKG_DIR_NAME).files $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) && \ 205 $(CP) $(TMP_DIR)/stage-$(PKG_DIR_NAME)/* $(STAGING_DIR)/; \ 206 ,staging-dir); \ 207 fi 208 rm -rf $(TMP_DIR)/stage-$(PKG_DIR_NAME) 209 touch $$@ 210 211 ifdef Build/InstallDev 212 compile: $(STAMP_INSTALLED) 213 endif 214 215 define Build/DefaultTargets 216 endef 217 218 prepare: $(STAMP_PREPARED) 219 configure: $(STAMP_CONFIGURED) 220 dist: $(STAMP_CONFIGURED) 221 distcheck: $(STAMP_CONFIGURED) 222endef 223 224define Build/IncludeOverlay 225 $(eval -include $(wildcard $(TOPDIR)/overlay/*/$(PKG_DIR_NAME).mk)) 226 define Build/IncludeOverlay 227 endef 228endef 229 230define BuildPackage 231 $(Build/IncludeOverlay) 232 $(eval $(Package/Default)) 233 $(eval $(Package/$(1))) 234 235ifdef DESCRIPTION 236$$(error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description) 237endif 238 239ifndef Package/$(1)/description 240define Package/$(1)/description 241 $(TITLE) 242endef 243endif 244 245 BUILD_PACKAGES += $(1) 246 $(STAMP_PREPARED): $$(if $(QUILT)$(DUMP),,$(call find_library_dependencies,$(DEPENDS))) 247 248 $(foreach FIELD, TITLE CATEGORY SECTION VERSION, 249 ifeq ($($(FIELD)),) 250 $$(error Package/$(1) is missing the $(FIELD) field) 251 endif 252 ) 253 254 $(if $(DUMP), \ 255 $(Dumpinfo/Package), \ 256 $(foreach target, \ 257 $(if $(Package/$(1)/targets),$(Package/$(1)/targets), \ 258 $(if $(PKG_TARGETS),$(PKG_TARGETS), ipkg) \ 259 ), $(BuildTarget/$(target)) \ 260 ) \ 261 ) 262 $(if $(PKG_HOST_ONLY)$(DUMP),,$(call Build/DefaultTargets,$(1))) 263endef 264 265define pkg_install_files 266 $(foreach install_file,$(1),$(INSTALL_DIR) $(3)/`dirname $(install_file)`; $(INSTALL_DATA) $(2)/$(install_file) $(3)/`dirname $(install_file)`;) 267endef 268 269define pkg_install_bin 270 $(foreach install_apps,$(1),$(INSTALL_DIR) $(3)/`dirname $(install_apps)`; $(INSTALL_BIN) $(2)/$(install_apps) $(3)/`dirname $(install_apps)`;) 271endef 272 273Build/Prepare=$(call Build/Prepare/Default,) 274Build/Configure=$(call Build/Configure/Default,) 275Build/Compile=$(call Build/Compile/Default,) 276Build/Install=$(if $(PKG_INSTALL),$(call Build/Install/Default,)) 277Build/Dist=$(call Build/Dist/Default,) 278Build/DistCheck=$(call Build/DistCheck/Default,) 279 280.NOTPARALLEL: 281 282.PHONY: prepare-package-install 283prepare-package-install: 284 @mkdir -p $(PKG_INFO_DIR) 285 @touch $(PKG_INSTALL_STAMP).clean 286 @echo "$(filter-out essential,$(PKG_FLAGS))" > $(PKG_INSTALL_STAMP).flags 287 288$(PACKAGE_DIR): 289 mkdir -p $@ 290 291dumpinfo: 292download: 293prepare: 294configure: 295compile: prepare-package-install 296install: compile 297 298clean: FORCE 299 $(CleanStaging) 300 $(call Build/UninstallDev,$(STAGING_DIR),$(STAGING_DIR_HOST)) 301 $(Build/Clean) 302 rm -f $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) $(STAGING_DIR_HOST)/packages/$(STAGING_FILES_LIST) 303 rm -rf $(PKG_BUILD_DIR) 304 305dist: 306 $(Build/Dist) 307 308distcheck: 309 $(Build/DistCheck) 310