xref: /redis-3.2.3/src/Makefile (revision 6b5daa2d)
1e2641e09Santirez# Redis Makefile
2e2641e09Santirez# Copyright (C) 2009 Salvatore Sanfilippo <antirez at gmail dot com>
3e2641e09Santirez# This file is released under the BSD license, see the COPYING file
49c83aec9Santirez#
5631539a5SPieter Noordhuis# The Makefile composes the final FINAL_CFLAGS and FINAL_LDFLAGS using
69c83aec9Santirez# what is needed for Redis plus the standard CFLAGS and LDFLAGS passed.
79c83aec9Santirez# However when building the dependencies (Jemalloc, Lua, Hiredis, ...)
89c83aec9Santirez# CFLAGS and LDFLAGS are propagated to the dependencies, so to pass
9631539a5SPieter Noordhuis# flags only to be used when compiling / linking Redis itself REDIS_CFLAGS
10631539a5SPieter Noordhuis# and REDIS_LDFLAGS are used instead (this is the case of 'make gcov').
119c83aec9Santirez#
129c83aec9Santirez# Dependencies are stored in the Makefile.dep file. To rebuild this file
139c83aec9Santirez# Just use 'make dep', but this is only needed by developers.
14e2641e09Santirez
15e2641e09Santirezrelease_hdr := $(shell sh -c './mkreleasehdr.sh')
16e2641e09Santirezuname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
17e2641e09SantirezOPTIMIZATION?=-O2
184b8a6394SPieter NoordhuisDEPENDENCY_TARGETS=hiredis linenoise lua
19b83e9583SBen Noordhuis
20caba5851SPieter Noordhuis# Default settings
210a08d2b0SPieter NoordhuisSTD= -std=c99 -pedantic
220a08d2b0SPieter NoordhuisWARN= -Wall
230a08d2b0SPieter NoordhuisOPT= $(OPTIMIZATION)
240a08d2b0SPieter Noordhuis
255bb2c88eSPieter Noordhuis# Default allocator
265bb2c88eSPieter Noordhuisifeq ($(uname_S),Linux)
27c04278baSPieter Noordhuis  MALLOC=jemalloc
285bb2c88eSPieter Noordhuiselse
29c04278baSPieter Noordhuis  MALLOC=libc
305bb2c88eSPieter Noordhuisendif
315bb2c88eSPieter Noordhuis
325bb2c88eSPieter Noordhuis# Backwards compatibility for selecting an allocator
330a802bd7Santirezifeq ($(USE_TCMALLOC),yes)
345bb2c88eSPieter Noordhuis  MALLOC=tcmalloc
355bb2c88eSPieter Noordhuisendif
365bb2c88eSPieter Noordhuis
375bb2c88eSPieter Noordhuisifeq ($(USE_TCMALLOC_MINIMAL),yes)
385bb2c88eSPieter Noordhuis  MALLOC=tcmalloc_minimal
395bb2c88eSPieter Noordhuisendif
405bb2c88eSPieter Noordhuis
415bb2c88eSPieter Noordhuisifeq ($(USE_JEMALLOC),yes)
425bb2c88eSPieter Noordhuis  MALLOC=jemalloc
435bb2c88eSPieter Noordhuisendif
445bb2c88eSPieter Noordhuis
457e7b69feSPieter Noordhuis# Override default settings if possible
467e7b69feSPieter Noordhuis-include .make-settings
477e7b69feSPieter Noordhuis
48caba5851SPieter Noordhuisifeq ($(uname_S),SunOS)
49caba5851SPieter Noordhuis  FINAL_CFLAGS= $(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS) -D__EXTENSIONS__ -D_XPG6
50a3eb7ac8Santirez  FINAL_LDFLAGS= $(LDFLAGS) $(REDIS_LDFLAGS) -g -ggdb
51620357fcSPieter Noordhuis  FINAL_LIBS= -ldl -lnsl -lsocket -lm -lpthread
52caba5851SPieter Noordhuis  DEBUG= -g -ggdb
53caba5851SPieter Noordhuiselse
54caba5851SPieter Noordhuis  FINAL_CFLAGS= $(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS)
55a3eb7ac8Santirez  FINAL_LDFLAGS= $(LDFLAGS) $(REDIS_LDFLAGS) -g -rdynamic -ggdb
56620357fcSPieter Noordhuis  FINAL_LIBS= -lm -pthread
57caba5851SPieter Noordhuis  DEBUG= -g -rdynamic -ggdb
58caba5851SPieter Noordhuisendif
59caba5851SPieter Noordhuis
60caba5851SPieter Noordhuis# Include paths to dependencies
61caba5851SPieter NoordhuisFINAL_CFLAGS+= -I../deps/hiredis -I../deps/linenoise -I../deps/lua/src
62caba5851SPieter Noordhuis
635bb2c88eSPieter Noordhuisifeq ($(MALLOC),tcmalloc)
64631539a5SPieter Noordhuis  FINAL_CFLAGS+= -DUSE_TCMALLOC
65631539a5SPieter Noordhuis  FINAL_LIBS+= -ltcmalloc
660a802bd7Santirezendif
6752825621SPieter Noordhuis
685bb2c88eSPieter Noordhuisifeq ($(MALLOC),tcmalloc_minimal)
69631539a5SPieter Noordhuis  FINAL_CFLAGS+= -DUSE_TCMALLOC
70631539a5SPieter Noordhuis  FINAL_LIBS+= -ltcmalloc_minimal
7152825621SPieter Noordhuisendif
7252825621SPieter Noordhuis
735bb2c88eSPieter Noordhuisifeq ($(MALLOC),jemalloc)
744b8a6394SPieter Noordhuis  DEPENDENCY_TARGETS+= jemalloc
75631539a5SPieter Noordhuis  FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include
76631539a5SPieter Noordhuis  FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a -ldl
7752825621SPieter Noordhuisendif
7852825621SPieter Noordhuis
79631539a5SPieter NoordhuisREDIS_CC=$(QUIET_CC)$(CC) $(FINAL_CFLAGS)
80631539a5SPieter NoordhuisREDIS_LD=$(QUIET_LINK)$(CC) $(FINAL_LDFLAGS)
81*6b5daa2dSantirezREDIS_INSTALL=$(QUIET_INSTALL)$(INSTALL)
82e2641e09Santirez
838c630146SantirezPREFIX?=/usr/local
840997b411SPedro MeloINSTALL_BIN= $(PREFIX)/bin
85120a36f2SantirezINSTALL= cp -pf
86acc01854Santirez
8735845afbSantirezCCCOLOR="\033[34m"
8835845afbSantirezLINKCOLOR="\033[34;1m"
8935845afbSantirezSRCCOLOR="\033[33m"
9035845afbSantirezBINCOLOR="\033[37;1m"
9135845afbSantirezMAKECOLOR="\033[32;1m"
9235845afbSantirezENDCOLOR="\033[0m"
9335845afbSantirez
9473e71867Santirezifndef V
950a08d2b0SPieter NoordhuisQUIET_CC = @printf '    %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(SRCCOLOR)$@$(ENDCOLOR) 1>&2;
960a08d2b0SPieter NoordhuisQUIET_LINK = @printf '    %b %b\n' $(LINKCOLOR)LINK$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2;
97*6b5daa2dSantirezQUIET_INSTALL = @printf '    %b %b\n' $(LINKCOLOR)INSTALL$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2;
9873e71867Santirezendif
9973e71867Santirez
100c18405c9SantirezREDIS_SERVER_NAME= redis-server
101*6b5daa2dSantirezREDIS_SENTINEL_NAME= redis-sentinel
102*6b5daa2dSantirezREDIS_SERVER_OBJ= adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o
1039c83aec9SantirezREDIS_CLI_NAME= redis-cli
104088c508aSantirezREDIS_CLI_OBJ= anet.o sds.o adlist.o redis-cli.o zmalloc.o release.o anet.o ae.o
1059c83aec9SantirezREDIS_BENCHMARK_NAME= redis-benchmark
1069c83aec9SantirezREDIS_BENCHMARK_OBJ= ae.o anet.o redis-benchmark.o sds.o adlist.o zmalloc.o redis-benchmark.o
1079c83aec9SantirezREDIS_CHECK_DUMP_NAME= redis-check-dump
10829c8cf01SantirezREDIS_CHECK_DUMP_OBJ= redis-check-dump.o lzf_c.o lzf_d.o crc64.o
1099c83aec9SantirezREDIS_CHECK_AOF_NAME= redis-check-aof
1109c83aec9SantirezREDIS_CHECK_AOF_OBJ= redis-check-aof.o
111e2641e09Santirez
112*6b5daa2dSantirezall: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_DUMP_NAME) $(REDIS_CHECK_AOF_NAME)
113c8061392SPieter Noordhuis	@echo ""
114c8061392SPieter Noordhuis	@echo "Hint: To run 'make test' is a good idea ;)"
115c8061392SPieter Noordhuis	@echo ""
116e2641e09Santirez
1170a08d2b0SPieter Noordhuis.PHONY: all
1180a08d2b0SPieter Noordhuis
119e2641e09Santirez# Deps (use make dep to generate this)
1200a08d2b0SPieter Noordhuisinclude Makefile.dep
121e2641e09Santirez
1220a08d2b0SPieter Noordhuisdep:
1239c83aec9Santirez	$(REDIS_CC) -MM *.c > Makefile.dep
124e2641e09Santirez
1250a08d2b0SPieter Noordhuis.PHONY: dep
126c8061392SPieter Noordhuis
1277e7b69feSPieter Noordhuispersist-settings: distclean
1287e7b69feSPieter Noordhuis	echo STD=$(STD) >> .make-settings
1297e7b69feSPieter Noordhuis	echo WARN=$(WARN) >> .make-settings
1307e7b69feSPieter Noordhuis	echo OPT=$(OPT) >> .make-settings
1317e7b69feSPieter Noordhuis	echo MALLOC=$(MALLOC) >> .make-settings
1327e7b69feSPieter Noordhuis	echo CFLAGS=$(CFLAGS) >> .make-settings
1337e7b69feSPieter Noordhuis	echo LDFLAGS=$(LDFLAGS) >> .make-settings
1347e7b69feSPieter Noordhuis	echo REDIS_CFLAGS=$(REDIS_CFLAGS) >> .make-settings
1357e7b69feSPieter Noordhuis	echo REDIS_LDFLAGS=$(REDIS_LDFLAGS) >> .make-settings
1367e7b69feSPieter Noordhuis	echo PREV_FINAL_CFLAGS=$(FINAL_CFLAGS) >> .make-settings
1377e7b69feSPieter Noordhuis	echo PREV_FINAL_LDFLAGS=$(FINAL_LDFLAGS) >> .make-settings
1387e7b69feSPieter Noordhuis	-(cd ../deps && $(MAKE) $(DEPENDENCY_TARGETS))
1397e7b69feSPieter Noordhuis
1407e7b69feSPieter Noordhuis.PHONY: persist-settings
1417e7b69feSPieter Noordhuis
1420a08d2b0SPieter Noordhuis# Prerequisites target
1430a08d2b0SPieter Noordhuis.make-prerequisites:
14442c6a5daSPieter Noordhuis	@touch $@
1455bb2c88eSPieter Noordhuis
1467e7b69feSPieter Noordhuis# Clean everything, persist settings and build dependencies if anything changed
1477e7b69feSPieter Noordhuisifneq ($(strip $(PREV_FINAL_CFLAGS)), $(strip $(FINAL_CFLAGS)))
1487e7b69feSPieter Noordhuis.make-prerequisites: persist-settings
1490a08d2b0SPieter Noordhuisendif
150e2641e09Santirez
1517e7b69feSPieter Noordhuisifneq ($(strip $(PREV_FINAL_LDFLAGS)), $(strip $(FINAL_LDFLAGS)))
1527e7b69feSPieter Noordhuis.make-prerequisites: persist-settings
1530a08d2b0SPieter Noordhuisendif
154e2641e09Santirez
1550a08d2b0SPieter Noordhuis# redis-server
156c18405c9Santirez$(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ)
157*6b5daa2dSantirez	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/src/liblua.a $(FINAL_LIBS)
158*6b5daa2dSantirez
159*6b5daa2dSantirez# redis-sentinel
160*6b5daa2dSantirez$(REDIS_SENTINEL_NAME): $(REDIS_SERVER_NAME)
161*6b5daa2dSantirez	$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME)
1627fc4ce13SPieter Noordhuis
1630a08d2b0SPieter Noordhuis# redis-cli
1649c83aec9Santirez$(REDIS_CLI_NAME): $(REDIS_CLI_OBJ)
165631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/linenoise/linenoise.o $(FINAL_LIBS)
166e2641e09Santirez
1670a08d2b0SPieter Noordhuis# redis-benchmark
1689c83aec9Santirez$(REDIS_BENCHMARK_NAME): $(REDIS_BENCHMARK_OBJ)
169631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a $(FINAL_LIBS)
170e2641e09Santirez
1710a08d2b0SPieter Noordhuis# redis-check-dump
1729c83aec9Santirez$(REDIS_CHECK_DUMP_NAME): $(REDIS_CHECK_DUMP_OBJ)
173631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ $(FINAL_LIBS)
174e2641e09Santirez
1750a08d2b0SPieter Noordhuis# redis-check-aof
1769c83aec9Santirez$(REDIS_CHECK_AOF_NAME): $(REDIS_CHECK_AOF_OBJ)
177631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ $(FINAL_LIBS)
1780a08d2b0SPieter Noordhuis
1790a08d2b0SPieter Noordhuis# Because the jemalloc.h header is generated as a part of the jemalloc build,
1800a08d2b0SPieter Noordhuis# building it should complete before building any other object. Instead of
1810a08d2b0SPieter Noordhuis# depending on a single artifact, build all dependencies first.
18242c6a5daSPieter Noordhuis%.o: %.c .make-prerequisites
1839c83aec9Santirez	$(REDIS_CC) -c $<
1844b8a6394SPieter Noordhuis
185e2641e09Santirezclean:
186*6b5daa2dSantirez	rm -rf $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_DUMP_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html
1870a08d2b0SPieter Noordhuis
1880a08d2b0SPieter Noordhuis.PHONY: clean
1894b8a6394SPieter Noordhuis
1904b8a6394SPieter Noordhuisdistclean: clean
1914b8a6394SPieter Noordhuis	-(cd ../deps && $(MAKE) distclean)
1920a08d2b0SPieter Noordhuis	-(rm -f .make-*)
193e2641e09Santirez
1940a08d2b0SPieter Noordhuis.PHONY: distclean
195e2641e09Santirez
196c18405c9Santireztest: $(REDIS_SERVER_NAME) $(REDIS_CHECK_AOF_NAME)
197f790bd02Santirez	@(cd ..; ./runtest)
198e2641e09Santirez
199c35b4e84SPremysl Hrubylcov:
2000342dd76SPieter Noordhuis	$(MAKE) gcov
201c35b4e84SPremysl Hruby	@(set -e; cd ..; ./runtest --clients 1)
202c35b4e84SPremysl Hruby	@geninfo -o redis.info .
203c35b4e84SPremysl Hruby	@genhtml --legend -o lcov-html redis.info
204c35b4e84SPremysl Hruby
2050a08d2b0SPieter Noordhuis.PHONY: lcov
2060a08d2b0SPieter Noordhuis
2079c83aec9Santirezbench: $(REDIS_BENCHMARK_NAME)
2089c83aec9Santirez	./$(REDIS_BENCHMARK_NAME)
209e2641e09Santirez
210e2641e09Santirez32bit:
211e2641e09Santirez	@echo ""
212e2641e09Santirez	@echo "WARNING: if it fails under Linux you probably need to install libc6-dev-i386"
213e2641e09Santirez	@echo ""
21434c943b3SPieter Noordhuis	$(MAKE) CFLAGS="-m32" LDFLAGS="-m32"
215e2641e09Santirez
216e2641e09Santirezgcov:
217631539a5SPieter Noordhuis	$(MAKE) REDIS_CFLAGS="-fprofile-arcs -ftest-coverage -DCOVERAGE_TEST" REDIS_LDFLAGS="-fprofile-arcs -ftest-coverage"
218e2641e09Santirez
219e2641e09Santireznoopt:
2200a08d2b0SPieter Noordhuis	$(MAKE) OPT="-O0"
221e2641e09Santirez
222319bb48cSantirezsrc/help.h:
223319bb48cSantirez	@../utils/generate-command-help.rb > help.h
224319bb48cSantirez
225acc01854Santirezinstall: all
2260bb5160cSantirez	mkdir -p $(INSTALL_BIN)
227*6b5daa2dSantirez	$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(INSTALL_BIN)
228*6b5daa2dSantirez	$(REDIS_INSTALL) $(REDIS_BENCHMARK_NAME) $(INSTALL_BIN)
229*6b5daa2dSantirez	$(REDIS_INSTALL) $(REDIS_CLI_NAME) $(INSTALL_BIN)
230*6b5daa2dSantirez	$(REDIS_INSTALL) $(REDIS_CHECK_DUMP_NAME) $(INSTALL_BIN)
231*6b5daa2dSantirez	$(REDIS_INSTALL) $(REDIS_CHECK_AOF_NAME) $(INSTALL_BIN)
232