################################
# 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

TERMHEADERS = $(STDCHEADERS)

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

#USE_NLLIBC = yes
USE_NLTERM = 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 =
CSRCS = termios.c

LIB = libnlterm.a
OBJLIB = nlterm.o

INCLUDEDIR = ../include

HEADERS = termio.h termios.h
HEADERS_SYS = termios.h

NLROOTDIR = ../..

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

TMPDIR = term

################################
# 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_nllibc = -nostdinc -I$(INCLUDEDIR)/nllibc
PFLAGS_TERMHEADERS_nllibc = -I$(INCLUDEDIR)/nlterm

PFLAGS  =
PFLAGS += -fno-inline
PFLAGS += $(PFLAGS_STDCHEADERS_$(STDCHEADERS))
PFLAGS += $(PFLAGS_TERMHEADERS_$(TERMHEADERS))
PFLAGS += $(USE_NLLIBC:yes=-DUSE_NLLIBC)
PFLAGS += $(USE_NLTERM:yes=-DUSE_NLTERM)
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 :		nlterm.all

nlterm.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
		rm -fR $(INCLUDEDIR)/$(TMPDIR)
		mkdir -p $(INCLUDEDIR)/$(TMPDIR) $(INCLUDEDIR)/$(TMPDIR)/sys
		cd $(INCLUDEDIR)/nlterm ; cp $(HEADERS) ../$(TMPDIR)
		cd $(INCLUDEDIR)/nlterm/sys ; cp $(HEADERS_SYS) ../../$(TMPDIR)/sys
		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
		cd $(INCDIR) ; rm -f $(HEADERS)
		cd $(INCDIR)/sys ; rm -f $(HEADERS_SYS)

clean :		nlterm.clean

nlterm.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 :	nlterm.clean
