################################
# 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
USE_NLCRT = 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 = crt-freebsd-i386.S crt-freebsd-amd64.S crt-freebsd-powerpc.S \
	crt-linux-x86.S crt-linux-x86_64.S \
	crt-linux-arm.S crt-linux-aarch64.S \
	crt-linux-powerpc.S crt-linux-mips.S crt-linux-sh.S \
	crt-linux-sparc.S crt-linux-alpha.S crt-linux-hppa.S \
	crt-linux-blackfin.S crt-linux-mn10300.S crt-linux-m32r.S \
	crt-linux-microblaze.S crt-linux-riscv32.S
CSRCS = crt.c

LIB = libnlcrt.a
OBJLIB = nlcrt.o

INCLUDEDIR = ../include

LDSCRDIR = ../ldscripts
LDSCRIPTS = ld.scr.i386 ld.scr.x86_64 \
	ld.scr.arm ld.scr.aarch64 \
	ld.scr.powerpc ld.scr.mips ld.scr.sh \
	ld.scr.sparc ld.scr.alpha ld.scr.hppa \
	ld.scr.blackfin ld.scr.mn10300 ld.scr.m32r \
	ld.scr.microblaze ld.scr.riscv32

NLROOTDIR = ../..

#INSTALLDIR = /usr/local
INSTALLDIR = $(NLROOTDIR)
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)

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_debian = -U__GNUC__ # to avoid include stdio2.h

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

PFLAGS  =
PFLAGS += -fno-inline
PFLAGS += $(PFLAGS_STDCHEADERS_$(STDCHEADERS))
PFLAGS += $(USE_NLLIBC:yes=-DUSE_NLLIBC)
PFLAGS += $(USE_NLCRT:yes=-DUSE_NLCRT)
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 :		nlcrt.all

nlcrt.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 $(LIBDIR)/ldscripts
		rm -fR $(LDSCRDIR)/ldscripts
		mkdir -p $(LDSCRDIR)/ldscripts
		cd $(LDSCRDIR) ; cp $(LDSCRIPTS) ldscripts
		mv $(LDSCRDIR)/ldscripts/* $(LIBDIR)/ldscripts
		rmdir $(LDSCRDIR)/ldscripts

uninstall :
		mkdir -p $(LIBDIR)
		cd $(LIBDIR) ; rm -f $(LIB) $(OBJLIB)
		mkdir -p $(LIBDIR)/ldscripts
		cd $(LIBDIR)/ldscripts ; rm -f $(LDSCRIPTS)

clean :		nlcrt.clean

nlcrt.clean :	pres.clean asms.clean objs.clean lib.clean libs.clean

pres.clean :
		rm -f $(PRES)

asms.clean :
		rm -f $(ASMS)

objs.clean :
		rm -f $(OBJS)

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

libs.clean :

allclean :	nlcrt.clean
