# Targets
# make          - twidle the options yourself :-)
# make cc       - standard cc options
# make gcc      - standard gcc options
# make x86-elf  - linux-elf etc
# make x86-out  - linux-a.out, FreeBSD etc
# make x86-solaris
# make x86-bdsi

DIR=	bf
TOP=	.
# use BF_PTR2 for intel boxes,
# BF_PTR for sparc and MIPS/SGI
# use nothing for Alpha and HP.

# There are 3 possible performance options, experiment :-)
#OPTS= -DBF_PTR  # usr for sparc and MIPS/SGI
#OPTS= -DBF_PTR2 # use for pentium
OPTS=		 # use for pentium pro, Alpha and HP

MAKE=make -f Makefile
#CC=cc
#CFLAG= -O

CC=gcc
#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
CFLAG= -O3 -fomit-frame-pointer

CFLAGS=$(OPTS) $(CFLAG)
CPP=$(CC) -E
AS=as
RANLIB=ranlib

# Assember version of bf_encrypt().
BF_ENC=bf_enc.o		# normal C version
#BF_ENC=asm/bx86-elf.o	# elf format x86
#BF_ENC=asm/bx86-out.o	# a.out format x86
#BF_ENC=asm/bx86-sol.o	# solaris format x86 
#BF_ENC=asm/bx86bsdi.o	# bsdi format x86 

LIBDIR=/usr/local/lib
BINDIR=/usr/local/bin
INCDIR=/usr/local/include
MANDIR=/usr/local/man
MAN1=1
MAN3=3
SHELL=/bin/sh
LIBOBJ=bf_skey.o bf_ecb.o $(BF_ENC) bf_cfb64.o bf_ofb64.o
LIBSRC=bf_skey.c bf_ecb.c bf_enc.c bf_cfb64.c bf_ofb64.c

GENERAL=Makefile Makefile.ssl Makefile.uni asm bf_locl.org README \
	COPYRIGHT blowfish.doc INSTALL

TESTING=    bftest bfspeed bf_opts
TESTING_SRC=bftest.c bfspeed.c bf_opts.c
HEADERS=bf_locl.h blowfish.h bf_pi.h

ALL=	$(GENERAL) $(TESTING_SRC) $(LIBSRC) $(HEADERS)

BLIB=	libblowfish.a

all: $(BLIB) $(TESTING)

cc:
	$(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all

gcc:
	$(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all

x86-elf:
	$(MAKE) BF_ENC='asm/bx86-elf.o' CC=$(CC) CFLAGS="-DELF $(OPTS) $(CFLAG)" all

x86-out:
	$(MAKE) BF_ENC='asm/bx86-out.o' CC=$(CC) CFLAGS="-DOUT $(OPTS) $(CFLAG)" all

x86-solaris:
	$(MAKE) BF_ENC='asm/bx86-sol.o' CC=$(CC) CFLAGS="-DSOL $(OPTS) $(CFLAG)" all

x86-bsdi:
	$(MAKE) BF_ENC='asm/bx86bsdi.o' CC=$(CC) CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all

# elf
asm/bx86-elf.o: asm/bx86unix.cpp
	$(CPP) -DELF asm/bx86unix.cpp | $(AS) -o asm/bx86-elf.o

# solaris
asm/bx86-sol.o: asm/bx86unix.cpp
	$(CC) -E -DSOL asm/bx86unix.cpp | sed 's/^#.*//' > asm/bx86-sol.s
	as -o asm/bx86-sol.o asm/bx86-sol.s
	rm -f asm/bx86-sol.s

# a.out
asm/bx86-out.o: asm/bx86unix.cpp
	$(CPP) -DOUT asm/bx86unix.cpp | $(AS) -o asm/bx86-out.o

# bsdi
asm/bx86bsdi.o: asm/bx86unix.cpp
	$(CPP) -DBSDI asm/bx86unix.cpp | $(AS) -o asm/bx86bsdi.o

asm/bx86unix.cpp:
	(cd asm; perl bf-586.pl cpp >bx86unix.cpp)
	
test:	all
	./bftest

$(BLIB): $(LIBOBJ)
	/bin/rm -f $(BLIB)
	ar cr $(BLIB) $(LIBOBJ)
	$(RANLIB) $(BLIB)

bftest: bftest.o $(BLIB)
	$(CC) $(CFLAGS) -o bftest bftest.o $(BLIB)

bfspeed: bfspeed.o $(BLIB)
	$(CC) $(CFLAGS) -o bfspeed bfspeed.o $(BLIB)

bf_opts: bf_opts.o $(BLIB)
	$(CC) $(CFLAGS) -o bf_opts bf_opts.o $(BLIB)

tags:
	ctags $(TESTING_SRC) $(LIBBF)

tar:
	tar chf libbf.tar $(ALL)

shar:
	shar $(ALL) >libbf.shar

depend:
	makedepend $(LIBBF) $(TESTING_SRC)

clean:
	/bin/rm -f *.o tags core $(TESTING) $(BLIB) .nfs* *.old *.bak asm/*.o 

dclean:
	sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
	mv -f Makefile.new Makefile

# Eric is probably going to choke when he next looks at this --tjh
install: $(BLIB)
	if test $(INSTALLTOP); then \
	    echo SSL style install; \
	    cp $(BLIB) $(INSTALLTOP)/lib; \
		$(RANLIB) $(BLIB); \
	    chmod 644 $(INSTALLTOP)/lib/$(BLIB); \
	    cp blowfish.h $(INSTALLTOP)/include; \
	    chmod 644 $(INSTALLTOP)/include/blowfish.h; \
	else \
	    echo Standalone install; \
	    cp $(BLIB) $(LIBDIR)/$(BLIB); \
		$(RANLIB) $(BLIB); \
	    chmod 644 $(LIBDIR)/$(BLIB); \
	    cp blowfish.h $(INCDIR)/blowfish.h; \
	    chmod 644 $(INCDIR)/blowfish.h; \
	fi

# DO NOT DELETE THIS LINE -- make depend depends on it.
