X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/1f181fae00a9879130ce21ee28c3035773aba744..9db1664fbe7461d7d0a88be682d364e2eb9aec2c:/include/package.mk?ds=inline diff --git a/include/package.mk b/include/package.mk index 2784cc888..e39a6598e 100644 --- a/include/package.mk +++ b/include/package.mk @@ -1,320 +1,266 @@ -# -# Copyright (C) 2006 OpenWrt.org +# +# Copyright (C) 2006-2008 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # -ifneq ($(DUMP),) - all: dumpinfo + +all: $(if $(DUMP),dumpinfo,compile) + +PKG_BUILD_DIR ?= $(BUILD_DIR)/$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION)) +PKG_INSTALL_DIR ?= $(PKG_BUILD_DIR)/ipkg-install +PKG_MD5SUM ?= unknown +PKG_BUILD_PARALLEL ?= + +ifeq ($(strip $(PKG_BUILD_PARALLEL)),0) +PKG_JOBS?=-j1 else - all: compile +PKG_JOBS?=$(if $(PKG_BUILD_PARALLEL)$(CONFIG_PKG_DEFAULT_PARALLEL),\ + $(if $(CONFIG_PKG_BUILD_PARALLEL),-j$(CONFIG_PKG_BUILD_JOBS),-j1),-j1) endif -define Build/DefaultTargets - ifeq ($(DUMP),) - ifneq ($$(shell $(SCRIPT_DIR)/timestamp.pl -p $(PKG_BUILD_DIR) .),$(PKG_BUILD_DIR)) - ifeq ($(CONFIG_AUTOREBUILD),y) - $(PKG_BUILD_DIR)/.prepared: package-clean - endif - endif +include $(INCLUDE_DIR)/prereq.mk +include $(INCLUDE_DIR)/host.mk +include $(INCLUDE_DIR)/unpack.mk +include $(INCLUDE_DIR)/depends.mk - ifneq ($$(shell $(SCRIPT_DIR)/timestamp.pl -p -x ipkg $(IPKG_$(1)) $(PKG_BUILD_DIR)),$(IPKG_$(1))) - ifeq ($(CONFIG_AUTOREBUILD),y) - $(PKG_BUILD_DIR)/.built: package-rebuild - endif - endif +STAMP_NO_AUTOREBUILD=$(wildcard $(PKG_BUILD_DIR)/.no_autorebuild) +PREV_STAMP_PREPARED:=$(if $(STAMP_NO_AUTOREBUILD),$(wildcard $(PKG_BUILD_DIR)/.prepared*)) +ifneq ($(PREV_STAMP_PREPARED),) + STAMP_PREPARED:=$(PREV_STAMP_PREPARED) + CONFIG_AUTOREBUILD:= +else + STAMP_PREPARED=$(PKG_BUILD_DIR)/.prepared$(if $(QUILT)$(DUMP),,_$(shell $(call find_md5,${CURDIR} $(PKG_FILE_DEPENDS),))) +endif +STAMP_CONFIGURED:=$(PKG_BUILD_DIR)/.configured$(if $(DUMP),,_$(call confvar,$(PKG_CONFIG_DEPENDS))) +STAMP_CONFIGURED_WILDCARD=$(patsubst %_$(call confvar,$(PKG_CONFIG_DEPENDS)),%_*,$(STAMP_CONFIGURED)) +STAMP_BUILT:=$(PKG_BUILD_DIR)/.built +STAMP_INSTALLED:=$(STAGING_DIR)/stamp/.$(PKG_NAME)_installed + +STAGING_FILES_LIST:=$(PKG_NAME)$(if $(BUILD_VARIANT),.$(BUILD_VARIANT),).list +ifneq ($(if $(CONFIG_SRC_TREE_OVERRIDE),$(wildcard ./git-src)),) + USE_GIT_TREE:=1 + QUILT:=1 +endif + +include $(INCLUDE_DIR)/download.mk +include $(INCLUDE_DIR)/quilt.mk +include $(INCLUDE_DIR)/package-defaults.mk +include $(INCLUDE_DIR)/package-dumpinfo.mk +include $(INCLUDE_DIR)/package-ipkg.mk +include $(INCLUDE_DIR)/package-bin.mk +include $(INCLUDE_DIR)/autotools.mk + +override MAKEFLAGS= +CONFIG_SITE:=$(INCLUDE_DIR)/site/$(REAL_GNU_TARGET_NAME) +CUR_MAKEFILE:=$(filter-out Makefile,$(firstword $(MAKEFILE_LIST))) +SUBMAKE:=$(NO_TRACE_MAKE) $(if $(CUR_MAKEFILE),-f $(CUR_MAKEFILE)) +PKG_CONFIG_PATH=$(STAGING_DIR)/usr/lib/pkgconfig + +ifeq ($(DUMP)$(filter prereq clean refresh update,$(MAKECMDGOALS)),) + ifneq ($(if $(QUILT),,$(CONFIG_AUTOREBUILD)),) + define Build/Autoclean + $(PKG_BUILD_DIR)/.dep_files: $(STAMP_PREPARED) + $(call rdep,${CURDIR} $(PKG_FILE_DEPENDS),$(STAMP_PREPARED),$(PKG_BUILD_DIR)/.dep_files,-x "*/.dep_*") + $(if $(filter prepare,$(MAKECMDGOALS)),,$(call rdep,$(PKG_BUILD_DIR),$(STAMP_BUILT),,-x "*/.dep_*" -x "*/ipkg*")) + endef endif +endif +ifeq ($(CONFIG_$(PKG_NAME)_USE_CUSTOM_SOURCE_DIR),y) +# disable load stage +PKG_SOURCE_URL:= +# add hook to install a link to customer source path of dedicated package +Hooks/Prepare/Pre += prepare_custom_source_directory +# define empty default action +define Build/Prepare/Default + @: +endef +endif + +define Download/default + FILE:=$(PKG_SOURCE) + URL:=$(PKG_SOURCE_URL) + SUBDIR:=$(PKG_SOURCE_SUBDIR) + PROTO:=$(PKG_SOURCE_PROTO) + $(if $(PKG_SOURCE_MIRROR),MIRROR:=$(filter 1,$(PKG_MIRROR))) + $(if $(PKG_MIRROR_MD5SUM),MIRROR_MD5SUM:=$(PKG_MIRROR_MD5SUM)) + VERSION:=$(PKG_SOURCE_VERSION) + MD5SUM:=$(PKG_MD5SUM) +endef + +ifdef USE_GIT_TREE + define Build/Prepare/Default + mkdir -p $(PKG_BUILD_DIR) + ln -s $(CURDIR)/git-src $(PKG_BUILD_DIR)/.git + ( cd $(PKG_BUILD_DIR); git checkout .) + endef +endif + +define Build/Exports/Default + $(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)) + $(1) : export STAGING_PREFIX=$$(STAGING_DIR)/usr + $(1) : export PATH=$$(TARGET_PATH_PKG) + $(1) : export CONFIG_SITE:=$$(CONFIG_SITE) + $(1) : export PKG_CONFIG_PATH:=$$(PKG_CONFIG_PATH) + $(1) : export PKG_CONFIG_LIBDIR:=$$(PKG_CONFIG_PATH) + $(1) : export CCACHE_DIR:=$(STAGING_DIR)/ccache +endef +Build/Exports=$(Build/Exports/Default) - $(PKG_BUILD_DIR)/.prepared: +define Build/DefaultTargets + $(if $(QUILT),$(Build/Quilt)) + $(if $(USE_GIT_TREE),,$(if $(strip $(PKG_SOURCE_URL)),$(call Download,default))) + $(call Build/Autoclean) + + download: + $(foreach hook,$(Hooks/Download), + $(call $(hook))$(sep) + ) + + $(STAMP_PREPARED) : export PATH=$$(TARGET_PATH_PKG) + $(STAMP_PREPARED): @-rm -rf $(PKG_BUILD_DIR) @mkdir -p $(PKG_BUILD_DIR) - $(call Build/Prepare) + $(foreach hook,$(Hooks/Prepare/Pre),$(call $(hook))$(sep)) + $(Build/Prepare) + $(foreach hook,$(Hooks/Prepare/Post),$(call $(hook))$(sep)) touch $$@ - $(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.prepared - $(call Build/Configure) + $(call Build/Exports,$(STAMP_CONFIGURED)) + $(STAMP_CONFIGURED): $(STAMP_PREPARED) + $(foreach hook,$(Hooks/Configure/Pre),$(call $(hook))$(sep)) + $(Build/Configure) + $(foreach hook,$(Hooks/Configure/Post),$(call $(hook))$(sep)) + rm -f $(STAMP_CONFIGURED_WILDCARD) touch $$@ - $(PKG_BUILD_DIR)/.built: $(PKG_BUILD_DIR)/.configured - $(call Build/Compile) + $(call Build/Exports,$(STAMP_BUILT)) + $(STAMP_BUILT): $(STAMP_CONFIGURED) + $(foreach hook,$(Hooks/Compile/Pre),$(call $(hook))$(sep)) + $(Build/Compile) + $(foreach hook,$(Hooks/Compile/Post),$(call $(hook))$(sep)) + $(Build/Install) + $(foreach hook,$(Hooks/Install/Post),$(call $(hook))$(sep)) touch $$@ - $(STAGING_DIR)/stampfiles/.$(PKG_NAME)-installed: $(PKG_BUILD_DIR)/.built - $(call Build/InstallDev) + $(STAMP_INSTALLED) : export PATH=$$(TARGET_PATH_PKG) + $(STAMP_INSTALLED): $(STAMP_BUILT) + $(SUBMAKE) -j1 clean-staging + rm -rf $(TMP_DIR)/stage-$(PKG_NAME) + mkdir -p $(TMP_DIR)/stage-$(PKG_NAME)/host $(STAGING_DIR)/packages $(STAGING_DIR_HOST)/packages + $(foreach hook,$(Hooks/InstallDev/Pre),\ + $(call $(hook),$(TMP_DIR)/stage-$(PKG_NAME),$(TMP_DIR)/stage-$(PKG_NAME)/host)$(sep)\ + ) + $(call Build/InstallDev,$(TMP_DIR)/stage-$(PKG_NAME),$(TMP_DIR)/stage-$(PKG_NAME)/host) + $(foreach hook,$(Hooks/InstallDev/Post),\ + $(call $(hook),$(TMP_DIR)/stage-$(PKG_NAME),$(TMP_DIR)/stage-$(PKG_NAME)/host)$(sep)\ + ) + if [ -d $(TMP_DIR)/stage-$(PKG_NAME) ]; then \ + (cd $(TMP_DIR)/stage-$(PKG_NAME); find ./ > $(TMP_DIR)/stage-$(PKG_NAME).files); \ + $(call locked, \ + mv $(TMP_DIR)/stage-$(PKG_NAME).files $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) && \ + $(CP) $(TMP_DIR)/stage-$(PKG_NAME)/* $(STAGING_DIR)/; \ + ,staging-dir); \ + fi + rm -rf $(TMP_DIR)/stage-$(PKG_NAME) touch $$@ - + ifdef Build/InstallDev - compile-targets: $(STAGING_DIR)/stampfiles/.$(PKG_NAME)-installed + compile: $(STAMP_INSTALLED) endif - package-clean: FORCE - $(call Build/Clean) - $(call Build/UninstallDev) - rm -f $(STAGING_DIR)/stampfiles/.$(PKG_NAME)-installed - - package-rebuild: FORCE - @-rm -f $(PKG_BUILD_DIR)/.built - define Build/DefaultTargets endef -endef -define Package/Default - CONFIGFILE:= - SECTION:=opt - CATEGORY:=Extra packages - DEPENDS:= - EXTRA_DEPENDS:= - MAINTAINER:=OpenWrt Developers Team - SOURCE:=$(patsubst $(TOPDIR)/%,%,${shell pwd}) - ifneq ($(PKG_VERSION),) - ifneq ($(PKG_RELEASE),) - VERSION:=$(PKG_VERSION)-$(PKG_RELEASE) - else - VERSION:=$(PKG_VERSION) - endif - else - VERSION:=$(PKG_RELEASE) - endif - PKGARCH:=$(ARCH) - PRIORITY:=optional - DEFAULT:= - MENU:= - SUBMENU:= - TITLE:= - DESCRIPTION:= + prepare: $(STAMP_PREPARED) + configure: $(STAMP_CONFIGURED) + dist: $(STAMP_CONFIGURED) + distcheck: $(STAMP_CONFIGURED) endef -define BuildIPKGVariable -pkg_$(subst .,_,$(subst -,_,$(1)))_$(2) = $$(Package/$(1)/$(2)) -export pkg_$(subst .,_,$(subst -,_,$(1))_$(2)) -$(1)_COMMANDS += if [ -n "$$$$$$$$pkg_$(subst .,_,$(subst -,_,$(1)))_$(2)" ]; then echo "$$$$$$$$pkg_$(subst .,_,$(subst -,_,$(1)))_$(2)" > $(2); fi; +define Build/IncludeOverlay + $(eval -include $(wildcard $(TOPDIR)/overlay/*/$(PKG_NAME).mk)) + define Build/IncludeOverlay + endef endef define BuildPackage - $(eval $(call Package/Default)) - $(eval $(call Package/$(1))) + $(Build/IncludeOverlay) + $(eval $(Package/Default)) + $(eval $(Package/$(1))) - $(foreach FIELD, TITLE CATEGORY PRIORITY VERSION, +ifdef DESCRIPTION +$$(error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description) +endif + +ifndef Package/$(1)/description +define Package/$(1)/description + $(TITLE) +endef +endif + + $(foreach FIELD, TITLE CATEGORY PRIORITY SECTION VERSION, ifeq ($($(FIELD)),) $$(error Package/$(1) is missing the $(FIELD) field) endif ) - ifeq ($(PKGARCH),) - PKGARCH:=$(ARCH) - endif - - ifeq ($(DESCRIPTION),) - $(eval DESCRIPTION:=$(TITLE)) - endif - - IPKG_$(1):=$(PACKAGE_DIR)/$(1)_$(VERSION)_$(PKGARCH).ipk - IDIR_$(1):=$(PKG_BUILD_DIR)/ipkg/$(1) - INFO_$(1):=$(IPKG_STATE_DIR)/info/$(1).list - - ifdef Package/$(1)/install - ifeq ($(CONFIG_PACKAGE_$(1)),y) - install-targets: $$(INFO_$(1)) - endif - - ifneq ($(CONFIG_PACKAGE_$(1))$(DEVELOPER),) - compile-targets: $$(IPKG_$(1)) - endif - endif - - ifeq ($(FORCEREBUILD),y) - $$(IPKG_$(1)): FORCE - endif - - IDEPEND_$(1):=$$(strip $$(DEPENDS)) - - DUMPINFO += \ - echo "Package: $(1)"; - - ifneq ($(MENU),) - DUMPINFO += \ - echo "Menu: $(MENU)"; - endif - - ifneq ($(SUBMENU),) - DUMPINFO += \ - echo "Submenu: $(SUBMENU)"; - endif - - ifneq ($(DEFAULT),) - DUMPINFO += \ - echo "Default: $(DEFAULT)"; - endif - - DUMPINFO += \ - echo "Version: $(VERSION)"; \ - echo "Depends: $$(IDEPEND_$(1))"; \ - echo "Build-Depends: $(PKG_BUILDDEP)"; \ - echo "Category: $(CATEGORY)"; \ - echo "Title: $(TITLE)"; \ - echo "Description: $(DESCRIPTION)" | sed -e 's,\\,\n,g'; - - ifneq ($(URL),) - DUMPINFO += \ - echo; \ - echo "$(URL)"; - endif - - DUMPINFO += \ - echo "@@"; - - ifneq ($(CONFIG),) - DUMPINFO += \ - echo "Config: $(CONFIG)" | sed -e 's,\\,\n,g'; \ - echo "@@"; - endif - - $(eval $(call BuildIPKGVariable,$(1),conffiles)) - $(eval $(call BuildIPKGVariable,$(1),preinst)) - $(eval $(call BuildIPKGVariable,$(1),postinst)) - $(eval $(call BuildIPKGVariable,$(1),prerm)) - $(eval $(call BuildIPKGVariable,$(1),postrm)) - $$(IDIR_$(1))/CONTROL/control: Makefile $(PKG_BUILD_DIR)/.prepared - mkdir -p $$(IDIR_$(1))/CONTROL - echo "Package: $(1)" > $$(IDIR_$(1))/CONTROL/control - echo "Version: $(VERSION)" >> $$(IDIR_$(1))/CONTROL/control - ( \ - DEPENDS=; \ - for depend in $$(filter-out @%,$$(IDEPEND_$(1))); do \ - DEPENDS=$$$${DEPENDS:+$$$$DEPENDS, }$$$${depend##+}; \ - done; \ - echo "Depends: $(EXTRA_DEPENDS) $$$$DEPENDS" >> $$(IDIR_$(1))/CONTROL/control; \ - ) - echo "Source: $(SOURCE)" >> $$(IDIR_$(1))/CONTROL/control - echo "Section: $(SECTION)" >> $$(IDIR_$(1))/CONTROL/control - echo "Priority: $(PRIORITY)" >> $$(IDIR_$(1))/CONTROL/control - echo "Maintainer: $(MAINTAINER)" >> $$(IDIR_$(1))/CONTROL/control - echo "Architecture: $(PKGARCH)" >> $$(IDIR_$(1))/CONTROL/control - echo "Description: $(DESCRIPTION)" | sed -e 's,\\,\n ,g' >> $$(IDIR_$(1))/CONTROL/control - chmod 644 $$(IDIR_$(1))/CONTROL/control - (cd $$(IDIR_$(1))/CONTROL; \ - $($(1)_COMMANDS) \ - ) - - $$(IPKG_$(1)): $$(IDIR_$(1))/CONTROL/control $(PKG_BUILD_DIR)/.built - $(call Package/$(1)/install,$$(IDIR_$(1))) - mkdir -p $(PACKAGE_DIR) - -find $$(IDIR_$(1)) -name CVS | xargs rm -rf - -find $$(IDIR_$(1)) -name .svn | xargs rm -rf - -find $$(IDIR_$(1)) -name '.#*' | xargs rm -f - $(RSTRIP) $$(IDIR_$(1)) - $(IPKG_BUILD) $$(IDIR_$(1)) $(PACKAGE_DIR) - - $$(INFO_$(1)): $$(IPKG_$(1)) - $(IPKG) install $$(IPKG_$(1)) - - $(1)-clean: - rm -f $(PACKAGE_DIR)/$(1)_* - - clean: $(1)-clean - - $$(eval $$(call Build/DefaultTargets,$(1))) + $(call shexport,Package/$(1)/description) + $(call shexport,Package/$(1)/config) + $(if $(DUMP), \ + $(Dumpinfo/Package), \ + $(foreach target, \ + $(if $(Package/$(1)/targets),$(Package/$(1)/targets), \ + $(if $(PKG_TARGETS),$(PKG_TARGETS), ipkg) \ + ), $(BuildTarget/$(target)) \ + ) \ + ) + $(if $(PKG_HOST_ONLY)$(DUMP),,$(call Build/DefaultTargets,$(1))) endef -ifneq ($(strip $(PKG_CAT)),) - ifeq ($(PKG_CAT),unzip) - UNPACK=unzip -d $(PKG_BUILD_DIR) $(DL_DIR)/$(PKG_SOURCE) - else - UNPACK=$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(PKG_BUILD_DIR)/.. $(TAR_OPTIONS) - - endif - define Build/Prepare/Default - $(UNPACK) - @if [ -d ./patches ]; then \ - $(PATCH) $(PKG_BUILD_DIR) ./patches; \ - fi - endef -endif - -define Build/Prepare - $(call Build/Prepare/Default) -endef - -define Build/Configure/Default - @(cd $(PKG_BUILD_DIR)/$(3); \ - [ -x configure ] && \ - $(2) \ - $(TARGET_CONFIGURE_OPTS) \ - CFLAGS="$(TARGET_CFLAGS)" \ - CPPFLAGS="-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include" \ - LDFLAGS="-L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib" \ - ./configure \ - --target=$(GNU_TARGET_NAME) \ - --host=$(GNU_TARGET_NAME) \ - --build=$(GNU_HOST_NAME) \ - --program-prefix="" \ - --program-suffix="" \ - --prefix=/usr \ - --exec-prefix=/usr \ - --bindir=/usr/bin \ - --sbindir=/usr/sbin \ - --libexecdir=/usr/lib \ - --sysconfdir=/etc \ - --datadir=/usr/share \ - --localstatedir=/var \ - --mandir=/usr/man \ - --infodir=/usr/info \ - $(DISABLE_NLS) \ - $(1); \ - true; \ - ) -endef - -define Build/Configure - $(call Build/Configure/Default,) +define pkg_install_files + $(foreach install_file,$(1),$(INSTALL_DIR) $(3)/`dirname $(install_file)`; $(INSTALL_DATA) $(2)/$(install_file) $(3)/`dirname $(install_file)`;) endef -define Build/Compile/Default - $(MAKE) -C $(PKG_BUILD_DIR) \ - $(TARGET_CONFIGURE_OPTS) \ - CC=$(TARGET_CC) \ - CROSS="$(TARGET_CROSS)" \ - EXTRA_CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/include -I$(STAGING_DIR)/usr/include" \ - ARCH="$(ARCH)" \ - $(1); +define pkg_install_bin + $(foreach install_apps,$(1),$(INSTALL_DIR) $(3)/`dirname $(install_apps)`; $(INSTALL_BIN) $(2)/$(install_apps) $(3)/`dirname $(install_apps)`;) endef -define Build/Compile - $(call Build/Compile/Default,) -endef +Build/Prepare=$(call Build/Prepare/Default,) +Build/Configure=$(call Build/Configure/Default,) +Build/Compile=$(call Build/Compile/Default,) +Build/Install=$(if $(PKG_INSTALL),$(call Build/Install/Default,)) +Build/Dist=$(call Build/Dist/Default,) +Build/DistCheck=$(call Build/DistCheck/Default,) -ifneq ($(DUMP),) - dumpinfo: FORCE - @$(DUMPINFO) -else - $(PACKAGE_DIR): +$(PACKAGE_DIR): mkdir -p $@ - - ifneq ($(strip $(PKG_SOURCE)),) - source: $(DL_DIR)/$(PKG_SOURCE) - - $(DL_DIR)/$(PKG_SOURCE): - mkdir -p $(DL_DIR) - $(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(PKG_SOURCE)" "$(PKG_MD5SUM)" $(PKG_SOURCE_URL) - - $(PKG_BUILD_DIR)/.prepared: $(DL_DIR)/$(PKG_SOURCE) - endif - - source: - prepare: $(PKG_BUILD_DIR)/.prepared - configure: $(PKG_BUILD_DIR)/.configured - - compile-targets: - compile: compile-targets - - install-targets: - install: install-targets + +dumpinfo: +download: +prepare: +configure: +compile: +install: +clean-staging: FORCE + rm -f $(STAMP_INSTALLED) + @-(\ + cd "$(STAGING_DIR)"; \ + if [ -f packages/$(STAGING_FILES_LIST) ]; then \ + cat packages/$(STAGING_FILES_LIST) | xargs -r rm -f 2>/dev/null; \ + fi; \ + ) - clean-targets: - clean: FORCE - @$(MAKE) clean-targets - $(call Build/Clean) +clean: clean-staging FORCE + $(call Build/UninstallDev,$(STAGING_DIR),$(STAGING_DIR_HOST)) + $(Build/Clean) + rm -f $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) $(STAGING_DIR_HOST)/packages/$(STAGING_FILES_LIST) rm -rf $(PKG_BUILD_DIR) -endif + +dist: + $(Build/Dist) + +distcheck: + $(Build/DistCheck)