## More-or-less generic make support stuff.
#
# Variables that can be overridden:
#   general:
#	LANGUAGE_DIRECTORIES	(optional) - *.lproj other than LANGUAGE
#	EXTRA_LOCAL_RESOURCES	(optional) - more localized resources.
#	DEBUGSH			(optional) - to debug shell commands.
#   genstrings:
#	GENSTRINGS		(optional) - the genstrings program to use.
#   dist:
#	GNUTAR_DIST_EXCLUDE	(optional) - (exclude) args for generic dist.
#	BS_DIST_GNUTAR_ARGS	(optional) - additional args for bin+src dist.
#	S_DIST_GNUTAR_ARGS	(optional) - additional args for src-only dist.
#	B_DIST_GNUTAR_ARGS	(optional) - additional args for bin-only dist.
#	TAR_EXT			(REQUIRED) - archive extension to use.
#   pkg:
#	PKGNAME			(REQUIRED) - name of the package
#	PKGTITLE		(REQUIRED) - title
#	PKGVERSION		(REQUIRED) - version
#	PKGDATE			(optional) - date
#	PKGINFO			(REQUIRED) - package info template
#	PKGTIFF			(optional) - package icon
# XXX finish documentation.
# XXX This isn't as bulletproof as I'd like (yet) for general consumption.

RCS_SUPPORT_ID = $Makefile.support,v 1.6 1998/07/13 22:20:16 tom Exp$

#DEBUGSH = set -vx;
DEBUGSH =

GENSTRINGS = genstrings
PACKAGE = /NextAdmin/Installer.app/package

TOPLEVEL_DOCS = BUGS INSTALL NEWS README TODO $(EXTRA_TOPLEVEL_DOCS)

# Extend 'make clean' to remove any backup files (those ending with ~) from
# the language subdirectories.
clean::
	-$(RM) -rf obj sym $(PRODUCT_ROOT)
	find . \( -name "*[#~]" -o -name "[%#]*" -o -name ".#*" \) -print | xargs $(RM) -rf

# Copy resources in other language directory.
# Rules using this should setup shell-variable "resource_root" beforehand.
# language.lporj to be copied should be setup in shell-variable "lproj"
# (ls will issue a warning if some resource doesn't exist).
COPY_LANGUAGE_RESOURCES = \
    $(MKDIRS) $$resource_root/$$lproj; \
    locals=`echo " $(LOCAL_RESOURCES) $(EXTRA_LOCAL_RESOURCES)" | \
	sed "s|$(LANGUAGE)\.lproj/||g; \
	     s| [	 ]*| $$lproj/|g"`; \
    locals=`ls -d $$locals || true`; \
    res=`$(FASTCP) $$locals $$resource_root/$$lproj || true`; \
    case "$$res" in "") ;; *) echo "[$$lproj] $$res"; esac

# Copy resources in other language directories.
COPY_OTHER_LANGUAGES_RESOURCES = \
	[ -n "$$resource_root" ] || { \
		echo "BUG: shell variable \`resource_root' not set in target \`$@:'"; \
		exit 99; \
	}; \
	for lproj in $(LANGUAGE_DIRECTORIES) ""; do \
	    case $$lproj in $(LANGUAGE).lproj | "") continue; esac; \
	    [ -d $$lproj ] || { echo "warning: $$lproj does not exist."; continue; }; \
	    $(COPY_LANGUAGE_RESOURCES); \
	done

# Additional target, to copy language(s) into development version.
languages:
	@$(DEBUGSH)\
	resource_root=$(PRODUCT_ROOT); \
	$(COPY_OTHER_LANGUAGES_RESOURCES)

language:
	@$(DEBUGSH)\
	resource_root=$(PRODUCT_ROOT); \
	lproj=$(LANGUAGE).lproj; \
	$(COPY_LANGUAGE_RESOURCES)


# Optionally hard-link duplicate files to save space.
duplink_installed:
	-duplink --doit --quiet $(DSTROOT)$(INSTALLDIR)/$(REL_PRODUCT_ROOT)


# generate localizable strings.
genstrings: genstrings_extract genstrings_merge genstrings_clean

genstrings_extract:
	@$(RM) -f Localizable.strings Localizable.patch NULL.strings strings
	$(GENSTRINGS) $(CLASSES) $(HFILES) $(CFILES) >strings
	@-cat strings NULL.strings >>Localizable.strings 2>/dev/null

genstrings_merge:
	-diff -c1 English.lproj/Localizable.strings Localizable.strings >Localizable.patch || true
	@for lproj in $(LANGUAGE_DIRECTORIES) ""; do \
	    case "$$lproj" in "") continue; esac; \
	    patch -b '~' $$lproj/Localizable.strings <Localizable.patch || true; \
	done

genstrings_clean:
	@$(RM) -f Localizable.strings Localizable.patch NULL.strings strings


## Distribution and packaging.

DIST_TARGET_ARCHS = `case '$(TARGET_ARCHS)' in \
  '') echo m68k i386 hppa sparc ;; \
   *) echo $(TARGET_ARCHS) ;; \
  esac`

DIST_TARGET_FLAGS = `f=""; \
    case '$(TARGET_ARCHS)' in \
    "") f="NIHS" ;; \
     *)	N=""; I=""; H=""; S=""; \
	for i in $(TARGET_ARCHS) ""; do \
	    case "$$i" in \
	    "") ;; \
	    m68k)	N=N ;; \
	    i386|i486)	I=I ;; \
	    hppa)	H=H ;; \
	    sparc)	S=S ;; \
	    *)		echo "Unsupported architecture \`$$i'" >&2; exit 2;; \
	    esac; \
	done; \
	f="$$N$$I$$HI$$S"; \
    esac; \
    echo "$$f"`

dist: pre_dist dist_build dist_package clean after_package dist_archive post_dist

_set_version = _v=$(PKGVERSION); version=`expr "$$_v" : '\([0-9][0-9.]*\).*'`

pre_dist::
	@cwd=`pwd`; $(_set_version); \
	if expr "$$cwd" : ".*/$(NAME)-$$version[a-z0-9]*/Source" >/dev/null; \
	then :; \
	else package=$(NAME); \
	     echo "dist: $$package source should be in directory named \`$(NAME)-$$version*/Source'" >&2 ; \
	     exit 100; \
	fi

dist_build::
	@$(MAKE) $(MFLAGS) CC='$(CC)' TARGET_ARCHS="$(DIST_TARGET_ARCHS)"

dist_package::
	@$(MAKE) $(MFLAGS) CC='$(CC)' TARGET_ARCHS="$(DIST_TARGET_ARCHS)" pkg

# Customization hook: after dist clean, but before archiving it.
after_package::

dist_archive:: pre_archive archive

post_dist::

## install README files, and create a gnutar'ed, gzipped archives.
## GNUTAR_DIST_EXCLUDE lets you exclude some stuff from the archive.

# package-specific archive:: rule should choose which archive(s) to create.

pre_archive::
	@$(DEBUGSH)$(_set_version); \
	echo "Preparing $(NAME) $$version distribution..."; \
	pkg=$(NAME).pkg; \
	[ -h $$pkg ] || { \
	    $(RM) -rf ../$$pkg ; \
	    mv $$pkg ..; \
	    ln -s ../$$pkg .; \
	}; \
	$(RM) -f ../../$(NAME).$$version.README; \
	ln README ../../$(NAME).$$version.README
	@for f in $(TOPLEVEL_DOCS) ""; do \
	    case "$$f" in "") continue; esac; \
	    [ -f $$f ] || continue; \
	    $(RM) -f ../`basename $$f`; ln $$f ..; \
	done
	@$(RM) -rf .nfs*
	@duplink --doit --quiet . 2>/dev/null || true

archive::

_CREATE_ARCHIVE = \
	echo "Creating \`$$archive' in \``cd ../..;pwd`'..."; \
	cd ../..; \
	cmd="gnutar -cf - $(GNUTAR_DIST_EXCLUDE) $$gnutar_extra_args \
		$(NAME)-$$version* | \
		gzip -9v >$$archive"; \
	echo "$$cmd"; eval "$$cmd"

bs_archive:
	@$(DEBUGSH)$(_set_version); \
	archive=$(NAME).$$version.$(DIST_TARGET_FLAGS).bs.$(TAR_EXT).gz; \
	gnutar_extra_args='$(BS_DIST_GNUTAR_ARGS)'; \
	$(_CREATE_ARCHIVE)

s_archive:
	@$(DEBUGSH)$(_set_version); \
	archive=$(NAME).$$version.s.$(TAR_EXT).gz; \
	gnutar_extra_args='--exclude "*/*.pkg" $(S_DIST_GNUTAR_ARGS)'; \
	$(_CREATE_ARCHIVE)

b_archive:
	@$(DEBUGSH)$(_set_version); \
	archive=$(NAME).$$version.$(DIST_TARGET_FLAGS).b.$(TAR_EXT).gz; \
	gnutar_extra_args='--exclude "*/Source" $(B_DIST_GNUTAR_ARGS)'; \
	$(_CREATE_ARCHIVE)


# package creation stuff.

PKGROOT = /tmp/pkgroot-$(NAME)

pkg: $(PKGNAME).pkg

$(PKGNAME).pkg: pkg_root base_pkg scripts_pkg gzip_pkg
	@-$(RM) -rf $(PKGROOT)

pkg_root:: all
	@$(MAKE) $(MFLAGS) CC='$(CC)' CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
		INSTALLDIR=$(PKGROOT) PACKAGING=YES install

base_pkg:: $(PKGNAME).info
	@$(PACKAGE) $(PKGROOT) $(PKGNAME).info $(PKGTIFF)

scripts_pkg:
	@for f in pre_install post_install pre_delete post_delete; \
	do [ -f $$f ] || continue; \
	   t=$(PKGNAME).pkg/real_$$f; \
	   [ -f $$t ] || t=$(PKGNAME).pkg/$(PKGNAME).$$f; \
	   echo -n "	copying $$f ... "; \
	   $(RM) -f $$t; \
	   cp $$f $$t; echo '' >>$$t; chmod 555 $$t; \
	   echo done.; \
	done

gzip_pkg:
	@-gzip_package $(PKGNAME).pkg

$(PKGNAME).info: $(PKGINFO) Makefile.postamble
	@echo "Creating $@ from $(PKGINFO)..."; \
	title="$(PKGTITLE)"; version=$(PKGVERSION); date=$(PKGDATE); \
	sed "s|@TITLE@|$$title|g; \
	     s|@NAME@|$(NAME)|g; \
	     s|@VERSION@|$$version|g; \
	     s|@LANGUAGE@|$(LANGUAGE)|g; \
	     s|@DATE@|$$date|g" $(PKGINFO) >$@

## Install package ``by hand''.
installpkg:
	-$(MKDIRS) $(INSTALLDIR)
	@$(DEBUGSH)\
	archive=$(PKGNAME).pkg/$(PKGNAME).tar.Z; \
	t=$(PKGNAME).pkg/$(PKGNAME).pre_install; \
	[ ! -f $$t ] || $$t "$(PKGNAME).pkg" "$(INSTALLDIR)" ; \
	if grep '^[	 ]*LongFileNames[	 ]*=[	 ]*YES' \
		$(PKGNAME).pkg/$(PKGNAME).info >/dev/null; \
	then tar=/NextAdmin/Installer.app/installer_bigtar; \
	else tar=gnutar; \
	fi; \
	cmd="uncompress <$$archive | (cd $(INSTALLDIR) && $$tar -xf -)"; \
	echo "$$cmd"; eval "$$cmd"; \
	t=$(PKGNAME).pkg/$(PKGNAME).post_install; \
	[ ! -f $$t ] || $$t "$(PKGNAME).pkg" "$(INSTALLDIR)"
