# Copyright (C) 1991,1992,1993,1994,1995,1996,1997,1998,1999,2003,2006,2008,2009
#	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.

# The unix-specific configure fragment writes `unix-generated' in config.make.
config-generated := $(config-generated) $(unix-generated)

ifeq (,$(filter-out $(sysdep_dir)/generic/ $(common-objpfx),\
	$(dir $(firstword $(wildcard $(+sysdep_dirs:%=%/bits/local_lim.h))))))

ifneq (,$(wildcard $(sysincludedir)/sys/param.h))
mk-local_lim-CFLAGS += -DHAVE_SYS_PARAM_H
endif
ifneq (,$(wildcard $(sysincludedir)/sys/limits.h))
mk-local_lim-CFLAGS += -DHAVE_SYS_LIMITS_H
endif
ifneq (,$(wildcard $(sysincludedir)/limits.h))
mk-local_lim-CFLAGS += -DHAVE_LIMITS_H
endif

$(common-objpfx)bits/local_lim.h: $(common-objpfx)mk-local_lim
	$(dir $<)$(notdir $<) > $@-t
	mv -f $@-t $@
$(common-objpfx)mk-local_lim: $(sysdep_dir)/unix/mk-local_lim.c
	$(common-objdir-compile)

before-compile += $(common-objpfx)bits/local_lim.h
common-generated += bits/local_lim.h mk-local_lim

endif

ifeq (,$(filter-out $(sysdep_dir)/generic/ $(common-objpfx),\
	$(patsubst %/sys/param.h,%/,\
		   $(firstword $(wildcard $(+sysdep_dirs:%=%/sys/param.h))))))

before-compile := $(before-compile) $(common-objpfx)sys/param.h

$(common-objpfx)sys/param.h: $(sysincludedir)/sys/param.h
	$(make-target-directory)
	(echo '#ifndef _SYS_PARAM_H';	\
	 echo '#define _SYS_PARAM_H 1';	\
	 echo '#include <endian.h>';		\
	 $(AWK) < $<			\
	   '/^#define[ 	]*NULL/ { print "#ifndef NULL";	\
				  print $$0;		\
				  print "#endif";	\
				  was_null = 1 }	\
	    { if (!was_null) print $$0;			\
	      was_null = 0 }';		\
	 echo '#ifndef MAXHOSTNAMELEN'; \
	 echo '#define MAXHOSTNAMELEN 64 /* XXX */'; \
	 echo '#endif /* No MAXHOSTNAMELEN.  */'; \
	 echo '#endif	/* sys/param.h */') > $@-tmp
	mv $@-tmp $@

$(common-objpfx)param.h.c: $(sysincludedir)/sys/param.h
	rm -f $@
	cp $< $@
$(common-objpfx)param.h.dep: $(common-objpfx)param.h.c \
			     $(sysdep_dir)/unix/Makefile
	$(+mkdep) -I$(sysincludedir) $<			\
	| sed > $@-t					\
	      -e 's@$(sysincludedir)/sys/param.h@@'	\
	      -e 's@^.*:@@'				\
	      -e 's@$<@@g'				\
	      -e 's@$(sysincludedir)/*@@g'		\
	      -e 's@\\$$@@'				\
	      -e 's@^@sys/param.h-includes := $$(sys/param.h-includes) @'
	mv $@-t $@

# Get the generated definition of sys/param.h-includes.
ifndef no_deps
-include $(common-objpfx)param.h.dep
endif

# Don't preempt our own headers.
sys/param.h-includes := \
  $(filter-out $(patsubst $(..)%,%,\
			  $(wildcard $(addprefix $(..),\
				     $(sys/param.h-includes)))),\
	       $(sys/param.h-includes))


.PHONY: sys/param.h-includes
sys/param.h-includes: $(addprefix $(common-objpfx),$(sys/param.h-includes))

ifdef sys/param.h-includes
# Copy the system files to $(common-objdir).
$(addprefix $(common-objpfx),$(sys/param.h-includes)): $(common-objpfx)%: \
						       $(sysincludedir)/%
	$(make-target-directory)
# Some of these files sometimes contain conflicting declarations for htons,
# ntohs, etc.  They also often contain definitions of *_ENDIAN and
# BYTE_ORDER, which we define ourselves in <endian.h>.
	sed -e '/[ 	]*[hn]to[nh][sl][	 (]*/d' \
	    -e '/^#define[ 	]*[A-Z]*_ENDIAN/d' \
	    -e '/^#define[ 	]*BYTE_ORDER/d' \
	    $< > $@-t
	mv $@-t $@
endif

common-generated := $(common-generated) \
		    sys/param.h $(sys/param.h-includes) param.h.c param.h.dep


ifeq ($(subdir),misc)

# Install system headers the system sys/param.h uses.

sysdep_headers := $(sysdep_headers) $(sys/param.h-includes)

endif # misc

endif # No sysdep sys/param.h.

ifeq (,$(filter-out $(sysdep_dir)/generic/ $(common-objpfx),\
	$(dir $(firstword $(wildcard $(+sysdep_dirs:%=%/bits/errno.h))))))

# These need to exist before any compiling is done,
# so cpp doesn't instead find the generic versions.
before-compile := $(before-compile) $(common-objpfx)bits/errno.h

$(common-objpfx)bits/errno.h: $(common-objpfx)make-errnos
	$(dir $<)$(notdir $<) > $@-tmp
	mv $@-tmp $@

$(common-objpfx)make-errnos: $(common-objpfx)make-errnos.c
	$(common-objdir-compile)

$(common-objpfx)make-errnos.c: $(sysdep_dir)/unix/errnos-tmpl.c \
			$(sysdep_dir)/unix/errnos.awk $(common-objpfx)errnos
	$(AWK) -f $(word 2,$^) errnos="`tr '\012' ' ' < $(word 3,$^)`" $< > $@T
	mv $@T $@

$(common-objpfx)errnos: $(wildcard $(sysincludedir)/errno.h	\
				   $(sysincludedir)/sys/errno.h)
	sed -n 's/^#define[ 	]*\(E[A-Z0-9][A-Z0-9]*\)[ 	].*$$/\1/p' \
	    $^ > $@-tmp
	mv $@-tmp $@

common-generated := $(common-generated) \
		    errnos.h errnos make-errnos make-errnos.c
endif

ifeq (,$(filter-out $(sysdep_dir)/generic/ $(common-objpfx),\
	$(dir $(firstword $(wildcard $(+sysdep_dirs:%=%/bits/ioctls.h))))))

before-compile := $(before-compile) $(common-objpfx)bits/ioctls.h

$(common-objpfx)bits/ioctls.h: $(common-objpfx)make-ioctls
	$(dir $<)$(notdir $<) > $@-tmp
	mv $@-tmp $@

ioctl-includes := sys/termios.h net/nit.h
ioctl-includes := $(wildcard $(addprefix $(sysincludedir)/,$(ioctl-includes)))
make-ioctls-CFLAGS := $(subst /,_,$(subst .,_,\
			$(patsubst $(sysincludedir)/%,-DHAVE_%,\
				   $(ioctl-includes))))

$(common-objpfx)make-ioctls: $(common-objpfx)make-ioctls.c
	$(common-objdir-compile)

$(common-objpfx)make-ioctls.c: $(sysdep_dir)/unix/ioctls-tmpl.c \
			       $(sysdep_dir)/unix/ioctls.awk \
			       $(common-objpfx)ioctls
	$(AWK) -f $(word 2,$^) requests="`cat $(word 3,$^)`" $< > $@T
	mv $@T $@


bits_termios.h := $(firstword $(wildcard $(+sysdep_dirs:%=%/bits/termios.h)))
ifeq ($(bits_termios.h),$(sysdep_dir)/generic/bits/termios.h)
bits_termios.h := # Ignore the generic version.
endif

# If there is a system-specific <bits/termios.h> file, we want to omit
# all the symbols it defines from ioctls.  Otherwise, both
# <bits/ioctls.h> and <bits/termios.h> would define them.  The
# system-specific <bits/termios.h> file presumably defines them with
# the same values as we find from the system's headers.  We also want
# to omit from ioctls the symbols defined in our own
# <sys/ttydefaults.h>, to avoid multiple definition conflicts.  We use
# snarf-ioctls on these files to find what symbols we want to omit.
# fgrep -xv gives all lines which do not match in their entirety;
# without -x, CSTOP's presence elided TIOCSTOP.

$(common-objpfx)ioctls: $(sysdep_dir)/unix/snarf-ioctls \
			$(sysincludedir)/sys/ioctl.h $(ioctl-includes)
	$(dir $<)$(notdir $<) $(filter-out $<,$^) \
	| fgrep -xv "`($(dir $<)$(notdir $<) $(bits_termios.h) \
					     $(..)sysdeps/generic/sys/ttydefaults.h; \
		      echo NULL) \
		     | sort | uniq`" \
	| sort | uniq | tr '\012' ' ' > $@-tmp
	mv $@-tmp $@

common-generated := $(common-generated) \
		    bits/ioctls.h ioctls make-ioctls make-ioctls.c
endif

ifeq (,$(filter-out $(sysdep_dir)/generic/ $(common-objpfx),\
	$(dir $(firstword $(wildcard $(+sysdep_dirs:%=%/sys/syscall.h))))))

# The syscall code assumes a file <sys/syscall.h> that defines macros
# `SYS_call' for syscall `call'.  Variations on this I have seen include:
# it's in <sys/syscall.h>;
# it's in <sys.s>;
# it defines `CALL' instead of `SYS_call'.
# Irix has a <syscall.h> which is not what we want, so check for <sys.s> first.

# Find a file that might have these.  NOTE: This list of possibilities is
# repeated in sysdeps/unix/configure and the two should be kept in sync.
syscall.h := $(firstword $(wildcard $(addprefix $(sysincludedir)/, \
						sys.s sys/sys.s \
						sys.S sys/sys.S \
						syscall.h sys/syscall.h \
						)))
ifdef syscall.h

# Transmogrify any of several formats of the file into the one we want.
$(common-objpfx)sys/syscall.h: $(syscall.h)
	$(make-target-directory)
	tr '[A-Z]' '[a-z]' < $< | \
	sed -e 's/[ 	]sys_/ /' \
	    -e 's/^#define[ 	]*\([a-z0-9_]*\)[ 	]*/#define SYS_\1 /' \
	    -e 's/[ 	]sys_/ SYS_/' \
	    -e 's/SYS_syscall_basenum/syscall_basenum/g' \
	    -e 's/SYS_kerncall_basenum/kerncall_basenum/g' \
	    -e 's/SYS_sysvoffset/sysvoffset/g' \
	    -e '/^#/!d' \
	    -e '/^#ident/d' \
	    -e 's-\(/\*[^*]*\)$$-\1\*/-' \
	> $@-tmp
	mv $@-tmp $@

before-compile += $(common-objpfx)sys/syscall.h
common-generated += sys/syscall.h

endif

endif

ifndef inhibit-unix-syscalls

# Sysdep dirs unix/... can contain a file syscalls.list,
# which specifies objects to be compiled as simple Unix system calls.

-include $(common-objpfx)sysd-syscalls

ifeq (misc,$(subdir))
sysdep_routines += $(unix-extra-syscalls)

ifdef unix-stub-syscalls
# The system call entry points in this list are supposed to be additional
# functions not overriding any other sysdeps/.../call.c implementation, but
# their system call numbers are unavailable in the kernel headers we're
# using.  Instead of a system call stub, these get a function that fails
# with ENOSYS.  We just generate a single module defining one function and
# making all these entry point names aliases for it.
sysdep_routines += stub-syscalls
$(objpfx)stub-syscalls.c: $(common-objpfx)sysd-syscalls \
			  $(..)sysdeps/unix/Makefile
	$(make-target-directory)
	(for call in $(unix-stub-syscalls); do \
	   echo "#define $$call RENAMED_$$call"; \
	 done; \
	 echo '#include <errno.h>'; \
	 for call in $(unix-stub-syscalls); do \
	   echo "#undef $$call"; \
	 done; \
	 echo 'long int _no_syscall (void)'; \
	 echo '{ __set_errno (ENOSYS); return -1L; }'; \
	 for call in $(unix-stub-syscalls); do \
	   case $$call in \
	   *@@*) ver=$${call##*@}; call=$${call%%*@}; \
		 echo "strong_alias (_no_syscall, $${call}_$${ver})"; \
		 echo "default_symbol_version \
		         ($${call}_$${ver}, $$call, $$ver);" ;; \
	   *@@*) ver=$${call##*@}; call=$${call%%*@}; \
		 echo "strong_alias (_no_syscall, $${call}_$${ver})"; \
		 echo "symbol_version ($${call}_$${ver}, $$call, $$ver);" ;; \
	   *) echo "weak_alias (_no_syscall, $$call)"; \
	      echo "stub_warning ($$call)"; \
	      echo "weak_alias (_no_syscall, __GI_$$call)" ;; \
	   esac; \
	 echo '#include <stub-tag.h>'; \
	 done) > $@T
	mv -f $@T $@
generated += stub-syscalls.c
endif
endif

# This is the end of the pipeline for compiling the syscall stubs.
# The stdin is assembler with cpp using sysdep.h macros.
compile-syscall = $(COMPILE.S) -o $@ -x assembler-with-cpp - \
			       $(compile-mkdep-flags)

ifndef avoid-generated
$(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
			       $(wildcard $(+sysdep_dirs:%=%/syscalls.list))
	for dir in $(+sysdep_dirs); do \
	  test -f $$dir/syscalls.list && \
	  { sysdirs='$(sysdirs)' \
	    asm_CPP='$(COMPILE.S) -E -x assembler-with-cpp' \
	    $(SHELL) $(dir $<)$(notdir $<) $$dir || exit 1; }; \
	  test $$dir = $(..)sysdeps/unix && break; \
	done > $@T
	mv -f $@T $@
endif

# The $(bppfx)syscall.ob objects depend on s-proto-bp.d, which are
# generated to specify dependencies generated BP stubs have on headers.
# These deps use file names relative to a subdir, so don't
# include them in the parent directory.
ifneq (,$(filter $(unix-syscalls),$(routines) $(sysdep_routines) $(aux)))
ifndef no_deps
-include $(common-objpfx)s-proto-bp.d
endif
endif

$(common-objpfx)s-%.d: $(..)sysdeps/unix/s-%.S \
		       $(wildcard $(+sysdep_dirs:%=%/syscalls.list))
	$(+make-deps)

common-generated += s-proto-bp.d
postclean-generated += sysd-syscalls

endif
