################################
# To use nlcc1

CCOMPILER = cc
#CCOMPILER = gcc
#CCOMPILER = clang
#CCOMPILER = nlcc1

ARCH =
#ARCH = i386
#ARCH = x86_64

################################
# To use header files

STDCHEADERS =
#STDCHEADERS = freebsd
#STDCHEADERS = debian
#STDCHEADERS = nllibc

################################
# To use nllibc

USE_NLLIBC = yes

################################
# For cross compile

#CROSS = arm-elf
#CCDIR = /usr/local/cross2-gcc494
## Target is FreeBSD
##OSDEF = __FreeBSD__
##OSABI = FreeBSD
## Target is Linux
#OSDEF = __linux__
#OSABI = none
##OSABI = linux

################################
# To use MinGW

#MINGW = mingw32

################################
# Build setting

ASRCS = arch/syscall-freebsd-i386.S arch/syscall-freebsd-amd64.S \
	arch/syscall-freebsd-powerpc.S \
	arch/syscall-linux-x86.S arch/syscall-linux-x86_64.S \
	arch/syscall-linux-arm.S arch/syscall-linux-aarch64.S \
	arch/syscall-linux-powerpc.S arch/syscall-linux-mips.S \
	arch/syscall-linux-sh.S arch/syscall-linux-sparc.S \
	arch/syscall-linux-alpha.S arch/syscall-linux-hppa.S \
	arch/syscall-linux-blackfin.S arch/syscall-linux-mn10300.S \
	arch/syscall-linux-m32r.S arch/syscall-linux-microblaze.S \
	arch/syscall-linux-riscv32.S \
	arch/libasm-arm.S arch/libasm-sh.S arch/libasm-sparc.S arch/libasm-hppa.S
CSRCS = init.c exit.c lib.c \
	syscall-freebsd.c syscall-linux.c \
	errno.c stdio.c ctype.c string.c memory.c dir.c dirent.c signal.c \
	strtol.c time.c term.c \
	arch/lib-arm.c

LIB = libnlc.a
OBJLIB = nllibc.o

INCLUDEDIR = ../include

HEADERS_NLLIBC = nllibc.h
HEADERS = stdio.h stdlib.h string.h strings.h stdint.h stddef.h stdarg.h \
	inttypes.h ctype.h errno.h unistd.h fcntl.h signal.h dirent.h time.h
HEADERS_SYS = types.h wait.h stat.h time.h mman.h select.h socket.h ioctl.h

NLROOTDIR = ../..

#INSTALLDIR = /usr/local
INSTALLDIR = $(NLROOTDIR)
INCDIR = $(INSTALLDIR)/include
BINDIR = $(INSTALLDIR)/bin
LIBDIR = $(INSTALLDIR)/lib

TMPDIR = lib

################################
# End of setting

CPRES = $(CSRCS:.c=.i)
AASMS = $(ASRCS:.S=.s)
CASMS = $(CSRCS:.c=.s)
AOBJS = $(ASRCS:.S=.o)
COBJS = $(CSRCS:.c=.o)

SRCS = $(ASRCS) $(CSRCS)
PRES = $(CPRES)
ASMS = $(AASMS) $(CASMS)
OBJS = $(AOBJS) $(COBJS)

LIBS =

PREFIX = $(CCDIR:$(CCDIR)=$(CCDIR)/bin/)$(CROSS:$(CROSS)=$(CROSS)-)$(MINGW:$(MINGW)=$(MINGW)-)

LOCAL_CC = $(PREFIX)$(CCOMPILER:nlcc1=cc)

CCOMPILER_cc = $(LOCAL_CC) -S -x c
CCOMPILER_gcc = $(LOCAL_CC) -S -x c
CCOMPILER_clang = $(LOCAL_CC) -S -x c
CCOMPILER_nlcc1 = nlbindir/nlcc1 -march=$(ARCH:-elf=)

LOCAL_CPP = $(LOCAL_CC) -E
LOCAL_CC1 = $(CCOMPILER_$(CCOMPILER))
LOCAL_AS  = $(LOCAL_CC) -c
LOCAL_AR  = $(PREFIX)ar
LOCAL_LD  = $(PREFIX)ld

HANDOVER_CC  ?= no
HANDOVER_CPP ?= no
HANDOVER_CC1 ?= no
HANDOVER_AS  ?= no
HANDOVER_AR  ?= no
HANDOVER_LD  ?= no

CC  = $(HANDOVER_CC:no=$(LOCAL_CC))
CPP = $(HANDOVER_CPP:no=$(LOCAL_CPP))
_CC1 = $(HANDOVER_CC1:no=$(LOCAL_CC1))
CC1 = $(_CC1:nlbindir/%=$(BINDIR)/%)
AS  = $(HANDOVER_AS:no=$(LOCAL_AS))
AR  = $(HANDOVER_AR:no=$(LOCAL_AR))
LD  = $(HANDOVER_LD:no=$(LOCAL_LD))

GFLAGS  = -O -Wall
GFLAGS += -g
#GFLAGS += -m32 # for 32bit executable
GFLAGS += $(GOPTFLAGS)

PFLAGS_STDCHEADERS_freebsd =
# to avoid xlocale/_ctype.h
PFLAGS_STDCHEADERS_freebsd += -D_POSIX_SOURCE -D__BSD_VISIBLE=1 -D__XSI_VISIBLE=1
#PFLAGS_STDCHEADERS_freebsd += -D_XLOCALE_CTYPE_H
# to avoid inline ctype functions
PFLAGS_STDCHEADERS_freebsd += -D_DONT_USE_CTYPE_INLINE_
# to avoid inline __sputc()
#PFLAGS_STDCHEADERS_freebsd += -U__GNUC__ -D__GNUCLIKE_BUILTIN_VARARGS
PFLAGS_STDCHEADERS_freebsd += -U__STDC__ -Wno-builtin-macro-redefined
# to define va_start
PFLAGS_STDCHEADERS_freebsd += -D__GNUCLIKE_BUILTIN_STDARG

PFLAGS_STDCHEADERS_debian  = -U__GNUC__ # to avoid include stdio2.h
#PFLAGS_STDCHEADERS_debian += -D_POSIX_SOURCE
#PFLAGS_STDCHEADERS_debian += -D__USE_MISC

PFLAGS_STDCHEADERS_centos  =
PFLAGS_STDCHEADERS_centos += -D__signed__=signed
PFLAGS_STDCHEADERS_centos += -D_SYS_WAIT_H # wait4(__WAIT_STATUS) in stdlib.h

PFLAGS_STDCHEADERS_nllibc  = -nostdinc -I$(INCLUDEDIR)/nllibc

PFLAGS  =
PFLAGS += -fno-inline
PFLAGS += $(PFLAGS_STDCHEADERS_$(STDCHEADERS))
PFLAGS += $(USE_NLLIBC:yes=-DUSE_NLLIBC)
PFLAGS += $(CROSS:$(CROSS)=-DCROSS $(OSDEF:$(OSDEF)=-D$(OSDEF)))
PFLAGS += $(MINGW:$(MINGW)=-DMINGW)
PFLAGS += -I$(INCLUDEDIR)
PFLAGS += $(POPTFLAGS)

CFLAGS  =
CFLAGS += -fno-builtin
CFLAGS += -fno-stack-protector
CFLAGS += $(COPTFLAGS)

AFLAGS  =
AFLAGS += $(AOPTFLAGS)

ARFLAGS = ruc
#ARFLAGS = rDc
ARFLAGS += $(AROPTFLAGS)

.SUFFIXES:
.SUFFIXES: .o .s .i .c .S
.PRECIOUS: $(PRES) $(ASMS)

all :		nllibc.all

nllibc.all :	$(LIB) $(OBJLIB)

pres :		$(PRES)

asms :		$(ASMS)

objs :		$(OBJS)

.S.s :
		$(CPP) $(GFLAGS) $(PFLAGS) $< -o $@

.c.i :
		$(CPP) $(GFLAGS) $(PFLAGS) $< -o $@

.i.s :
		$(CC1) $(GFLAGS) $(CFLAGS) $< -o $@

.s.o :
		$(AS) $(GFLAGS) $(AFLAGS) $< -o $@
		$(OSABI:$(OSABI)=elfedit --output-osabi=$(OSABI) $@)

# clear default .c.o rule
# (useless because of priority definition of .SUFFIXES)

# for BSD make
.c.o :

# for GNU make
%.o :		%.c

lib :		$(LIB) $(OBJLIB)

libs :		$(LIBS)

$(LIB) :	$(OBJS)
		$(AR) $(ARFLAGS) $(LIB) $(OBJS)
		$(OSABI:$(OSABI)=elfedit --output-osabi=$(OSABI) $@)

$(OBJLIB) :	$(OBJS)
		$(LD) -r -o $(OBJLIB) $(OBJS)
		$(OSABI:$(OSABI)=elfedit --output-osabi=$(OSABI) $@)

install :
		mkdir -p $(LIBDIR)
		cp $(LIB) $(OBJLIB) $(LIBDIR)
		mkdir -p $(INCDIR) $(INCDIR)/sys $(INCDIR)/nllibc
		rm -fR $(INCLUDEDIR)/$(TMPDIR)
		mkdir -p $(INCLUDEDIR)/$(TMPDIR) $(INCLUDEDIR)/$(TMPDIR)/sys $(INCLUDEDIR)/$(TMPDIR)/nllibc
		cd $(INCLUDEDIR)/nllibc ; cp $(HEADERS) ../$(TMPDIR)
		cd $(INCLUDEDIR)/nllibc/sys ; cp $(HEADERS_SYS) ../../$(TMPDIR)/sys
		cd $(INCLUDEDIR) ; cp $(HEADERS_NLLIBC) $(TMPDIR)/nllibc
		mv $(INCLUDEDIR)/$(TMPDIR)/nllibc/* $(INCDIR)/nllibc
		rmdir $(INCLUDEDIR)/$(TMPDIR)/nllibc
		mv $(INCLUDEDIR)/$(TMPDIR)/sys/* $(INCDIR)/sys
		rmdir $(INCLUDEDIR)/$(TMPDIR)/sys
		mv $(INCLUDEDIR)/$(TMPDIR)/* $(INCDIR)
		rmdir $(INCLUDEDIR)/$(TMPDIR)

uninstall :
		mkdir -p $(LIBDIR)
		cd $(LIBDIR) ; rm -f $(LIB) $(OBJLIB)
		mkdir -p $(INCDIR) $(INCDIR)/sys $(INCDIR)/nllibc
		cd $(INCDIR) ; rm -f $(HEADERS)
		cd $(INCDIR)/sys ; rm -f $(HEADERS_SYS)
		cd $(INCDIR)/nllibc ; rm -f $(HEADERS_NLLIBC)
		rmdir $(INCDIR)/nllibc

clean :		nllibc.clean

nllibc.clean :	pres.clean asms.clean objs.clean lib.clean libs.clean
		rm -fR $(INCLUDEDIR)/$(TMPDIR)

pres.clean :
		rm -f $(PRES)

asms.clean :
		rm -f $(ASMS)

objs.clean :
		rm -f $(OBJS)

lib.clean :
		rm -f $(LIB) $(OBJLIB)

libs.clean :

allclean :	nllibc.clean
