Make 'make clean' wipe all object files in src/*/
[libgit2.git] / Makefile
blob7b08db51663cabc4794305fe36fb5e09c575d883
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 ifdef MSVC
22 # avoid the MinGW and Cygwin configuration sections
23 uname_S := Windows
24 endif
26 CFLAGS = -g -O2 -Wall
27 OS = unix
29 EXTRA_SRC =
30 EXTRA_OBJ =
32 AR_OUT=
33 CC_OUT=-o # add a space
35 # Platform specific tweaks
37 ifeq ($(uname_S),Windows)
38 OS=win32
39 RANLIB = echo
40 CC = cl -nologo
41 AR = lib -nologo
42 CFLAGS = -TC -W3 -RTC1 -Zi -DWIN32 -D_DEBUG -D_LIB
43 AR_OUT=-out:
44 CC_OUT=-Fo
45 NO_VISIBILITY=YesPlease
46 endif
48 ifneq (,$(findstring CYGWIN,$(uname_S)))
49 NO_VISIBILITY=YesPlease
50 endif
52 ifneq (,$(findstring MINGW,$(uname_S)))
53 OS=win32
54 NO_VISIBILITY=YesPlease
55 SPARSE_FLAGS=-Wno-one-bit-signed-bitfield
56 endif
58 SRC_C = $(wildcard src/*.c)
59 OS_SRC = $(wildcard src/$(OS)/*.c)
60 SRC_C += $(OS_SRC)
61 OBJS = $(patsubst %.c,%.o,$(SRC_C))
62 HDRS = $(wildcard src/*.h)
63 PUBLIC_HEADERS = $(wildcard src/git/*.h)
64 HDRS += $(PUBLIC_HEADERS)
66 GIT_LIB = libgit2.a
68 TEST_OBJ = $(patsubst %.c,%.o,\
69 $(wildcard tests/t[0-9][0-9][0-9][0-9]-*.c))
70 TEST_EXE = $(patsubst %.o,%.exe,$(TEST_OBJ))
71 TEST_RUN = $(patsubst %.exe,%.run,$(TEST_EXE))
72 TEST_VAL = $(patsubst %.exe,%.val,$(TEST_EXE))
74 ifndef NO_OPENSSL
75 SHA1_HEADER = <openssl/sha.h>
76 else
77 SHA1_HEADER = "sha1/sha1.h"
78 EXTRA_SRC += src/sha1/sha1.c
79 EXTRA_OBJ += src/sha1/sha1.o
80 endif
82 BASIC_CFLAGS := -Isrc -DSHA1_HEADER='$(SHA1_HEADER)'
83 ifndef NO_VISIBILITY
84 BASIC_CFLAGS += -fvisibility=hidden
85 endif
87 ALL_CFLAGS = $(CFLAGS) $(BASIC_CFLAGS)
88 SRC_C += $(EXTRA_SRC)
89 OBJ += $(EXTRA_OBJ)
91 all:: $(GIT_LIB)
93 clean:
94 rm -f $(GIT_LIB)
95 rm -f libgit2.pc
96 rm -f *.pdb
97 rm -f src/*.o src/*/*.o
98 rm -rf apidocs
99 rm -f *~ src/*~ src/git/*~ src/sha1/*~ src/unix/*~ src/win32/*~
100 @$(MAKE) -C tests -s --no-print-directory clean
101 @$(MAKE) -s --no-print-directory cov-clean
103 test-clean:
104 @$(MAKE) -C tests -s --no-print-directory clean
106 apidocs:
107 $(DOXYGEN) api.doxygen
108 cp CONVENTIONS apidocs/
110 test: $(GIT_LIB)
111 @$(MAKE) -C tests --no-print-directory test
113 valgrind: $(GIT_LIB)
114 @$(MAKE) -C tests --no-print-directory valgrind
116 sparse:
117 cgcc -no-compile $(ALL_CFLAGS) $(SPARSE_FLAGS) $(SRC_C)
119 install-headers: $(PUBLIC_HEADERS)
120 @$(INSTALL) -d /tmp/gitinc/git
121 @for i in $^; do cat .HEADER $$i > /tmp/gitinc/$${i##src/}; done
123 install: $(GIT_LIB) $(PUBLIC_HEADERS) libgit2.pc
124 @$(INSTALL) -d $(DESTDIR)/$(prefix)/include/git
125 @for i in $(PUBLIC_HEADERS); do \
126 cat .HEADER $$i > $(DESTDIR)/$(prefix)/include/$${i##src/}; \
127 done
128 @$(INSTALL) -d $(DESTDIR)/$(libdir)
129 @$(INSTALL) $(GIT_LIB) $(DESTDIR)/$(libdir)/libgit2.a
130 @$(INSTALL) -d $(DESTDIR)/$(libdir)/pkgconfig
131 @$(INSTALL) libgit2.pc $(DESTDIR)/$(libdir)/pkgconfig/libgit2.pc
133 uninstall:
134 @rm -f $(DESTDIR)/$(libdir)/libgit2.a
135 @rm -f $(DESTDIR)/$(libdir)/pkgconfig/libgit2.pc
136 @for i in $(PUBLIC_HEADERS); do \
137 rm -f $(DESTDIR)/$(prefix)/include/$${i##src/}; \
138 done
139 @rmdir $(DESTDIR)/$(prefix)/include/git
141 .c.o:
142 $(CC) $(ALL_CFLAGS) -c $< $(CC_OUT)$@
144 $(OBJS): $(HDRS)
145 $(GIT_LIB): $(OBJS)
146 rm -f $(GIT_LIB)
147 $(AR) $(AR_OUT)$(GIT_LIB) $(OBJS)
148 $(RANLIB) $(GIT_LIB)
150 $(TEST_OBJ) $(TEST_EXE) $(TEST_RUN) $(TEST_VAL): $(GIT_LIB)
151 @$(MAKE) -C tests --no-print-directory \
152 OS=$(OS) NO_OPENSSL=$(NO_OPENSSL) $(@F)
154 libgit2.pc: libgit2.pc.in
155 sed -e 's#@prefix@#$(prefix)#' -e 's#@libdir@#$(libdir)#' $< > $@
157 .PHONY: all
158 .PHONY: clean
159 .PHONY: test $(TEST_VAL) $(TEST_RUN) $(TEST_EXE) $(TEST_OBJ)
160 .PHONY: apidocs
161 .PHONY: install-headers
162 .PHONY: install uninstall
163 .PHONY: sparse
165 ### Test suite coverage testing
167 .PHONY: coverage cov-clean cov-build cov-report
169 COV_GCDA = $(patsubst %.c,%.gcda,$(SRC_C))
170 COV_GCNO = $(patsubst %.c,%.gcno,$(SRC_C))
172 coverage:
173 @$(MAKE) -s --no-print-directory clean
174 @$(MAKE) --no-print-directory cov-build
175 @$(MAKE) --no-print-directory cov-report
177 cov-clean:
178 rm -f $(COV_GCDA) $(COV_GCNO) *.gcov untested
180 COV_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
182 cov-build:
183 $(MAKE) CFLAGS="$(COV_CFLAGS)" all
184 $(MAKE) TEST_COVERAGE=1 NO_OPENSSL=$(NO_OPENSSL) test
186 cov-report:
187 @echo "--- untested files:" | tee untested
188 @{ for f in $(SRC_C); do \
189 gcda=$$(dirname $$f)"/"$$(basename $$f .c)".gcda"; \
190 if test -f $$gcda; then \
191 gcov -b -p -o $$(dirname $$f) $$f >/dev/null; \
192 else \
193 echo $$f | tee -a untested; \
194 fi; \
195 done; }
196 @rm -f *.h.gcov
197 @echo "--- untested functions:" | tee -a untested
198 @grep '^function .* called 0' *.c.gcov \
199 | sed -e 's/\([^:]*\)\.gcov:function \([^ ]*\) called.*/\1: \2/' \
200 | sed -e 's|#|/|g' | tee -a untested