# Makefile to create the library (archive) and a Test Program
#=====================================================================
#
# Copyright (c) 2026 2027
#     John McCue <jmccue@sdf.org>
#
# Permission to use, copy, modify, and distribute this software
# for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#=====================================================================
# hash a string to generate a 'unique' value that can be
# generated to:
#    1. Create a unique value that can be used to shorten a Key
#       if large string is needs to be a database key
#    2. Hide Personally Identifiable Information (PII) so it can
#       be stored in a database but it cannot be used to
#       determine the real information (like SSN or Credit Card
#       Data)
#
#  test ssl hash generation speed:
#     $ openssl speed sha256 sha512
#=====================================================================


### adjust these as needed, OWNER = DEFAULT will bypass chown(1) on install
### Uncomment LINUXLIB on Linux 64 bit systems

DESTDIR=/usr/local
OWNER="root:wheel"

#LINUXLIB=64

##### FROM HERE DOWN, YOU SHOULD NOT NEED TO CHANGE
PRODLIB=$(DESTDIR)/lib$(LINUXLIB)
PRODINC=$(DESTDIR)/include
PRODMAN=$(DESTDIR)/man/man3
PRODREAD=$(DESTDIR)/share/jhash

LIB_EXT=.a
SO_EXT=.so
EXE=
OBJ=.o
LIBS= -lssl -lcrypto
TRM=

FLAGSO=-fPIC
CFLAGS=-c -Wall -O1 $(FLAGSO)
LFLAGS=-Wall -O1 -L/usr/local/lib$(LINUXLIB) -L/opt/jmc/lib$(LINUXLIB)
LDFLAGS=-shared

LIB_SHARED=libjhash$(SO_EXT)
LIB_STATIC=libjhash$(LIB_EXT)

AR=ar
CC=cc
CHMOD=chmod
CP=cp
CTAGS=ctags
ECHO=echo
ETAGS=etags
GZIP=gzip
LD=cc
LINK=cc
MKDIR=mkdir
MV=mv
OBJ=.o
RANLIB=ranlib
RM=rm -f
RMDIR=rmdir

ALL_SRC=jcnv.c jmd5.c jsha1.c jsha224.c jsha256.c jsha384.c jsha512.c tst.c
ALL_LIB=jcnv$(OBJ) jmd5$(OBJ) jsha1$(OBJ) jsha224$(OBJ) jsha256$(OBJ) jsha384$(OBJ) jsha512$(OBJ)
ALL_OBJ=$(ALL_LIB) tst$(OBJ)

all:	man tags TAGS $(LIB_STATIC) $(LIB_SHARED) tst$(EXE)
	$(ECHO) complete

#--- install(1) differs, use ./install.sh, also adjusts for Linux if needed
install:	all
	./install.sh 644 $(OWNER) $(PRODREAD) LICENSE.md
	./install.sh 644 $(OWNER) $(PRODREAD) README.md
	./install.sh 644 $(OWNER) $(PRODINC) jhash.h
	./install.sh 644 $(OWNER) $(PRODMAN) cnv_to_txt.3.gz
	./install.sh 644 $(OWNER) $(PRODMAN) hash_md5.3.gz
	./install.sh 644 $(OWNER) $(PRODMAN) hash_sha1.3.gz
	./install.sh 644 $(OWNER) $(PRODMAN) hash_sha224.3.gz
	./install.sh 644 $(OWNER) $(PRODMAN) hash_sha256.3.gz
	./install.sh 644 $(OWNER) $(PRODMAN) hash_sha384.3.gz
	./install.sh 644 $(OWNER) $(PRODMAN) hash_sha512.3.gz
	./install.sh 644 $(OWNER) $(PRODMAN) jhash.3.gz
	./install.sh 644 $(OWNER) $(PRODLIB) libjhash$(LIB_EXT)
	./install.sh 644 $(OWNER) $(PRODLIB) libjhash$(SO_EXT)

uninstall:	all
	-$(RM) $(PRODREAD)/LICENSE.md
	-$(RM) $(PRODREAD)/README.md
	-$(RM) $(PRODINC)/jhash.h
	-$(RM) $(PRODMAN)/cnv_to_txt.3.gz
	-$(RM) $(PRODMAN)/hash_md5.3.gz
	-$(RM) $(PRODMAN)/hash_sha1.3.gz
	-$(RM) $(PRODMAN)/hash_sha224.3.gz
	-$(RM) $(PRODMAN)/hash_sha256.3.gz
	-$(RM) $(PRODMAN)/hash_sha384.3.gz
	-$(RM) $(PRODMAN)/hash_sha512.3.gz
	-$(RM) $(PRODMAN)/jhash.3.gz
	-$(RM) $(PRODLIB)/libjhash$(LIB_EXT)
	-$(RM) $(PRODLIB)/libjhash$(SO_EXT)
	-$(RMDIR) $(PRODREAD)

tags:	jhash.h $(ALL_SRC)
	-$(CTAGS) jhash.h $(ALL_SRC)
TAGS:	jhash.h $(ALL_SRC)
	-$(ETAGS) jhash.h $(ALL_SRC)

$(LIB_SHARED):	$(ALL_OBJ)
	-$(RM) $(LIB_SHARED)
	$(LD) $(LDFLAGS) -o $(LIB_SHARED) $(ALL_LIB)
$(LIB_STATIC):	$(ALL_OBJ)
	$(AR) rv $(LIB_STATIC) $(ALL_LIB)
	$(RANLIB) $(LIB_STATIC)

clean:
	-$(RM) *$(OBJ)
	-$(RM) tst$(EXE)
	-$(RM) TAGS
	-$(RM) a.out
	-$(RM) tags
	-$(RM) core
	-$(RM) core*
	-$(RM) *.core
	-$(RM) *.pdb
	-$(RM) *.ilk
	-$(RM) out.txt
	-$(RM) err.txt
	-$(RM) ktrace.out
	-$(RM) $(LIB_SHARED)
	-$(RM) $(LIB_STATIC)
	-$(RM) cnv_to_txt.3.gz
	-$(RM) hash_md5.3.gz
	-$(RM) hash_sha1.3.gz
	-$(RM) hash_sha224.3.gz
	-$(RM) hash_sha256.3.gz
	-$(RM) hash_sha384.3.gz
	-$(RM) hash_sha512.3.gz
	-$(RM) jhash.3.gz
	-$(RM) libjhash$(LIB_EXT)
	-$(RM) libjhash$(SO_EXT)

tst$(EXE):	$(ALL_OBJ)
	$(LINK) $(LFLAGS) -o tst$(EXE) tst$(OBJ) jcnv$(OBJ) jmd5$(OBJ) jsha1$(OBJ) jsha224$(OBJ) jsha256$(OBJ) jsha384$(OBJ) jsha512$(OBJ) $(LIBS)

man:	cnv_to_txt.3.gz hash_md5.3.gz hash_sha1.3.gz hash_sha224.3.gz hash_sha256.3.gz hash_sha384.3.gz hash_sha512.3.gz jhash.3.gz
	$(ECHO) manuals created
jhash.3.gz:	jhash.man
	$(GZIP) < jhash.man > jhash.3.gz
cnv_to_txt.3.gz:	cnv_to_txt.man
	$(GZIP) < cnv_to_txt.man > cnv_to_txt.3.gz
hash_md5.3.gz:	hash_md5.man
	$(GZIP) < hash_md5.man > hash_md5.3.gz
hash_sha1.3.gz:	hash_sha1.man
	$(GZIP) < hash_sha1.man > hash_sha1.3.gz
hash_sha224.3.gz:	hash_sha224.man
	$(GZIP) < hash_sha224.man > hash_sha224.3.gz
hash_sha256.3.gz:	hash_sha256.man
	$(GZIP) < hash_sha256.man > hash_sha256.3.gz
hash_sha384.3.gz:	hash_sha384.man
	$(GZIP) < hash_sha384.man > hash_sha384.3.gz
hash_sha512.3.gz:	hash_sha512.man
	$(GZIP) < hash_sha512.man > hash_sha512.3.gz

### END: Makefile
