1#CC=clang
2HASHDIR = ../src
3UTILS = emit_keys
4PROGS = test1 test2 test3 test4 test5 test6 test7 test8 test9   \
5        test10 test11 test12 test13 test14 test15 test16 test17 \
6        test18 test19 test20 test21 test22 test23 test24 test25 \
7        test26 test27 test28 test29 test30 test31 test32 test33 \
8        test34 test35 test36 test37 test38 test39 test40 test41 \
9        test42 test43 test44 test45 test46 test47 test48 test49 \
10        test50 test51 test52 test53 test54 test55 test56 test57 \
11        test58 test59 test60 test61 test62 test63 test64 test65 \
12        test66 test67 test68 test69 test70 test71 test72 test73 \
13        test74 test75 test76 test77 test78 test79 test80 test81 \
14        test82 test83 test84 test85 test86 test87 test88 test89 \
15        test90 test91 test92 test93
16CFLAGS += -I$(HASHDIR)
17#CFLAGS += -DHASH_BLOOM=16
18#CFLAGS += -O2
19CFLAGS += -g
20#CFLAGS += -Wstrict-aliasing=2
21CFLAGS += -Wall
22#CFLAGS += -Wextra
23#CFLAGS += -std=c89
24CFLAGS += ${EXTRA_CFLAGS}
25
26ifeq ($(HASH_DEBUG),1)
27CFLAGS += -DHASH_DEBUG=1
28endif
29
30ifeq ($(HASH_PEDANTIC),1)
31CFLAGS += -pedantic
32endif
33
34TEST_TARGET=run_tests
35TESTS=./do_tests
36
37# These flags are required in order to build with -DHASH_FUNCTION=HASH_MUR.
38MUR_CFLAGS = -DHASH_USING_NO_STRICT_ALIASING -fno-strict-aliasing
39
40# detect Cygwin
41ifneq ($(strip $(shell $(CC) -v 2>&1 |grep "cygwin")),)
42  TESTS=./do_tests.cygwin
43endif
44
45# detect MinGW
46ifneq ($(strip $(shell $(CC) -v 2>&1 |grep "mingw")),)
47  TEST_TARGET=run_tests_mingw
48  TESTS=./do_tests.mingw
49endif
50
51#detect Linux (platform specific utilities)
52ifneq ($(strip $(shell $(CC) -v 2>&1 |grep "linux")),)
53  PLAT_UTILS = hashscan sleep_test
54endif
55
56#detect FreeBSD (platform specific utilities)
57ifeq ($(strip $(shell uname -s)), FreeBSD)
58  ifeq ($(shell if [ `sysctl -n kern.osreldate` -ge 0801000 ]; then echo "ok"; fi), ok)
59    PLAT_UTILS = hashscan sleep_test
60  endif
61endif
62
63all: $(PROGS) $(UTILS) $(PLAT_UTILS) keystat $(TEST_TARGET)
64
65tests_only: $(PROGS) $(TEST_TARGET)
66
67GITIGN = .gitignore
68MKGITIGN = [ -f "$(GITIGN)" ] || echo "$(GITIGN)" > $(GITIGN); grep -q '^\$@$$' $(GITIGN) || echo "$@" >> $(GITIGN)
69
70debug:
71	$(MAKE) all HASH_DEBUG=1
72
73pedantic:
74	$(MAKE) all HASH_PEDANTIC=1
75
76cplusplus:
77	CC=$(CXX) $(MAKE) all
78
79thorough:
80	$(MAKE) clean && $(MAKE) all EXTRA_CFLAGS='-pedantic'
81	$(MAKE) clean && $(MAKE) all EXTRA_CFLAGS='-pedantic -DHASH_BLOOM=16'
82	$(MAKE) clean && $(MAKE) tests_only EXTRA_CFLAGS='-pedantic -DHASH_BLOOM=16 -DHASH_DEBUG -DNO_DECLTYPE'
83	$(MAKE) clean && $(MAKE) tests_only EXTRA_CFLAGS='-pedantic -DHASH_USING_NO_STRICT_ALIASING -fno-strict-aliasing -DHASH_FUNCTION=HASH_MUR'
84	$(MAKE) clean && CC=$(CXX) $(MAKE) all EXTRA_CFLAGS='-pedantic'
85	$(MAKE) clean && CC=$(CXX) $(MAKE) all EXTRA_CFLAGS='-pedantic -DHASH_BLOOM=16'
86	$(MAKE) clean && CC=$(CXX) $(MAKE) tests_only EXTRA_CFLAGS='-pedantic -DHASH_BLOOM=16 -DHASH_DEBUG -DNO_DECLTYPE'
87	$(MAKE) clean && CC=$(CXX) $(MAKE) tests_only EXTRA_CFLAGS='-pedantic -DHASH_USING_NO_STRICT_ALIASING -fno-strict-aliasing -DHASH_FUNCTION=HASH_MUR'
88
89example: example.c $(HASHDIR)/uthash.h
90	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(@).c
91
92$(PROGS) $(UTILS) : $(HASHDIR)/uthash.h
93	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(@).c
94	@$(MKGITIGN)
95
96hashscan : $(HASHDIR)/uthash.h
97	$(CC) $(CPPFLAGS) $(CFLAGS) $(MUR_CFLAGS) $(LDFLAGS) -o $@ $(@).c
98	@$(MKGITIGN)
99
100sleep_test : $(HASHDIR)/uthash.h
101	$(CC) $(CPPFLAGS) $(CFLAGS) -DHASH_BLOOM=16 $(LDFLAGS) -o $@ $(@).c
102	@$(MKGITIGN)
103
104keystat : $(HASHDIR)/uthash.h
105	$(CC) $(CPPFLAGS) $(CFLAGS) -DHASH_FUNCTION=HASH_BER $(LDFLAGS) -o keystat.BER keystat.c
106	$(CC) $(CPPFLAGS) $(CFLAGS) -DHASH_FUNCTION=HASH_FNV $(LDFLAGS) -o keystat.FNV keystat.c
107	$(CC) $(CPPFLAGS) $(CFLAGS) -DHASH_FUNCTION=HASH_JEN $(LDFLAGS) -o keystat.JEN keystat.c
108	$(CC) $(CPPFLAGS) $(CFLAGS) -DHASH_FUNCTION=HASH_OAT $(LDFLAGS) -o keystat.OAT keystat.c
109	$(CC) $(CPPFLAGS) $(CFLAGS) -DHASH_FUNCTION=HASH_SAX $(LDFLAGS) -o keystat.SAX keystat.c
110	$(CC) $(CPPFLAGS) $(CFLAGS) -DHASH_FUNCTION=HASH_SFH $(LDFLAGS) -o keystat.SFH keystat.c
111	$(CC) $(CPPFLAGS) $(CFLAGS) $(MUR_CFLAGS) -DHASH_FUNCTION=HASH_MUR $(LDFLAGS) -o keystat.MUR keystat.c
112
113run_tests: $(PROGS)
114	perl $(TESTS)
115
116run_tests_mingw: $(PROGS)
117	/bin/bash do_tests.mingw
118
119astyle:
120	astyle -n --style=kr --indent-switches --add-brackets *.c
121
122.PHONY: clean astyle
123
124clean:
125	rm -f $(UTILS) $(PLAT_UTILS) $(PROGS) test*.out keystat.??? example hashscan sleep_test *.exe $(GITIGN)
126	rm -rf *.dSYM
127