# Makefile for sr5sieve. (C) Geoffrey Reynolds, April 2006.
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.

export MAJOR_VER=1
export MINOR_VER=2
export PATCH_VER=2

# Set DEBUG=yes to compile with debugging information and internal checks.
#
DEBUG=no

# Set ASSEMBLER=yes to use assembler code where available.
#
ASSEMBLER=yes

# Uncomment one of the following ARCH= lines:
#
#ARCH=ppc64
#ARCH=i586
#ARCH=i686
#ARCH=k8

# If ARCH not set above then these defauts will be used:
#
ifeq ($(ARCH),)
DEBUG_CFLAGS=-g
OPT_CFLAGS=-O2
endif

ifeq ($(ARCH),ppc64)
DEBUG_CFLAGS=-g -O3 -ffast-math -mdynamic-no-pic -mtune=G5 -mcpu=970 -m64
OPT_CFLAGS=-g -O3 -ffast-math -mdynamic-no-pic -mtune=G5 -mcpu=970 -m64 -fomit-frame-pointer
ASFLAGS=-O3 -ffast-math -mdynamic-no-pic -mtune=G5 -mcpu=970 -m64 -fomit-frame-pointer -c
CPPFLAGS=-Wall
LDFLAGS=-m64
endif

ifeq ($(ARCH),i586)
DEBUG_CFLAGS=-g -march=i586
OPT_CFLAGS=-O2 -fomit-frame-pointer -march=i586
CPPFLAGS=-Wall
endif

ifeq ($(ARCH),i686)
DEBUG_CFLAGS=-g -march=i686
OPT_CFLAGS=-O2 -fomit-frame-pointer -march=i686
CPPFLAGS=-Wall -DHAVE_CMOV
endif

ifeq ($(ARCH),k8)
DEBUG_CFLAGS=-g -march=k8 -m64
OPT_CFLAGS=-O2 -fomit-frame-pointer -march=k8 -m64
CPPFLAGS=-Wall -DHAVE_CMOV
LDFLAGS=-m64
endif

ifeq ($(ASSEMBLER),yes)
CPPFLAGS+= -DUSE_ASM
ifeq ($(ARCH),ppc64)
ASM_OBJS=mulmod-ppc64.o expmod-ppc64.o
else
ASM_OBJS=
endif
endif

# Append any user-supplied CFLAGS.
ifeq ($(DEBUG),yes)
override CFLAGS:=$(DEBUG_CFLAGS) $(CFLAGS)
else
CPPFLAGS+= -DNDEBUG
override CFLAGS:=$(OPT_CFLAGS) $(CFLAGS)
LDFLAGS+= -s
endif

CC=gcc
AS=gcc
LDLIBS=-lm

TAR=tar -c
GZIP=gzip -9
ZIP=zip -q -9
MD5SUM=md5sum
SED=sed
FMT=fmt
CMP=cmp

# No changes should be needed below here.

.PHONY: all dist clean realclean

export FULL_VER=$(MAJOR_VER).$(MINOR_VER).$(PATCH_VER)

PROGS=sr5sieve

export SR5SIEVE_OBJS=sr5sieve.o arithmetic.o bitmap.o bsgs.o choose.o clock.o \
	events.o factors.o files.o hashtable.o primes.o sequences.o subseq.o \
	util.o

SOURCES=Makefile arithmetic.h arithmetic.c bitmap.h bitmap.c bsgs.c choose.c \
	clock.c config.h events.c factors.c files.c hashtable.h hashtable.c \
	primes.c sequences.c sr5sieve.h sr5sieve.c subseq.c util.c \
	asm-i386-gcc.h asm-ppc64.h asm-x86-64-gcc.h expmod-ppc64.s \
	mulmod-ppc64.s README.txt.in mingw32/BUILD.txt.in mingw32/Makefile \
	linux32/BUILD.in linux32/Makefile linux64/BUILD.in linux64/Makefile

DOCS=CHANGES COPYING INSTALL README TODO

TARBALL=sr5sieve-$(FULL_VER).tar.gz

# These mingw32 targets are only for cross-compiling from unix.
MINGW32I586=sr5sieve-$(FULL_VER)-mingw32-i586.zip
MINGW32I686=sr5sieve-$(FULL_VER)-mingw32-i686.zip
MINGW32=$(MINGW32I586) $(MINGW32I686)

LINUX32I586=sr5sieve-$(FULL_VER)-linux32-i586.tar.gz
LINUX32I686=sr5sieve-$(FULL_VER)-linux32-i686.tar.gz
LINUX64K8=sr5sieve-$(FULL_VER)-linux64-k8.tar.gz
LINUX32=$(LINUX32I586) $(LINUX32I686)
LINUX64=$(LINUX64K8)

DISTFILES=$(TARBALL) $(MINGW32) $(LINUX32) $(LINUX64) MD5SUM.txt README.txt

all: $(PROGS)

dist: $(DISTFILES)

$(TARBALL): $(DOCS) $(SOURCES) $(TESTS)
	$(TAR) $^ | $(GZIP) > $@

MD5SUM.txt: $(TARBALL) $(MINGW32) $(LINUX32) $(LINUX64)
	$(MD5SUM) $^ > $@

README.txt: README.txt.in
	$(SED) -e s/VERSION/$(FULL_VER)/g $< | $(FMT) > $@

sr5sieve: $(SR5SIEVE_OBJS)

$(MINGW32I586): version.h
	$(MAKE) -C mingw32 clean
	$(MAKE) -C mingw32 ARCH=i586 ASM_FLAGS="-DUSE_ASM" $@
	cp -a mingw32/$@ $@

$(MINGW32I686): version.h
	$(MAKE) -C mingw32 clean
	$(MAKE) -C mingw32 ARCH=i686 ASM_FLAGS="-DUSE_ASM -DHAVE_CMOV" $@
	cp -a mingw32/$@ $@

$(LINUX32I586): version.h
	$(MAKE) -C linux32 clean
	$(MAKE) -C linux32 ARCH=i586 ASM_FLAGS="-DUSE_ASM" $@
	cp -a linux32/$@ $@

$(LINUX32I686): version.h
	$(MAKE) -C linux32 clean
	$(MAKE) -C linux32 ARCH=i686 ASM_FLAGS="-DUSE_ASM -DHAVE_CMOV" $@
	cp -a linux32/$@ $@

$(LINUX64K8): version.h
	$(MAKE) -C linux64 clean
	$(MAKE) -C linux64 ARCH=k8 ASM_FLAGS="-DUSE_ASM -DHAVE_CMOV" $@
	cp -a linux64/$@ $@

version.h:
	echo "#define MAJOR_VER $(MAJOR_VER)" > version.h
	echo "#define MINOR_VER $(MINOR_VER)" >> version.h
	echo "#define PATCH_VER $(PATCH_VER)" >> version.h

ASM_H=asm-i386-gcc.h asm-ppc64.h asm-x86-64-gcc.h
arithmetic.o: arithmetic.c arithmetic.h $(ASM_H) config.h
bitmap.o: bitmap.c sr5sieve.h config.h bitmap.h
bsgs.o: bsgs.c sr5sieve.h config.h arithmetic.h $(ASM_H) hashtable.h
choose.o: choose.c sr5sieve.h config.h
clock.o: clock.c sr5sieve.h config.h
events.o: events.c sr5sieve.h config.h
factors.o: factors.c sr5sieve.h config.h arithmetic.h $(ASM_H)
files.o: files.c sr5sieve.h config.h
hashtable.o: hashtable.c sr5sieve.h config.h hashtable.h $(ASM_H)
primes.o: primes.c sr5sieve.h bitmap.h config.h
sequences.o: sequences.c sr5sieve.h config.h bitmap.h arithmetic.h $(ASM_H)
sr5sieve.o: sr5sieve.c files.c sr5sieve.h config.h version.h
subseq.o: subseq.c sr5sieve.h config.h bitmap.h arithmetic.h $(ASM_H)
util.o: util.c sr5sieve.h config.h
expmod-ppc64.o: expmod-ppc64.s
mulmod-ppc64.o: mulmod-ppc64.s

clean:
	rm -f *.o sr5sieve.log checkpoint.txt factors*.txt

realclean: clean
	rm -f $(PROGS) version.h $(DISTFILES)
	$(MAKE) -C mingw32 realclean
	$(MAKE) -C linux32 realclean
	$(MAKE) -C linux64 realclean
