xref: /redis-3.2.3/src/Makefile (revision 29c8cf01)
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
50caba5851SPieter Noordhuis  FINAL_LDFLAGS= $(LDFLAGS) $(REDIS_LDFLAGS)
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)
55caba5851SPieter Noordhuis  FINAL_LDFLAGS= $(LDFLAGS) $(REDIS_LDFLAGS)
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)
81e2641e09Santirez
82e1386503SPedro MeloPREFIX= /usr/local
830997b411SPedro MeloINSTALL_BIN= $(PREFIX)/bin
84120a36f2SantirezINSTALL= cp -pf
85acc01854Santirez
8635845afbSantirezCCCOLOR="\033[34m"
8735845afbSantirezLINKCOLOR="\033[34;1m"
8835845afbSantirezSRCCOLOR="\033[33m"
8935845afbSantirezBINCOLOR="\033[37;1m"
9035845afbSantirezMAKECOLOR="\033[32;1m"
9135845afbSantirezENDCOLOR="\033[0m"
9235845afbSantirez
9373e71867Santirezifndef V
940a08d2b0SPieter NoordhuisQUIET_CC = @printf '    %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(SRCCOLOR)$@$(ENDCOLOR) 1>&2;
950a08d2b0SPieter NoordhuisQUIET_LINK = @printf '    %b %b\n' $(LINKCOLOR)LINK$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2;
9673e71867Santirezendif
9773e71867Santirez
98c18405c9SantirezREDIS_SERVER_NAME= redis-server
99c18405c9SantirezREDIS_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
1009c83aec9SantirezREDIS_CLI_NAME= redis-cli
1019c83aec9SantirezREDIS_CLI_OBJ= anet.o sds.o adlist.o redis-cli.o zmalloc.o release.o
1029c83aec9SantirezREDIS_BENCHMARK_NAME= redis-benchmark
1039c83aec9SantirezREDIS_BENCHMARK_OBJ= ae.o anet.o redis-benchmark.o sds.o adlist.o zmalloc.o redis-benchmark.o
1049c83aec9SantirezREDIS_CHECK_DUMP_NAME= redis-check-dump
105*29c8cf01SantirezREDIS_CHECK_DUMP_OBJ= redis-check-dump.o lzf_c.o lzf_d.o crc64.o
1069c83aec9SantirezREDIS_CHECK_AOF_NAME= redis-check-aof
1079c83aec9SantirezREDIS_CHECK_AOF_OBJ= redis-check-aof.o
108e2641e09Santirez
109c18405c9Santirezall: $(REDIS_SERVER_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_DUMP_NAME) $(REDIS_CHECK_AOF_NAME)
110c8061392SPieter Noordhuis	@echo ""
111c8061392SPieter Noordhuis	@echo "Hint: To run 'make test' is a good idea ;)"
112c8061392SPieter Noordhuis	@echo ""
113e2641e09Santirez
1140a08d2b0SPieter Noordhuis.PHONY: all
1150a08d2b0SPieter Noordhuis
116e2641e09Santirez# Deps (use make dep to generate this)
1170a08d2b0SPieter Noordhuisinclude Makefile.dep
118e2641e09Santirez
1190a08d2b0SPieter Noordhuisdep:
1209c83aec9Santirez	$(REDIS_CC) -MM *.c > Makefile.dep
121e2641e09Santirez
1220a08d2b0SPieter Noordhuis.PHONY: dep
123c8061392SPieter Noordhuis
1247e7b69feSPieter Noordhuispersist-settings: distclean
1257e7b69feSPieter Noordhuis	echo STD=$(STD) >> .make-settings
1267e7b69feSPieter Noordhuis	echo WARN=$(WARN) >> .make-settings
1277e7b69feSPieter Noordhuis	echo OPT=$(OPT) >> .make-settings
1287e7b69feSPieter Noordhuis	echo MALLOC=$(MALLOC) >> .make-settings
1297e7b69feSPieter Noordhuis	echo CFLAGS=$(CFLAGS) >> .make-settings
1307e7b69feSPieter Noordhuis	echo LDFLAGS=$(LDFLAGS) >> .make-settings
1317e7b69feSPieter Noordhuis	echo REDIS_CFLAGS=$(REDIS_CFLAGS) >> .make-settings
1327e7b69feSPieter Noordhuis	echo REDIS_LDFLAGS=$(REDIS_LDFLAGS) >> .make-settings
1337e7b69feSPieter Noordhuis	echo PREV_FINAL_CFLAGS=$(FINAL_CFLAGS) >> .make-settings
1347e7b69feSPieter Noordhuis	echo PREV_FINAL_LDFLAGS=$(FINAL_LDFLAGS) >> .make-settings
1357e7b69feSPieter Noordhuis	-(cd ../deps && $(MAKE) $(DEPENDENCY_TARGETS))
1367e7b69feSPieter Noordhuis
1377e7b69feSPieter Noordhuis.PHONY: persist-settings
1387e7b69feSPieter Noordhuis
1390a08d2b0SPieter Noordhuis# Prerequisites target
1400a08d2b0SPieter Noordhuis.make-prerequisites:
14142c6a5daSPieter Noordhuis	@touch $@
1425bb2c88eSPieter Noordhuis
1437e7b69feSPieter Noordhuis# Clean everything, persist settings and build dependencies if anything changed
1447e7b69feSPieter Noordhuisifneq ($(strip $(PREV_FINAL_CFLAGS)), $(strip $(FINAL_CFLAGS)))
1457e7b69feSPieter Noordhuis.make-prerequisites: persist-settings
1460a08d2b0SPieter Noordhuisendif
147e2641e09Santirez
1487e7b69feSPieter Noordhuisifneq ($(strip $(PREV_FINAL_LDFLAGS)), $(strip $(FINAL_LDFLAGS)))
1497e7b69feSPieter Noordhuis.make-prerequisites: persist-settings
1500a08d2b0SPieter Noordhuisendif
151e2641e09Santirez
1520a08d2b0SPieter Noordhuis# redis-server
153c18405c9Santirez$(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ)
154631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ ../deps/lua/src/liblua.a $(FINAL_LIBS)
1557fc4ce13SPieter Noordhuis
1560a08d2b0SPieter Noordhuis# redis-cli
1579c83aec9Santirez$(REDIS_CLI_NAME): $(REDIS_CLI_OBJ)
158631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/linenoise/linenoise.o $(FINAL_LIBS)
159e2641e09Santirez
1600a08d2b0SPieter Noordhuis# redis-benchmark
1619c83aec9Santirez$(REDIS_BENCHMARK_NAME): $(REDIS_BENCHMARK_OBJ)
162631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a $(FINAL_LIBS)
163e2641e09Santirez
1640a08d2b0SPieter Noordhuis# redis-check-dump
1659c83aec9Santirez$(REDIS_CHECK_DUMP_NAME): $(REDIS_CHECK_DUMP_OBJ)
166631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ $(FINAL_LIBS)
167e2641e09Santirez
1680a08d2b0SPieter Noordhuis# redis-check-aof
1699c83aec9Santirez$(REDIS_CHECK_AOF_NAME): $(REDIS_CHECK_AOF_OBJ)
170631539a5SPieter Noordhuis	$(REDIS_LD) -o $@ $^ $(FINAL_LIBS)
1710a08d2b0SPieter Noordhuis
1720a08d2b0SPieter Noordhuis# Because the jemalloc.h header is generated as a part of the jemalloc build,
1730a08d2b0SPieter Noordhuis# building it should complete before building any other object. Instead of
1740a08d2b0SPieter Noordhuis# depending on a single artifact, build all dependencies first.
17542c6a5daSPieter Noordhuis%.o: %.c .make-prerequisites
1769c83aec9Santirez	$(REDIS_CC) -c $<
1774b8a6394SPieter Noordhuis
178e2641e09Santirezclean:
179c18405c9Santirez	rm -rf $(REDIS_SERVER_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_DUMP_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html
1800a08d2b0SPieter Noordhuis
1810a08d2b0SPieter Noordhuis.PHONY: clean
1824b8a6394SPieter Noordhuis
1834b8a6394SPieter Noordhuisdistclean: clean
1844b8a6394SPieter Noordhuis	-(cd ../deps && $(MAKE) distclean)
1850a08d2b0SPieter Noordhuis	-(rm -f .make-*)
186e2641e09Santirez
1870a08d2b0SPieter Noordhuis.PHONY: distclean
188e2641e09Santirez
189c18405c9Santireztest: $(REDIS_SERVER_NAME) $(REDIS_CHECK_AOF_NAME)
190f790bd02Santirez	@(cd ..; ./runtest)
191e2641e09Santirez
192c35b4e84SPremysl Hrubylcov:
1930342dd76SPieter Noordhuis	$(MAKE) gcov
194c35b4e84SPremysl Hruby	@(set -e; cd ..; ./runtest --clients 1)
195c35b4e84SPremysl Hruby	@geninfo -o redis.info .
196c35b4e84SPremysl Hruby	@genhtml --legend -o lcov-html redis.info
197c35b4e84SPremysl Hruby
1980a08d2b0SPieter Noordhuis.PHONY: lcov
1990a08d2b0SPieter Noordhuis
2009c83aec9Santirezbench: $(REDIS_BENCHMARK_NAME)
2019c83aec9Santirez	./$(REDIS_BENCHMARK_NAME)
202e2641e09Santirez
203e2641e09Santirez32bit:
204e2641e09Santirez	@echo ""
205e2641e09Santirez	@echo "WARNING: if it fails under Linux you probably need to install libc6-dev-i386"
206e2641e09Santirez	@echo ""
20734c943b3SPieter Noordhuis	$(MAKE) CFLAGS="-m32" LDFLAGS="-m32"
208e2641e09Santirez
209e2641e09Santirezgcov:
210631539a5SPieter Noordhuis	$(MAKE) REDIS_CFLAGS="-fprofile-arcs -ftest-coverage -DCOVERAGE_TEST" REDIS_LDFLAGS="-fprofile-arcs -ftest-coverage"
211e2641e09Santirez
212e2641e09Santireznoopt:
2130a08d2b0SPieter Noordhuis	$(MAKE) OPT="-O0"
214e2641e09Santirez
215319bb48cSantirezsrc/help.h:
216319bb48cSantirez	@../utils/generate-command-help.rb > help.h
217319bb48cSantirez
218acc01854Santirezinstall: all
2190bb5160cSantirez	mkdir -p $(INSTALL_BIN)
220c18405c9Santirez	$(INSTALL) $(REDIS_SERVER_NAME) $(INSTALL_BIN)
2219c83aec9Santirez	$(INSTALL) $(REDIS_BENCHMARK_NAME) $(INSTALL_BIN)
2229c83aec9Santirez	$(INSTALL) $(REDIS_CLI_NAME) $(INSTALL_BIN)
2239c83aec9Santirez	$(INSTALL) $(REDIS_CHECK_DUMP_NAME) $(INSTALL_BIN)
2249c83aec9Santirez	$(INSTALL) $(REDIS_CHECK_AOF_NAME) $(INSTALL_BIN)
225