Makefile 4.95 KB
Newer Older
1 2
all::

3 4
# Define NO_VISIBILITY if your compiler does not support symbol
# visibility in general (and the -fvisibility switch in particular).
5
#
6 7 8 9 10 11
# Define OPENSSL_SHA1 if you want use the SHA1 routines from the
# OpenSSL crypto library, rather than the built-in C versions.
#
# Define PPC_SHA1 if you want to use the bundled SHA1 routines that
# are optimized for PowerPC, rather than the built-in C versions.
#
12

13
DOXYGEN = doxygen
14
INSTALL = install
15
RANLIB  = ranlib
16
AR      = ar cr
17

18
prefix=/usr/local
19
libdir=$(prefix)/lib
20

21 22
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo no')

23 24 25 26 27
ifdef MSVC
	# avoid the MinGW and Cygwin configuration sections
	uname_S := Windows
endif

28
CFLAGS = -g -O2 -Wall -Wextra
29
OS     = unix
30

31 32
EXTRA_SRC =
EXTRA_OBJ =
33
EXTRA_CFLAGS =
34

35 36 37
AR_OUT=
CC_OUT=-o # add a space

38 39
# Platform specific tweaks

40 41 42 43 44
ifeq ($(uname_S),Windows)
	OS=win32
	RANLIB = echo
	CC = cl -nologo
	AR = lib -nologo
45
	CFLAGS = -TC -W4 -RTC1 -Zi -DWIN32 -D_DEBUG -D_LIB
46 47 48 49 50
	AR_OUT=-out:
	CC_OUT=-Fo
	NO_VISIBILITY=YesPlease
endif

51 52 53 54
ifneq (,$(findstring CYGWIN,$(uname_S)))
	NO_VISIBILITY=YesPlease
endif

55 56 57 58 59 60
ifneq (,$(findstring MINGW,$(uname_S)))
	OS=win32
	NO_VISIBILITY=YesPlease
	SPARSE_FLAGS=-Wno-one-bit-signed-bitfield
endif

61 62
-include config.mak

63
SRC_C = $(wildcard src/*.c)
64
OS_SRC = $(wildcard src/$(OS)/*.c)
65
SRC_C += $(OS_SRC) $(EXTRA_SRC)
66
OBJS = $(patsubst %.c,%.o,$(SRC_C)) $(EXTRA_OBJ)
67 68 69
HDRS = $(wildcard src/*.h)
PUBLIC_HEADERS = $(wildcard src/git/*.h)
HDRS += $(PUBLIC_HEADERS)
70

71
GIT_LIB = libgit2.a
72

73 74 75 76
TEST_OBJ = $(patsubst %.c,%.o,\
           $(wildcard tests/t[0-9][0-9][0-9][0-9]-*.c))
TEST_EXE = $(patsubst %.o,%.exe,$(TEST_OBJ))
TEST_RUN = $(patsubst %.exe,%.run,$(TEST_EXE))
77
TEST_VAL = $(patsubst %.exe,%.val,$(TEST_EXE))
78

79
ifdef PPC_SHA1
80 81
	EXTRA_SRC += src/ppc/sha1.c
	EXTRA_OBJ += src/ppc/sha1ppc.o
82
	EXTRA_CFLAGS += -DPPC_SHA1
83
else
84 85 86
ifdef OPENSSL_SHA1
	EXTRA_CFLAGS += -DOPENSSL_SHA1
else
87
	EXTRA_SRC += src/block-sha1/sha1.c
88
endif
89
endif
90

91
BASIC_CFLAGS := -Isrc
92 93 94 95
ifndef NO_VISIBILITY
BASIC_CFLAGS += -fvisibility=hidden
endif

96
ALL_CFLAGS = $(CFLAGS) $(BASIC_CFLAGS) $(EXTRA_CFLAGS)
97

98
all:: $(GIT_LIB)
99 100

clean:
101
	rm -f $(GIT_LIB)
102
	rm -f libgit2.pc
103
	rm -f *.pdb
104
	rm -f src/*.[oi] src/*/*.[oi]
105
	rm -rf apidocs
106
	rm -f *~ src/*~ src/*/*~
107
	@$(MAKE) -C tests -s --no-print-directory clean
108
	@$(MAKE) -s --no-print-directory cov-clean
109 110 111

test-clean:
	@$(MAKE) -C tests -s --no-print-directory clean
112 113 114

apidocs:
	$(DOXYGEN) api.doxygen
115
	cp CONVENTIONS apidocs/
116

117 118
test: $(GIT_LIB)
	@$(MAKE) -C tests --no-print-directory test
119

120 121 122
valgrind: $(GIT_LIB)
	@$(MAKE) -C tests --no-print-directory valgrind

123
sparse:
124
	cgcc -no-compile $(ALL_CFLAGS) $(SPARSE_FLAGS) $(SRC_C)
125

126
install-headers: $(PUBLIC_HEADERS)
127
	@$(INSTALL) -d /tmp/gitinc/git
128
	@for i in $^; do cat .HEADER $$i > /tmp/gitinc/$${i##src/}; done
129

130
install: $(GIT_LIB) $(PUBLIC_HEADERS) libgit2.pc
131
	@$(INSTALL) -d $(DESTDIR)/$(prefix)/include/git
132
	@for i in $(PUBLIC_HEADERS); do \
Ingmar Vanhassel committed
133
		cat .HEADER $$i > $(DESTDIR)/$(prefix)/include/$${i##src/}; \
134
	done
135 136 137 138
	@$(INSTALL) -d $(DESTDIR)/$(libdir)
	@$(INSTALL) $(GIT_LIB) $(DESTDIR)/$(libdir)/libgit2.a
	@$(INSTALL) -d $(DESTDIR)/$(libdir)/pkgconfig
	@$(INSTALL) libgit2.pc $(DESTDIR)/$(libdir)/pkgconfig/libgit2.pc
139 140

uninstall:
141 142
	@rm -f $(DESTDIR)/$(libdir)/libgit2.a
	@rm -f $(DESTDIR)/$(libdir)/pkgconfig/libgit2.pc
143
	@for i in $(PUBLIC_HEADERS); do \
Ingmar Vanhassel committed
144
		rm -f $(DESTDIR)/$(prefix)/include/$${i##src/}; \
145
	done
Ingmar Vanhassel committed
146
	@rmdir $(DESTDIR)/$(prefix)/include/git
147

148
.c.o:
149
	$(CC) $(ALL_CFLAGS) -c $< $(CC_OUT)$@
150

151 152 153
.S.o:
	$(CC) $(ALL_CFLAGS) -c $< $(CC_OUT)$@

154 155 156
%.i: %.c FORCE
	$(CC) $(ALL_CFLAGS) -E $< >$*.i

157
$(OBJS): $(HDRS)
158
$(GIT_LIB): $(OBJS)
159
	rm -f $(GIT_LIB)
160
	$(AR) $(AR_OUT)$(GIT_LIB) $(OBJS)
161
	$(RANLIB) $(GIT_LIB)
162

163
$(TEST_OBJ) $(TEST_EXE) $(TEST_RUN) $(TEST_VAL): $(GIT_LIB)
164
	@$(MAKE) -C tests --no-print-directory \
165
		OS=$(OS) $(@F)
166

167
libgit2.pc: libgit2.pc.in
168
	sed -e 's#@prefix@#$(prefix)#' -e 's#@libdir@#$(libdir)#' $< > $@
169

170 171
.PHONY: all
.PHONY: clean
172
.PHONY: test $(TEST_VAL) $(TEST_RUN) $(TEST_EXE) $(TEST_OBJ)
173
.PHONY: apidocs
174
.PHONY: install-headers
175
.PHONY: install uninstall
176
.PHONY: sparse
177
.PHONY: FORCE
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

### Test suite coverage testing
#
.PHONY: coverage cov-clean cov-build cov-report

COV_GCDA = $(patsubst %.c,%.gcda,$(SRC_C))
COV_GCNO = $(patsubst %.c,%.gcno,$(SRC_C))

coverage:
	@$(MAKE) -s --no-print-directory clean
	@$(MAKE) --no-print-directory cov-build
	@$(MAKE) --no-print-directory cov-report

cov-clean:
	rm -f $(COV_GCDA) $(COV_GCNO) *.gcov untested

COV_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs

cov-build:
	$(MAKE) CFLAGS="$(COV_CFLAGS)" all
198
	$(MAKE) TEST_COVERAGE=1 test
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215

cov-report:
	@echo "--- untested files:" | tee untested
	@{ for f in $(SRC_C); do \
		gcda=$$(dirname $$f)"/"$$(basename $$f .c)".gcda"; \
		if test -f $$gcda; then \
			gcov -b -p -o $$(dirname $$f) $$f >/dev/null; \
		else \
			echo $$f | tee -a untested; \
		fi; \
	   done; }
	@rm -f *.h.gcov
	@echo "--- untested functions:" | tee -a untested
	@grep '^function .* called 0' *.c.gcov \
	| sed -e 's/\([^:]*\)\.gcov:function \([^ ]*\) called.*/\1: \2/' \
	| sed -e 's|#|/|g' | tee -a untested