Redis-3.2.8 Makefile分析

来源:互联网 发布:淘宝评价计分规则 编辑:程序博客网 时间:2024/06/02 05:14
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

0 0
原创粉丝点击