#
# kbuild file for generating syscall stubs
#

# Include automatically generated Makefile fragment.
# It contains definition of syscall-objs specifying name of all .o files
-include $(obj)/syscalls.mk

# Composite object containing all .o file
always := syscalls.o

klibc-dir := $(srctree)/usr/klibc


#####
# Generate syscalls stubs
# Based on list in SYSCALLS.def generate stubs for sys calls. Actual arch code
# is defined in an arch specific perl file
targets += syscalls.mk
targets += syscalls.o
targets += SYSCALLS.i syscalls.nrs
targets += $(syscall-objs)

# Side effect of running syscalls.pl
clean-files += $(objtree)/usr/include/klibc/havesyscall.h
# All the syscall stubs
clean-files += *.o *.S *.c

# Create reloctable composite object file
$(obj)/syscalls.o: $(call objectify,$(syscall-objs)) FORCE
	$(call if_changed,userld)

# Generate assembler file (.i)
# We pass -ansi to keep cpp from define e.g. "i386" as well as "__i386__"
quiet_cmd_syscall.i = GEN     $@
      cmd_syscall.i = $(USERCC) $(usercflags) -D__ASSEMBLY__ \
                                -ansi -x assembler-with-cpp -E -o $@ $<
$(obj)/SYSCALLS.i: $(klibc-dir)/SYSCALLS.def FORCE
	$(call if_changed_dep,syscall.i)

# Get syscalls numbers
quiet_cmd_syscall.nrs = GEN     $@
      cmd_syscall.nrs = $(USERCC) $(usercflags) -Wp,-dM -x c -E -o $@ $<
$(obj)/syscalls.nrs: $(srctree)/usr/include/sys/syscall.h FORCE
	$(call if_changed_dep,syscall.nrs)

# Generate usr/include/klibc/havesyscall.h + makefile fragment
# Using sysstub.pl in arch dir generate all .S files
quiet_cmd_syscalls = GEN     $@
      cmd_syscalls = mkdir -p $(objtree)/usr/include/klibc/;                 \
                     $(PERL) $(klibc-dir)/syscalls.pl $(obj)/SYSCALLS.i      \
                             $(klibc-dir)/arch/$(ARCH)/sysstub.ph            \
                             $(ARCH) $(BITSIZE) $(obj)/syscalls.nrs          \
			     $(obj)                                          \
                             $(objtree)/usr/include/klibc/havesyscall.h > $@ \
                             || rm -f $@

$(obj)/syscalls.mk: $(klibc-dir)/syscalls.pl $(obj)/SYSCALLS.i \
                    $(klibc-dir)/arch/$(ARCH)/sysstub.ph       \
		    $(call objectify, $(syscall-objs:.o=.S))  \
                    $(klibc-dir)/syscommon.h $(obj)/syscalls.nrs
	$(call cmd,syscalls)

