# 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
	@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
		$(INSTALL_DATA) $(TARGETLIB) $(libdir)/$(TARGETLIB)n
		$(RANLIB) $(libdir)/$(TARGETLIB)n
		mv -f $(libdir)/$(TARGETLIB)n $(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
