# Generated automatically from Makefile.in by configure.
# /************************************************************-*-makefile-*-
#  * Myricom GM networking software, interface, and documentation	   *
#  * Copyright (c) 1999 by Myricom, Inc.				   *
#  * All rights reserved.  See the file `COPYING' for copyright notice.	   *
#  *************************************************************************/

srcdir = .
VPATH = ./:.

# This should be a reasonably capable bourne shell
SHELL = /bin/sh



.SUFFIXES:
.SUFFIXES:

top_srcdir      = .
prefix          = /usr/local
exec_prefix     = ${prefix}
sbindir         = ${exec_prefix}/sbin
infodir         = ${prefix}/info
libdir          = ${exec_prefix}/lib
driverdir	= drivers/linux
gm_driver_makefiles_in = 

host_cpu	= i686
target_cpu	= i686
target		= i686-pc-linux-gnu

# Location of various programs we may need.
AR		= /usr/bin/ar
ARFLAGS		= cr
CAT		= /bin/cat
CC              = gcc
CHMOD		= /bin/chmod
CTAGS		= /usr/bin/ctags
CXX		= c++
DISTILL		= distill
DVIPS		= /usr/bin/dvips
ECHO		= /bin/echo
ETAGS		= /usr/bin/etags
EXE		= 
GENDAT          = gendat
GM_MCPS 	= mcp/gm_lanai_rate_array.c mcp/gmcp_array_32b_l7_4k.c mcp/gmcp_array_32b_l7_4k_newfeatures.c mcp/gmcp_array_32b_l9_4k.c mcp/gmcp_array_32b_l9_4k_newfeatures.c 
GM_MCP_OBJS	= mcp/gm_lanai_rate_array.o mcp/gmcp_array_32b_l7_4k.o mcp/gmcp_array_32b_l7_4k_newfeatures.o mcp/gmcp_array_32b_l9_4k.o mcp/gmcp_array_32b_l9_4k_newfeatures.o
GS		= /usr/bin/gs
GSFLAGS		= -r600 -dBATCH -dNOPAUSE
INSTALL         = /usr/bin/install -c
INSTALL_DATA    = ${INSTALL} -m 644
INSTALL_INFO	= /sbin/install-info
INSTALL_PROGRAM = ${INSTALL}
KCC		= $(CC)
LANAI_AR	= lanai-ar
LANAI_GCC	= lanai-gcc
LD		= /usr/bin/ld
LN_S		= ln -s
MAKEINFO        = /usr/bin/makeinfo
PSREV		= psrev
RANLIB		= ranlib
STRIP		= /usr/bin/strip
TEXI2DVI        = /usr/bin/texi2dvi
TEXI2HTML       = /usr/bin/texi2html

RELEASE_LIBS    = binary/lib/libgm.a
INSTALL_DSO     = 

DUSER		= -DXXrootXX=1

CPPFLAGS	=  -DHAVE_CONFIG_H -Iinclude -I$(srcdir)/include \
			-I$(srcdir)/$(driverdir)/gm -DGM_DEBUG=0 \
			$(DUSER) -DINSIST  -DGM_BUILDING_GM=1
CPUBOARD	= 
OPTFLAGS        = -g -O2
CFLAGS		= -g -O2 $(CPPFLAGS) -DGM_CPU_$(target_cpu)=1
CXXFLAGS	= -g -O2 $(CPPFLAGS) -DGM_CPU_$(target_cpu)=1
LDFLAGS		=  -lgcc 

EXTRA_USER_CFLAGS     = 
# Note for IRIX: one way to get runtime array-bounds checking etc. is to append
# the following to EXTRA_KERNEL_CPPFLAGS:
#     -DEBUG:div_check=3:subscript_check:trap_uninitialized:verbose_runtime
# See the IRIX manpage DEBUG_GROUP(5) for more info.
EXTRA_KERNEL_CPPFLAGS = -DGM_KERNEL=1 -I$(srcdir)/drivers -I$(srcdir)/zlib
EXTRA_KERNEL_CFLAGS = 
KERN_CPPFLAGS	= $(CPPFLAGS) $(EXTRA_KERNEL_CPPFLAGS)\
			-DGM_BUILDING_INTERNALS=1
KERN_CFLAGS	= $(CFLAGS) $(EXTRA_KERNEL_CPPFLAGS) $(EXTRA_KERNEL_CFLAGS)
LIBGM_CPPFLAGS	= $(CPPFLAGS) $(EXTRA_USER_CFLAGS) -DGM_BUILDING_INTERNALS=1 -DGM_BUILDING_GM_LIB
LIBGM_CFLAGS	= $(CFLAGS) $(LIBGM_CPPFLAGS)
LANAI_CPPFLAGS = -I$(srcdir)/mcp/libc/include -I$(srcdir)/mcp/libc/include/sys\
	-I$(srcdir)/mcp -Imcp -Iinclude -I$(srcdir)/include \
	-DGM_MCP=1 -DGM_BUILDING_INTERNALS=1 \
	-DHAVE_CONFIG_H $(DUSER) -DGM_BUILDING_FIRMWARE=1
LANAI_CFLAGS = $(LANAI_CPPFLAGS) -Wall -Wno-unused -O3 -nostdlib\
	-fcall-saved-11 -fcall-saved-12 -fcall-saved-13 -fcall-saved-14\
	-ffixed-11 -ffixed-12 -ffixed-13 -ffixed-14 -fno-builtin -DUSER=0\
        -DGM_DEBUG=0
# LANAI_CFLAGS += -Wall -Wno-unused
# Enabling optimization and debugging at the same time can cause the
# compiler to fail unless running on a machine with tons of memory.
LANAI3_CFLAGS = $(LANAI_CFLAGS) -m4.1 -Dlanai3 -msingle-context
LANAI4_CFLAGS = $(LANAI_CFLAGS) -m4.1 -Dlanai3 -msingle-context
LANAI5_CFLAGS = $(LANAI_CFLAGS) -m4.1 -Dlanai3 -msingle-context 
LANAI6_CFLAGS = $(LANAI_CFLAGS) -m4.1 -Dlanai3 -msingle-context
LANAI7_CFLAGS = $(LANAI_CFLAGS) -m7.0 -Dlanai7
LANAI8_CFLAGS = $(LANAI_CFLAGS) -m7.0 -Dlanai7
LANAI9_CFLAGS = $(LANAI_CFLAGS) -m9.0

LANAI_LDFLAGS =
LANAI3_LDFLAGS =
LANAI4_LDFLAGS =
LANAI5_LDFLAGS =
LANAI6_LDFLAGS =
LANAI7_LDFLAGS =
LANAI8_LDFLAGS =
LANAI9_LDFLAGS =

EXTRA_LIBZ_CFLAGS = 
LIBZ_CFLAGS     = $(CFLAGS) $(EXTRA_LIBZ_CFLAGS)

MATH_LIBRARY    = -lm

ALL		= release

GM_VERSION	= 1.4pre44
_GM_VERSION	= 1_4pre44
GM_DATE		= $(shell date)
GM_HOSTNAME	= $(shell hostname)
GM_USER		= $(shell echo $${USER})
GM_BUILD_ID	= $(GM_VERSION) $(GM_USER)@$(GM_HOSTNAME) $(GM_DATE)

GM_SYS = $(shell uname -s)
GM_REL = $(shell uname -r)
GM_MACH = $(shell uname -m | sed -e 's/i[0-9]86/x86/')
GM_TARGET = $(GM_MACH)-$(GM_SYS)-$(GM_REL)

# If it exists, include the Makefile.overrides file to allow manual
# overrides of automatically configured variables.  This allows
# the overrides to be persistent across Makefile rebuilds.

all: $(ALL)
	@echo GM build succeeded.
Makefile.overrides:
	touch Makefile.overrides
include Makefile.overrides

########################################################################
########################################################################
### Distributed entry points
########################################################################
########################################################################

# The following entry points have multiple rules distributed 
# throughout this file and drivers/<arch>/make-os.in

.PHONY: mostlyclean clean distclean maintainer-clean

########################################################################
########################################################################
### Abstract targets
########################################################################
########################################################################

.PHONY: all build install 

release: installdirs

build: binary/sbin/gm

# Install the binary release on this machine

ifneq (${INSTALL_DSO},"yes")
install_package: force
	if [ ! -d ${INSTALL_PREFIX}/usr/local/gm ] ; then \
		 mkdir -p ${INSTALL_PREFIX}/usr/local/gm ; \
	fi
	for idir in ${INSTALL_DIRS} ; \
		do if [ ! -d ${INSTALL_PREFIX}/usr/local/gm/$${idir} ] ; \
			then mkdir -p  ${INSTALL_PREFIX}/usr/local/gm/$${idir} ; fi; done
	cp -a binary/* ${INSTALL_PREFIX}/usr/local/gm
else
install_package: force
	if [ ! -d ${INSTALL_PREFIX}/usr/local/gm ] ; then \
		mkdir -p ${INSTALL_PREFIX}/usr/local/gm ; \
	fi
	for idir in ${INSTALL_DIRS} ; \
		do if [ ! -d ${INSTALL_PREFIX}/usr/local/gm/$${idir} ] ; \
			then mkdir -p  ${INSTALL_PREFIX}/usr/local/gm/$${idir} ; fi; done
	cp -a binary/* ${INSTALL_PREFIX}/usr/local/gm
	if [ -e ${INSTALL_PREFIX}/usr/local/gm/lib/libgm.so.${GM_VERSION} ] ; \
		then rm -f /usr/lib/libgm.so ; \
                ln -s ${INSTALL_PREFIX}/usr/local/gm/lib/libgm.so.${GM_VERSION} /usr/lib/libgm.so ; fi
endif


install: $(ALL) force
	cd binary && ./GM_INSTALL

########################################################################
########################################################################
### architecture builds
########################################################################
########################################################################

HOSTS = redhat6 empire jove rack1 sx monet umax8 hawking1 frisbee freebsd
ARCH := arch/$(shell uname)
ARCH_M := $(ARCH)/$(shell uname -m)
ARCH_MR := $(ARCH_M)/$(shell uname -r)

.PHONY: arch archs

archs.%: force
	rm -f include/gm_auto_config.h
	$(SHELL) -ec '							\
	wd=`pwd` ;							\
	for host in $(HOSTS) ; do					\
	  echo "=====" ;						\
          echo "= preparing to build on $${host}" ;			\
	  echo "=====" ;						\
	  rsh $${host} cd $${wd} "&&" $(MAKE) arch.Makefile ;		\
	done ;								\
	echo "========================" ;				\
        echo "= building on $(HOSTS)" ;					\
	echo "========================" ;				\
	for host in $(HOSTS) ; do					\
	  eval rsh $${host} cd $${wd} '\''"&&"'\'' $(MAKE) arch.$*	\
	       '\''"|"'\'' sed -e '\''"s@^@$${host}:@g"'\'' \& ;	\
	done ;								\
	wait'

arch.%: force
	$(SHELL) -ec '							\
	echo Making arch. ;						\
	wd=`pwd` ;							\
	sd=`cd ${srcdir} ; pwd` ;					\
	if [ -f ../../drivers/gm.c ] ; then				\
	  echo '\''Cannot "make arch" in an arch directory.'\'' ;	\
	  echo '\''Try "make release" instead.'\'' ;			\
	  exit 1 ;							\
	fi ;								\
	if [ ! -d arch ] ; then mkdir arch || true ; fi ;		\
	if [ ! -d $(ARCH) ] ; then mkdir $(ARCH) || true ; fi ;		\
	if [ ! -d $(ARCH_M) ] ; then mkdir $(ARCH_M) || true ; fi ;	\
	if [ ! -d $(ARCH_MR) ] ; then mkdir $(ARCH_MR) || true ; fi ;	\
	if [ ! -f $(ARCH_MR)/Makefile ] ; then				\
	  rm -f include/gm_auto_config.h                 		\
	  cd $(ARCH_MR) && $${sd}/configure --enable-maintainer-mode $(CONF_OPTS);		\
	fi ;								\
	cd $${wd}/$(ARCH_MR) && $(MAKE) $*'

########################################################################
########################################################################
### directory .
########################################################################
########################################################################

#############
# Installation
#############

release_msg: force
	@echo "***************************************"
	@echo "** Building binary release directory **"
	@echo "***************************************"

binary/README.TXT: README installdirs
	tr '\012' '\015' < $(srcdir)/README > drivers/nt4.0/README.TXT
	$(INSTALL_DATA) drivers/nt4.0/README.TXT binary/README.TXT

#############
# Distribution
#############

dist: gz

# Make the archive for a binary release

gz: release
	(cd binary; tar czf - *) > gm-$(GM_VERSION).tar.gz

#############
# tags
#############

# Make emacs TAGS file

TAGS: common_tags driver_tags
.PHONY: common_tags
common_tags: force
	-rm -f $(srcdir)/TAGS
	cd $(srcdir) && $(ETAGS) */*.c \
	&& $(ETAGS) --append */*.h \
	&& $(ETAGS) --append drivers/*.[ch] \
	&& $(ETAGS) --append `find mcp/libc -name '*.[ch]' -print`

# Make vi tags file

tags: force
	cd $(srcdir) && $(CTAGS) */*.c $(srcdir)/$(driverdir)/*/*.c	\
		&& $(CTAGS) --append */*.h $(srcdir}/$(driverdir)/*/*.h	\
		&& $(CTAGS) --append drivers/*.[ch]

############
# Tests
############

.PHONY: check
check: force
	@echo 'Target not supported yet.  You can run the tests in the '
	@echo 'release manually, however.'

#############
# Configuration (maintainer only)
#############

$(srcdir)/configure: configure.in
	cd $(srcdir) && autoconf

# autoheader might not change gm_auto_config.h.in, so touch a stamp file.
$(srcdir)/include/gm_auto_config.h.in: stamp-h.in
$(srcdir)/stamp-h.in: configure.in acconfig.h
	cd $(srcdir) ; autoheader
	echo This is a timestamp file. > $(srcdir)/stamp-h.in

include/gm_auto_config.h: stamp-h
stamp-h: $(srcdir)/include/gm_auto_config.h.in config.status
	./config.status

# Special timestamp to rebuild Makefile if user runs config.status manually
MAKEFILE_DEPS =\
 config.status\
 Makefile.in\
 $(srcdir)/$(driverdir)/make-os.in\
 libgm/_gm_version.c.in

libgm/_gm_version.c Makefile: $(MAKEFILE_DEPS)
	./config.status

config.status: configure VERSION
	./config.status --recheck

#############
# cleanliness
#############

distclean: remove_derived
.PHONY: remove_derived
remove_derived: force
	rm -f include/gm_auto_config.h Makefile
	rm -f libgm/_gm_version.c

#############
# Utility
#############

.PHONY: force
force:

#############
# Cleanliness
#############
# This section cleans only the top and binary directories.  Additional
# rules for cleaning each subdirectory are grouped with the other
# rules for the subdirectory.

.PHONY: mostlyclean clean distclean maintainer-clean
.PHONY: _mostlyclean _clean _distclean _maintainer-clean

mostlyclean:
	-rm -f configure.scan
	-rm -f *.i *.s
clean: mostlyclean
	-rm -f gm-*.tar.gz
# Clean up for combined binary release (Myricom specific)
strip: force
	-$(STRIP) binary/bin/* binary/sbin/mapper
# Clean up for source release (use "cvs export" instead at Myricom)
distclean: clean force
	-rm -rf binary 
# This command is intended for maintainers to use; it
# deletes files that may need special tools to rebuild.
maintainer-clean: distclean
	@echo 'This command is intended for maintainers to use; it'
	@echo 'deletes files that may need special tools to rebuild.'
	-rm -f TAGS tags
	-rm -f configure

########################################################################
########################################################################
### directory ./binary
########################################################################
########################################################################

# NOTE: Only the rules for making the binary release directories go
# here.  The rules for the files in the binary release are in the
# Makefile section corresponding to the directory containing the source
# for that file.

#############
# Directories
#############

# Directories appear to change each time they are accessed, so we use
# a timestamp file.

# This is the conventional (GNU) way to timestamp the installation 
# directories, except for the "binary/..." dependency, which I added.
# (see below). --Glenn 

installdirs: binary/...
	echo timestamp > installdirs

# I find I have a tendency to "rm -f binary", so I introduced another
# timestamp to rebuild the installdirs in this case.

binary/...: 
	if [ ! -d binary ]; then mkdir binary ; fi
	for dir in bin doc etc include info lib sbin ;			\
	do								\
	  if [ ! -d binary/$${dir} ]; then mkdir binary/$${dir} ; fi ;	\
	done
	echo timestamp > binary/...

clean: clean_installdirs
clean_installdirs:
	-rm -rf binary/* binary/...

binary/include/gm.h : installdirs
binary/include/gm_stbar.h : installdirs
binary/include/gm_roster.h : installdirs
binary/include/gm_config.h : installdirs
binary/include/gm_auto_config.h : installdirs

release: binary/include/gm.h binary/include/gm_stbar.h \
         binary/include/gm_roster.h binary/include/gm_config.h \
         binary/include/gm_auto_config.h

binary/include/%.h: include/%.h
	$(INSTALL_DATA) $< $@

########################################################################
########################################################################
### directory ./zlib
########################################################################
########################################################################

# Zlib is used in the kernel only.

ZLIB_SRCS = zlib/adler32.c zlib/compress.c zlib/crc32.c\
 zlib/uncompr.c zlib/deflate.c zlib/trees.c zlib/zutil.c\
 zlib/inflate.c zlib/infblock.c zlib/inftrees.c\
 zlib/infcodes.c zlib/infutil.c zlib/inffast.c
ZLIB_OBJS = $(ZLIB_SRCS:.c=_k.o)

zlib/libz.a: $(ZLIB_OBJS)
	rm -f zlib/libz.a
	$(AR) $(ARFLAGS) $@ $(ZLIB_OBJS) || rm $@
	$(RANLIB) $@ || rm $@

zlib/%_k.o: zlib/%.c
	$(KCC) -c -I$(*D) $(DRIVER_CFLAGS) $(LIBZ_CFLAGS) $< -o $@

mostlyclean: zlib/mostlyclean
zlib/mostlyclean: force
	-rm -f zlib/*.o zlib/*.a

#############
# Cleanliness
#############

clean: zlib/clean
zlib/clean: force
	-rm -f zlib/*.o

distclean: zlib/distclean
zlib/distclean: force
	-rm -f zlib/libz.a

########################################################################
########################################################################
### directory ./libgm
########################################################################
########################################################################

libgm/_gm_build_id.c:
	echo "/* DO NOT EDIT THIS FILE!  It is machine generated. */" \
		> libgm/_gm_build_id.c
	echo "#include \"gm_internal.h\"" \
		>> libgm/_gm_build_id.c
	echo 'GM_ENTRY_POINT const char*_gm_build_id="$(GM_BUILD_ID)"; void _gm_nt_foo(void) {} ' \
		>> libgm/_gm_build_id.c

release: $(RELEASE_LIBS)

LIB_UTIL_SRCS =\
 libgm/GM_PAGE_LEN.c\
 libgm/_gm_build_id.c\
 libgm/_gm_version.c\
 libgm/gm_abort.c\
 libgm/gm_alloc_pages.c\
 libgm/gm_bcopy.c\
 libgm/gm_bzero.c\
 libgm/gm_calloc.c\
 libgm/gm_close.c\
 libgm/gm_cop.c\
 libgm/gm_crc.c\
 libgm/gm_crc_table.c\
 libgm/gm_free.c\
 libgm/gm_get_host_name.c\
 libgm/gm_get_node_type.c\
 libgm/gm_hash.c\
 libgm/gm_init.c\
 libgm/gm_log2.c\
 libgm/gm_lookaside.c\
 libgm/gm_malloc.c\
 libgm/gm_mark.c\
 libgm/gm_memcmp.c\
 libgm/gm_mutex.c\
 libgm/gm_page_alloc.c\
 libgm/gm_printf.c\
 libgm/gm_rand.c\
 libgm/gm_rand_mod.c\
 libgm/gm_strcmp.c\
 libgm/gm_strncmp.c\
 libgm/gm_strncpy.c\
 libgm/gm_zone.c


LIB_SRCS =\
 libgm/GM_PAGE_LEN.c\
 libgm/_gm_assertion_failed.c\
 libgm/_gm_build_id.c\
 libgm/_gm_clear_all_routes.c\
 libgm/_gm_dump_receive_queue.c\
 libgm/_gm_enable_raw_receives.c\
 libgm/_gm_finish_mmap.c\
 libgm/_gm_get_eeprom.c\
 libgm/_gm_get_firmware_string.c\
 libgm/_gm_get_globals.c\
 libgm/_gm_get_globals_by_request.c\
 libgm/_gm_get_kernel_build_id.c\
 libgm/_gm_get_mapping_specs.c\
 libgm/_gm_get_opener_pids.c\
 libgm/_gm_get_page_hash_cache_size.c\
 libgm/_gm_get_page_len.c\
 libgm/_gm_get_route.c\
 libgm/_gm_host_name.c\
 libgm/_gm_ioctl_cmd_name.c\
 libgm/_gm_ip_checksum.c\
 libgm/_gm_mapper_open.c\
 libgm/_gm_mmap.c\
 libgm/_gm_modsend.c\
 libgm/_gm_munmap.c\
 libgm/_gm_open_ports.c\
 libgm/_gm_provide_raw_receive_buffer.c\
 libgm/_gm_raw_send.c\
 libgm/_gm_recv_event_name.c\
 libgm/_gm_request_sleep.c\
 libgm/_gm_set_host_name.c\
 libgm/_gm_set_mapper_level.c\
 libgm/_gm_set_node_id.c\
 libgm/_gm_set_node_type.c\
 libgm/_gm_set_opener_pid.c\
 libgm/_gm_set_port_num.c\
 libgm/_gm_set_route.c\
 libgm/_gm_set_unique_id.c\
 libgm/_gm_sleep.c\
 libgm/_gm_stbar.c\
 libgm/_gm_user_ioctl.c\
 libgm/_gm_version.c\
 libgm/gm_abort.c\
 libgm/gm_alloc_pages.c\
 libgm/gm_alloc_send_token.c\
 libgm/gm_allow_remote_memory_access.c\
 libgm/gm_bcopy.c\
 libgm/gm_blocking_receive.c\
 libgm/gm_blocking_receive_no_spin.c\
 libgm/gm_bzero.c\
 libgm/gm_call_trace.c\
 libgm/gm_calloc.c\
 libgm/gm_close.c\
 libgm/gm_cop.c\
 libgm/gm_crc.c\
 libgm/gm_crc_table.c\
 libgm/gm_datagram_send.c\
 libgm/gm_datagram_send_4.c\
 libgm/gm_debug_buffers.c\
 libgm/gm_debug_lanai_dma.c\
 libgm/gm_deregister.c\
 libgm/gm_directcopy.c\
 libgm/gm_directed_send.c\
 libgm/gm_dma_calloc.c\
 libgm/gm_dma_free.c\
 libgm/gm_dma_malloc.c\
 libgm/gm_drop_sends.c\
 libgm/gm_exit.c\
 libgm/gm_flush_alarm.c\
 libgm/gm_fork_system.c\
 libgm/gm_free.c\
 libgm/gm_free_send_token.c\
 libgm/gm_free_send_tokens.c\
 libgm/gm_get_host_name.c\
 libgm/gm_get_ktrace.c\
 libgm/gm_get_mapper_unique_id.c\
 libgm/gm_get_node_id.c\
 libgm/gm_get_node_type.c\
 libgm/gm_get_unique_board_id.c\
 libgm/gm_getpid.c\
 libgm/gm_handle_sent_tokens.c\
 libgm/gm_hash.c\
 libgm/gm_hex_dump.c\
 libgm/gm_host_name_to_node_id.c\
 libgm/gm_init.c\
 libgm/gm_isprint.c\
 libgm/gm_log2.c\
 libgm/gm_lookaside.c\
 libgm/gm_malloc.c\
 libgm/gm_mark.c\
 libgm/gm_max_length_for_size.c\
 libgm/gm_max_node_id.c\
 libgm/gm_max_node_id_inuse.c\
 libgm/gm_max_used_node_id.c\
 libgm/gm_memcmp.c\
 libgm/gm_memorize_message.c\
 libgm/gm_min_message_size.c\
 libgm/gm_min_size_for_length.c\
 libgm/gm_mtu.c\
 libgm/gm_mutex.c\
 libgm/gm_next_event_peek.c\
 libgm/gm_node_id_to_host_name.c\
 libgm/gm_node_id_to_unique_id.c\
 libgm/gm_num_ports.c\
 libgm/gm_num_receive_tokens.c\
 libgm/gm_num_send_tokens.c\
 libgm/gm_on_exit.c\
 libgm/gm_open.c\
 libgm/gm_page_alloc.c\
 libgm/gm_perror.c\
 libgm/gm_printf.c\
 libgm/gm_provide_receive_buffer.c\
 libgm/gm_rand.c\
 libgm/gm_rand_mod.c\
 libgm/gm_receive.c\
 libgm/gm_receive_pending.c\
 libgm/gm_register.c\
 libgm/gm_resume_sending.c\
 libgm/gm_save_trace.c\
 libgm/gm_send.c\
 libgm/gm_send_to_peer.c\
 libgm/gm_send_token_available.c\
 libgm/gm_set_acceptable_sizes.c\
 libgm/gm_set_alarm.c\
 libgm/gm_set_enable_nack_down.c\
 libgm/gm_sleep.c\
 libgm/gm_strcmp.c\
 libgm/gm_strerror.c\
 libgm/gm_strlen.c\
 libgm/gm_strncasecmp.c\
 libgm/gm_strncmp.c\
 libgm/gm_strncpy.c\
 libgm/gm_struct_lock.c\
 libgm/gm_tick_init.c\
 libgm/gm_ticks.c\
 libgm/gm_tracing.c\
 libgm/gm_unique_id.c\
 libgm/gm_unique_id_to_node_id.c\
 libgm/gm_unknown.c\
 libgm/gm_zone.c

LIB_OBJS = $(LIB_SRCS:.c=.o)

#moved to each arch/make-os.in
#binary/lib/libgm.a: $(LIB_OBJS) installdirs
#	$(AR) $(ARFLAGS) $@ $(LIB_OBJS) || rm $@
#	$(RANLIB) $@ || rm $@

LIB_K_SRCS =\
 libgm/GM_PAGE_LEN.c\
 libgm/_gm_assertion_failed.c\
 libgm/_gm_build_id.c\
 libgm/_gm_clear_all_routes.c\
 libgm/_gm_enable_raw_receives.c\
 libgm/_gm_finish_mmap.c\
 libgm/_gm_get_eeprom.c\
 libgm/_gm_get_firmware_string.c\
 libgm/_gm_get_globals.c\
 libgm/_gm_get_globals_by_request.c\
 libgm/_gm_get_kernel_build_id.c\
 libgm/_gm_get_mapping_specs.c\
 libgm/_gm_get_opener_pids.c\
 libgm/_gm_get_page_hash_cache_size.c\
 libgm/_gm_get_route.c\
 libgm/_gm_host_name.c\
 libgm/_gm_ioctl_cmd_name.c\
 libgm/_gm_ip_checksum.c\
 libgm/_gm_mapper_open.c\
 libgm/_gm_mmap.c\
 libgm/_gm_modsend.c\
 libgm/_gm_munmap.c\
 libgm/_gm_open_ports.c\
 libgm/_gm_provide_ethernet_scatter_list.c\
 libgm/_gm_provide_raw_receive_buffer.c\
 libgm/_gm_raw_send.c\
 libgm/_gm_recv_event_name.c\
 libgm/_gm_request_sleep.c\
 libgm/_gm_set_host_name.c\
 libgm/_gm_set_mapper_level.c\
 libgm/_gm_set_node_id.c\
 libgm/_gm_set_node_type.c\
 libgm/_gm_set_opener_pid.c\
 libgm/_gm_set_route.c\
 libgm/_gm_set_unique_id.c\
 libgm/_gm_sleep.c\
 libgm/_gm_stbar.c\
 libgm/_gm_user_ioctl.c\
 libgm/_gm_version.c\
 libgm/gm_abort.c\
 libgm/gm_alloc_pages.c\
 libgm/gm_alloc_send_token.c\
 libgm/gm_allow_remote_memory_access.c\
 libgm/gm_bcopy.c\
 libgm/gm_blocking_receive.c\
 libgm/gm_blocking_receive_no_spin.c\
 libgm/gm_bzero.c\
 libgm/gm_call_trace.c\
 libgm/gm_calloc.c\
 libgm/gm_close.c\
 libgm/gm_cop.c\
 libgm/gm_crc.c\
 libgm/gm_crc_table.c\
 libgm/gm_datagram_send.c\
 libgm/gm_datagram_send_4.c\
 libgm/gm_debug_buffers.c\
 libgm/gm_debug_lanai_dma.c\
 libgm/gm_deregister.c\
 libgm/gm_directed_send.c\
 libgm/gm_dma_calloc.c\
 libgm/gm_dma_free.c\
 libgm/gm_dma_malloc.c\
 libgm/gm_drop_sends.c\
 libgm/gm_flush_alarm.c\
 libgm/gm_free.c\
 libgm/gm_free_send_token.c\
 libgm/gm_free_send_tokens.c\
 libgm/gm_get_host_name.c\
 libgm/gm_get_ktrace.c\
 libgm/gm_get_mapper_unique_id.c\
 libgm/gm_get_node_id.c\
 libgm/gm_get_node_type.c\
 libgm/gm_get_unique_board_id.c\
 libgm/gm_getpid.c\
 libgm/gm_handle_sent_tokens.c\
 libgm/gm_hash.c\
 libgm/gm_hex_dump.c\
 libgm/gm_host_name_to_node_id.c\
 libgm/gm_init.c\
 libgm/gm_isprint.c\
 libgm/gm_log2.c\
 libgm/gm_lookaside.c\
 libgm/gm_malloc.c\
 libgm/gm_mark.c\
 libgm/gm_max_length_for_size.c\
 libgm/gm_max_node_id.c\
 libgm/gm_max_node_id_inuse.c\
 libgm/gm_max_used_node_id.c\
 libgm/gm_memcmp.c\
 libgm/gm_memorize_message.c\
 libgm/gm_min_message_size.c\
 libgm/gm_min_size_for_length.c\
 libgm/gm_mutex.c\
 libgm/gm_next_event_peek.c\
 libgm/gm_node_id_to_host_name.c\
 libgm/gm_node_id_to_unique_id.c\
 libgm/gm_num_ports.c\
 libgm/gm_num_receive_tokens.c\
 libgm/gm_num_send_tokens.c\
 libgm/gm_open.c\
 libgm/gm_page_alloc.c\
 libgm/gm_perror.c\
 libgm/gm_provide_receive_buffer.c\
 libgm/gm_rand.c\
 libgm/gm_rand_mod.c\
 libgm/gm_receive.c\
 libgm/gm_receive_pending.c\
 libgm/gm_register.c\
 libgm/gm_resume_sending.c\
 libgm/gm_save_trace.c\
 libgm/gm_send.c\
 libgm/gm_send_to_peer.c\
 libgm/gm_send_token_available.c\
 libgm/gm_set_acceptable_sizes.c\
 libgm/gm_set_alarm.c\
 libgm/gm_set_enable_nack_down.c\
 libgm/gm_sleep.c\
 libgm/gm_strcmp.c\
 libgm/gm_strerror.c\
 libgm/gm_strlen.c\
 libgm/gm_strncasecmp.c\
 libgm/gm_strncmp.c\
 libgm/gm_strncpy.c\
 libgm/gm_struct_lock.c\
 libgm/gm_tick_init.c\
 libgm/gm_ticks.c\
 libgm/gm_tracing.c\
 libgm/gm_unique_id.c\
 libgm/gm_unique_id_to_node_id.c\
 libgm/gm_unknown.c\
 libgm/gm_zone.c

LIB_K_OBJS = $(LIB_K_SRCS:.c=_k.o)

# Version of the library with no debugging information.
libgm/libgm_k.a: $(LIB_K_OBJS)
	rm -f libgm/libgm_k.a
	$(AR) $(ARFLAGS) $@ $(LIB_K_OBJS) || rm $@
	$(RANLIB) $@ || rm $@

libgm/%.o: libgm/%.c
	$(CC) -c $(LIBGM_CFLAGS) $< -o $@

############
# Cleanliness
############

mostlyclean: libgm/mostlyclean
libgm/mostlyclean: force
	-rm -f libgm/*.o libgm/_gm_build_id.c
	-rm -f libgm/libgm_k.a

maintainer-clean: libgm/maintainer-clean
libgm/maintainer-clean: force
	-rm -f binary/lib/libgm.a

########################################################################
########################################################################
### directory ./trace
########################################################################
########################################################################

TRACETOOLS= gm_ktrace gm_lanai_bias gm_mpi_cbias piclgen
TRACEBINS= $(TRACETOOLS:%=binary/bin/%)

trace : $(TRACEBINS)

$(TRACEBINS) : binary/lib/libgm.a

binary/bin/gm_mpi_cbias : trace/gm_mpi_cbias.o
	mpicc $< $(CFLAGS) -o $@

trace/gm_mpi_cbias.o : trace/gm_mpi_cbias.c
	mpicc $< -c $(CFLAGS) -I./include -I$(srcdir)/include -o $@

########################################################################
########################################################################
### directory ./tests
########################################################################
########################################################################

EXTRA_TESTS     = 
EXTRA_TEST_SRCS = 

TEST_LDFLAGS		= -Llibgm -Lbinary/lib -lgm $(LDFLAGS) $(IRIX_API_FLAG) $(EXTRA_USER_LDFLAGS) $(LIBS)

TESTS =\
 $(EXTRA_TESTS)\
 binary/bin/gm_set_speed\
 binary/bin/gm_allsize\
 binary/bin/gm_board_info\
 binary/bin/gm_counters\
 binary/bin/gm_debug\
 binary/bin/gm_dirsend\
 binary/bin/gm_dma_malloc\
 binary/bin/gm_fault\
 binary/bin/gm_nway\
 binary/bin/gm_set_node_type\
 binary/bin/gm_setname\
 binary/bin/gm_simpleroute\
 binary/bin/gm_time_registration\
 binary/bin/logp_test\
 $(END)
DISABLED_TESTS = \
 binary/bin/gm_simple_api\
 binary/bin/gm_lat\
 binary/bin/gm_basic\
 binary/bin/gm_hash\
 binary/bin/gm_malloc\
 $(END)

TEST_SRCS =\
 $(EXTRA_TEST_SRCS) \
 tests/gm_allsize.c\
 tests/gm_basic.c\
 tests/gm_board_info.c\
 tests/gm_counters.c\
 tests/gm_debug.c\
 tests/gm_dirsend.c\
 tests/gm_dma_malloc.c\
 tests/gm_fault.c\
 tests/gm_hash.c\
 tests/gm_malloc.c\
 tests/gm_nway.c\
 tests/gm_set_speed.c\
 tests/gm_setname.c\
 tests/gm_simpleroute.c\
 tests/gm_time_registration.c\
 tests/logp_stat.c\
 tests/logp_test.c\
 tests/logp_time.c\
 $(END)
DISABLED_TEST_SRCS =\
 tests/gm_simple_api.c\
 tests/gm_lat.c\
 $(END)

TEST_OBJS = $(TEST_SRCS:.c=.o)

$(TESTS) : binary/lib/libgm.a installdirs

release: $(TESTS) binary/bin/logp_test.README binary/bin/tests.README \
                  binary/bin/gmperf.pl

build : $(TESTS)

binary/bin/%.README: tests/%.README
	$(INSTALL_DATA) $< $@

binary/bin/%.pl: tests/%.pl
	$(INSTALL) $< $@

tests/all: $(TESTS)

#############
# Cleanliness
#############

mostlyclean: tests/mostlyclean
tests/mostlyclean:
	-rm -f tests/*.o

############
# Executables
############

binary/bin/logp_test: tests/logp_test.o tests/logp_stat.o tests/logp_time.o
	$(CC) -o $@ tests/logp_stat.o tests/logp_time.o $< $(TEST_LDFLAGS) \
	   $(MATH_LIBRARY)
 
GM_ALLSIZE_OBJS = tests/gm_allsize.o tests/stats.o
binary/bin/gm_allsize: $(GM_ALLSIZE_OBJS) 
	$(CC) $(GM_ALLSIZE_OBJS) $(TEST_LDFLAGS) -o $@ $(MATH_LIBRARY) 

GM_SET_SPEED_OBJS = tests/gm_set_speed.o
binary/bin/gm_set_speed: $(GM_SET_SPEED_OBJS) 
	$(CC) $(GM_SET_SPEED_OBJS) $(TEST_LDFLAGS) -o $@ $(MATH_LIBRARY) 

binary/bin/%: tests/%.o
	$(CC) $< $(TEST_LDFLAGS) -o $@

binary/bin/%: trace/%.o
	$(CC) $< $(TEST_LDFLAGS) -o $@

########################################################################
########################################################################
### directory ./gam
########################################################################
########################################################################

gam/all: gamdir gam/libgam.a gam/test_xfer gam/ping_pong gam/ping_ping
gam/all: gam/ping_xfer gam/thru_bulk

gamdir:
	$(SHELL) -ec 'if [ ! -d gam ] ; then mkdir gam || true ; fi ;'

mostlyclean: gam/mostlyclean
gam/mostlyclean:
	-rm -f gam/core gam/*.o gam/*.a gam/ping_xfer gam/ping_pong \
           gam/ping_ping gam/thru_bulk gam/test_xfer
clean: gam/mostlyclean

GAM_OBJS = gam/enable.o gam/disable.o gam/poll.o gam/ucb.o

gam/%.o: gam/%.c
	$(CC) -c $(CFLAGS) $< -o $@

gam/libgam.a: $(GAM_OBJS) 
	$(AR) $(ARFLAGS) $@ $? || rm $@
	$(RANLIB) $@ || rm $@

gam/thru_bulk: gam/thru_bulk.o gam/libgam.a  binary/lib/libgm.a
	$(CC) $(LDFLAGS) -o $@ gam/thru_bulk.o gam/libgam.a binary/lib/libgm.a

gam/ping_pong: gam/ping_pong.o gam/libgam.a binary/lib/libgm.a
	$(CC) $(LDFLAGS) -o $@  gam/ping_pong.o gam/libgam.a binary/lib/libgm.a

gam/test_xfer: gam/test_xfer.o gam/libgam.a binary/lib/libgm.a
	$(CC) $(LDFLAGS) -o $@  gam/test_xfer.o gam/libgam.a binary/lib/libgm.a

gam/ping_xfer: gam/ping_xfer.o gam/libgam.a binary/lib/libgm.a
	$(CC) $(LDFLAGS) -o $@ gam/ping_xfer.o gam/libgam.a binary/lib/libgm.a

gam/ping_ping: gam/ping_ping.o gam/libgam.a binary/lib/libgm.a
	$(CC) $(LDFLAGS) -o $@ gam/ping_ping.o gam/libgam.a binary/lib/libgm.a

########################################################################
########################################################################
### directory ./mt
########################################################################
########################################################################

MT_LIBMT_OBJS =\
 mt/libmt/mt_Address.o\
 mt/libmt/mt_Args.o\
 mt/libmt/mt_Calculator.o\
 mt/libmt/mt_Cloud.o\
 mt/libmt/mt_CloudResponder.o\
 mt/libmt/mt_Component.o\
 mt/libmt/mt_File.o\
 mt/libmt/mt_FileReader.o\
 mt/libmt/mt_FileWriter.o\
 mt/libmt/mt_Gm.o\
 mt/libmt/mt_Graph.o\
 mt/libmt/mt_Host.o\
 mt/libmt/mt_HostTable.o\
 mt/libmt/mt_Job.o\
 mt/libmt/mt_MapFile.o\
 mt/libmt/mt_Mapper.o\
 mt/libmt/mt_MapperOptions.o\
 mt/libmt/mt_Message.o\
 mt/libmt/mt_Network.o\
 mt/libmt/mt_NetworkQueue.o\
 mt/libmt/mt_Node.o\
 mt/libmt/mt_Queue.o\
 mt/libmt/mt_Responder.o\
 mt/libmt/mt_Route.o\
 mt/libmt/mt_RouteFile.o\
 mt/libmt/mt_RouteTable.o\
 mt/libmt/mt_StringReader.o\
 mt/libmt/mt_Switch.o\
 mt/libmt/mt_Tokenizer.o

MT_DEADLOCK_OBJS=\
mt/deadlock/de_Deadlock.o

MT_MMAPPER_OBJS =\
 mt/mmapper/mm.o\
 mt/mmapper/mm_Cloud.o\
 mt/mmapper/mm_Graph.o\
 mt/mmapper/mm_Host.o\
 mt/mmapper/mm_Mapper.o\
 mt/mmapper/mm_MapperModule.o\
 mt/mmapper/mm_Node.o\
 mt/mmapper/mm_Simulation.o\
 mt/mmapper/mm_Switch.o

MT_SIMPLE_OBJS =\
 mt/simple/sc.o\
 mt/simple/sc_Calculator.o\
 mt/simple/sc_Host.o\
 mt/simple/sc_Switch.o

MT_TOOLS_OBJS = mt/tools/mapper.o

MAPPER_OBJS =\
 $(MT_DEADLOCK_OBJS)\
 $(MT_LIBMT_OBJS)\
 $(MT_MMAPPER_OBJS)\
 $(MT_SIMPLE_OBJS)\
 $(MT_TOOLS_OBJS)

MAPPER = binary/sbin/mapper
MAPPER_ARGS = binary/sbin/active.args binary/sbin/passive.args
MAPPER_CXX = $(CXX)
MAPPER_CXXFLAGS = $(CXXFLAGS) -I$(srcdir)/mt/libmt -I$(srcdir)/mt/deadlock
MAPPER_CXXLDFLAGS = $(MAPPER_CXXFLAGS)
MAPPER_LDFLAGS = -Llibgm -Lbinary/lib -lgm $(LDFLAGS) $(EXTRA_USER_LDFLAGS) $(LIBS)

release: $(MAPPER) $(MAPPER_ARGS)

# Build mapper executable

$(MAPPER): $(MAPPER_OBJS) binary/lib/libgm.a
	$(MAPPER_CXX) $(MAPPER_CXXLDFLAGS) -o $(MAPPER) $(MAPPER_OBJS) $(MAPPER_LDFLAGS)

# Copy mapper setup files
binary/sbin/active.args: mt/tools/active.args
	cp $(srcdir)/mt/tools/active.args binary/sbin/active.args

binary/sbin/passive.args: mt/tools/passive.args
	cp $(srcdir)/mt/tools/passive.args binary/sbin/passive.args

# Implicit rule to use C++ to build the mapper.

mt/%.o: $(srcdir)/mt/%.c
	  $(CXX) -c $(MAPPER_CXXFLAGS) $< -o $@

############
# Cleanliness
############

clean: mt-clean
mt-clean: force
	-rm -f mt/*.o mt/*/*.o mt/*/*/*.o
.PHONY: mt-clean

distclean: mt-distclean
mt-distclean: force
	-rm -f $(MAPPER)
.PHONY: mt-distclean

############
# Bob and David's build hooks.  (Glenn deprecates these.)
############

.PHONY: mapper-strip mapper mapper-clean mapper-release

mapper-strip: force
	  (cd mt ; make strip)

mapper: force
	  (cd mt ; make gm)

mapper-clean: force
	  (cd mt ; make clean)

mapper-release: force
	  (cd mt ; make release)

########################################################################
########################################################################
### directory ./doc
########################################################################
########################################################################

TEX_DROPPINGS = gm.aux gm.cp gm.cps gm.fn gm.ky gm.log gm.pg gm.toc gm.tp \
	gm.vr gm.vrs
BINARY_DOCS = binary/doc/gm.pdf binary/info/gm.info binary/doc/gm_toc.html \
	binary/doc/gm.txt
# Documentation to be included in CVS repository, as it cannot be built on
# all architectures.
CVS_DOCS = \
	$(srcdir)/doc/gm.html \
	$(srcdir)/doc/gm.info \
	$(srcdir)/doc/gm.pdf \
	$(srcdir)/doc/gm.txt \
	$(srcdir)/doc/gm_foot.html \
	$(srcdir)/doc/gm_toc.html

.PHONY: doc docs binary/doc
.PHONY: info pdf html txt

# Documentation to build for a Unix binary release
docs: doc
doc: info txt pdf html

binary/doc: $(BINARY_DOCS)
release: binary/doc

# Rules for checking that the examples in the .texi file actually compile

TEXI_I_FILES = doc/1.texi_i doc/2.texi_i
TEXI_C_FILES = $(TEXI_I_FILES:_i=_c)
$(TEXI_I_FILES) : $(TEXI_C_FILES)
	for out in $(TEXI_I_FILES) ; do					\
	  if [ ! -d doc ] ; then mkdir doc ; fi	;			\
          in=`echo $${out}						\
              | sed -e s@doc@$(srcdir)/doc@				\
              | sed -e s@_i@_c@` ;					\
	  echo "#line 1 \"$${in}\"" > $${out} ;				\
	  sed -e 's/@//g' < $${in} | sed -e 's/\.\.\.//g' >> $${out} ;	\
        done
.PHONY: check_texi
check_texi: $(srcdir)/doc/check_texi.c $(TEXI_I_FILES)
	$(CC) -I$(srcdir)/include -Idoc -c $(srcdir)/doc/check_texi.c

# Rules to build docs in the doc/ directory
#
# These rules are a bit odd to allow the use precompiled versions of the
# docs on machines that cannot build the documentation.  They are designed
# carefully to not modify the docs in the source directory if
# the key build tools (makeinfo, texi2html, or distill does not exist
#
# The documentation building tools are pretty stupid and require all
# the figures to be in the build directory.  Therefore, we copy them
# there when building to allow us to build outside the source
# directory.
DOC_IMAGES_EPS = \
 $(srcdir)/doc/figures/endpoints.eps\
 $(srcdir)/doc/figures/receive.eps\
 $(srcdir)/doc/figures/send.eps\
 $(srcdir)/doc/figures/tokens.eps
DOC_IMAGES_JPG = $(DOC_IMAGES_EPS:.eps=.jpg)
DOC_IMAGES_TXT = $(DOC_IMAGES_EPS:.eps=.txt)
IMAGES_EPS = $(subst $(srcdir)/doc,.,$(DOC_IMAGES_EPS))
IMAGES_JPG = $(IMAGES_EPS:.eps=.jpg)
IMAGES_TXT = $(IMAGES_EPS:.eps=.txt)

doc/gm.texi: check_texi
info: doc/gm.info
doc/gm.info: doc/gm.texi $(TEXI_C_FILES) $(DOC_IMAGES_TXT)
	if [ ! -d figures ] ; then mkdir figures ; fi
	cp $(DOC_IMAGES_TXT) figures
	$(MAKEINFO) -I $(srcdir)/doc $(srcdir)/doc/gm.texi -o $(srcdir)/doc/gm.info
	rm $(IMAGES_TXT)
	-rmdir figures
	if [ -f $(srcdir)/doc/gm.info ] ; then touch $(srcdir)/doc/gm.info ; fi
	echo timestamp > $(srcdir)/doc/info.stmp
nonpdf: info html txt
pdf: doc/gm.pdf
$(IMAGES_EPS):
	if [ ! -d figures ] ; then mkdir figures ; fi
	cp $(DOC_IMAGES_EPS) figures
gm.dvi: doc/gm.texi $(TEXI_C_FILES) $(DOC_IMAGES_EPS)
	$(TEXI2DVI) -I $(srcdir)/doc $(srcdir)/doc/gm.texi || rm -f $(TEX_DROPPINGS)
	rm -f $(TEX_DROPPINGS)
gm.ps: gm.dvi $(IMAGES_EPS)
	$(DVIPS) -t letter -r0 -o gm.ps gm.dvi
doc/gm.pdf: gm.ps
	if [ -f $(DISTILL) ] ;						\
	then								\
	  $(DISTILL) gm.ps ;						\
	else								\
	  pwd=`pwd` ;							\
	  rsh creator "cd $${pwd} && /usr/local/bin/distill gm.ps" ;	\
	  sleep 5 ;							\
	fi
	mv gm.pdf $(srcdir)/doc/gm.pdf || rm -f gm.pdf
	if [ -f $(srcdir)/doc/gm.pdf ] ; then touch $(srcdir)/doc/gm.pdf ; fi
	echo timestamp > $(srcdir)/doc/pdf.stmp
html: doc/gm_toc.html
doc/gm_toc.html: doc/gm.texi $(TEXI_C_FILES) $(DOC_IMAGES_JPG)
	if [ ! -d figures ] ; then mkdir figures ; fi
	cp $(DOC_IMAGES_JPG) figures
	: text files copied only to prevent texi2html warnings
	cp $(DOC_IMAGES_TXT) figures
	-rm -f $(srcdir)/*.html
	$(TEXI2HTML) -monolithic -expandinfo $(srcdir)/doc/gm.texi
	$(TEXI2HTML) -split_chapter -expandinfo $(srcdir)/doc/gm.texi
	: Add a cascading style sheet link to the document to make
	: the ugly texi2html output look reasonable, and
	: fix some nastyness in the texi2htm output including
	: the lack of a doctype, the crazy underlined ":" before each
	: function definition, and the deprecated "</P>" tags, which
	: confuse Netscape\'s layout engine.
	for file in *.html ; do \
	  echo $${file} ; \
	  sed -e 's@<HTML>@<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"><HTML>@' \
	    < $${file} \
	    | sed -e 's@</HEAD>@<LINK REL=stylesheet HREF="gm.css" TYPE="text/css"></HEAD>@' \
	    | sed -e 's@<DT><U>:</U>@<DT>- @' \
	    | sed -e 's@</P>@@' \
	    > foo ;\
	  rm -f $${file} ;\
	  cp -f foo $(srcdir)/doc/$${file} ;\
	  rm -f foo ;\
        done
	rm $(IMAGES_JPG)
	rm $(IMAGES_TXT)
	-rmdir figures
	if [ -f $(srcdir)/doc/gm_toc.html ] ; then touch $(srcdir)/doc/*.html ; fi
	echo timestamp > $(srcdir)/doc/html.stmp
txt: doc/gm.txt
doc/gm.txt: doc/gm.texi $(TEXI_C_FILES) $(DOC_IMAGES_TXT)
	if [ ! -d figures ] ; then mkdir figures ; fi
	cp $(DOC_IMAGES_TXT) figures
	$(MAKEINFO) -I $(srcdir)/doc --fill-column=78 --no-headers --no-split \
	     $(srcdir)/doc/gm.texi -o $(srcdir)/doc/gm.txt
	rm $(IMAGES_TXT)
	-rmdir figures
	if [ -f $(srcdir)/doc/gm.txt ] ; then touch $(srcdir)/doc/gm.txt ; fi
	echo timestamp > $(srcdir)/doc/txt.stmp

$(BINARY_DOCS) : installdirs

# Rules to copy docs into the binary release.  These rules do not depend
# on the documentation source files because the docs are meant to only
# be rebuilt manually using "make doc" to allow the docs to be prebuilt.
binary/info/gm.info: doc/info.stmp
	cp $(srcdir)/doc/gm.info binary/info/gm.info
binary/doc/gm_toc.html: doc/html.stmp
	cp $(srcdir)/doc/gm*.html $(srcdir)/doc/gm.css binary/doc/
	-mkdir -p binary/doc/figures
	cp $(DOC_IMAGES_JPG) binary/doc/figures
binary/doc/gm.pdf: doc/pdf.stmp
	cp $(srcdir)/doc/gm.pdf binary/doc/gm.pdf
binary/doc/gm.txt: doc/txt.stmp
	cp $(srcdir)/doc/gm.txt binary/doc/gm.txt

############
# Cleanliness
############

# We don't remove the built documentation files from the distribution,
# because we wish for users to be able to read the documentation before
# building.

mostlyclean: doc/mostlyclean
doc/mostlyclean: force
	-rm -f $(TEX_DROPPINGS)

########################################################################
########################################################################
### directory ./mcp (LANai firmware)
########################################################################
########################################################################

#############
# Building
#############

# Build the MCPs specified in configure.in

.PHONY: mcp/all
mcp/all: #MAINT# $(GM_MCPS)

#############
# Installation
#############

.PHONY: mcp/installdirs mcp/install mcp/uninstall
mcp/installdirs:
mcp/install:
mcp/uninstall:

######################################################################

# Creating redundant header files for debugging purposes

# variable used by mcp/genmak
MCP_GENERATED_HEADERS = #MAINT# \
 mcp/gm_rdma1.h\
 mcp/gm_recv1.h\
 mcp/gm_sdma1.h\
 mcp/gm_send1.h

# explicitly mention these files to prevent make from removing them
# when done.
$(MCP_GENERATED_HEADERS):

mcp/%1.h: #MAINT# mcp/%.h
	-rm -f $@
	$(ECHO) '/* DO NOT EDIT THIS FILE!  It is machine-generated. */' > $@.tmp || rm -f $@.tmp
	$(CAT) $< >> $@.tmp || rm -f $@.tmp
	mv $@.tmp $@ || rm -f $@.tmp
	$(CHMOD) a-w $@

# LANai7 clock-rate measuring MCP

mcp/gm_lanai_rate$(EXE): #MAINT# mcp/gm_lanai_rate.c
# This must be built with the new compiler and the -many option so that it
# can run on any LANai
	$(LANAI_GCC) -many -I $(srcdir)/include -o mcp/gm_lanai_rate $(srcdir)/mcp/gm_lanai_rate.c
$(srcdir)/mcp/gm_lanai_rate_array.c: #MAINT# mcp/gm_lanai_rate$(EXE)
# Pipe then move to ensure user ^C does not cause problems
	$(GENDAT) --format=zlib-array --array-name=gm_control_program_lanai_rate mcp/gm_lanai_rate$(EXE) > mcp/gm_lanai_rate_array.c.tmp
	mv -f mcp/gm_lanai_rate_array.c.tmp $(srcdir)/mcp/gm_lanai_rate_array.c

############
# Header dependencies (maintainer only)
############

MCP_LIBC_SRCS = #MAINT# \
 mcp/libc/stdio/fflush.c\
 mcp/libc/stdio/findfp.c\
 mcp/libc/stdio/fvwrite.c\
 mcp/libc/stdio/fwalk.c\
 mcp/libc/stdio/makebuf.c\
 mcp/libc/stdio/printf.c\
 mcp/libc/stdio/stdio.c\
 mcp/libc/stdio/vfprintf.c\
 mcp/libc/stdio/wsetup.c\
 mcp/libc/stdlib/malloc.c\
 mcp/libc/string/bcopy.c\
 mcp/libc/string/memchr.c\
 mcp/libc/string/strlen.c\
 mcp/libc_hooks.c

MCP_SRCS = #MAINT# \
 libgm/gm_crc.c\
 libgm/gm_debug_lanai_dma.c\
 libgm/gm_hex_dump.c\
 libgm/gm_printf.c\
 mcp/gm_bootstrap.c\
 mcp/gm_crc_table.c\
 mcp/gm_debug.c\
 mcp/gm_error_handlers.c\
 mcp/gm_get_first_handler.c\
 mcp/gm_log2.c\
 mcp/gmcp.c

MCP_OBJS = #MAINT# mcp/crt0.o $(MCP_SRCS:.c=.o)
VM_MCP_SRCS = #MAINT# $(MCP_SRCS) mcp/gm_page_hash.c mcp/gm_fill_pte_from_host.c
VM_MCP_OBJS = #MAINT# mcp/crt0.o $(VM_MCP_SRCS:.c=.o)

############
# Generic build rules
############

# list of MCPs to prebuild
PREBUILT_MCP_ARRAYS =\
 mcp/gm_lanai_rate_array.c\
 mcp/gmcp_array_32b_l4_4k.c\
 mcp/gmcp_array_32b_l4_4k_compact.c\
 mcp/gmcp_array_32b_l4_8k.c\
 mcp/gmcp_array_32b_l4_8k_compact.c\
 mcp/gmcp_array_32b_l4_8k_compact512.c\
 mcp/gmcp_array_32b_l7_4k.c\
 mcp/gmcp_array_32b_l7_4k_newfeatures.c\
 mcp/gmcp_array_32b_l7_8k.c\
 mcp/gmcp_array_32b_l7_8k_newfeatures.c\
 mcp/gmcp_array_32b_l9_4k.c\
 mcp/gmcp_array_32b_l9_4k_newfeatures.c\
 mcp/gmcp_array_32b_l9_8k.c\
 mcp/gmcp_array_32b_l9_8k_newfeatures.c\
 mcp/gmcp_array_64b_l4_8k.c\
 mcp/gmcp_array_64b_l4_8k_compact.c\
 mcp/gmcp_array_64b_l4_8k_compact512.c\
 mcp/gmcp_array_64b_l4_16k.c\
 mcp/gmcp_array_64b_l7_8k.c\
 mcp/gmcp_array_64b_l7_8k_newfeatures.c\
 mcp/gmcp_array_64b_l7_16k.c\
 mcp/gmcp_array_64b_l7_16k_newfeatures.c\
 mcp/gmcp_array_64b_l9_8k.c\
 mcp/gmcp_array_64b_l9_8k_newfeatures.c\
 mcp/gmcp_array_64b_l9_16k.c\
 mcp/gmcp_array_64b_l9_16k_newfeatures.c
prebuild prebuilt_mcps: $(PREBUILT_MCP_ARRAYS)
	cat $(srcdir)/mcp/*array*.c | $(srcdir)/mcp/sizes.pl | sort -n
clean : depend.clean
depend.clean: force
	-rm -f *.ts */*.ts */*/*.ts */*/*/*.ts

############
# Generic build rules
############

# Generate compressed firmware images as C byte arrays to be compiled
# into the driver.

mcp/gmcp_array_%.c: #MAINT# mcp/gmcp.%
# Pipe then move to ensure user ^C does not cause problems
	$(GENDAT) --format=zlib-array --array-name=gm_control_program_$* $< > $(srcdir)/$@.tmp
	mv -f $(srcdir)/$@.tmp $@

mcp/gmcp_array_%.o: mcp/gmcp_array_%.c
	$(KCC) -c $(CFLAGS) -O0 $< -o $@

mcp/gm_lanai_rate_array.o: mcp/gm_lanai_rate_array.c
	$(KCC) -c $(CFLAGS) -O0 $< -o $@

#############
# Cleanliness
#############

.PHONY: mcp/mostlyclean
mostlyclean: mcp/mostlyclean
mcp/mostlyclean: force
	-rm -f mcp/gm_lanai_rate
	-rm -f mcp/*.i mcp/*.l[0-9]_[0-9]k[._]o mcp/gm_????1.h
	-rm -f mcp/*.o mcp/*_o
	-rm -f mcp/gmcp.{32,64}b_l[0-9]_{4,8,16}k
	-rm -f mcp/gmcp.{32,64}b_l[0-9]_{4,8,16}k_compact
	-rm -f mcp/libc/*/*_o
	-rm -f mcp/libc/*/*_a mcp/libc/*_a
	-rm -f libgm/*_o

.PHONY: mcp/maintainter-clean
maintainer-clean: mcp/maintainer-clean
mcp/maintainer-clean: force
	-rm -f mcp/*.mak
	-rm -f $(srcdir)/mcp/gmcp_array_*.c

# convenient alias

.PHONY: mcp/clean
mcp/clean: mcp/mostlyclean

########################################################################
########################################################################
### directory ./util
########################################################################
########################################################################

MAKE_DEPEND_SRCS = \
 libgm/GM_PAGE_LEN.c\
 libgm/_gm_assertion_failed.c\
 libgm/_gm_get_page_len.c\
 libgm/gm_alloc_pages.c\
 libgm/gm_bcopy.c\
 libgm/gm_bzero.c\
 libgm/gm_call_trace.c\
 libgm/gm_crc.c\
 libgm/gm_crc_table.c\
 libgm/gm_free.c\
 libgm/gm_hash.c\
 libgm/gm_init.c\
 libgm/gm_lookaside.c\
 libgm/gm_malloc.c\
 libgm/gm_mutex.c\
 libgm/gm_page_alloc.c\
 libgm/gm_printf.c\
 libgm/gm_rand.c\
 libgm/gm_strcmp.c\
 libgm/gm_struct_lock.c\
 util/gm_make_depend.c
MAKE_DEPEND_OBJS = $(MAKE_DEPEND_SRCS:.c=.o)

util/gm_make_depend${EXE} : $(MAKE_DEPEND_OBJS)
	$(CC) $(CFLAGS) -o util/gm_make_depend${EXE} $(MAKE_DEPEND_OBJS)

mostlyclean: util/clean
util/clean: force
	rm -f util/gm_make_depend${EXE} util/*.o util/*.obj

########################################################################
########################################################################
### directory ./drivers
########################################################################
########################################################################

DRIVER_SRCS =\
 drivers/gm.c\
 drivers/gm_ether.c\
 drivers/gm_instance.c\
 drivers/gm_minor.c\
 drivers/gm_pio.c\
 drivers/gm_port_state.c\
 drivers/gm_uc.c

include $(driverdir)/make-os

drivers/%.o: drivers/%.c
	$(CC) -c $(DRIVER_CFLAGS) $< -o $@

#############
# Cleanliness
#############

# Extend cleanliness entry points to clean driver directory
# and add driver cleanliness entry points

.PHONY: drivers/mostlyclean
mostlyclean: drivers/mostlyclean
drivers/mostlyclean: force
	-rm -f drivers/*.o

# convenient alias

.PHONY: drivers/clean
drivers/clean: drivers/mostlyclean

################################################################
# Version maintenance (maintainer only)
################################################################

.PHONY: cvs_commit cvs_tag check_tag
.PHONY: source_tarball binary_tarball tarballs
cvs_tag: force
	@echo "This is overly conservative, requiring the tag to be at the"
	@echo "very end of the main branch, due to a CVS bug."
	cd $(srcdir) && cvs tag -c gm-$(_GM_VERSION) 
check_tag: force
	# Verify that the source in the current directory matches the
	# tagged source.
	(cd $(srcdir) && cvs diff -r gm-$(_GM_VERSION) || true) > check_tag
	@if [ -s check_tag ] ;						\
	then								\
	  cat check_tag ;						\
	  echo "Cannot build tarball because of discrepancies above." ;	\
	  exit 1;							\
	fi
################
# Source tarball
################
$(GM_VERSION).stmp1: check_tag
	-rm -rf gm-$(GM_VERSION)
	cvs export -r gm-$(_GM_VERSION) -d gm-$(GM_VERSION) gm
	echo timestamp > $(GM_VERSION).stmp1
$(GM_VERSION).stmp2: $(GM_VERSION).stmp1
	find gm-$(GM_VERSION) -type f -print > $(GM_VERSION).stmp2_p
	mv $(GM_VERSION).stmp2_p $(GM_VERSION).stmp2
$(GM_VERSION).stmp3: $(GM_VERSION).stmp2
	echo " "
	echo "**** Using CONF_OPTS = '$(CONF_OPTS)'  ****"
	echo " "
	cd gm-$(GM_VERSION) && ./configure --enable-maintainer-mode $(CONF_OPTS)
	echo timestamp > $(GM_VERSION).stmp3
$(GM_VERSION).stmp4: $(GM_VERSION).stmp3
	cd gm-$(GM_VERSION) && make
	echo timestamp > $(GM_VERSION).stmp4
$(GM_VERSION).stmp5: $(GM_VERSION).stmp4
	cd gm-$(GM_VERSION) && make prebuild
	echo timestamp > $(GM_VERSION).stmp5
$(GM_VERSION).stmp6: $(GM_VERSION).stmp5
	cd gm-$(GM_VERSION) && make all
	echo timestamp > $(GM_VERSION).stmp6
gm-$(GM_VERSION)/MANIFEST: $(GM_VERSION).stmp6
	# Add the built files to the manifest
	cat $(GM_VERSION).stmp2 > MANIFEST
	find gm-$(GM_VERSION)/mcp -name '*array*.c' -type f >> MANIFEST
	echo gm-$(GM_VERSION)/stamp-h.in >> MANIFEST
	sleep 2
	test -f gm-$(GM_VERSION)/stamp-h.in
	touch gm-$(GM_VERSION)/stamp-h.in
	test -f gm-$(GM_VERSION)/configure
	touch gm-$(GM_VERSION)/configure
	sleep 2
	test -f gm-$(GM_VERSION)/include/gm_auto_config.h.in
	touch gm-$(GM_VERSION)/include/gm_auto_config.h.in
	ls -rt1 `cat MANIFEST` > MANIFEST.sorted
	echo gm-$(GM_VERSION)/MANIFEST >> MANIFEST.sorted
	mv MANIFEST.sorted gm-$(GM_VERSION)/MANIFEST
source_tarball: gm-$(GM_VERSION)/MANIFEST $(SOURCE_STMPS)
	# create a tarball of all the files in the manifest
	tar czf gm-$(GM_VERSION).tar.gz -T gm-$(GM_VERSION)/MANIFEST
	# clean up
	-rm -rf gm-$(GM_VERSION) $(GM_VERSION).stmp*
binary_tarball: all
	-rm -rf gm-$(GM_VERSION)-$(GM_TARGET)
	-rm -f binary/sbin/*hosts* binary/sbin/mapper.map binary/sbin/mapper.counters
	cp -r binary gm-$(GM_VERSION)-$(GM_TARGET)
	chmod a+rwX gm-$(GM_VERSION)-$(GM_TARGET)
	tar -cvf - gm-$(GM_VERSION)-$(GM_TARGET) | gzip > gm-$(GM_VERSION)-$(GM_TARGET).tar.gz
	-rm -rf gm-$(GM_VERSION)-$(GM_TARGET)
tarballs: binary_tarball source_tarball

################################################################
# Dependencies (maintainer only)
################################################################

# Hack to make dependencies only if manually requested with "make depend"
# or if the file does not exist, since the "include dependencies" 
# directive requires that it exist.

$(srcdir)/dependencies:
	touch $(srcdir)/dependencies
	$(MAKE) depend

.PHONY: depend
depend: util/gm_make_depend$(EXE) mcp/genmak force
	pwd=`pwd` ; \
	cd $(srcdir) ; \
	(for dir in include gam mt util libgm drivers tests mcp ; \
	 do find $${dir} -name '*.[ch]' -print ; done) \
        | tee foo \
	| $${pwd}/util/gm_make_depend$(EXE) \
	> $(srcdir)/dependencies ; \
	$(SHELL) mcp/genmak >> $(srcdir)/dependencies

########################################################################
########################################################################
### Implicit rules
########################################################################
########################################################################

# These come near the end to allow more specific rules for
# subdirectories to override these rules.

# Build object files to run in the kernel

%_k.o: %.c
	$(KCC) -c -I$(*D) $(DRIVER_CFLAGS) $< -o $@

# Build object files to run in user land

%.o: %.c
	$(CC) -c -I$(*D) $(CFLAGS) $(EXTRA_USER_CFLAGS) $< -o $@

%.o: %.cpp
	$(CXX) -I$(*D) -I$(*D) $(CXXFLAGS) -c -o $@ $<

########################################################################
########################################################################
### warnings
########################################################################
########################################################################

# This hook causes gm_compile_warnings.c to be compiled with every
# release build, generating warning commentary about the build.

libgm/gm_compile_warnings.o: force
release: libgm/gm_compile_warnings.o
libgm/gm_compile_warnings.o: libgm/gm_compile_warnings.c
	$(CC) -c -I$(*D) $(CFLAGS) $(srcdir)/libgm/gm_compile_warnings.c -o libgm/gm_compile_warnings.o

################################################################
# automatically generated rules
################################################################

include $(srcdir)/dependencies

############
# Overrides target
############
# If it exists, include the Makefile.overrides.targets file to allow
# manual overrides of automatic configured targets.  This allows
# the overrides to be persistent across Makefile rebuilds.

Makefile.overrides.targets:
	touch Makefile.overrides.targets

include Makefile.overrides.targets


