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

USE_NLLINE = yes

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

#USE_NLLIBC = yes
#USE_NLTERM = yes

################################
# To use curses library

#USE_CURSES = yes

#CURSESDIR = /usr/local

################################
# 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 = readline.c history.c

LIB = libnlline.a
OBJLIB = nlline.o

INCLUDEDIR = ../include

HEADERS = nlline.h

NLROOTDIR = ../..

NLLIBCDIR = $(NLROOTDIR)/nllibc

#INSTALLDIR = /usr/local
INSTALLDIR = $(NLROOTDIR)
INCDIR = $(INSTALLDIR)/include
BINDIR = $(INSTALLDIR)/bin
LIBDIR = $(INSTALLDIR)/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)

NLLIBC = $(LIBDIR)/libnlc.a
#NLLIBC = $(LIBDIR)/nllibc.o
NLTERM = $(LIBDIR)/libnlterm.a

LIBS = $(USE_NLLIBC:yes=$(NLLIBC)) $(USE_NLTERM:yes=$(NLTERM))

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 = -D__RUNETYPE_INTERNAL # for _ThreadRuneLocale
# 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 = -D__NO_CTYPE # to avoid __isctype() in ctype.h
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 = -D__NO_CTYPE # to avoid __isctype() in ctype.h

PFLAGS_STDCHEADERS_nllibc = -nostdinc -I$(INCDIR)

PFLAGS_TERMHEADERS_nllibc = -I$(INCDIR)

PFLAGS  =
PFLAGS += -fno-inline
PFLAGS += $(PFLAGS_STDCHEADERS_$(STDCHEADERS))
PFLAGS += $(PFLAGS_TERMHEADERS_$(TERMHEADERS))
PFLAGS += $(USE_NLLINE:yes=-DUSE_NLLINE)
PFLAGS += $(USE_NLLIBC:yes=-DUSE_NLLIBC -I$(INCDIR)/nllibc)
PFLAGS += $(USE_NLTERM:yes=-DUSE_NLTERM)
PFLAGS += $(USE_CURSES:yes=-DUSE_CURSES $(CURSESDIR:$(CURSESDIR)=-I$(CURSESDIR)/include))
PFLAGS += $(CROSS:$(CROSS)=-DCROSS $(OSDEF:$(OSDEF)=-D$(OSDEF)))
PFLAGS += $(MINGW:$(MINGW)=-DMINGW)
PFLAGS += -I$(INCLUDEDIR)
PFLAGS += $(POPTFLAGS)

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

AFLAGS  =
AFLAGS += $(AOPTFLAGS)

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

HANDOVER  =
HANDOVER += CCOMPILER=$(CCOMPILER) ARCH=$(ARCH)
HANDOVER += STDCHEADERS=$(STDCHEADERS) TERMHEADERS=$(TERMHEADERS)
HANDOVER += USE_NLLINE=$(USE_NLLINE)
HANDOVER += USE_NLLIBC=$(USE_NLLIBC) USE_NLTERM=$(USE_NLTERM)
HANDOVER += USE_CURSES=$(USE_CURSES) CURSESDIR=$(CURSESDIR)
HANDOVER += CROSS=$(CROSS) CCDIR=$(CCDIR) OSDEF=$(OSDEF) OSABI=$(OSABI)
HANDOVER += MINGW=$(MINGW)
HANDOVER += HANDOVER_CC="$(CC)" HANDOVER_CPP="$(CPP)" HANDOVER_CC1="$(_CC1)"
HANDOVER += HANDOVER_AS="$(AS)" HANDOVER_AR="$(AR)" HANDOVER_LD="$(LD)"

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

all :		nlline.all

nlline.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)

$(CPRES) $(AASMS) :	$(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) $@)

$(NLLIBC) :
		$(MAKE) -C $(NLLIBCDIR) $(HANDOVER) lib.all
		$(MAKE) -C $(NLLIBCDIR) $(HANDOVER) lib.install

$(NLTERM) :
		$(MAKE) -C $(NLLIBCDIR) $(HANDOVER) term.all
		$(MAKE) -C $(NLLIBCDIR) $(HANDOVER) term.install

install :
		mkdir -p $(LIBDIR)
		cp $(LIB) $(OBJLIB) $(LIBDIR)
		mkdir -p $(INCDIR)
		rm -fR $(INCLUDEDIR)/include
		mkdir -p $(INCLUDEDIR)/include
		cd $(INCLUDEDIR) ; cp $(HEADERS) include
		mv $(INCLUDEDIR)/include/* $(INCDIR)
		rmdir $(INCLUDEDIR)/include

uninstall :
		mkdir -p $(LIBDIR)
		cd $(LIBDIR) ; rm -f $(LIB) $(OBJLIB)
		mkdir -p $(INCDIR)
		cd $(INCDIR) ; rm -f $(HEADERS)

clean :		nlline.clean

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

pres.clean :
		rm -f $(PRES)

asms.clean :
		rm -f $(ASMS)

objs.clean :
		rm -f $(OBJS)

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

libs.clean :	$(USE_NLLIBC:yes=nllibc.clean) $(USE_NLTERM:yes=nlterm.clean)

nllibc.clean :
		-$(MAKE) -C $(NLLIBCDIR) $(HANDOVER) lib.clean

nlterm.clean :
		-$(MAKE) -C $(NLLIBCDIR) $(HANDOVER) term.clean

allclean :	nlline.clean nllibc.clean nlterm.clean
