VERSION := 0.2.13
PROJNAME := pbc
# these (uppercase) variables apply to gmake-builtin rules
CC:=gcc
#CPPFLAGS := -I/usr/local/include
CPPFLAGS := -Iinclude
warnflags := -Wall -W -Wfloat-equal -Wendif-labels -Wshadow \
	     -Wpointer-arith -Wcast-align -Wstrict-prototypes \
             -Wredundant-decls #-std=c99 -pedantic
CFLAGS := -O3 -g $(warnflags) -pipe -ffast-math -fomit-frame-pointer
#LDFLAGS := -L/usr/local/lib
LDFLAGS := -L.
LDLIBS := -lgmp -lm

ALLFILES := *.[ch] include/*.h sig/*.[ch] test/*.[ch] bce/*.[ch] \
	Makefile \
	CREDITS NEWS COPYING README INSTALL manual.txt \
	*.param report_times

# source file list.
# add a new .c file to exactly one of these ...
libpbc_srcs := field.c naivefp.c curve.c fieldquadratic.c poly.c \
               darray.c symtab.c \
	       mnt.c mpc.c hilbert.c \
	       pairing.c parse.c param.c get_time.c random.c \
	       bgn_param.c a_param.c c_param.c e_param.c f_param.c
libsig_srcs := hash.c sig/sig.c		# eventually also bbs.c ...
test_srcs := test/testbls.c test/testbb.c test/testsig.c test/testbbs.c \
	     test/testibs.c \
	     bce/testbce.c \
	     test/testibe.c \
	     test/testhilbert.c test/listmnt.c test/testmnt.c \
             test/testpairing.c test/testpoly.c \
	     test/benchmark.c \
	     test/19.c

srcs := $(libpbc_srcs) $(libsig_srcs) $(test_srcs)
libpbc_objs := $(libpbc_srcs:.c=.o)
libsig_objs := $(libsig_srcs:.c=.o)
objs := $(srcs:.c=.o)

libs := libpbc.a libsig.a
binaries := $(test_srcs:.c=)

.PHONY: target dist clean spotless depend

target: $(libs) $(binaries)

# file dependencies for library-making
# see GNU Make manual, sect. 11.2 for explanation
libpbc.a: libpbc.a($(libpbc_objs))
	ranlib $@
libsig.a: libsig.a($(libsig_objs))
	ranlib $@

# the test binaries.  when adding a new test binary, add a line here
# to specify its dependencies
test/benchmark: test/benchmark.o libpbc.a
test/testhilbert: test/testhilbert.o libpbc.a
bce/testbce: bce/testbce.o bce/bce.o libpbc.a
test/testbbs: test/testbbs.o libpbc.a
test/testbls: test/testbls.o libsig.a libpbc.a
test/testibs: test/testibs.o libsig.a libpbc.a
test/testbb: test/testbb.o libsig.a libpbc.a
test/testsig: test/testsig.o libpbc.a
test/testibe: test/testibe.o libpbc.a
test/testpairing: test/testpairing.o libpbc.a
test/testmnt: test/testmnt.o libpbc.a
test/listmnt: test/listmnt.o libpbc.a
test/testpoly: test/testpoly.o libpbc.a
test/19: test/19.o libpbc.a

DISTNAME := $(PROJNAME)-$(VERSION)

dist: $(ALLFILES) clean depend
	-rm -rf $(DISTNAME)
	mkdir $(DISTNAME)
	cp -rl --parents $(ALLFILES) $(DISTNAME)
	tar chfz $(DISTNAME).tgz $(DISTNAME)
	-rm -rf $(DISTNAME)

clean:
	-rm -f $(binaries) $(libs) $(objs)

spotless: clean
	-rm -f Makefile.bak *~ core

depend:
	makedepend -Iinclude -Y -- $(CFLAGS) -- $(srcs) 2> /dev/null

# DO NOT DELETE

field.o: include/field.h include/random.h
naivefp.o: include/field.h include/random.h
curve.o: include/curve.h include/poly.h include/field.h include/random.h
curve.o: include/darray.h include/parse.h
fieldquadratic.o: include/fieldquadratic.h include/field.h include/random.h
poly.o: include/poly.h include/field.h include/random.h include/darray.h
darray.o: include/noleak.h include/darray.h
symtab.o: include/symtab.h include/darray.h
mnt.o: include/mnt.h include/darray.h include/curve.h include/poly.h
mnt.o: include/field.h include/random.h
mpc.o: include/darray.h include/mpc.h
hilbert.o: include/hilbert.h include/poly.h include/field.h include/random.h
hilbert.o: include/darray.h include/mpc.h
pairing.o: include/pairing.h include/curve.h include/poly.h include/field.h
pairing.o: include/random.h include/darray.h include/a_param.h
pairing.o: include/fieldquadratic.h include/c_param.h include/mnt.h
pairing.o: include/e_param.h include/f_param.h include/bgn_param.h
pairing.o: include/parse.h
parse.o: include/parse.h
param.o: include/param.h include/symtab.h include/darray.h include/parse.h
get_time.o: include/get_time.h
random.o: include/random.h
bgn_param.o: include/bgn_param.h include/fieldquadratic.h include/field.h
bgn_param.o: include/random.h include/pairing.h include/curve.h
bgn_param.o: include/poly.h include/darray.h include/param.h include/symtab.h
a_param.o: include/a_param.h include/fieldquadratic.h include/field.h
a_param.o: include/random.h include/pairing.h include/curve.h include/poly.h
a_param.o: include/darray.h include/param.h include/symtab.h
c_param.o: include/poly.h include/field.h include/random.h include/darray.h
c_param.o: include/fieldquadratic.h include/hilbert.h include/c_param.h
c_param.o: include/pairing.h include/curve.h include/mnt.h include/param.h
c_param.o: include/symtab.h
e_param.o: include/e_param.h include/pairing.h include/curve.h include/poly.h
e_param.o: include/field.h include/random.h include/darray.h include/param.h
e_param.o: include/symtab.h
f_param.o: include/pbc.h include/pairing.h include/curve.h include/poly.h
f_param.o: include/field.h include/random.h include/darray.h include/mnt.h
f_param.o: include/param.h include/symtab.h include/f_param.h
f_param.o: include/fieldquadratic.h
hash.o: include/hash.h
sig/sig.o: include/sig.h include/pbc.h include/pairing.h include/curve.h
sig/sig.o: include/poly.h include/field.h include/random.h include/darray.h
sig/sig.o: include/mnt.h include/hash.h
test/testbls.o: include/sig.h include/pbc.h include/pairing.h include/curve.h
test/testbls.o: include/poly.h include/field.h include/random.h
test/testbls.o: include/darray.h include/mnt.h
test/testbb.o: include/sig.h include/pbc.h include/pairing.h include/curve.h
test/testbb.o: include/poly.h include/field.h include/random.h
test/testbb.o: include/darray.h include/mnt.h
test/testsig.o: include/pbc.h include/pairing.h include/curve.h
test/testsig.o: include/poly.h include/field.h include/random.h
test/testsig.o: include/darray.h include/mnt.h
test/testbbs.o: include/pbc.h include/pairing.h include/curve.h
test/testbbs.o: include/poly.h include/field.h include/random.h
test/testbbs.o: include/darray.h include/mnt.h include/get_time.h
test/testibs.o: include/sig.h include/pbc.h include/pairing.h include/curve.h
test/testibs.o: include/poly.h include/field.h include/random.h
test/testibs.o: include/darray.h include/mnt.h
bce/testbce.o: include/pbc.h include/pairing.h include/curve.h include/poly.h
bce/testbce.o: include/field.h include/random.h include/darray.h
bce/testbce.o: include/mnt.h bce/bce.h
test/testibe.o: include/pbc.h include/pairing.h include/curve.h
test/testibe.o: include/poly.h include/field.h include/random.h
test/testibe.o: include/darray.h include/mnt.h
test/testhilbert.o: include/hilbert.h include/poly.h include/field.h
test/testhilbert.o: include/random.h include/darray.h
test/listmnt.o: include/pbc.h include/pairing.h include/curve.h
test/listmnt.o: include/poly.h include/field.h include/random.h
test/listmnt.o: include/darray.h include/mnt.h
test/testmnt.o: include/pbc.h include/pairing.h include/curve.h
test/testmnt.o: include/poly.h include/field.h include/random.h
test/testmnt.o: include/darray.h include/mnt.h include/c_param.h
test/testpairing.o: include/pbc.h include/pairing.h include/curve.h
test/testpairing.o: include/poly.h include/field.h include/random.h
test/testpairing.o: include/darray.h include/mnt.h
test/testpoly.o: include/pbc.h include/pairing.h include/curve.h
test/testpoly.o: include/poly.h include/field.h include/random.h
test/testpoly.o: include/darray.h include/mnt.h
test/benchmark.o: include/pbc.h include/pairing.h include/curve.h
test/benchmark.o: include/poly.h include/field.h include/random.h
test/benchmark.o: include/darray.h include/mnt.h include/get_time.h
test/19.o: include/pbc.h include/pairing.h include/curve.h include/poly.h
test/19.o: include/field.h include/random.h include/darray.h include/mnt.h
