Fix some "signed v unsigned comparison" warnings with -Wextra
[libgit2/raj.git] / Makefile
blobbd0d32c74ae66ddafc9c875b391717e1bdfd6f8c
1 all::
3 # Define NO_VISIBILITY if your compiler does not support symbol
4 # visibility in general (and the -fvisibility switch in particular).
6 # Define NO_OPENSSL if you do not have OpenSSL, or if you simply want
7 # to use the bundled (Mozilla) SHA1 routines. (The bundled SHA1
8 # routines are reported to be faster than OpenSSL on some platforms)
11 DOXYGEN = doxygen
12 INSTALL = install
13 RANLIB = ranlib
14 AR = ar cr
16 prefix=/usr/local
17 libdir=$(prefix)/lib
19 uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo no')
21 CFLAGS = -g -O2 -Wall
22 OS = unix
24 EXTRA_SRC =
25 EXTRA_OBJ =
27 # Platform specific tweaks
29 ifneq (,$(findstring CYGWIN,$(uname_S)))
30 NO_VISIBILITY=YesPlease
31 endif
33 ifneq (,$(findstring MINGW,$(uname_S)))
34 OS=win32
35 NO_VISIBILITY=YesPlease
36 SPARSE_FLAGS=-Wno-one-bit-signed-bitfield
37 endif
39 SRC_C = $(wildcard src/*.c)
40 OS_SRC = $(wildcard src/$(OS)/*.c)
41 SRC_C += $(OS_SRC)
42 OBJS = $(patsubst %.c,%.o,$(SRC_C))
43 HDRS = $(wildcard src/*.h)
44 PUBLIC_HEADERS = $(wildcard src/git/*.h)
45 HDRS += $(PUBLIC_HEADERS)
47 GIT_LIB = libgit2.a
49 TEST_OBJ = $(patsubst %.c,%.o,\
50 $(wildcard tests/t[0-9][0-9][0-9][0-9]-*.c))
51 TEST_EXE = $(patsubst %.o,%.exe,$(TEST_OBJ))
52 TEST_RUN = $(patsubst %.exe,%.run,$(TEST_EXE))
53 TEST_VAL = $(patsubst %.exe,%.val,$(TEST_EXE))
55 ifndef NO_OPENSSL
56 SHA1_HEADER = <openssl/sha.h>
57 else
58 SHA1_HEADER = "sha1/sha1.h"
59 EXTRA_SRC += src/sha1/sha1.c
60 EXTRA_OBJ += src/sha1/sha1.o
61 endif
63 BASIC_CFLAGS := -Isrc -DSHA1_HEADER='$(SHA1_HEADER)'
64 ifndef NO_VISIBILITY
65 BASIC_CFLAGS += -fvisibility=hidden
66 endif
68 ALL_CFLAGS = $(CFLAGS) $(BASIC_CFLAGS)
69 SRC_C += $(EXTRA_SRC)
70 OBJ += $(EXTRA_OBJ)
72 all:: $(GIT_LIB)
74 clean:
75 rm -f $(GIT_LIB)
76 rm -f libgit2.pc
77 rm -f src/*.o src/sha1/*.o src/unix/*.o src/win32/*.o
78 rm -rf apidocs
79 rm -f *~ src/*~ src/git/*~ src/sha1/*~ src/unix/*~ src/win32/*~
80 @$(MAKE) -C tests -s --no-print-directory clean
81 @$(MAKE) -s --no-print-directory cov-clean
83 test-clean:
84 @$(MAKE) -C tests -s --no-print-directory clean
86 apidocs:
87 $(DOXYGEN) api.doxygen
88 cp CONVENTIONS apidocs/
90 test: $(GIT_LIB)
91 @$(MAKE) -C tests --no-print-directory test
93 valgrind: $(GIT_LIB)
94 @$(MAKE) -C tests --no-print-directory valgrind
96 sparse:
97 cgcc -no-compile $(ALL_CFLAGS) $(SPARSE_FLAGS) $(SRC_C)
99 install-headers: $(PUBLIC_HEADERS)
100 @$(INSTALL) -d /tmp/gitinc/git
101 @for i in $^; do cat .HEADER $$i > /tmp/gitinc/$${i##src/}; done
103 install: $(GIT_LIB) $(PUBLIC_HEADERS) libgit2.pc
104 @$(INSTALL) -d $(DESTDIR)/$(prefix)/include/git
105 @for i in $(PUBLIC_HEADERS); do \
106 cat .HEADER $$i > $(DESTDIR)/$(prefix)/include/$${i##src/}; \
107 done
108 @$(INSTALL) -d $(DESTDIR)/$(libdir)
109 @$(INSTALL) $(GIT_LIB) $(DESTDIR)/$(libdir)/libgit2.a
110 @$(INSTALL) -d $(DESTDIR)/$(libdir)/pkgconfig
111 @$(INSTALL) libgit2.pc $(DESTDIR)/$(libdir)/pkgconfig/libgit2.pc
113 uninstall:
114 @rm -f $(DESTDIR)/$(libdir)/libgit2.a
115 @rm -f $(DESTDIR)/$(libdir)/pkgconfig/libgit2.pc
116 @for i in $(PUBLIC_HEADERS); do \
117 rm -f $(DESTDIR)/$(prefix)/include/$${i##src/}; \
118 done
119 @rmdir $(DESTDIR)/$(prefix)/include/git
121 .c.o:
122 $(CC) $(ALL_CFLAGS) -c $< -o $@
124 $(OBJS): $(HDRS)
125 $(GIT_LIB): $(OBJS)
126 rm -f $(GIT_LIB)
127 $(AR) $(GIT_LIB) $(OBJS)
128 $(RANLIB) $(GIT_LIB)
130 $(TEST_OBJ) $(TEST_EXE) $(TEST_RUN) $(TEST_VAL): $(GIT_LIB)
131 @$(MAKE) -C tests --no-print-directory \
132 OS=$(OS) NO_OPENSSL=$(NO_OPENSSL) $(@F)
134 libgit2.pc: libgit2.pc.in
135 sed -e 's#@prefix@#$(prefix)#' -e 's#@libdir@#$(libdir)#' $< > $@
137 .PHONY: all
138 .PHONY: clean
139 .PHONY: test $(TEST_VAL) $(TEST_RUN) $(TEST_EXE) $(TEST_OBJ)
140 .PHONY: apidocs
141 .PHONY: install-headers
142 .PHONY: install uninstall
143 .PHONY: sparse
145 ### Test suite coverage testing
147 .PHONY: coverage cov-clean cov-build cov-report
149 COV_GCDA = $(patsubst %.c,%.gcda,$(SRC_C))
150 COV_GCNO = $(patsubst %.c,%.gcno,$(SRC_C))
152 coverage:
153 @$(MAKE) -s --no-print-directory clean
154 @$(MAKE) --no-print-directory cov-build
155 @$(MAKE) --no-print-directory cov-report
157 cov-clean:
158 rm -f $(COV_GCDA) $(COV_GCNO) *.gcov untested
160 COV_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
162 cov-build:
163 $(MAKE) CFLAGS="$(COV_CFLAGS)" all
164 $(MAKE) TEST_COVERAGE=1 NO_OPENSSL=$(NO_OPENSSL) test
166 cov-report:
167 @echo "--- untested files:" | tee untested
168 @{ for f in $(SRC_C); do \
169 gcda=$$(dirname $$f)"/"$$(basename $$f .c)".gcda"; \
170 if test -f $$gcda; then \
171 gcov -b -p -o $$(dirname $$f) $$f >/dev/null; \
172 else \
173 echo $$f | tee -a untested; \
174 fi; \
175 done; }
176 @rm -f *.h.gcov
177 @echo "--- untested functions:" | tee -a untested
178 @grep '^function .* called 0' *.c.gcov \
179 | sed -e 's/\([^:]*\)\.gcov:function \([^ ]*\) called.*/\1: \2/' \
180 | sed -e 's|#|/|g' | tee -a untested