diff options
Diffstat (limited to 'package/Makefile.autotools.in')
-rw-r--r-- | package/Makefile.autotools.in | 363 |
1 files changed, 363 insertions, 0 deletions
diff --git a/package/Makefile.autotools.in b/package/Makefile.autotools.in new file mode 100644 index 000000000..a6d356ffa --- /dev/null +++ b/package/Makefile.autotools.in @@ -0,0 +1,363 @@ +################################################################################ +# +# Makefile.autotools.in -- +# +# Implicit and Generated Rules for easily creating autotools-compatible +# buildroot packages +# +## Example minimal makefile for a package named 'foo' +# +# | FOO_VERSION = 1.0 +# | FOO_SOURCE = foo-$(FOO_VERSION).tar.gz +# | FOO_SITE = http://www.libfoo.org/dist +# | $(eval $(call AUTOTARGETS,foo)) +# +## The following targets can be called from the shell: +# +# foo, foo-source, foo-patch, foo-configure, foo-build, foo-install, +# foo-install-target, foo-install-staging, foo-uninstall, foo-clean, +# foo-dirclean +# +## The following variables which can be (re)defined in the package makefile: +# +# FOO_VERSION [mandatory] +# version string of the package +# FOO_SOURCE [default foo-$(FOO_VERSION).tar.gz] +# file name of the package source +# FOO_SITE [default sourceforge project "foo"] +# URL under wich $(FOO_SOURCE) can be found +# FOO_DEPENDANCIES [default empty] +# list of (package) targets that must be built before foo +# FOO_AUTORECONF [YES/NO, default NO] +# run <autoreconf> before <configure> +# FOO_CONF_ENV [default empty] +# environment passed to the <configure> script +# FOO_CONF_OPT [default empty] +# arguments passed to the <configure> script +# FOO_MAKE_ENV [default empty] +# environment passed to all calls to <make> in the package source +# directory +# FOO_MAKE_OPT [default empty] +# arguments passed to <make> while building +# FOO_INSTALL_STAGING [YES/NO, default NO] +# install the package to the staging directory +# FOO_INSTALL_TARGET [YES/NO, default YES] +# install the package to the target directory +# FOO_INSTALL_STAGING_OPT [default DESTDIR=$(STAGING_DIR)/usr install] +# arguments passed to <make> while installing to the staging directory +# FOO_INSTALL_TARGET_OPT [default DESTDIR=$(STAGING_DIR)/usr install-exec] +# arguments passed to <make> while installing to the target directory +# FOO_CLEAN_OPT [default clean] +# arguments passed to <make> while installing to the staging directory +# FOO_UNINSTALL_STAGING_OPT [default DESTDIR=$(STAGING_DIR)/usr uninstall] +# arguments passed to <make> while uninstalling from the staging +# directory +# FOO_UNINSTALL_TARGET_OPT [default DESTDIR=$(STAGING_DIR)/usr uninstall] +# arguments passed to <make> while uninstalling from the target +# directory +# FOO_SUBDIR [default empty] +# relative path in the package source from which to run configure and +# make +# +## The following variables contain hook target names; +## by default they do nothing, they can be overriden in package makefiles +# +# FOO_HOOK_POST_BUILD, FOO_HOOK_POST_INSTALL +# +## The following variables contain targets that can be overriden +# +# FOO_TARGET_INSTALL_TARGET FOO_TARGET_INSTALL_STAGING FOO_TARGET_BUILD +# FOO_TARGET_CONFIGURE FOO_TARGET_PATCH FOO_TARGET_EXTRACT FOO_TARGET_SOURCE +# FOO_TARGET_UNINSTALL FOO_TARGET_CLEAN FOO_TARGET_DIRCLEAN +# +# E.g. if your package has a no <configure> script you can place the following +# in your package makefile: +# +# | $(FOO_TARGET_INSTALL): +# | touch $@ +# +## The following variables are defined automatically and can be used in +## overriden targets: +# +# PKG +# is always the current package name ("foo" in the example) +# FOO_DIR +# the directory in which the package source is extracted. +# the base name will always be foo-$(FOO_VERSION), no matter what the +# archive name or the directory-in-archive name are. +# MESSAGE +# macro that outputs a pretty message to stdout, e.g. use +# $(call MESSAGE,"Hello World") +# in a target. +# +# Caveats: +# - the 'eval' line (final line in the example) must be placed +# after all variable settings, but before all target re-definition +# (including hooks) +################################################################################ + +# UPPERCASE Macro -- transform its argument to uppercase and replace dots and +# hyphens to underscores +UPPERCASE = $(shell echo $(1) | tr "a-z.-" "A-Z__") + +# Define extrators for different archive suffixes +INFLATE.bz2 = $(BZCAT) +INFLATE.gz = $(ZCAT) +INFLATE.tbz = $(BZCAT) +INFLATE.tgz = $(ZCAT) +INFLATE.tar = cat + +# MESSAGE Macro -- display a message in bold type +MESSAGE = @echo $(TERM_BOLD) ; \ + echo ">>> $($(PKG)_NAME) $($(PKG)_VERSION) $(1)$(shell tput rmso)" ; \ + echo $(TERM_RESET) +TERM_BOLD = $(shell tput bold) +TERM_RESET = $(shell tput rmso) + +# Utility programs used to build packages +TAR ?= tar +#ACLOCAL_STAGING_DIR ?= $(STAGING_DIR)/usr/share/aclocal +#ACLOCAL ?= aclocal -I $(ACLOCAL_STAGING_DIR) +#AUTORECONF ?= autoreconf -v -i -f -I $(ACLOCAL_STAGING_DIR) +# ACLOCAL="$(ACLOCAL)" + + +################################################################################ +# Implicit targets -- produce a stamp file for each step of a package build +################################################################################ + +# Retrieve and unpack the archive +$(BUILD_DIR)/%/.stamp_downloaded: + $(call MESSAGE,"Downloading") + test -e $(DL_DIR)/$($(PKG)_SOURCE) || $(WGET) -P $(DL_DIR) $($(PKG)_SITE)/$($(PKG)_SOURCE) + mkdir -p $(@D) + touch $@ + +# Retrieve and unpack the archive +$(BUILD_DIR)/%/.stamp_extracted: + $(call MESSAGE,"Extracting") + mkdir -p $(@D) + $(INFLATE$(suffix $($(PKG)_SOURCE))) $(DL_DIR)/$($(PKG)_SOURCE) | \ + $(TAR) --strip-components=1 -C $(@D) $(TAR_OPTIONS) - + touch $@ + +# Patch +$(BUILD_DIR)/%/.stamp_patched: NAMEVER = $($(PKG)_NAME)-$($(PKG)_VERSION) +$(BUILD_DIR)/%/.stamp_patched: + $(call MESSAGE,"Patching") + (if test -d package/$($(PKG)_NAME) ; then \ + if test "$(wildcard package/$($(PKG)_NAME)/$(NAMEVER)*.patch)" ; then \ + toolchain/patch-kernel.sh $(@D) package/$($(PKG)_NAME) $(NAMEVER)\*.patch || exit 1 ; \ + else \ + toolchain/patch-kernel.sh $(@D) package/$($(PKG)_NAME) $($(PKG)_NAME)\*.patch || exit 1 ; \ + if test -d package/$($(PKG)_NAME)/$(NAMEVER) ; then \ + toolchain/patch-kernel.sh $(@D) package/$($(PKG)_NAME)/$(NAMEVER) \*.patch || exit 1 ; \ + fi; \ + fi; \ + fi) +ifeq ($(strip $(BR2_UPDATE_CONFIG)),y) + @(for file in config.guess config.sub; do \ + for i in $$(find $(@D) -name $$file); do \ + cp package/gnuconfig/$$file $$i; \ + done;\ + done) +endif + touch $@ + +# Running autoreconf +$(BUILD_DIR)/%/.stamp_autoconfigured: + $(call MESSAGE,"Running autoreconf") + cd $(@D)/$($(PKG)_SUBDIR) && $(AUTORECONF) + touch $@ + +# Configuring +$(BUILD_DIR)/%/.stamp_configured: + $(call MESSAGE,"Configuring") + if test "$($(PKG)_AUTORECONF)" = "YES" ; then \ + cd $(@D)/$($(PKG)_SUBDIR) && \ + $(AUTORECONF) ; \ + fi + cd $(@D)/$($(PKG)_SUBDIR) && \ + rm -f config.cache && \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + CXXFLAGS="$(TARGET_CXXFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" \ + $($(PKG)_CONF_ENV) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --sysconfdir=/etc \ + $($(PKG)_CONF_OPT) + touch $@; + +# Build +$(BUILD_DIR)/%/.stamp_built: + $(call MESSAGE,"Building") + $($(PKG)_MAKE_ENV) $(MAKE) $($(PKG)_MAKE_OPT) -C $(@D)/$($(PKG)_SUBDIR) + touch $@ + +# Install to staging dir +$(BUILD_DIR)/%/.stamp_staging_installed: + $(call MESSAGE,'Installing to host (staging directory)') + $($(PKG)_MAKE_ENV) $(MAKE) $($(PKG)_INSTALL_STAGING_OPT) -C $(@D)/$($(PKG)_SUBDIR) +# toolchain/replace.sh $(STAGING_DIR)/usr/lib ".*\.la" "\(['= ]\)/usr" "\\1$(STAGING_DIR)/usr" + for i in $$(find $(STAGING_DIR)/usr/lib/ -name "*.la") ; do \ + cp $$i $$i~ ; \ + $(SED) "s:\(['= ]\)/usr:\\1$(STAGING_DIR)/usr:" $$i ; \ + done + touch $@ + +# Install to target dir +$(BUILD_DIR)/%/.stamp_target_installed: + $(call MESSAGE,"Installing to target") + $($(PKG)_MAKE_ENV) $(MAKE) $($(PKG)_INSTALL_TARGET_OPT) -C $(@D)/$($(PKG)_SUBDIR) + for d in man include info share/info ; do \ + rm -rf $(TARGET_DIR)/$$d $(TARGET_DIR)/usr/$$d ; \ + done + find $(TARGET_DIR) -name '*.a' -o -name '*.la' -delete + touch $@ + +$(BUILD_DIR)/%/.stamp_cleaned: + $(call MESSAGE,"Cleaning up") + -$($(PKG)_MAKE_ENV) $(MAKE) $($(PKG)_CLEAN_OPT) -C $(@D)/$($(PKG)_SUBDIR) + +$(BUILD_DIR)/%/.stamp_uninstalled: + $(call MESSAGE,"Uninstalling") + $($(PKG)_MAKE_ENV) $(MAKE) $($(PKG)_UNINSTALL_STAGING_OPT) -C $(@D)/$($(PKG)_SUBDIR) + $($(PKG)_MAKE_ENV) $(MAKE) $($(PKG)_UNINSTALL_TARGET_OPT) -C $(@D)/$($(PKG)_SUBDIR) + +$(BUILD_DIR)/%/.stamp_dircleaned: + rm -Rf $(@D) + + +################################################################################ +# AUTOTARGETS -- the target generator macro; define a set of human-readable +# make targets, stamps, and default per-package variables. +# Argument 1 is the (lowercase) package name. +################################################################################ + +define AUTOTARGETS +$(call AUTOTARGETS_INNER,$(1),$(call UPPERCASE,$(1))) +endef + +# AUTOTARGETS_INNER -- does the job for AUTOTARGETS; argument 1 is the +# lowercase package name, argument 2 the uppercase package name +define AUTOTARGETS_INNER + +# define package-specific variables to default values +$(2)_NAME = $(1) +$(2)_VERSION ?= undefined +$(2)_DIR = $$(BUILD_DIR)/$(1)-$$($(2)_VERSION) +$(2)_SOURCE ?= $(1)-$$($(2)_VERSION).tar.gz +$(2)_SITE ?= \ + http://$$(BR2_SOURCEFORGE_MIRROR).dl.sourceforge.net/sourceforge/$(1) +$(2)_DEPENDANCIES ?= +$(2)_AUTORECONF ?= NO +$(2)_CONF_ENV ?= +$(2)_CONF_OPT ?= +$(2)_MAKE_ENV ?= +$(2)_MAKE_OPT ?= +$(2)_INSTALL_STAGING ?= NO +$(2)_INSTALL_TARGET ?= YES +$(2)_INSTALL_STAGING_OPT ?= DESTDIR=$$(STAGING_DIR) install +$(2)_INSTALL_TARGET_OPT ?= DESTDIR=$$(TARGET_DIR) install-exec +$(2)_CLEAN_OPT ?= clean +$(2)_UNINSTALL_STAGING_OPT ?= DESTDIR=$$(STAGING_DIR) uninstall +$(2)_UNINSTALL_TARGET_OPT ?= DESTDIR=$$(TARGET_DIR) uninstall +$(2)_SUBDIR ?= + + +# define sub-target stamps +$(2)_TARGET_INSTALL_TARGET = $$($(2)_DIR)/.stamp_target_installed +$(2)_TARGET_INSTALL_STAGING = $$($(2)_DIR)/.stamp_staging_installed +$(2)_TARGET_BUILD = $$($(2)_DIR)/.stamp_built +$(2)_TARGET_CONFIGURE = $$($(2)_DIR)/.stamp_configured +$(2)_TARGET_AUTORECONF = $$($(2)_DIR)/.stamp_autoconfigured +$(2)_TARGET_PATCH = $$($(2)_DIR)/.stamp_patched +$(2)_TARGET_EXTRACT = $$($(2)_DIR)/.stamp_extracted +$(2)_TARGET_SOURCE = $$($(2)_DIR)/.stamp_downloaded +$(2)_TARGET_UNINSTALL = $$($(2)_DIR)/.stamp_uninstalled +$(2)_TARGET_CLEAN = $$($(2)_DIR)/.stamp_cleaned +$(2)_TARGET_DIRCLEAN = $$($(2)_DIR)/.stamp_dircleaned + +$(2)_HOOK_POST_BUILD = $$($(2)_DIR)/.stamp_hook_post_build +$(2)_HOOK_POST_INSTALL = $$($(2)_DIR)/.stamp_hook_post_install + +# human-friendly targets and target sequencing +$(1): $(1)-install +$(1)-install: $(1)-install-staging $(1)-install-target \ + $$($(2)_HOOK_POST_INSTALL) + +ifeq ($$($(2)_INSTALL_TARGET),YES) +$(1)-install-target: $(1)-build $$($(2)_TARGET_INSTALL_TARGET) +else +$(1)-install-target: +endif + +ifeq ($$($(2)_INSTALL_STAGING),YES) +$(1)-install-staging: $(1)-build $$($(2)_TARGET_INSTALL_STAGING) +else +$(1)-install-staging: +endif + +$(1)-build: $(1)-configure $$($(2)_TARGET_BUILD) \ + $$($(2)_HOOK_POST_BUILD) + +$(1)-configure: $(1)-autoreconf $$($(2)_TARGET_CONFIGURE) + +ifeq ($$($(2)_AUTORECONF),YES) +$(1)-autoreconf: $(1)-patch $$($(2)_TARGET_AUTORECONF) +$(2)_DEPENDANCIES += host-automake host-autoconf host-libtool +else +$(1)-autoreconf: $(1)-patch +endif + +$(1)-patch: $(1)-extract $$($(2)_TARGET_PATCH) + +$(1)-extract: $(1)-depends $$($(2)_TARGET_EXTRACT) + +$(1)-depends: $(1)-source $$($(2)_DEPENDANCIES) + +$(1)-source: $$($(2)_TARGET_SOURCE) + +# non-build targets +$(1)-uninstall: $(1)-configure $$($(2)_TARGET_UNINSTALL) + +$(1)-clean: $$($(2)_TARGET_CLEAN) + +$(1)-dirclean: $$($(2)_TARGET_DIRCLEAN) + +# define the PKG variable for all targets, containing the +# uppercase package variable prefix +$$($(2)_TARGET_INSTALL_TARGET): PKG=$(2) +$$($(2)_TARGET_INSTALL_STAGING): PKG=$(2) +$$($(2)_TARGET_BUILD): PKG=$(2) +$$($(2)_TARGET_CONFIGURE): PKG=$(2) +$$($(2)_TARGET_AUTORECONF): PKG=$(2) +$$($(2)_TARGET_PATCH): PKG=$(2) +$$($(2)_TARGET_EXTRACT): PKG=$(2) +$$($(2)_TARGET_SOURCE): PKG=$(2) +$$($(2)_TARGET_UNINSTALL): PKG=$(2) +$$($(2)_TARGET_CLEAN): PKG=$(2) +$$($(2)_TARGET_DIRCLEAN): PKG=$(2) +$$($(2)_HOOK_POST_BUILD): PKG=$(2) +$$($(2)_HOOK_POST_INSTALL): PKG=$(2) + +# define hook targets +# default hook behaviour: do nothing +$$($(2)_HOOK_POST_BUILD): +$$($(2)_HOOK_POST_INSTALL): + +# add package to the general list if targets if requested by the buildroot +# configuration +ifeq ($$(BR2_PACKAGE_$(2)),y) +TARGETS += $(1) +endif +endef + +# :mode=makefile: + |