You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-construct/gar.lib.mk

470 lines
15 KiB

#-*- mode: Fundamental; tab-width: 4; -*-
# ex:ts=4
# $Id$
# Copyright (C) 2001 Nick Moffitt
#
# Redistribution and/or use, with or without modification, is
# permitted. This software is without warranty of any kind. The
# author(s) shall not be liable in the event that use of the
# software causes damage.
# cookies go here, so we have to be able to find them for
# dependency checking.
VPATH += $(COOKIEDIR)
# So these targets are all loaded into bbc.port.mk at the end,
# and provide actions that would be written often, such as
# running configure, automake, makemaker, etc.
#
# The do- targets depend on these, and they can be overridden by
# a port maintainer, since they'e pattern-based. Thus:
#
# extract-foo.tar.gz:
# (special stuff to unpack non-standard tarball, such as one
# accidentally named .gz when it's really bzip2 or something)
#
# and this will override the extract-%.tar.gz rule.
# convenience variable to make the cookie.
MAKECOOKIE = mkdir -p $(COOKIEDIR)/$(@D) && date >> $(COOKIEDIR)/$@
#################### FETCH RULES ####################
URLS = $(subst ://,//,$(foreach SITE,$(FILE_SITES) $(MASTER_SITES),$(addprefix $(SITE),$(DISTFILES))) $(foreach SITE,$(FILE_SITES) $(PATCH_SITES) $(MASTER_SITES),$(addprefix $(SITE),$(PATCHFILES))))
# Download the file if and only if it doesn't have a preexisting
# checksum file. Loop through available URLs and stop when you
# get one that doesn't return an error code.
$(DOWNLOADDIR)/%:
@if test -f $(COOKIEDIR)/checksum-$*; then : ; else \
echo " ==> Grabbing $(call TMSG_ID,$@)"; \
for i in $(filter %/$*,$(URLS)); do \
echo " ==> Trying $(call TMSG_ID,$$i)"; \
$(MAKE) -s $$i || continue; \
break; \
done; \
if test -r $@ ; then : ; else \
echo '*** GAR GAR GAR! Failed to download $(call TMSG_ID,$@)! GAR GAR GAR! ***' 1>&2; \
false; \
fi; \
fi
# download an http URL
http//%:
@wget -c -nd --passive-ftp -P $(DOWNLOADDIR) http://$*
# download an ftp URL
ftp//%:
@wget -c -nd --passive-ftp -P $(DOWNLOADDIR) ftp://$*
# link to a local copy of the file
# (absolute path)
file///%:
@if test -f /$*; then \
ln -f -s /$* $(DOWNLOADDIR)/$(notdir $*); \
else \
false; \
fi
# link to a local copy of the file
# (relative path)
file//%:
@if test -f $*; then \
ln -f -s "$(CURDIR)/$*" $(DOWNLOADDIR)/$(notdir $*); \
else \
false; \
fi
# Using Jeff Waugh's rsync rule.
# DOES NOT PRESERVE SYMLINKS!
rsync//%:
@rsync -azvLP rsync://$* $(DOWNLOADDIR)/
# Using Jeff Waugh's scp rule
scp//%:
@scp -C $* $(DOWNLOADDIR)/
#################### CHECKSUM RULES ####################
# check a given file's checksum against $(CHECKSUM_FILE) and
# error out if it mentions the file without an "OK".
checksum-%: $(CHECKSUM_FILE)
@echo " ==> Running checksum on $(call TMSG_ID,$*)"
@if grep -- '$*' $(CHECKSUM_FILE); then \
if LC_ALL="C" LANG="C" $(MD5) -c $(CHECKSUM_FILE) 2>&1 | grep -- '$*' | grep -v ':[ ]\+OK'; then \
echo '*** GAR GAR GAR! $(call TMSG_ID,$*) failed checksum test! GAR GAR GAR! ***' 1>&2; \
false; \
else \
echo 'file $(call TMSG_ID,$*) passes checksum test!'; \
$(MAKECOOKIE); \
fi \
else \
echo '*** GAR GAR GAR! $(call TMSG_ID,$*) not in $(CHECKSUM_FILE) file! GAR GAR GAR! ***' 1>&2; \
false; \
fi
#################### EXTRACT RULES ####################
# rule to extract uncompressed tarballs
tar-extract-%:
@echo ' $(call TMSG_LIB,Extracting,$(DOWNLOADDIR)/$*)'
@$(TAR) -xf $(DOWNLOADDIR)/$* -C $(EXTRACTDIR)
@$(MAKECOOKIE)
# rule to extract files with tar xzf
tar-gz-extract-%:
@echo ' $(call TMSG_LIB,Extracting,$(DOWNLOADDIR)/$*)'
@gzip -dc $(DOWNLOADDIR)/$* | $(TAR) -xf - -C $(EXTRACTDIR)
@$(MAKECOOKIE)
# rule to extract files with tar and bzip
tar-bz-extract-%:
@echo ' $(call TMSG_LIB,Extracting,$(DOWNLOADDIR)/$*)'
@bzip2 -dc $(DOWNLOADDIR)/$* | $(TAR) -xf - -C $(EXTRACTDIR)
@$(MAKECOOKIE)
# rule to extract files with unzip
zip-extract-%:
@echo ' $(call TMSG_LIB,Extracting,$(DOWNLOADDIR)/$*)'
@unzip $(DOWNLOADDIR)/$* -d $(EXTRACTDIR)
@$(MAKECOOKIE)
# this is a null extract rule for files which are constant and
# unchanged (not archives)
cp-extract-%:
@echo ' $(call TMSG_LIB,Copying,$(DOWNLOADDIR)/$*)'
@cp $(DOWNLOADDIR)/$* $(WORKDIR)/
@$(MAKECOOKIE)
### EXTRACT FILE TYPE MAPPINGS ###
# These rules specify which of the above extract action rules to use for a
# given file extension. Often support for a given extract type can be handled
# by simply adding a rule here.
extract-%.tar: tar-extract-%.tar
@$(MAKECOOKIE)
extract-%.tar.gz: tar-gz-extract-%.tar.gz
@$(MAKECOOKIE)
extract-%.tar.Z: tar-gz-extract-%.tar.Z
@$(MAKECOOKIE)
extract-%.tgz: tar-gz-extract-%.tgz
@$(MAKECOOKIE)
extract-%.taz: tar-gz-extract-%.taz
@$(MAKECOOKIE)
extract-%.tar.bz: tar-bz-extract-%.tar.bz
@$(MAKECOOKIE)
extract-%.tar.bz2: tar-bz-extract-%.tar.bz2
@$(MAKECOOKIE)
extract-%.tbz: tar-bz-extract-%.tbz
@$(MAKECOOKIE)
extract-%.zip: zip-extract-%.zip
@$(MAKECOOKIE)
extract-%.ZIP: zip-extract-%.ZIP
@$(MAKECOOKIE)
extract-%.jpeg: cp-extract-%.jpeg
@$(MAKECOOKIE)
extract-%.png: cp-extract-%.png
@$(MAKECOOKIE)
extract-%.html: cp-extract-%.html
@$(MAKECOOKIE)
extract-%.spl: cp-extract-%.spl
@$(MAKECOOKIE)
extract-%.txt: cp-extract-%.txt
@$(MAKECOOKIE)
extract-%.cfg: cp-extract-%.cfg
@$(MAKECOOKIE)
extract-%.c: cp-extract-%.c
@$(MAKECOOKIE)
extract-%.sh: cp-extract-%.sh
@$(MAKECOOKIE)
extract-%.cmd: cp-extract-%.cmd
@$(MAKECOOKIE)
extract-%: cp-extract-%
@$(MAKECOOKIE)
#################### PATCH RULES ####################
# apply bzipped patches
bz-patch-%:
@echo ' $(call TMSG_LIB,Applying patch,$(DOWNLOADDIR)/$*)'
@bzip2 -dc $(DOWNLOADDIR)/$* | patch -p0
@$(MAKECOOKIE)
# apply gzipped patches
gz-patch-%:
@echo ' $(call TMSG_LIB,Applying patch,$(DOWNLOADDIR)/$*)'
@gzip -dc $(DOWNLOADDIR)/$* | patch -p0
@$(MAKECOOKIE)
# apply normal patches
normal-patch-%:
@echo ' $(call TMSG_LIB,Applying patch,$(DOWNLOADDIR)/$*)'
@patch -p0 < $(DOWNLOADDIR)/$*
@$(MAKECOOKIE)
# This is used by makepatch
%/gar-base.diff:
@echo ' $(call TMSG_LIB,Creating patch,$@)'
@EXTRACTDIR=$(SCRATCHDIR) COOKIEDIR=$(SCRATCHDIR)-$(COOKIEDIR) $(MAKE) extract
@if diff --speed-large-files --minimal -Nru $(SCRATCHDIR) $(WORKDIR) > $@; then \
rm $@; \
fi
### PATCH FILE TYPE MAPPINGS ###
# These rules specify which of the above patch action rules to use for a given
# file extension. Often support for a given patch format can be handled by
# simply adding a rule here.
patch-%.diff.bz: bz-patch-%.diff.bz
@$(MAKECOOKIE)
patch-%.patch.bz: bz-patch-%.patch.bz
@$(MAKECOOKIE)
patch-%.diff.bz2: bz-patch-%.diff.bz2
@$(MAKECOOKIE)
patch-%.patch.bz2: bz-patch-%.patch.bz2
@$(MAKECOOKIE)
patch-%.diff.gz: gz-patch-%.diff.gz
@$(MAKECOOKIE)
patch-%.patch.gz: gz-patch-%.patch.gz
@$(MAKECOOKIE)
patch-%.diff.Z: gz-patch-%.diff.Z
@$(MAKECOOKIE)
patch-%.patch.Z: gz-patch-%.patch.Z
@$(MAKECOOKIE)
patch-%.diff: normal-patch-%.diff
@$(MAKECOOKIE)
patch-%.patch: normal-patch-%.patch
@$(MAKECOOKIE)
#################### CONFIGURE RULES ####################
ifdef HAVE_QT_3_3_INSTALLED
TMP_DIRPATHS = --prefix=$(prefix) --exec_prefix=$(exec_prefix) --bindir=$(bindir) --sbindir=$(sbindir) --libexecdir=$(libexecdir) --datadir=$(datadir) --sysconfdir=$(sysconfdir) --sharedstatedir=$(sharedstatedir) --localstatedir=$(localstatedir) --libdir=$(libdir) --infodir=$(infodir) --lispdir=$(lispdir) --includedir=$(includedir) --mandir=$(mandir) --with-qt-dir=$(QTDIR)
else
TMP_DIRPATHS = --prefix=$(prefix) --exec_prefix=$(exec_prefix) --bindir=$(bindir) --sbindir=$(sbindir) --libexecdir=$(libexecdir) --datadir=$(datadir) --sysconfdir=$(sysconfdir) --sharedstatedir=$(sharedstatedir) --localstatedir=$(localstatedir) --libdir=$(libdir) --infodir=$(infodir) --lispdir=$(lispdir) --includedir=$(includedir) --mandir=$(mandir) --with-qt-dir=$(prefix)
QTDIR = $(prefix)
endif
TDEDIR = $(prefix)
TDEDIRS = $(prefix)
ARTSCCONFIG = $(prefix)/bin/artsc-config
KDECONFIG = $(prefix)/bin/tde-config
LIBART_CONFIG = $(prefix)/bin/libart2-config
XML_CONFIG = $(prefix)/bin/xml2-config
XSLT_CONFIG = $(prefix)/bin/xslt-config
export QTDIR TDEDIR TDEDIRS ARTSCCONFIG KDECONFIG LIBART_CONFIG XML_CONFIG XSLT_CONFIG
NODIRPATHS += --lispdir
DIRPATHS = $(filter-out $(addsuffix %,$(NODIRPATHS)), $(TMP_DIRPATHS))
# configure a package that has an autoconf-style configure
# script.
configure-%/configure:
@echo ' $(call TMSG_LIB,Running configure in,$*)'
@cd $* && $(CONFIGURE_ENV) ./configure $(CONFIGURE_ARGS)
@$(MAKECOOKIE)
# configure a package that uses imake
# FIXME: untested and likely not the right way to handle the
# arguments
configure-%/Imakefile:
@echo ' $(call TMSG_LIB,Running xmkmf in,$*)'
@cd $* && $(CONFIGURE_ENV) xmkmf $(CONFIGURE_ARGS)
@$(MAKECOOKIE)
#################### BUILD RULES ####################
# build from a standard gnu-style makefile's default rule.
build-%/Makefile:
@echo ' $(call TMSG_LIB,Running make in,$*)'
@$(BUILD_ENV) $(MAKE) $(foreach TTT,$(BUILD_OVERRIDE_DIRS),$(TTT)="$($(TTT))") -C $* $(BUILD_ARGS)
@$(MAKECOOKIE)
build-%/makefile:
@echo ' $(call TMSG_LIB,Running make in,$*)'
@$(BUILD_ENV) $(MAKE) $(foreach TTT,$(BUILD_OVERRIDE_DIRS),$(TTT)="$($(TTT))") -C $* $(BUILD_ARGS)
@$(MAKECOOKIE)
build-%/GNUmakefile:
@echo ' $(call TMSG_LIB,Running make in,$*)'
@$(BUILD_ENV) $(MAKE) $(foreach TTT,$(BUILD_OVERRIDE_DIRS),$(TTT)="$($(TTT))") -C $* $(BUILD_ARGS)
@$(MAKECOOKIE)
#################### STRIP RULES ####################
# The strip rule should probably strip uninstalled binaries.
# TODO: Seth, what was the exact parameter set to strip that you
# used to gain maximal space on the LNX-BBC?
# Strip all binaries listed in the manifest file
# TODO: actually write it!
# This will likely become almost as hairy as the actual
# installation code.
strip-$(MANIFEST_FILE):
@echo "$(call TMSG_FAIL,Not finished)"
# The Makefile must have a "make strip" rule for this to work.
strip-%/Makefile:
@echo ' $(call TMSG_LIB,Running make strip in,$*)'
@$(BUILD_ENV) $(MAKE) -C $* $(BUILD_ARGS) strip
@$(MAKECOOKIE)
#################### INSTALL RULES ####################
# just run make install and hope for the best.
install-%/Makefile:
@echo ' $(call TMSG_LIB,Running make install in,$*)'
@$(INSTALL_ENV) $(MAKE) DESTDIR=$(DESTDIR) $(foreach TTT,$(INSTALL_OVERRIDE_DIRS),$(TTT)="$(DESTDIR)$($(TTT))") -C $* $(INSTALL_ARGS) install
@$(MAKECOOKIE)
install-%/makefile:
@echo ' $(call TMSG_LIB,Running make install in,$*)'
@$(INSTALL_ENV) $(MAKE) DESTDIR=$(DESTDIR) $(foreach TTT,$(INSTALL_OVERRIDE_DIRS),$(TTT)="$(DESTDIR)$($(TTT))") -C $* $(INSTALL_ARGS) install
@$(MAKECOOKIE)
install-%/GNUmakefile:
@echo ' $(call TMSG_LIB,Running make install in,$*)'
@$(INSTALL_ENV) $(MAKE) DESTDIR=$(DESTDIR) $(foreach TTT,$(INSTALL_OVERRIDE_DIRS),$(TTT)="$(DESTDIR)$($(TTT))") -C $* $(INSTALL_ARGS) install
@$(MAKECOOKIE)
######################################
# Use a manifest file of the format:
# src:dest[:mode[:owner[:group]]]
# as in...
# ${WORKSRC}/nwall:${bindir}/nwall:2755:root:tty
# ${WORKSRC}/src/foo:${sharedstatedir}/foo
# ${WORKSRC}/yoink:${sysconfdir}/yoink:0600
# Okay, so for the benefit of future generations, this is how it
# works:
#
# First of all, we have this file with colon-separated lines.
# The $(shell cat foo) routine turns it into a space-separated
# list of words. The foreach iterates over this list, putting a
# colon-separated record in $(ZORCH) on each pass through.
#
# Next, we have the macro $(MANIFEST_LINE), which splits a record
# into a space-separated list, and $(MANIFEST_SIZE), which
# determines how many elements are in such a list. These are
# purely for convenience, and could be inserted inline if need
# be.
MANIFEST_LINE = $(subst :, ,$(ZORCH))
MANIFEST_SIZE = $(words $(MANIFEST_LINE))
# So the install command takes a variable number of parameters,
# and our records have from two to five elements. Gmake can't do
# any sort of arithmetic, so we can't do any really intelligent
# indexing into the list of parameters.
#
# Since the last three elements of the $(MANIFEST_LINE) are what
# we're interested in, we make a parallel list with the parameter
# switch text (note the dummy elements at the beginning):
MANIFEST_FLAGS = notused notused --mode= --owner= --group=
# The following environment variables are set before the
# installation boogaloo begins. This ensures that WORKSRC is
# available to the manifest and that all of the location
# variables are suitable for *installation* (that is, using
# DESTDIR)
MANIFEST_ENV += WORKSRC=$(WORKSRC)
# This was part of the "implicit DESTDIR" regime. However:
# http://gar.lnx-bbc.org/wiki/ImplicitDestdirConsideredHarmful
#MANIFEST_ENV += $(foreach TTT,prefix exec_prefix bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir infodir lispdir includedir mandir,$(TTT)=$(DESTDIR)$($(TTT)))
# ...and then we join a slice of it with the corresponding slice
# of the $(MANIFEST_LINE), starting at 3 and going to
# $(MANIFEST_SIZE). That's where all the real magic happens,
# right there!
#
# following that, we just splat elements one and two of
# $(MANIFEST_LINE) on the end, since they're the ones that are
# always there. Slap a semicolon on the end, and you've got a
# completed iteration through the foreach! Beaujolais!
# FIXME: using -D may not be the right thing to do!
install-$(MANIFEST_FILE):
@echo ' $(call TMSG_LIB,Installing from,$(MANIFEST_FILE))'
$(MANIFEST_ENV) ; $(foreach ZORCH,$(shell cat $(MANIFEST_FILE)), install -Dc $(join $(wordlist 3,$(MANIFEST_SIZE),$(MANIFEST_FLAGS)),$(wordlist 3,$(MANIFEST_SIZE),$(MANIFEST_LINE))) $(word 1,$(MANIFEST_LINE)) $(word 2,$(MANIFEST_LINE)) ;)
@$(MAKECOOKIE)
#################### DEPENDENCY RULES ####################
# builddeps need to have everything put in $(BUILD_PREFIX)
# (unless they've been installed already, in which case they're
# already in the install dir)
# it checks the standard cookie dir first, then a special
# -builddep cookie dir, then if those fail, it does the builddep
# build with the -builddep cookie dir. This should do The Right
# Thing.
builddep-$(GARDIR)/%:
@echo ' $(call TMSG_LIB,Building,$*,as a build dep)'
@COOKIEDIR=cookies $(MAKE) -C $(GARDIR)/$* install-p > /dev/null 2>&1 || \
COOKIEDIR=$(COOKIEDIR)-builddep $(MAKE) -C $(GARDIR)/$* install-p > /dev/null 2>&1 || \
COOKIEDIR=$(COOKIEDIR)-builddep prefix=$(BUILD_PREFIX) exec_prefix=$(BUILD_PREFIX) $(MAKE) -C $(GARDIR)/$* install
# Standard deps install into the standard install dir. For the
# BBC, we set the includedir to the build tree and the libdir to
# the install tree. Most dependencies work this way.
# XXX: use a secondary variable to store the canonical cookiedir
# somehow.
dep-$(GARDIR)/%:
@echo ' $(call TMSG_LIB,Building,$*,as a dependency)'
@COOKIEDIR=cookies $(MAKE) -C $(GARDIR)/$* install-p > /dev/null 2>&1 || \
$(MAKE) -C $(GARDIR)/$* install
# Source Deps grab the source code for another package
srcdep-$(GARDIR)/%:
@echo ' $(call TMSG_LIB,Grabbing source for,$*,as a dependency)'
@$(MAKE) -C $(GARDIR)/$* patch-p extract-p > /dev/null 2>&1 || \
$(MAKE) -C $(GARDIR)/$* patch
# Igor's info and man gzipper rule
gzip-info-man: gzip-info gzip-man
gzip-info:
find $(DESTDIR) -type f -iname *.info* -not -iname *.gz | \
xargs -r gzip --force
gzip-man:
find $(DESTDIR) -type f -iname *.[1-8] -size +2 -print | \
xargs -r gzip --force
# Mmm, yesssss. cookies my preciousssss! Mmm, yes downloads it
# is! We mustn't have nasty little gmakeses deleting our
# precious cookieses now must we?
.PRECIOUS: $(DOWNLOADDIR)/% $(COOKIEDIR)/% $(FILEDIR)/%