# Makefile for use with gnu make (linux, unix, CygWin32)
#
# save               :   make zip
#                    :   make tar
#
# !!!! First "make clean ; make dep " !!!!
#
# remove .o files    :   make clean
# dependencies       :   make dep
# build              :   make
# build static       :   make static   # only UNIX/Linux !
# binaries	     :	 make dist  


# use "static" for standalone/distributed binaries that should
# work more or less independent from linux distribution

export PROGNAME=lincardemu
export VERS=0.20e

#uncomment (only used under linux/unix or cygwin-gnu-gcc):
USE_NCURSES  = 1    #can cause problems on various ppc images, default = commented
#USE_READLINE = 1

# in Linux use _POSIX_PRIORITY_SCHEDULING / 
USE_PRIORITY_SCHEDULING = 1

# if newer Redhat / gcc 3 gives runtime error when entering PIN in OSD:
# NEW_GCC_ERROR1 = 1
#
OST= $(shell uname -s)

TODAY= $(shell date +%Y%m%d)
ifeq ($(OST),Linux)
OSTARGET:=UNIX
else
ifeq ($(findstring CYGWIN,$(OST)),CYGWIN)
#ifeq ("$(OST)","CYGWIN_98-4.10")
#
OSTARGET:=CYGWIN
endif
#ifeq ("$(OST)","CYGWIN_95-4.0")
#OSTARGET:=CYGWIN
#endif
endif

ifndef OSTARGET
OSTARGET:=UNKNOWN
dep:    err
err:    vecho
        exit 2  
endif

CC=gcc
CXX=g++
CCXX=gcc
#to compile for Dreambox/dbox2, uncomment next 3 lines:
#CC=powerpc-tuxbox-linux-gnu-gcc
#CXX=powerpc-tuxbox-linux-gnu-g++
#CCXX=powerpc-tuxbox-linux-gnu-gcc

ifeq ($(OSTARGET),UNIX)
 CFLAGS = -Wall  -O2 -g  -D${OSTARGET}
 CXXFLAGS = -Wall  -O2  -g  -D${OSTARGET}
 LDFLAGS = -Wall -g 
 LDLIBSTATIC =
 LDLIBS=
 LDLIBSLCE= -lpthread 
ifdef USE_NCURSES
 CFLAGS += -DUSE_NCURSES 
 LDLIBS += -lncurses
endif
ifdef USE_READLINE
 CFLAGS += -DUSE_READLINE
 LDLIBS += -lreadline
endif
ifdef USE_PRIORITY_SCHEDULING
 CFLAGS += -DUSE_PRIORITY_SCHEDULING
endif
 LDFLAGSTATIC = -static -s
 OSSRC:= serfunc.c
 OSHFILES:= serfunc.h
 OSUTILOBJ:= serfunc.o 
 OSOTHER:= SerialWin.c  SerialWin.h SerialWin_n.c 
 EXE:=
else
 #To use the Cygwin.dll uncomment the following line:
 OSTARGET=MINGW32

 CFLAGS := -Wall -O2 -D${OSTARGET}
 LDFLAGS :=  -Wall
 LDFLAGSTATIC = -static -s
 LDLIBSTATIC=
 LDLIBS=
ifeq ($(OSTARGET),MINGW32)
 CFLAGS += -mno-cygwin
 LDFLAGS += -mno-cygwin
else
 #only readline with
 ifdef USE_READLINE
  CFLAGS += -DUSE_READLINE
  LDFLAGS += -lreadline 
  LDLIBSTATIC += /cygnus/cygwin-b20/H-i586-cygwin32/lib/libreadline.a
  LDLIBS +=  /cygnus/cygwin-b20/H-i586-cygwin32/lib/libreadline.a
 endif
endif

 OSSRC:= SerialWin.c SerialWin_n.c
 OSHFILES:= SerialWin.h
 OSUTILOBJ:= SerialWin.o
 OSOTHER:= serfunc.c serfunc.h
 EXE=.exe
endif

ifdef NEW_GCC_ERROR1
  CFLAGS += -DNEW_GCC_ERROR1
endif

LDLIBSLCE += $(LDLIBS)

# -funsigned-char -pedantic
CFLAGS += -DVERS=\"${VERS}\"

SRCFILES= $(OSSRC) des.c ec.c ec_util.c ec_keys.c \
	conax.c irdeto.c irdeto_v1_algorithm.c seca.c viaccess.c \
	secaAlgorithm.c seca_keys.c nagra.c \
	main.c command.c common.c config.c confutil.c videoguard.c  \
	debug.c ec-s.c std_log.c \
	emu_options.c hexupd.c hexmmn4.c sha.c seca2Algorithm.c \
	md5.c newcamd-client.c \
	 \
	NagraFxEmu.c 

HFILES= $(OSHFILES) common.h des.h ec.h ec_keys.h ec_util.h  \
	conax.h irdeto.h irdeto_v1_algorithm.h seca.h main.h \
	emu_options.h viaccess.h secaAlgorithm.h seca_keys.h \
	nagra.h \
	config.h confutil.h videoguard.h debug.h ec-s.h std_log.h \
	seca2Algorithm.h sha.h chaintable.h newcamd-client.h \
	 \
	NagraFxEmu.h 

SHAWK=  mmcodes.awk mmcodes.sh geronimo.awk geronimo.sh softcam2lce.sh newcamd2lce.sh

OTHERFL= Makefile .depend lincardemu.dat hexupd.dat \
	Copyright.txt Readme.txt Changes.txt receivers.txt \
	lincemu.ico  $(OSOTHER) $(SHAWK)

BINFILE= Copyright.txt Readme.txt $(PROGNAME)$(EXE) 

KEYFILES= seca.dat eckeys.dat viaccess.dat irdeto.dat newcamd-client.dat

UTILOBJS=  confutil.o debug.o ec_keys.o seca_keys.o ec_util.o common.o md5.o newcamd-client.o

LCEOBJS= command.o config.o std_log.o emu_options.o

CRYPTOBJS=des.o ec.o conax.o irdeto.o irdeto_v1_algorithm.o seca.o viaccess.o \
	secaAlgorithm.o videoguard.o ec-s.o nagra.o seca2Algorithm.o sha.o \
	 \
	NagraFxEmu.o 

SECRETFILES=    $(KEYFILES)

NONSECRETFILES=   viaccess-dist.dat \
	irdeto-dist.dat conax-dist.dat seca-dist.dat eckeys-dist.dat \
	newcamd-client-dist.dat

# all libs:
ALIBS=lce.a cryp.a util.a nagra-rsa/librsa.a

SRCDIR= $(shell pwd | sed "s/.\+\///" )

all:	vecho $(PROGNAME)

$(PROGNAME):	main.o $(ALIBS)  $(OSUTILOBJ)
	$(CCXX) $(LDFLAGS)  $(LDLIBSLCE) -o $(PROGNAME) main.o $(ALIBS) $(OSUTILOBJ)
	strip $(PROGNAME)$(EXE)

hexupd:	hexupd.o util.a config.o nagra-rsa/librsa.a
	$(CCXX) $(LDFLAGS) $(LDLIBS) -o hexupd hexupd.o config.o util.a nagra-rsa/librsa.a

hexmmn4:	hexmmn4.o confutil.o 
	$(CCXX) $(LDFLAGS) -o hexmmn4  hexmmn4.o confutil.o 

new:	$(ALIBS) main.o SerialWin_n.o
	$(CCXX) $(LDFLAGS) -o $(PROGNAME) $(ALIBS) main.o SerialWin_n.o $(LDLIBSLCE)
	strip $(PROGNAME)$(EXE)

lce:	main.o $(LCEOBJS) $(UTILOBJS) $(CRYPTOBJS) $(OSUTILOBJ) nagra-rsa/librsa.a
	$(CCXX) $(LDFLAGS)  $(LDLIBSLCE) -o lce main.o $(LCEOBJS) $(UTILOBJS) $(CRYPTOBJS)  $(OSUTILOBJ) nagra-rsa/librsa.a

static:	main.o $(LCEOBJS) $(UTILOBJS) $(CRYPTOBJS) $(OSUTILOBJ) nagra-rsa/librsa.a
	$(CCXX) $(LDFLAGSTATIC) $(LDFLAGS) -o lcestatic main.o $(LCEOBJS) $(UTILOBJS) $(CRYPTOBJS)  $(OSUTILOBJ) $(LDLIBSLCE) nagra-rsa/librsa.a 



vecho:  
	@echo "OSTARGET='"$(OSTARGET)"' uname='"$(OST)"' date: $(TODAY)" 

datetime:	datetime.o
	$(CCXX) datetime.o -o datetime


makedir1:
	rm -rf $(PROGNAME)-$(VERS)
	mkdir $(PROGNAME)-$(VERS)
	cd nagra-rsa && $(MAKE) makedir
	cp -p ${SRCFILES} ${HFILES} ${OTHERFL} $(PROGNAME)-$(VERS)/


makedir: makedir1
	@echo "removing non-distribution files:"  ${SECRETFILES}
	for fl  in ${SECRETFILES} ; do \
	  if test -f "$(PROGNAME)-$(VERS)/$$fl" ; then rm -f "$(PROGNAME)-$(VERS)/$$fl" ; fi ; \
	done ;
	@echo "copying distribution files:"  ${NONSECRETFILES}
	for distfl  in ${NONSECRETFILES} ; do \
	  if test $${distfl%.dat} != $$distfl ; then fl=$$distfl; \
	  else fl=$${distfl/-dist/}; fi ;  \
	  cp -p $$distfl "$(PROGNAME)-$(VERS)/$$fl" ; \
	done ;


makebindir:
	rm -rf $(PROGNAME)-bin-$(VERS)
	mkdir $(PROGNAME)-bin-$(VERS)
	cp -p ${BINFILE}  $(PROGNAME)-bin-$(VERS)/
	for distfl  in ${NONSECRETFILES} lincardemu.dat ; do \
	  if test $${distfl%.dat} != $$distfl ; then fl=$$distfl; \
	  else fl=$${distfl/-dist/}; fi ;  \
	  cp -p $$distfl "$(PROGNAME)-bin-$(VERS)/$$fl" ; \
	done ;

#	cp -p hexupd.dat $(PROGNAME)-bin-$(VERS)/hexupd.dat
#	cp -p lincardemu.dat $(PROGNAME)-bin-$(VERS)/lincardemu.dat

# 	cp -p lincardemu.rc $(PROGNAME)-bin-$(VERS)/lincardemu.rc


ziptar:	makedir
	tar zcvf $(PROGNAME)-$(VERS).tar.gz $(PROGNAME)-$(VERS) 
	zip -9r $(PROGNAME)-$(VERS).zip $(PROGNAME)-$(VERS)
	rm -rf $(PROGNAME)-$(VERS)

tar:	makedir
	@echo "copying distribution files:"  ${NONSECRETFILES}
	for distfl  in ${NONSECRETFILES} ; do \
	  cp -p $$distfl "$(PROGNAME)-$(VERS)/$$distfl" ; \
	done ;
	tar zcvf $(PROGNAME)-$(VERS).tar.gz $(PROGNAME)-$(VERS) 
	rm -rf $(PROGNAME)-$(VERS)


zip:	makedir
	zip -9r $(PROGNAME)-$(VERS).zip $(PROGNAME)-$(VERS)
	rm -rf $(PROGNAME)-$(VERS)

binzip:	makebindir
	zip -9r $(PROGNAME)-bin-$(VERS).zip $(PROGNAME)-bin-$(VERS)

bintar:	makebindir
	tar zcvf $(PROGNAME)-bin-$(VERS).tar.gz $(PROGNAME)-bin-$(VERS)

dist:	static binzip bintar
	rm -rf $(PROGNAME)-bin-$(VERS)


backup:	clean
	(cd .. ; tar zcvf $(PROGNAME)-$(VERS).backup.tar.gz $(SRCDIR) )

serfunc.o:	serfunc.c
	${CC} ${CFLAGS} -c serfunc.c -o serfunc.o

WLIB= -lgdi32 -lrpcrt4 -lkernel32 -lpenwin32 -lglu32
wint:	wint.c
	${CCXX} ${CFLAGS} wint.c -o wint -mwindows


clean:
	rm -f *.o *.a 
	cd nagra-rsa && $(MAKE) clean


mrproper:
	rm -f *.o *.a *~ lincardemu hexmmn4 hexupd lcestatic
	cd nagra-rsa && $(MAKE) clean


lce.a:	$(LCEOBJS)
	ar r $@ $?
	ranlib $@

util.a:	$(UTILOBJS)
	ar r $@ $?
	ranlib $@

cryp.a:	$(CRYPTOBJS)
	ar r $@ $?
	ranlib $@


nagra-rsa/librsa.a:
	cd nagra-rsa && $(MAKE) librsa.a 

dep:
	$(CCXX)  -MM ${CFLAGS} $(SRCFILES) > .depend


include	.depend

