INCDIR = /usr1/gnu/DIST/include
VPATH=.:i386

SRCS=	mach_traps.cs mig_support.c mig_strncpy.c \
	mach_msg_destroy.c mach_msg_server.c \
	strcmp.c strlen.c strncpy.c msg.c mach_syscalls.c machine/_setjmp.s \
	machine/bcopy.cs strcat.c strcpy.c mach_init.c exit.c \
	mig_allocate.c mig_deallocate.c mig_reply_setup.c

CRT0= machine/crt0.c

#
# Rename selected mach_user and mach_port_user
# interface routines to allow access to trap routines.
#
MACH_SYSCALLS = vm_allocate vm_map vm_deallocate \
	task_create task_terminate task_suspend \
	task_set_special_port

MIG_MACH_SRCS = $(addsuffix .c,$(MACH_SYSCALLS))
MIG_MACH_OBJS = $(addsuffix .o,$(MACH_SYSCALLS))

SYS_MACH_OBJS = $(addsuffix .o,$(addprefix ms_,$(MACH_SYSCALLS)))

MACH_PORT_SYSCALLS = mach_port_allocate mach_port_allocate_name \
	mach_port_deallocate mach_port_insert_right

MIG_MACH_PORT_SRCS = $(addsuffix .c,$(MACH_PORT_SYSCALLS))
MIG_MACH_PORT_OBJS = $(addsuffix .o,$(MACH_PORT_SYSCALLS))

SYS_MACH_PORT_OBJS = $(addsuffix .o,$(addprefix ms_,$(MACH_PORT_SYSCALLS)))

#
# Other objects are generated from mach.defs or
# mach_port.defs.
#
MACH_ROUTINES = \
	task_threads thread_terminate \
	vm_protect vm_inherit vm_read \
	vm_write vm_copy vm_region vm_statistics mach_ports_register \
	mach_ports_lookup memory_object_data_provided \
	memory_object_data_unavailable memory_object_get_attributes \
	vm_set_default_memory_manager memory_object_lock_request \
	task_get_emulation_vector task_set_emulation_vector \
	task_resume task_get_special_port \
	task_info thread_create thread_suspend thread_resume thread_abort \
	thread_get_state thread_set_state thread_get_special_port \
	thread_set_special_port thread_info task_set_emulation \
	memory_object_data_error memory_object_set_attributes \
	memory_object_destroy memory_object_data_supply memory_object_ready \
	memory_object_change_attributes vm_machine_attribute

MACH_SRCS = $(addsuffix .c,$(MACH_ROUTINES))
MACH_OBJS = $(addsuffix .o,$(MACH_ROUTINES))

MACH_PORT_ROUTINES = \
	mach_port_names mach_port_type mach_port_rename \
	mach_port_destroy \
	mach_port_get_refs mach_port_mod_refs \
	old_mach_port_get_receive_status mach_port_set_qlimit \
	mach_port_set_mscount mach_port_get_set_status mach_port_move_member \
	mach_port_request_notification \
	mach_port_extract_right mach_port_get_receive_status mach_port_set_seqno

MACH_PORT_SRCS = $(addsuffix .c,$(MACH_PORT_ROUTINES))
MACH_PORT_OBJS = $(addsuffix .o,$(MACH_PORT_ROUTINES))

DEVICE_ROUTINES = device_open device_close device_write device_write_inband \
	device_read device_read_inband device_set_status device_get_status \
	device_set_filter device_map

DEVICE_SRCS = $(addsuffix .c,$(DEVICE_ROUTINES))
DEVICE_OBJS = $(addsuffix .o,$(DEVICE_ROUTINES))

MACH_HOST_ROUTINES = host_processors host_info processor_info processor_start \
	processor_exit processor_control processor_set_default \
	xxx_processor_set_default_priv processor_set_create \
	processor_set_destroy processor_set_info processor_assign \
	processor_get_assignment thread_assign thread_assign_default \
	thread_get_assignment task_assign task_assign_default \
	task_get_assignment host_kernel_version thread_priority \
	thread_max_priority task_priority processor_set_max_priority \
	thread_policy processor_set_policy_enable processor_set_policy_disable \
	processor_set_tasks processor_set_threads host_processor_sets \
	host_processor_set_priv host_set_time host_adjust_time 	host_get_time \
	host_reboot vm_wire thread_wire

MACH_HOST_SRCS = $(addsuffix .c,$(MACH_HOST_ROUTINES))
MACH_HOST_OBJS = $(addsuffix .o,$(MACH_HOST_ROUTINES))

MACH_DEBUG_ROUTINES = host_zone_info mach_port_get_srights host_ipc_hash_info \
	host_ipc_marequest_info mach_port_space_info mach_port_dnrequest_info \
	mach_vm_region_info vm_mapped_pages_info host_stack_usage \
	processor_set_stack_usage host_virtual_physical_table_info \
	host_load_symbol_table

MACH_DEBUG_SRCS = $(addsuffix .c,$(MACH_DEBUG_ROUTINES))
MACH_DEBUG_OBJS = $(addsuffix .o,$(MACH_DEBUG_ROUTINES))

OBJS=	crt0.o exit.o mach_traps.o mig_support.o \
	mach_msg_destroy.o  mach_msg_server.o \
	bcopy.o strcmp.o strlen.o strncpy.o msg.o \
	_setjmp.o bzero.o strcat.o strcpy.o mach_init.o mig_strncpy.o \
	mig_allocate.o mig_deallocate.o mig_reply_setup.o \
	exc_server.o device_request_user.o device_reply_server.o \
	mach_norma_user.o \
	${MACH_OBJS} ${MIG_MACH_OBJS} \
	${MACH_PORT_OBJS} ${MIG_MACH_PORT_OBJS} \
	${SYS_MACH_OBJS} ${SYS_MACH_PORT_OBJS} \
	${DEVICE_OBJS} ${MACH_HOST_OBJS} ${MACH_DEBUG_OBJS}

I386_OBJS = gcc.o mach_i386_user.o

DEFS=	mach/exc.defs mach/memory_object.defs mach/mach.defs mach/host.defs \
	device/device.defs device/device_request.defs \
	device/device_reply.defs mach_debug/mach_debug.defs \
	mach/mach_norma.defs

I386_DEFS = mach/i386/mach_i386.defs

INCLUDES= -nostdinc -I. -I$(INCDIR)
DEFINES = -DMACH_IPC_COMPAT=0 -DSTANDALONE -DTypeCheck=0 -DMACH
CFLAGS = $(DEFINES) $(INCLUDES) -g -O
MIGFLAGS = $(MIGOPTS) $(DEFINES) $(INCLUDES)

CPP=/usr1/gnu/DIST/lib/gcc-cpp
CC=gcc
AS=as
AR=ar
RANLIB=ranlib
MIG=mig

all: libmach_sa.a

install: all
	cp libmach_sa.a /usr1/gnu/DIST/lib/libmach_sa.a
	$(RANLIB) /usr1/gnu/DIST/lib/libmach_sa.a

clean:
	rm -f *.o *.as *User.c *Server.c *_user.c *_server.c *.d *.S
	rm -f mach_interface.h exc.h device.h device_request.h device_reply.h
	rm -f mach_port.h mach_host.h mach_debug.h mach_norma.h mach_i386.h
	rm -f crt0.s x.s crt0.c 
	rm -f $(MIG_MACH_SRCS) $(MIG_MACH_PORT_SRCS) $(MACH_SRCS)
	rm -f $(MACH_PORT_SRCS) $(MACH_HOST_SRCS) $(DEVICE_SRCS)
	rm -f $(MACH_DEBUG_SRCS)
	rm -f xxx_* yyy_*
	rm -f libmach_sa.a

libmach_sa.a: $(OBJS) $(I386_OBJS)
	rm -f $@
	$(AR) crv $@ $(OBJS) $(I386_OBJS)
	$(RANLIB) $@

crt0.o: $(CRT0)

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

%.o: %.s
	$(CPP) $(DEFINES) $(INCLUDES) $< > $*.as
	$(AS) -o $@ $*.as
	rm -f $*.as

%.o: %.ss
	$(AS) -o $@ $*.as

%.o: %.cs
	cp $< $*.S
	$(CPP) $(DEFINES) $(INCLUDES) $*.S > $*.as
	$(AS) -o $@ $*.as
	rm -f $*.S $*.as

$(MIG_MACH_OBJS) $(MIG_MACH_PORT_OBJS): $(MIG_MACH_SRCS) $(MIG_MACH_PORT_SRCS)
	sed -e "s/"$*"/mig_"$*"/" < $*.c > mig_$*.c
	$(CC) -c $(CFLAGS) -o $@ mig_$*.c
	rm -f mig_$*.c

$(MACH_SRCS) $(MIG_MACH_SRCS):
	$(MIG) $(MIGFLAGS) \
		-i ./ \
		-header mach_interface.h \
		-server /dev/null \
		$(INCDIR)/mach/mach.defs

$(MACH_PORT_SRCS) $(MIG_MACH_PORT_SRCS):
	$(MIG) $(MIGFLAGS) \
		-i ./ \
		-header mach_port.h \
		-server /dev/null \
		$(INCDIR)/mach/mach_port.defs

exc_server.c:
	$(MIG) $(MIGFLAGS) \
		-server exc_server.c \
		-header exc.h \
		-user /dev/null \
		$(INCDIR)/mach/exc.defs

$(DEVICE_SRCS):
	$(MIG) $(MIGFLAGS) \
		-i ./ \
		-header device.h \
		-server /dev/null \
		$(INCDIR)/device/device.defs

device_request_user.c:
	$(MIG) $(MIGFLAGS) \
		-user device_request_user.c \
		-server /dev/null \
		$(INCDIR)/device/device_request.defs

device_reply_server.c:
	$(MIG) $(MIGFLAGS) \
		-server device_reply_server.c \
		-user /dev/null \
		$(INCDIR)/device/device_reply.defs

$(MACH_HOST_SRCS):
	$(MIG) $(MIGFLAGS) \
		-i ./ \
		-server /dev/null \
		$(INCDIR)/mach/mach_host.defs

$(MACH_DEBUG_SRCS):
	$(MIG) $(MIGFLAGS) \
		-i ./ \
		-server /dev/null \
		$(INCDIR)/mach_debug/mach_debug.defs

mach_norma_user.c:
	$(MIG) $(MIGFLAGS) \
		-user mach_norma_user.c \
		-server /dev/null \
		$(INCDIR)/mach/mach_norma.defs

mach_i386_user.c:
	$(MIG) $(MIGFLAGS) \
		-user mach_i386_user.c \
		-server /dev/null \
		$(INCDIR)/mach/i386/mach_i386.defs
