#
# Copyright (c) 2002-2003 Silicon Graphics, Inc.  All Rights Reserved.
#

BUILDRULES = $(TOPDIR)/include/buildrules

# LCFLAGS, LLDFLAGS, LLDLIBS, LSRCFILES and LDIRT may be specified in
# user Makefiles. Note: LSRCFILES is anything other than Makefile, $(CFILES)
# $(CXXFILES), or $(HFILES) and is used to construct the manifest list
# during the "dist" phase (packaging).

LDFLAGS += $(LOADERFLAGS) $(LLDFLAGS)
LTLDFLAGS += $(LOADERFLAGS)
LDLIBS = $(LLDLIBS) $(PLDLIBS) $(MALLOCLIB)

MAKEOPTS = --no-print-directory
SRCFILES = Makefile $(HFILES) $(CFILES) $(LSRCFILES) $(LFILES) $(YFILES)
SRCFILES += $(QAHFILES)

DEPDIRT = dep dep.bak
MANDIRT = *.[1-9].gz
PODIRT = *.tmpo *.mo
CDIRT = $(OBJECTS) $(LTOBJECTS) $(LTCOMMAND) $(LTLIBRARY)
DIRT = $(LDIRT) $(DEPDIRT) $(MANDIRT) $(PODIRT) $(CDIRT)

OBJECTS = $(ASFILES:.s=.o) \
	  $(CFILES:.c=.o) \
	  $(LFILES:.l=.o) \
	  $(YFILES:%.y=%.tab.o)

INSTALL	= $(TOPDIR)/install-sh -o $(PKG_USER) -g $(PKG_GROUP)

SHELL = /bin/sh
IMAGES_DIR = $(TOPDIR)/all-images
DIST_DIR = $(TOPDIR)/dist

CCF	= $(CC) $(CFLAGS) $(CPPFLAGS)
MAKEF	= $(MAKE) $(MAKEOPTS)
CXXF	= $(CXX) $(CXXFLAGS)

# For libtool.
LIBNAME = $(basename $(LTLIBRARY))
LTOBJECTS = $(OBJECTS:.o=.lo)
LTVERSION = $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)

LTLINK = $(LIBTOOL) --tag=CC --mode=link $(CC)
LTEXEC = $(LIBTOOL) --mode=execute
LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL)
LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CCF)

ifeq ($(ENABLE_SHARED),yes)
LTLDFLAGS += -rpath $(PKG_LIB_DIR)
LTLDFLAGS += -version-info $(LTVERSION)
endif

ifeq ($(ENABLE_SHARED),yes)
INSTALL_LTLIB = \
	cd $(TOPDIR)/$(LIBNAME)/.libs; \
	../$(INSTALL) -m 755 -d $(PKG_LIB_DIR); \
	../$(INSTALL) -m 644 -T so_dot_version $(LIBNAME).lai $(PKG_LIB_DIR); \
	../$(INSTALL) -T so_dot_current $(LIBNAME).lai $(PKG_LIB_DIR)
endif

# Libtool thinks the static and shared libs should be in the same dir, so
# make the static lib appear in the place we chose as rpath (using the two
# symlinks below).
# Other things want the shared libs to appear in /usr/lib, else they'll
# link with the static libs there.  So, another symlink to get the .so into
# /usr/lib.
ifeq ($(ENABLE_SHARED),yes)
INSTALL_LTLIB_DEV = \
	cd $(TOPDIR)/$(LIBNAME)/.libs; \
	../$(INSTALL) -m 755 -d $(PKG_DEVLIB_DIR); \
	../$(INSTALL) -m 644 -T old_lib $(LIBNAME).lai $(PKG_DEVLIB_DIR); \
	../$(INSTALL) -m 644 $(LIBNAME).lai $(PKG_DEVLIB_DIR)/$(LIBNAME).la ; \
	../$(INSTALL) -m 755 -d $(PKG_LIB_DIR); \
	../$(INSTALL) -T so_base $(LIBNAME).lai $(PKG_LIB_DIR); \
	if test "x$(PKG_DEVLIB_DIR)" != "x$(PKG_LIB_DIR)" ; then \
	../$(INSTALL) -S $(PKG_DEVLIB_DIR)/$(LIBNAME).a $(PKG_LIB_DIR)/$(LIBNAME).a; \
	../$(INSTALL) -S $(PKG_DEVLIB_DIR)/$(LIBNAME).la $(PKG_LIB_DIR)/$(LIBNAME).la; \
	../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).so $(PKG_DEVLIB_DIR)/$(LIBNAME).so; \
	fi
else
INSTALL_LTLIB_DEV = $(INSTALL_LTLIB_STATIC)
endif

INSTALL_LTLIB_STATIC = \
	cd $(TOPDIR)/$(LIBNAME)/.libs; \
	../$(INSTALL) -m 755 -d $(PKG_DEVLIB_DIR); \
	../$(INSTALL) -m 644 -T old_lib $(LIBNAME).lai $(PKG_DEVLIB_DIR)

INSTALL_MAN = \
	@for d in $(MAN_PAGES); do \
		first=true; \
		for m in `$(AWK) \
			'/^\.S[h|H] NAME/ {ok=1; next} ok {print; exit}' $$d \
			| $(SED) \
				-e 's/^\.Nm //' -e 's/,/ /g' -e 's/\\-.*//' \
				-e 's/\\\f[0-9]//g' -e 's/  / /g;q'`; \
		do \
			[ -z "$$m" -o "$$m" = "\\" ] && continue; \
			t=$(MAN_DEST)/$$m.$(MAN_SECTION); \
			if $$first; then \
				if $(HAVE_ZIPPED_MANPAGES); then \
					$(ZIP) -9 -c $$d > $$d.gz; _sfx=.gz; \
				fi; \
				u=$$m.$(MAN_SECTION)$$_sfx; \
				echo $(INSTALL) -m 644 $${d}$$_sfx $${t}$$_sfx;\
				$(INSTALL) -m 644 $${d}$$_sfx $${t}$$_sfx; \
			else \
				echo $(INSTALL) -S $$u $${t}$$_sfx; \
				$(INSTALL) -S $$u $${t}$$_sfx; \
			fi; \
			first=false; \
		done; \
	done

ifeq ($(ENABLE_GETTEXT),yes)
INSTALL_LINGUAS = \
	@for l in $(LINGUAS) ""; do \
		if test -f "$$l.mo" ; then \
			ldir=$(PKG_LOCALE_DIR)/$$l/LC_MESSAGES; \
			$(INSTALL) -m 755 -d $$ldir; \
			$(INSTALL) -m 644 $$l.mo $$ldir/$(PKG_NAME).mo; \
		fi; \
	done
endif

MAN_MAKERULE = \
	@for f in *.[12345678] ""; do \
		if test ! -z "$$f"; then \
			$(ZIP) --best -c < $$f > $$f.gz; \
		fi; \
	done

DIST_MAKERULE = \
	$(MAKEF) -C build dist

SOURCE_MAKERULE = \
	@test -z "$$DIR" && DIR="."; \
	for f in $(SRCFILES) ""; do \
	    test -z "$$f" && break; \
	    test -L "$$f" || $(ECHO) $$DIR/$$f; \
	done; \
	for d in `echo $(SUBDIRS)` ""; do \
	    test -z "$$d" && break; \
	    if test -d "$$d"; then \
		$(MAKEF) DIR=$$DIR/$$d -C $$d $@ || exit $$?; \
	    fi; \
	done
