Redis的makefile主要是src目录下的makefile,编译的日志也不多,300多行,Redis的makefile用到了make的一些高级规则
配置文件.make-settings(通过include实现),给CC,MAKE上色,如果执行make V=1就不会看到CC上色
.make-prerequisites定义的规则在默认的目标all之前执行,而且.make-prerequisites定义的规则,后面的先执行
因为下面这个规则
%.o: %.c .make-prerequisites
$(REDIS_CC) -c $<
REDIS_CC=$(QUIET_CC)$(CC) $(FINAL_CFLAGS)
QUIET_CC = @printf ' %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(SRCCOLOR)$@$(ENDCOLOR) 1>&2;
在shell中执行printf ' %b %b\n' "\033[34m"CC"\033[0m" "\033[33m"adlist.o"\033[0m" 1>&2;的结果,输出是
CC adlist.o,CC和adlist.o都是带颜色的
在shell中执行printf ' %b %b\n' "\033[34m"CC"\033[0m" "\033[33m"adlist.o"\033[0m" 1>&2; \
cc -std=c99 -pedantic -DREDIS_STATIC='' -Wall -W -O2 -g -ggdb -I../deps/geohash-int -I../deps/hiredis -I../deps/linenoise -I../deps/lua/src -DUSE_JEMALLOC -I../deps/jemalloc/include -c adlist.c
也只打印CC adlist.o,却多执行了一条编译命令
@抑制了shell命令的输出,这里巧妙地把make应该执行的命令变成了一条shell命令,而且可以定制化输出
.make-prerequisites:
@touch $@
ifneq ($(strip $(PREV_FINAL_CFLAGS)), $(strip $(FINAL_CFLAGS)))
.make-prerequisites: persist-settings
endif
ifneq ($(strip $(PREV_FINAL_LDFLAGS)), $(strip $(FINAL_LDFLAGS)))
.make-prerequisites: persist-settings
endif
如果PREV_FINAL_CFLAGS != FINAL_CFLAGS,FINAL_CFLAGS在makefile前文中有构造,PREV_FINAL_CFLAGS则就是来自.make-settings文件,
第一次没有这个文件,所以肯定不等,所以执行persist-settings目标
persist-settings: distclean
echo STD=$(STD) >> .make-settings
echo WARN=$(WARN) >> .make-settings
echo OPT=$(OPT) >> .make-settings
echo MALLOC=$(MALLOC) >> .make-settings
echo CFLAGS=$(CFLAGS) >> .make-settings
echo LDFLAGS=$(LDFLAGS) >> .make-settings
echo REDIS_CFLAGS=$(REDIS_CFLAGS) >> .make-settings
echo REDIS_LDFLAGS=$(REDIS_LDFLAGS) >> .make-settings
echo PREV_FINAL_CFLAGS=$(FINAL_CFLAGS) >> .make-settings
echo PREV_FINAL_LDFLAGS=$(FINAL_LDFLAGS) >> .make-settings
-(cd ../deps && $(MAKE) $(DEPENDENCY_TARGETS))
persist-settings依赖distclean,所以先执行distclean,
distclean: clean
-(cd ../deps && $(MAKE) distclean)
-(rm -f .make-*)
clean删除redis几个可执行程序。接着进入deps目录,执行distclean目标。并删掉当前目录(src目录)下的make配置文件
接下来是创建.make-settings,然后就如deps目录,编译依赖hiredis linenoise lua geohash-int
编译好这些依赖,执行第二个.make-prerequisites,@touch $@,没有实际的操作
接着开始执行all目标,依次编译redis-server,redis-sentinel,redis-cli,redis-benchmark,redis-check-rdb,redis-check-aof
配置文件.make-settings(通过include实现),给CC,MAKE上色,如果执行make V=1就不会看到CC上色
.make-prerequisites定义的规则在默认的目标all之前执行,而且.make-prerequisites定义的规则,后面的先执行
因为下面这个规则
%.o: %.c .make-prerequisites
$(REDIS_CC) -c $<
REDIS_CC=$(QUIET_CC)$(CC) $(FINAL_CFLAGS)
QUIET_CC = @printf ' %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(SRCCOLOR)$@$(ENDCOLOR) 1>&2;
在shell中执行printf ' %b %b\n' "\033[34m"CC"\033[0m" "\033[33m"adlist.o"\033[0m" 1>&2;的结果,输出是
CC adlist.o,CC和adlist.o都是带颜色的
在shell中执行printf ' %b %b\n' "\033[34m"CC"\033[0m" "\033[33m"adlist.o"\033[0m" 1>&2; \
cc -std=c99 -pedantic -DREDIS_STATIC='' -Wall -W -O2 -g -ggdb -I../deps/geohash-int -I../deps/hiredis -I../deps/linenoise -I../deps/lua/src -DUSE_JEMALLOC -I../deps/jemalloc/include -c adlist.c
也只打印CC adlist.o,却多执行了一条编译命令
@抑制了shell命令的输出,这里巧妙地把make应该执行的命令变成了一条shell命令,而且可以定制化输出
.make-prerequisites:
@touch $@
ifneq ($(strip $(PREV_FINAL_CFLAGS)), $(strip $(FINAL_CFLAGS)))
.make-prerequisites: persist-settings
endif
ifneq ($(strip $(PREV_FINAL_LDFLAGS)), $(strip $(FINAL_LDFLAGS)))
.make-prerequisites: persist-settings
endif
如果PREV_FINAL_CFLAGS != FINAL_CFLAGS,FINAL_CFLAGS在makefile前文中有构造,PREV_FINAL_CFLAGS则就是来自.make-settings文件,
第一次没有这个文件,所以肯定不等,所以执行persist-settings目标
persist-settings: distclean
echo STD=$(STD) >> .make-settings
echo WARN=$(WARN) >> .make-settings
echo OPT=$(OPT) >> .make-settings
echo MALLOC=$(MALLOC) >> .make-settings
echo CFLAGS=$(CFLAGS) >> .make-settings
echo LDFLAGS=$(LDFLAGS) >> .make-settings
echo REDIS_CFLAGS=$(REDIS_CFLAGS) >> .make-settings
echo REDIS_LDFLAGS=$(REDIS_LDFLAGS) >> .make-settings
echo PREV_FINAL_CFLAGS=$(FINAL_CFLAGS) >> .make-settings
echo PREV_FINAL_LDFLAGS=$(FINAL_LDFLAGS) >> .make-settings
-(cd ../deps && $(MAKE) $(DEPENDENCY_TARGETS))
persist-settings依赖distclean,所以先执行distclean,
distclean: clean
-(cd ../deps && $(MAKE) distclean)
-(rm -f .make-*)
clean删除redis几个可执行程序。接着进入deps目录,执行distclean目标。并删掉当前目录(src目录)下的make配置文件
接下来是创建.make-settings,然后就如deps目录,编译依赖hiredis linenoise lua geohash-int
编译好这些依赖,执行第二个.make-prerequisites,@touch $@,没有实际的操作
接着开始执行all目标,依次编译redis-server,redis-sentinel,redis-cli,redis-benchmark,redis-check-rdb,redis-check-aof