redis源码阅读 2 - 解读makefile, make编译生成 redis-cli redis-server

下载源码

git clone [email protected]:redis/redis.git

生成带debug信息的redis-server和redis-cli

cd redis
 make CFLAGS="-g -O0"

指定编译参数支持debug

增加CFLAGS="-g -O0"参数,支持编辑器debug

make CFLAGS="-g -O0"

官方关于debug说明连接

https://redis.io/topics/debugging

此时,可见src目录下已生成 *.o文件 和 redis-server, redis-cli等可执行程序

配置好Clion后,debug便能看到相关变量信息。

makefile说明

makefile 可理解为make命令的配置文件,可使分块式执行shell命令。
在make之后有更先进的cmake工具。

make命令依赖 Makefile
cmake命令依赖 CMakeLists.txt

makefile语法

target ...: prerequisites
            command
            command

redis源码阅读 2 - 解读makefile, make编译生成 redis-cli redis-server_第1张图片

  • 通常target是目标文件,由command生成。但你可以定义一个永远不会被生成的target,使得command每次都会被执行
  • prerequisites也可以是代码文件,也可以是另一个target
    ,对比修改时间决定本组command是否执行

makefile .DEFAULT .PHONY include说明

.DEFAULT是依赖项目不存在时,执行的默认动作
.PHONY是不管文件是否存在,都要执行其command
如:

# make 不指定动作时,默认执行第一个动作,名字随意叫,此处叫default
# default 依赖 all,  因为all模块不存在, 所以执行默认动作.DEFAULT
default: all

# 定义依赖项不存在时的 默认动作
.DEFAULT:
	cd src && $(MAKE) $@

install:
	cd src && $(MAKE) $@

# 定义install动作模块是一个伪模块,即不检查是否存在install文件都要执行其命令。
.PHONY: install

# inclue 可以加载其他makefile文件进来,作为本makefile的一部分
include release.mk

redis 项目下的makefile

redis项目的中有很多makefile, 分别有

➜  redis git:(unstable) ✗ find ./ |grep 'akefile' 
.//Makefile
.//tests/modules/Makefile
.//deps/Makefile
.//deps/jemalloc/Makefile.in
.//deps/linenoise/Makefile
.//deps/hiredis/Makefile
.//deps/lua/Makefile
.//deps/lua/etc/Makefile
.//deps/lua/src/Makefile
.//deps/hdr_histogram/Makefile
.//src/Makefile.dep
.//src/Makefile
.//src/latex/Makefile
.//src/modules/Makefile

查看./Makefile 可以看到,在redis根目录每次执行make 和 make install效果差别大, 都是进入src目录 执行其Makefile中的all动作。

参考文档

对 makefile 中 .DEFAULT 的理解

https://www.cnblogs.com/thrillerz/articles/4510124.html

makefile中的target到底代表什么?

https://www.cnblogs.com/bwangel23/p/4497250.html

你可能感兴趣的:(redis,redis,数据库,git)