# Copyright (C) 1991,92,93,94,95,96,97,98,2001,02
#	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 Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 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
# Lesser General Public License for more details.

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

subdir := mach

all:

# Some things below (but before including Rules) use configuration variables.
include ../Makeconfig


headers = mach_init.h mach.h mach_error.h mach-shortcuts.h mach/mach_traps.h \
	  $(interface-headers) mach/mach.h mach/mig_support.h mach/error.h \
	  $(lock-headers) machine-sp.h
distribute = thread_state.h
lock = spin-solid spin-lock mutex-init mutex-solid
lock-headers = lock-intern.h machine-lock.h spin-lock.h
routines = $(mach-syscalls) $(mach-shortcuts) \
	   mach_init mig_strncpy msg \
	   mig-alloc mig-dealloc mig-reply \
	   msg-destroy msgserver \
	   mach_error errstring error_compat errsystems \
	   devstream setup-thread $(lock)

# The RPC interfaces go in a separate library.
interface-library := libmachuser

# We produce mach_interface.h from mach.defs because there is already a
# <mach/mach.h> that is not the interface header (thanks CMU).
mach-interface-list := $(patsubst mach,mach_interface,$(mach-interface-list))
mach/mach_interface.defs = mach/mach.defs

# Similarly for memory_object_user vs. memory_object
mach-interface-list := $(patsubst memory_object,memory_object_user,\
				  $(mach-interface-list))
mach/memory_object_user.defs = mach/memory_object.defs

user-interfaces := $(addprefix mach/,$(mach-interface-list)	\
			       	     mach_port mach_host exc	\
	            )\
		   $(addprefix device/,device device_request)

server-interfaces := mach/exc

# It is important that we do not use the wildcard function to expand
# `err_*.sub'.  Leaving the wildcard allows Make-dist to find all matching
# files in all sysdep directories.
distribute += Machrules syscalls.awk shortcut.awk \
	      errorlib.h err_*.sub errsystems.awk

# Clear any environment	value.
generated =

# Translate GNU names for CPUs into the names used in Mach header files.
mach-machine = $(patsubst powerpc,ppc,$(base-machine))

# Define mach-syscalls and sysno-*.
ifndef inhibit_mach_syscalls
-include $(objpfx)mach-syscalls.mk
endif
$(objpfx)mach-syscalls.mk: syscalls.awk Makefile
# Go kludges!!!
	$(make-target-directory)
# We must use $(CFLAGS) to get -O flags that affect #if's in header files.
	echo '#include <mach/syscall_sw.h>' | \
	$(CC) $(CFLAGS) $(CPPFLAGS) -E -MD -MP -MF $@-dep -MT $@ \
	      -x c-header - \
	      -D_MACH_`echo $(mach-machine) | tr a-z A-Z`_SYSCALL_SW_H_=1 | \
	sed -n -e 's/^kernel_trap(\(.*\),\([-0-9]*\),\([0-9]*\))$$/\1 \2 \3/p'\
	| $(AWK) -f $< > $@-new
ifneq (,$(objpfx))
	sed $(sed-remove-objpfx) $@-dep >> $@-new
else
	cat $@-dep >> $@-new
endif
	rm -f $@-dep
	mv -f $@-new $@
generated += mach-syscalls.mk

ifndef mach-syscalls
# We cannot make the deps properly until we know how to make the system
# call functions, and for that we must know what they all are.
no_deps=t
else
$(mach-syscalls:%=$(objpfx)%.S): $(objpfx)%.S: $(objpfx)mach-syscalls.mk
	(echo '#include <sysdep.h>'; \
	 echo 'kernel_trap (__$*,$(sysno-$*),$(nargs-$*))'; \
	 echo 'weak_alias (__$*, $*)') > $@-new
	 mv -f $@-new $@
generated += $(mach-syscalls:=.S)
endif	# mach-syscalls

# These syscalls that look like RPCs actually have no RPC equivalents.
mach-shortcuts := $(filter-out device_writev_request \
			       device_read_overwrite_request \
			       device_read_overwrite \
			       vm_read_overwrite \
			       thread_switch \
			       ,\
		  $(patsubst syscall_%,%,$(filter syscall_%,$(mach-syscalls))))

ifndef mach-shortcuts
# Forget about mach_interface.defs for this run.  On the next run,
# $(mach-shortcuts) will be set, and that will change how
# mach_interface.defs is processed: it will get the -D flags below.
user-interfaces := $(filter-out $(mach-interface-list:%=mach/%) \
				mach/mach_port mach/mach_host mach/mach4 \
				device/device_request,\
				$(user-interfaces))
endif

# For some reason, the calls in this file are `protected' by an ifdef.
MIGFLAGS-mach/mach4=-DMACH_PCSAMPLE

# Make the MiG stubs for $(mach-shortcuts) be CALL_rpc.
migdefines += $(foreach call,$(mach-shortcuts),-D$(call)=$(call)_rpc)
$(mach-interface-list:%=mach/%.uh) \
  mach/mach_host.uh mach/mach_port.uh: $(objpfx)mach-syscalls.mk

ifdef mach-shortcuts
$(mach-shortcuts:%=$(objpfx)%.c): $(objpfx)%.c: shortcut.awk \
						$(objpfx)RPC_%_rpc.c
	$(AWK)	-v alias=$* -v call=__$* -v rpc=__$*_rpc \
		-v syscall=__syscall_$* -f $^ > $@-new
	mv -f $@-new $@
generated += $(mach-shortcuts:%=%.c)
endif	# mach-shortcuts

# Generate mach-shortcuts.h, which will contain the prototypes for the
# shortcutted kernel RPC functions.
$(objpfx)mach-shortcuts.h: $(mach-interface-list:%=$(objpfx)mach/%.h) \
			   $(objpfx)mach/mach_host.h \
			   $(objpfx)mach/mach_port.h
# The first line gets us one paragraph per line, with @s separating real lines.
# The second line selects paragraphs for the shortcutted functions.
# The third line removes `_rpc' from the names and reconstitutes the lines.
	cat $^ | tr \\012 @ | sed s/@@/@%/g | tr % \\012 \
	| grep '^/\* Routine [a-z0-9_]*_rpc \*/' \
	| sed 's/_rpc//g' | tr @ \\012 > $@-new
	mv -f $@-new $@
generated += mach-shortcuts.h

before-compile += $(objpfx)mach-shortcuts.h

include Machrules
include ../Rules


# A gcc bug prevents the generated file from working properly,
# so we have one in the distribution for the time being.
generated += errsystems.c
$(objpfx)errsystems.c: errsystems.awk err_*.sub \
		       $(wildcard $(addsuffix /err_*.sub,$(+sysdep_dirs)))
	$(AWK) -v subsys='$(filter-out $<,$^)' -f $^ > $@.n
	mv -f $@.n $@


# Convenient target to update all the generated source files.
.PHONY: generated
generated: $(addprefix $(common-objpfx),$(common-generated)) \
	   $(addprefix $(objpfx),$(generated))

.PHONY: mach-before-compile
mach-before-compile: $(mach-before-compile)
