#
# 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 Q=$(Q)
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)
LIBDIRT = .libs
DIRDIRT = $(LDIRDIRT) $(LIBDIRT)

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

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

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) --quiet --tag=CC --mode=link $(CC)
LTEXEC = $(LIBTOOL) --quiet --mode=execute
LTINSTALL = $(LIBTOOL) --quiet --mode=install $(INSTALL)
LTCOMPILE = $(LIBTOOL) --quiet --tag=CC --mode=compile $(CCF)

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

ifeq ($(ENABLE_SHARED),yes)
INSTALL_LTLIB = \
	cd $(TOPDIR)/$(LIBNAME)/.libs; \
	../$(INSTALL) -m 755 -d $(PKG_ROOT_LIB_DIR); \
	../$(INSTALL) -m 755 -T so_dot_version $(LIBNAME).lai $(PKG_ROOT_LIB_DIR); \
	../$(INSTALL) -T so_dot_current $(LIBNAME).lai $(PKG_ROOT_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_LIB_DIR); \
	../$(INSTALL) -m 644 -T old_lib $(LIBNAME).lai $(PKG_LIB_DIR); \
	../$(INSTALL) -m 644 $(LIBNAME).lai $(PKG_LIB_DIR)/$(LIBNAME).la ; \
	../$(INSTALL) -m 755 -d $(PKG_ROOT_LIB_DIR); \
	../$(INSTALL) -T so_base $(LIBNAME).lai $(PKG_ROOT_LIB_DIR); \
	if [ "x$(shell readlink -f $(PKG_LIB_DIR))" != \
	     "x$(shell readlink -f $(PKG_ROOT_LIB_DIR))"; ]; then \
		../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).a $(PKG_ROOT_LIB_DIR)/$(LIBNAME).a; \
		../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).la $(PKG_ROOT_LIB_DIR)/$(LIBNAME).la; \
		../$(INSTALL) -S $(PKG_ROOT_LIB_DIR)/$(LIBNAME).so $(PKG_LIB_DIR)/$(LIBNAME).so; \
	fi
else
INSTALL_LTLIB_DEV = $(INSTALL_LTLIB_STATIC)
endif

INSTALL_LTLIB_STATIC = \
	cd $(TOPDIR)/$(LIBNAME)/.libs; \
	../$(INSTALL) -m 755 -d $(PKG_LIB_DIR); \
	../$(INSTALL) -m 644 -T old_lib $(LIBNAME).lai $(PKG_LIB_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
