#
# Makefile.win - gmake Makefile for building MPI with MSVC on NT

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

#
# $Id$
#

## Define CC to be the C compiler you wish to use.  The GNU cc
## compiler (gcc) should work, at the very least
#CC=cc
#CC=gcc
CC=cl.exe
ifeq ($(CPU_ARCH),x86_64)
AS=ml64.exe
else
AS=ml.exe
endif

## 
## Define PERL to point to your local Perl interpreter.  It
## should be Perl 5.x, although it's conceivable that Perl 4
## might work ... I haven't tested it.
##
#PERL=/usr/bin/perl
#PERL=perl

##
## Define CFLAGS to contain any local options your compiler
## setup requires.
##
## Conditional compilation options are no longer here; see
## the file 'mpi-config.h' instead.
##
MPICMN = -I. -DMP_API_COMPATIBLE -DMP_IOFUNC

ifeq ($(CPU_ARCH),x86_64)
AS_SRCS = mpi_x86_64.asm
CFLAGS = -O2 -Z7 -MD -W3 -nologo -DXP_PC -UDEBUG -U_DEBUG -DNDEBUG \
 -DWIN32 -D_WIN64 -D_AMD64_ -D_M_AMD64 -D_WINDOWS -DWIN95 $(MPICMN)
ASFLAGS = -Cp -Sn -Zi -I.
else
#NT
AS_SRCS = mpi_x86.asm
MPICMN += -DMP_ASSEMBLY_MULTIPLY -DMP_ASSEMBLY_SQUARE -DMP_ASSEMBLY_DIV_2DX1D
#CFLAGS= -Od -Z7 -MD -W3 -nologo -D_X86_ -DXP_PC \
 -DDEBUG -D_DEBUG -UNDEBUG -DWIN32 -D_WINDOWS -DWIN95 $(MPICMN)
#CFLAGS = -O2 -MD -W3 -nologo -D_X86_ -DXP_PC -UDEBUG -U_DEBUG -DNDEBUG \
 -DWIN32 -D_WINDOWS -DWIN95 $(MPICMN)
#CFLAGS = -Od -Z7 -MD -W3 -nologo -D_X86_ -DXP_PC -UDEBUG -U_DEBUG -DNDEBUG \
 -DWIN32 -D_WINDOWS -DWIN95 $(MPICMN)
CFLAGS = -O2 -Z7 -MD -W3 -nologo -D_X86_ -DXP_PC -UDEBUG -U_DEBUG -DNDEBUG \
 -DWIN32 -D_WINDOWS -DWIN95 $(MPICMN)
ASFLAGS = -Cp -Sn -Zi -coff -I. 
endif

##
## Define LIBS to include any libraries you need to link against.
## If NO_TABLE is define, LIBS should include '-lm' or whatever is
## necessary to bring in the math library.  Otherwise, it can be
## left alone, unless your system has other peculiar requirements.
##
LIBS=#-lmalloc#-lefence#-lm

## 
## Define RANLIB to be the library header randomizer; you might not
## need this on some systems (just set it to 'echo' on these systems,
## such as IRIX)
##
RANLIB=echo

##
## This is the version string used for the documentation and 
## building the distribution tarball.  Don't mess with it unless
## you are releasing a new version
VERS=1.7p6

## ----------------------------------------------------------------------
## You probably don't need to change anything below this line...
##

##
## This is the list of source files that need to be packed into
## the distribution file
SRCS=   mpi.c mpprime.c mplogic.c mpmontg.c mpi-test.c primes.c tests/ \
	utils/gcd.c utils/invmod.c utils/lap.c \
	utils/ptab.pl utils/sieve.c utils/isprime.c\
	utils/dec2hex.c utils/hex2dec.c utils/bbs_rand.c \
	utils/bbsrand.c utils/prng.c utils/primegen.c \
	utils/basecvt.c utils/makeprime.c\
	utils/fact.c utils/exptmod.c utils/pi.c utils/metime.c \
	utils/mpi.h utils/mpprime.h mulsqr.c \
	make-test-arrays test-arrays.txt all-tests make-logtab \
	types.pl stats timetest multest

## These are the header files that go into the distribution file
HDRS=mpi.h mpi-config.h utils/mpi.h utils/mpi-config.h mpprime.h mplogic.h \
     utils/bbs_rand.h tests/mpi.h tests/mpprime.h

## These are the documentation files that go into the distribution file
DOCS=README doc utils/README utils/PRIMES 

## This is the list of tools built by 'make tools'
TOOLS=gcd.exe invmod.exe isprime.exe lap.exe dec2hex.exe hex2dec.exe \
 primegen.exe prng.exe basecvt.exe fact.exe exptmod.exe pi.exe makeprime.exe

AS_OBJS = $(AS_SRCS:.asm=.obj)
LIBOBJS = mpprime.obj mpmontg.obj mplogic.obj mpi.obj $(AS_OBJS)
LIBHDRS = mpi-config.h mpi-priv.h mpi.h
APPHDRS = mpi-config.h mpi.h mplogic.h mpprime.h


help:
	@ echo ""
	@ echo "The following targets can be built with this Makefile:"
	@ echo ""
	@ echo "mpi.lib     - arithmetic and prime testing library"
	@ echo "mpi-test     - test driver (requires MP_IOFUNC)"
	@ echo "tools        - command line tools"
	@ echo "doc          - manual pages for tools"
	@ echo "clean        - clean up objects and such"
	@ echo "distclean    - get ready for distribution"
	@ echo "dist         - distribution tarball"
	@ echo ""

.SUFFIXES: .c .obj .i .lib .exe .asm

.c.i:
	$(CC) $(CFLAGS) -E $< > $@

.c.obj: 
	$(CC) $(CFLAGS) -c $<

.asm.obj:
	$(AS) $(ASFLAGS) -c $<

.obj.exe:
	$(CC) $(CFLAGS) -Fo$@ $<

#---------------------------------------

$(LIBOBJS): $(LIBHDRS)

logtab.h: make-logtab
	$(PERL) make-logtab > logtab.h

mpi.obj: mpi.c logtab.h $(LIBHDRS)

mplogic.obj: mplogic.c mpi-priv.h mplogic.h $(LIBHDRS)

mpmontg.obj: mpmontg.c mpi-priv.h mplogic.h mpprime.h $(LIBHDRS)

mpprime.obj: mpprime.c mpi-priv.h mpprime.h mplogic.h primes.c $(LIBHDRS)

mpi_mips.obj: mpi_mips.s
	$(CC) -Fo$@ $(ASFLAGS) -c mpi_mips.s

mpi.lib: $(LIBOBJS)
	ar -cvr mpi.lib $(LIBOBJS)
	$(RANLIB) mpi.lib

lib libs: mpi.lib

#---------------------------------------

MPTESTOBJS = mptest1.obj mptest2.obj mptest3.obj mptest3a.obj mptest4.obj \
 mptest4a.obj mptest4b.obj mptest6.obj mptest7.obj mptest8.obj mptest9.obj
MPTESTS = $(MPTESTOBJS:.obj=.exe)

$(MPTESTOBJS): mptest%.obj: tests/mptest-%.c $(LIBHDRS)
	$(CC) $(CFLAGS) -Fo$@ -c $<

$(MPTESTS): mptest%.exe: mptest%.obj mpi.lib $(LIBS)
	$(CC) $(CFLAGS) -Fo$@ $^ 

tests: mptest1.exe mptest2.exe mptest3.exe mptest3a.exe mptest4.exe \
 mptest4a.exe mptest4b.exe mptest6.exe bbsrand.exe

utests: mptest7.exe mptest8.exe mptest9.exe

#---------------------------------------

EXTRAOBJS = bbsrand.obj bbs_rand.obj prng.obj
UTILOBJS = primegen.obj metime.obj identest.obj basecvt.obj fact.obj \
 exptmod.obj pi.obj makeprime.obj karatsuba.obj gcd.obj invmod.obj lap.obj \
 isprime.obj dec2hex.obj hex2dec.obj
UTILS = $(UTILOBJS:.obj=.exe) 

$(UTILS): %.exe : %.obj mpi.lib $(LIBS)
	$(CC) $(CFLAGS) -Fo$@ $^ 

$(UTILOBJS) $(EXTRAOBJS): %.obj : utils/%.c $(LIBHDRS)
	$(CC) $(CFLAGS) -Fo$@ -c $<

prng.exe: prng.obj bbs_rand.obj mpi.lib $(LIBS)
	$(CC) $(CFLAGS) -Fo$@ $^

bbsrand.exe: bbsrand.obj bbs_rand.obj mpi.lib $(LIBS)
	$(CC) $(CFLAGS) -Fo$@ $^

utils: $(UTILS) prng.exe bbsrand.exe

#---------------------------------------

test-info.c: test-arrays.txt
	$(PERL) make-test-arrays test-arrays.txt > test-info.c

mpi-test.obj: mpi-test.c test-info.c $(LIBHDRS)
	$(CC) $(CFLAGS) -Fo$@ -c $<

mpi-test.exe: mpi-test.obj mpi.lib $(LIBS)
	$(CC) $(CFLAGS) -Fo$@ $^

mdxptest.obj: mdxptest.c $(LIBHDRS) mpi-priv.h

mdxptest.exe: mdxptest.obj mpi.lib $(LIBS)
	$(CC) $(CFLAGS) -Fo$@ $^

mulsqr.obj: mulsqr.c logtab.h mpi.h mpi-config.h mpprime.h 
	$(CC) $(CFLAGS) -DMP_SQUARE=1 -Fo$@ -c mulsqr.c 

mulsqr.exe: mulsqr.obj mpi.lib $(LIBS)
	$(CC) $(CFLAGS) -Fo$@ $^

#---------------------------------------

alltests: tests utests mpi-test.exe

tools: $(TOOLS)

doc:
	(cd doc; ./build)

clean:
	rm -f *.obj *.lib *.pdb *.ilk
	cd utils; rm -f *.obj *.lib *.pdb *.ilk

distclean: clean
	rm -f mptest? mpi-test metime mulsqr karatsuba
	rm -f mptest?a mptest?b
	rm -f utils/mptest?
	rm -f test-info.c logtab.h
	rm -f mpi.lib
	rm -f $(TOOLS)

dist: Makefile $(HDRS) $(SRCS) $(DOCS)
	tar -cvf mpi-$(VERS).tar Makefile $(HDRS) $(SRCS) $(DOCS)
	pgps -ab mpi-$(VERS).tar
	chmod +r mpi-$(VERS).tar.asc
	gzip -9 mpi-$(VERS).tar


print: 
	@echo LIBOBJS = $(LIBOBJS)
# END
