# Copyright (C) 1992 Free Software Foundation, Inc.
# This file is part of the GNU C Library.

# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.

# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Library General Public License for more details.

# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB.  If
# not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.

#
# Makefile for mmalloc directory
#

# Directory containing source files.  Don't clean up the spacing,
# this exact string is matched for by the "configure" script.

VPATH = @srcdir@
srcdir = @srcdir@

prefix =	@prefix@
exec_prefix =	@exec_prefix@

bindir =	@bindir@
libdir =	@libdir@

datadir =	@datadir@
mandir =	@mandir@
man1dir =	$(mandir)/man1
man2dir =	$(mandir)/man2
man3dir =	$(mandir)/man3
man4dir =	$(mandir)/man4
man5dir =	$(mandir)/man5
man6dir =	$(mandir)/man6
man7dir =	$(mandir)/man7
man8dir =	$(mandir)/man8
man9dir =	$(mandir)/man9
infodir =	@infodir@
includedir =	@includedir@

SHELL =		@SHELL@

INSTALL =	@INSTALL@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
INSTALL_DATA =	@INSTALL_DATA@

AR =		@AR@
AR_FLAGS =	qv
CFLAGS =	-g
MAKEINFO =	makeinfo
RANLIB =	@RANLIB@
RM =		rm

# where to find makeinfo
MAKEINFO=makeinfo

SET_TEXINPUTS = TEXINPUTS=${TEXIDIR}:.:$(srcdir):$(READLINE_DIR):$$TEXINPUTS

# Files which should be generated via 'info' and installed by 'install-info'
INFO_DEPS = mmalloc.info

# The TeX formatter
TEX = tex

TARGETLIB =	libmmalloc.a

CFILES =	mcalloc.c mfree.c mmalloc.c mmcheck.c mmemalign.c mmstats.c \
		mmtrace.c mrealloc.c mvalloc.c mmap-sup.c attach.c detach.c \
		keys.c sbrk-sup.c mm.c

HFILES =	mmalloc.h

OFILES =	mcalloc.o mfree.o mmalloc.o mmcheck.o mmemalign.o mmstats.o \
		mmtrace.o mrealloc.o mvalloc.o mmap-sup.o attach.o detach.o \
		keys.o sbrk-sup.o

DEFS =		@DEFS@

# The current default is to build a single object module with all the mmalloc
# functions.  To build a more traditional library, flip this macro definition.
#TARGETOBJS =	$(OFILES)
TARGETOBJS =	mm.o

.c.o:
		$(CC) -c $(CFLAGS) $(DEFS) -I. -I$(srcdir)/../include $<

# Do we want/need any config overrides?
#	 

STAGESTUFF =	$(TARGETLIB) *.o

all:		$(TARGETLIB)

info: $(INFO_DEPS)
dvi: mmalloc.dvi
clean-info:
installcheck:

mmalloc.info: mmalloc.texi
	$(MAKEINFO) -I $(srcdir) -o ./mmalloc.info mmalloc.texi

# This file doesn't need texindex currently.
mmalloc.dvi: mmalloc.texi
	$(SET_TEXINPUTS) $(TEX) mmalloc.texi
	rm -f mmalloc.?? mmalloc.??s mmalloc.log mmalloc.aux mmalloc.toc

install-info: info
	$(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(infodir)
	@list='$(INFO_DEPS)'; \
	for file in $$list; do \
	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
	  for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \
	    if test -f $$d/$$ifile; then \
	      echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \
	      $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \
	    else : ; fi; \
	  done; \
	done
	$(POST_INSTALL)
	@if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
	  list='$(INFO_DEPS)'; \
	  for file in $$list; do \
	    echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\
	    install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\
	  done; \
	else : ; fi

uninstall-info:
	$(PRE_UNINSTALL)
	@if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
	  ii=yes; \
	else ii=; fi; \
	list='$(INFO_DEPS)'; \
	for file in $$list; do \
	  test -z "$$ii" \
	    || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \
	done
	$(NORMAL_UNINSTALL)
	list='$(INFO_DEPS)'; \
	for file in $$list; do \
	  (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \
	done

check: test1.c
#	$(CC) -g $(srcdir)/test1.c libmmalloc.a
# This loses for Canadian cross (building mmalloc with a cross-compiler).
# There is probably some dejagnu-ish solution (such as what we are doing
# for gdb, perhaps).
#	./a.out

install:	all install-info
		$(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(libdir)
		$(INSTALL_DATA) $(TARGETLIB) $(DESTDIR)$(libdir)/$(TARGETLIB)n
		$(RANLIB) $(DESTDIR)$(libdir)/$(TARGETLIB)n
		mv -f $(DESTDIR)$(libdir)/$(TARGETLIB)n $(DESTDIR)$(libdir)/$(TARGETLIB)

uninstall:	uninstall-info

$(TARGETLIB):	$(TARGETOBJS)
		$(RM) -rf $@
		$(AR) $(AR_FLAGS) $@ $(TARGETOBJS)
		$(RANLIB) $@

$(OFILES) :	$(HFILES) Makefile

mm.o:		$(HFILES) $(CFILES)
		$(CC) -c $(CFLAGS) $(DEFS) -I. -I$(srcdir)/../include $(srcdir)/mm.c

.always.:
# Do nothing.

.PHONEY: all etags tags ls clean stage1 stage2 .always.

stage1:		force
		-mkdir stage1
		-mv -f $(STAGESTUFF) stage1

stage2:		force
		-mkdir stage2
		-mv -f $(STAGESTUFF) stage2

stage3:		force
		-mkdir stage3
		-mv -f $(STAGESTUFF) stage3

stage4:		force
		-mkdir stage4
		-mv -f $(STAGESTUFF) stage4

against=stage2

comparison:	force
		for i in *.o ; do cmp $$i $(against)/$$i || exit 1 ; done

de-stage1:	force
		-(cd stage1 ; mv -f * ..)
		-rmdir stage1

de-stage2:	force
		-(cd stage2 ; mv -f * ..)
		-rmdir stage2

de-stage3:	force
		-(cd stage3 ; mv -f * ..)
		-rmdir stage3

de-stage4:	force
		-(cd stage4 ; mv -f * ..)
		-rmdir stage4

etags tags:	TAGS

TAGS:		$(CFILES)
	etags `for i in $(HFILES) $(CFILES); do echo $(srcdir)/$$i ; done`

ls:
		@echo Makefile $(HFILES) $(CFILES)

# Need to deal with profiled libraries, too.

mostlyclean clean:
		rm -f *.a *.o core errs *~ \#* TAGS *.E a.out errors 

distclean:	clean 
		rm -f config.cache config.log config.status
		rm -f Makefile depend

maintainer-clean realclean: distclean clean
		@echo "This command is intended for maintainers to use;"
		@echo "it deletes files that may require special tools to rebuild."
		rm -f mmalloc.info

force:

Makefile:	Makefile.in config.status
		$(SHELL) config.status

config.status:	configure
		$(SHELL) config.status --recheck
