#-*- 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)/%