Rebuild deps/ and src/ when ARCH changes

This change moves the build instructions for dependencies to a separate
Makefile in deps/. The ARCH environment variable is stored in a
.make-arch file in the same directory as the Makefile. The contents of
this file is read and compared to the current ARCH, and, on a mismatch
triggers rebuilding the entire source tree.

When file .make-arch exists and matches with ARCH from the environment,
the dependencies are assumed to already be built.

The new "clean" target only cleans the Redis source tree, not its
dependencies. To clear the dependencies as well, the "distclean" target
can be used.
This commit is contained in:
Pieter Noordhuis 2011-11-15 12:40:49 -08:00
parent 321a0440c0
commit 4b8a63941d
3 changed files with 88 additions and 35 deletions

1
.gitignore vendored
View File

@ -22,3 +22,4 @@ src/redis.conf
deps/lua/src/lua deps/lua/src/lua
deps/lua/src/luac deps/lua/src/luac
deps/lua/src/liblua.a deps/lua/src/liblua.a
.make-*

59
deps/Makefile vendored Normal file
View File

@ -0,0 +1,59 @@
# Redis dependency Makefile
UNAME_S:=$(shell sh -c 'uname -s 2> /dev/null || echo not')
LUA_CFLAGS=-O2 -Wall $(ARCH)
ifeq ($(UNAME_S),SunOS)
# Make isinf() available
LUA_CFLAGS+= -D__C99FEATURES__=1
endif
JEMALLOC_CFLAGS=
ifeq ($(ARCH),-m32)
JEMALLOC_CFLAGS+=CFLAGS="-std=gnu99 -Wall -pipe -g3 -fvisibility=hidden -O3 -funroll-loops -m32"
endif
CCCOLOR="\033[34m"
LINKCOLOR="\033[34;1m"
SRCCOLOR="\033[33m"
BINCOLOR="\033[37;1m"
MAKECOLOR="\033[32;1m"
ENDCOLOR="\033[0m"
default:
@echo "Explicit target required"
# Clean everything when ARCH is different
ifneq ($(shell sh -c '[ -f .make-arch ] && cat .make-arch'), $(ARCH))
.make-arch: distclean
else
.make-arch:
endif
.make-arch:
-(echo $(ARCH) > .make-arch)
distclean:
-(cd hiredis && $(MAKE) clean) > /dev/null || true
-(cd linenoise && $(MAKE) clean) > /dev/null || true
-(cd lua && $(MAKE) clean) > /dev/null || true
-(cd jemalloc && [ -f Makefile ] && $(MAKE) distclean) > /dev/null || true
-(rm -f .make-arch)
hiredis: .make-arch
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)hiredis$(ENDCOLOR)
cd hiredis && $(MAKE) static ARCH="$(ARCH)"
linenoise: .make-arch
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)linenoise$(ENDCOLOR)
cd linenoise && $(MAKE) ARCH="$(ARCH)"
lua: .make-arch
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)lua$(ENDCOLOR)
cd lua && $(MAKE) CFLAGS="$(LUA_CFLAGS)" MYLDFLAGS="$(ARCH)" ansi
jemalloc: .make-arch
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)jemalloc$(ENDCOLOR)
cd jemalloc && ./configure $(JEMALLOC_CFLAGS) --with-jemalloc-prefix=je_ --enable-cc-silence && $(MAKE) lib/libjemalloc.a
.PHONY: default conditional_clean hiredis linenoise lua jemalloc

View File

@ -5,8 +5,7 @@
release_hdr := $(shell sh -c './mkreleasehdr.sh') release_hdr := $(shell sh -c './mkreleasehdr.sh')
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
OPTIMIZATION?=-O2 OPTIMIZATION?=-O2
DEPENDENCY_TARGETS=hiredis linenoise lua
LUA_CFLAGS=-O2 -Wall
ifeq ($(uname_S),Linux) ifeq ($(uname_S),Linux)
ifneq ($(FORCE_LIBC_MALLOC),yes) ifneq ($(FORCE_LIBC_MALLOC),yes)
@ -15,8 +14,6 @@ ifeq ($(uname_S),Linux)
endif endif
ifeq ($(uname_S),SunOS) ifeq ($(uname_S),SunOS)
# make isinf() available
LUA_CFLAGS+=-D__C99FEATURES__=1
CFLAGS?=-std=c99 -pedantic $(OPTIMIZATION) -Wall -W -D__EXTENSIONS__ -D_XPG6 CFLAGS?=-std=c99 -pedantic $(OPTIMIZATION) -Wall -W -D__EXTENSIONS__ -D_XPG6
CCLINK?=-ldl -lnsl -lsocket -lm -lpthread CCLINK?=-ldl -lnsl -lsocket -lm -lpthread
DEBUG?=-g -ggdb DEBUG?=-g -ggdb
@ -27,27 +24,23 @@ else
endif endif
ifeq ($(USE_TCMALLOC),yes) ifeq ($(USE_TCMALLOC),yes)
ALLOD_DEPS=
ALLOC_LINK=-ltcmalloc ALLOC_LINK=-ltcmalloc
ALLOC_FLAGS=-DUSE_TCMALLOC ALLOC_FLAGS=-DUSE_TCMALLOC
endif endif
ifeq ($(USE_TCMALLOC_MINIMAL),yes) ifeq ($(USE_TCMALLOC_MINIMAL),yes)
ALLOD_DEPS=
ALLOC_LINK=-ltcmalloc_minimal ALLOC_LINK=-ltcmalloc_minimal
ALLOC_FLAGS=-DUSE_TCMALLOC ALLOC_FLAGS=-DUSE_TCMALLOC
endif endif
ifeq ($(USE_JEMALLOC),yes) ifeq ($(USE_JEMALLOC),yes)
ALLOC_DEP=../deps/jemalloc/lib/libjemalloc.a ALLOC_LINK=../deps/jemalloc/lib/libjemalloc.a -ldl
ALLOC_LINK=$(ALLOC_DEP) -ldl
ALLOC_FLAGS=-DUSE_JEMALLOC -I../deps/jemalloc/include ALLOC_FLAGS=-DUSE_JEMALLOC -I../deps/jemalloc/include
DEPENDENCY_TARGETS+= jemalloc
endif endif
CCLINK+= $(ALLOC_LINK) CCLINK+= $(ALLOC_LINK)
CFLAGS+= $(ALLOC_FLAGS) CFLAGS+= $(ALLOC_FLAGS)
LUA_CFLAGS+= $(ARCH)
CCOPT= $(CFLAGS) $(ARCH) $(PROF) CCOPT= $(CFLAGS) $(ARCH) $(PROF)
PREFIX= /usr/local PREFIX= /usr/local
@ -160,52 +153,52 @@ ziplist.o: ziplist.c zmalloc.h util.h ziplist.h endian.h
zipmap.o: zipmap.c zmalloc.h endian.h zipmap.o: zipmap.c zmalloc.h endian.h
zmalloc.o: zmalloc.c config.h zmalloc.h zmalloc.o: zmalloc.c config.h zmalloc.h
.PHONY: dependencies # Clean local objects when ARCH is different
ifneq ($(shell sh -c '[ -f .make-arch ] && cat .make-arch'), $(ARCH))
.make-arch: clean
else
.make-arch:
endif
dependencies: .make-arch:
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)hiredis$(ENDCOLOR) -(cd ../deps && make $(DEPENDENCY_TARGETS) ARCH="$(ARCH)")
@cd ../deps/hiredis && $(MAKE) static ARCH="$(ARCH)" -(echo $(ARCH) > .make-arch)
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)linenoise$(ENDCOLOR)
@cd ../deps/linenoise && $(MAKE) ARCH="$(ARCH)"
@echo $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)Lua ansi$(ENDCOLOR)
@cd ../deps/lua && $(MAKE) CFLAGS="$(LUA_CFLAGS)" MYLDFLAGS="$(ARCH)" ansi
../deps/jemalloc/lib/libjemalloc.a: redis-server: .make-arch $(OBJ)
cd ../deps/jemalloc && ./configure $(JEMALLOC_CFLAGS) --with-jemalloc-prefix=je_ --enable-cc-silence && $(MAKE) lib/libjemalloc.a
redis-server: dependencies $(OBJ)
$(QUIET_LINK)$(CC) -o $(PRGNAME) $(CCOPT) $(DEBUG) $(OBJ) ../deps/lua/src/liblua.a $(CCLINK) $(QUIET_LINK)$(CC) -o $(PRGNAME) $(CCOPT) $(DEBUG) $(OBJ) ../deps/lua/src/liblua.a $(CCLINK)
redis-benchmark: dependencies $(BENCHOBJ) redis-benchmark: .make-arch $(BENCHOBJ)
@cd ../deps/hiredis && $(MAKE) static
$(QUIET_LINK)$(CC) -o $(BENCHPRGNAME) $(CCOPT) $(DEBUG) $(BENCHOBJ) ../deps/hiredis/libhiredis.a $(CCLINK) $(QUIET_LINK)$(CC) -o $(BENCHPRGNAME) $(CCOPT) $(DEBUG) $(BENCHOBJ) ../deps/hiredis/libhiredis.a $(CCLINK)
redis-benchmark.o: redis-benchmark.o: redis-benchmark.c .make-arch
$(QUIET_CC)$(CC) -c $(CFLAGS) -I../deps/hiredis $(DEBUG) $(COMPILE_TIME) $< $(QUIET_CC)$(CC) -c $(CFLAGS) -I../deps/hiredis $(DEBUG) $(COMPILE_TIME) $<
redis-cli: dependencies $(CLIOBJ) redis-cli: .make-arch $(CLIOBJ)
$(QUIET_LINK)$(CC) -o $(CLIPRGNAME) $(CCOPT) $(DEBUG) $(CLIOBJ) ../deps/hiredis/libhiredis.a ../deps/linenoise/linenoise.o $(CCLINK) $(QUIET_LINK)$(CC) -o $(CLIPRGNAME) $(CCOPT) $(DEBUG) $(CLIOBJ) ../deps/hiredis/libhiredis.a ../deps/linenoise/linenoise.o $(CCLINK)
redis-cli.o: redis-cli.o: redis-cli.c .make-arch
$(QUIET_CC)$(CC) -c $(CFLAGS) -I../deps/hiredis -I../deps/linenoise $(DEBUG) $(COMPILE_TIME) $< $(QUIET_CC)$(CC) -c $(CFLAGS) -I../deps/hiredis -I../deps/linenoise $(DEBUG) $(COMPILE_TIME) $<
redis-check-dump: $(CHECKDUMPOBJ) redis-check-dump: .make-arch $(CHECKDUMPOBJ)
$(QUIET_LINK)$(CC) -o $(CHECKDUMPPRGNAME) $(CCOPT) $(DEBUG) $(CHECKDUMPOBJ) $(CCLINK) $(QUIET_LINK)$(CC) -o $(CHECKDUMPPRGNAME) $(CCOPT) $(DEBUG) $(CHECKDUMPOBJ) $(CCLINK)
redis-check-aof: $(CHECKAOFOBJ) redis-check-aof: .make-arch $(CHECKAOFOBJ)
$(QUIET_LINK)$(CC) -o $(CHECKAOFPRGNAME) $(CCOPT) $(DEBUG) $(CHECKAOFOBJ) $(CCLINK) $(QUIET_LINK)$(CC) -o $(CHECKAOFPRGNAME) $(CCOPT) $(DEBUG) $(CHECKAOFOBJ) $(CCLINK)
# Because the jemalloc.h header is generated as a part of the jemalloc build # Because the jemalloc.h header is generated as a part of the jemalloc build
# process, building it should complete before building any other object. # process, building it should complete before building any other object. Instead of
%.o: %.c $(ALLOC_DEP) # depending on a single artifact, simply build all dependencies first.
%.o: %.c .make-arch
$(QUIET_CC)$(CC) -c $(CFLAGS) $(DEBUG) $(COMPILE_TIME) -I../deps/lua/src $< $(QUIET_CC)$(CC) -c $(CFLAGS) $(DEBUG) $(COMPILE_TIME) -I../deps/lua/src $<
.PHONY: all clean distclean
clean: clean:
rm -rf $(PRGNAME) $(BENCHPRGNAME) $(CLIPRGNAME) $(CHECKDUMPPRGNAME) $(CHECKAOFPRGNAME) *.o *.gcda *.gcno *.gcov rm -rf $(PRGNAME) $(BENCHPRGNAME) $(CLIPRGNAME) $(CHECKDUMPPRGNAME) $(CHECKAOFPRGNAME) *.o *.gcda *.gcno *.gcov
cd ../deps/hiredis && $(MAKE) $@
cd ../deps/linenoise && $(MAKE) $@ distclean: clean
cd ../deps/lua && $(MAKE) $@ -(cd ../deps && $(MAKE) distclean)
-(cd ../deps/jemalloc && $(MAKE) distclean) -(rm -f .make-arch)
dep: dep:
$(CC) -MM *.c -I ../deps/hiredis -I ../deps/linenoise $(CC) -MM *.c -I ../deps/hiredis -I ../deps/linenoise