#
# Makefile for the Linux C library
#

GCCVERSION=-V 2.3.3.old

# where do you build this?
HOST_MACHINE=decstation-3100
#HOST_MACHINE=i386-att-sysv
TARGET_MACHINE=i386-linux

# Host root directory, maybe /usr for Linux
HOSTROOTDIR=/net/irl/users/hlu/local
#HOSTROOTDIR=/local
#HOSTROOTDIR=/usr

# Where we are now.
SRCDIR=/net/irl/users/hlu/linux/pkg/libc-linux
#SRCDIR=/usr2/linux/src/libc-linux

# Host root directory, maybe /usr for Linux
TARGETROOTDIR=/net/irl/users/hlu/linux/pkg/usr
#TARGETROOTDIR=/usr2/linux/disk2/usr

# where to put libc_p.a, libg.a
TARGETROOT1DIR=/net/irl/users/hlu/linux/pkg/extra/usr
#TARGETROOT1DIR=/usr2/linux/disk3/usr

# Host bin direcory
HOSTBINDIR=$(HOSTROOTDIR)/$(HOST_MACHINE)/bin

# For Linux, that should be /usr/bin
CROSSBINDIR=$(HOSTROOTDIR)/$(TARGET_MACHINE)/bin
#CROSSBINDIR=/usr/bin

# This should be /usr/lib under Linux.
HOST_LIB_DIR =$(HOSTROOTDIR)/$(TARGET_MACHINE)/lib

# normal static libraries.
TARGET_LIB_DIR =$(TARGETROOTDIR)/lib

# libc_p.a, libg.a
TARGET_LIB1_DIR =$(TARGETROOT1DIR)/lib

MKDIR=mkdir -p

MV	=/bin/mv

AR	=$(CROSSBINDIR)/ar
AR_FLAGS=ucv
AS	=$(CROSSBINDIR)/as
LD	=$(CROSSBINDIR)/ld
NM	=$(CROSSBINDIR)/nm
REALRANLIB	=$(CROSSBINDIR)/ranlib

RANLIB	=echo
LDFLAGS	=-r -x

CC	=$(HOSTBINDIR)/gcc $(GCCVERSION) -b $(TARGET_MACHINE) \
		$(I486FLAGS)
DEBUG   =-g

XCFLAGS = -D_GNU_SOURCE -DSTDC_HEADERS -DUSG -DDIRENT -DSYSV \
	-DUSE_BSD_REGEX -DHAVE_GNU_LD # -D__USE_BSD_SIGNAL

# for debug library
G_OPTFLAGS=-O $(DEBUG)

# for profile library
PG_OPTFLAGS=-O -pg

# for static library
S_OPTFLAGS= -O2 -fomit-frame-pointer
S_OPTFLAGS= -O2 $(PIC)

CPP	=$(CC) -E $(XCFLAGS)
RM	=/bin/rm

LIBS	= libc.a libm.a libtermcap.a libcurses.a \
	libmcheck.a libgmon.a libdbm.a # libnet.a librpc.a

PGLIBS	=libc.a

# for debug library
GDIRS = bsd cvt ctype dirent grp inet io iostream locale login \
	malloc misc mntent posix pwd regex rpc setjmp signal stdlib \
	string sysdeps time ufc jumptable1 jumptable2

# for profile library
PGDIRS = bsd cvt ctype dirent grp inet io iostream locale login \
	malloc misc mntent posix pwd regex rpc setjmp signal stdlib \
	string sysdeps time ufc jumptable1 jumptable2

# for static library
CDIRS = crt bsd cvt ctype curses dirent gdbm gmon grp inet io \
	iostream locale login malloc misc mntent posix pwd regex \
	rpc setjmp signal stdlib string sysdeps termcap time ufc \
	jumptable1 jumptable2

# for light C library without rpc, curses, gdbm ,gmon
LITEDIRS = bsd cvt ctype dirent grp inet io iostream locale login \
	malloc misc mntent posix pwd regex setjmp signal stdlib \
	string sysdeps time ufc jumptable1 jumptable2

XMFLAGS= OPTFLAGS="$(OPTFLAGS)"

MFLAGS=CC="$(CC)" AR="$(AR)" LD="$(LD)" AS="$(AS)" \
	RANLIB="$(RANLIB)" RM="$(RM)" XCFLAGS="$(XCFLAGS)" \
	MINUS_G= XTRAFLAGS="$(XCFLAGS)" AR_FLAGS="$(AR_FLAGS)" \
	LDFLAGS="$(LDFLAGS)" MV="$(MV)" DEBUG="$(DEBUG)" \
	GCCVERSION="$(GCCVERSION)" $(DUMMY) \
	HOSTROOTDIR="$(HOSTROOTDIR)" CROSSBINDIR="$(CROSSBINDIR)"

all: static

# build debug library
debug:
	make lib OPTFLAGS="$(G_OPTFLAGS)" DIRS="$(GDIRS)" \
		MV=echo LD=echo DEBUG=-g LDFLAGS=

# build profile library
profile:
	make lib OPTFLAGS="$(PG_OPTFLAGS)" DIRS="$(PGDIRS)" \
		DEBUG=-pg MV=echo LD=echo LDFLAGS=

# build static library
static:
	make lib DIRS="$(CDIRS)" DEBUG= XMFLAGS=

# Only build i486 stuff for static library.
i486:
	make lib CFLAGS="$(SCFLAGS)" DIRS="$(CDIRS)" I486FLAGS=-m486 \
		XMFLAGS=

# build light static library
lite:
	-if [ -f libc.a ]; then mv libc.a libc.a.old; fi
	make lib CFLAGS="$(SCFLAGS)" DIRS="$(LITEDIRS)" DEBUG= \
		XMFLAGS=

lib:
	for i in $(DIRS); do \
		echo making $$i; \
		(cd $$i; make $(MFLAGS) $(XMFLAGS)); \
	done
	$(RANLIB) $(LIBS)

dep:
	for i in $(DIRS); do \
		echo making depend $$i; \
		(cd $$i; make dep $(MFLAGS)); \
	done

clean:
	$(RM) -f $(LIBS)
	for i in $(CDIRS); do \
		echo cleaning $$i; \
		(cd $$i; make clean $(MFLAGS)); \
	done

install:
	@echo which version? debug, static, or profiling.

# install profile library
install.profile: libc.a symdef
	mv libc.a libc_p.a
	make install.target LIBS=libc_p.a TARGET_LIB_DIR=$(TARGET_LIB1_DIR)

# install static library
install.static: $(LIBS)
	make install.lib LIBS="$(LIBS)"
	make install.crt $(MFLAGS) TARGETROOTDIR="$(TARGETROOTDIR)"

# install debug library
install.debug: libc.a symdef
	mv libc.a libg.a
	make install.target LIBS=libg.a TARGET_LIB_DIR=$(TARGET_LIB1_DIR)

install.debug1: libc.a symdef
	mv libc.a libg.a
	make install.target LIBS=libg.a TARGET_LIB_DIR=$(TARGET_LIB2_DIR)

install.crt:
	(cd crt ; make install $(MFLAGS) \
		TARGETROOTDIR="$(TARGETROOTDIR)" \
		TARGET_LIB_DIR="$(TARGET_LIB_DIR)" \
		HOST_LIB_DIR="$(HOST_LIB_DIR)")

symdef:
	-$(AR) -d libc.a __.SYMDEF > /dev/null 2>&1
	$(REALRANLIB) libc.a

ranlib:
	-for l in $(LIBS); do \
	  $(AR) -d $$l __.SYMDEF > /dev/null 2>&1; \
	done
	$(REALRANLIB) $(LIBS)

install.lib:
	-for l in $(LIBS); do \
	  $(AR) -d $$l __.SYMDEF > /dev/null 2>&1; \
	done
	$(REALRANLIB) $(LIBS)
	if [ $(HOSTROOTDIR) != $(TARGETROOTDIR) ]; \
	then \
		make install.host LIBS="$(LIBS)"; \
	fi
	make install.target LIBS="$(LIBS)"

install.host:
	-if [ ! -d $(HOST_LIB_DIR) ]; then $(MKDIR) $(HOST_LIB_DIR); fi
	cp $(LIBS) $(HOST_LIB_DIR)

install.target:
	-if [ ! -d $(TARGET_LIB_DIR) ]; then $(MKDIR) $(TARGET_LIB_DIR); fi
	cp $(LIBS) $(TARGET_LIB_DIR)
