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 50*a3eb7ac8Santirez 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) 55*a3eb7ac8Santirez 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) 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 10529c8cf01SantirezREDIS_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