mac + CLion + redis5 本地调试/运行

1、安装CLion

2、下载源码

下载源码到本地~/CLionProjects目录下:

cd ~/CLionProjects
git clone https://github.com/antirez/redis.git

稍等片刻源码即可下载完成。

3、添加CMakeLists.txt文件

  • 前提:mac需要安装CMake。
brew install cmake
  • 根目录redis/CMakeLists.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(redis VERSION 4.0)
set(CMAKE_BUILD_TYPE "Debug")

get_filename_component(REDIS_ROOT "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)

add_subdirectory(deps)
add_subdirectory(src/modules)

set(SRC_SERVER_TMP
        src/adlist.c
        src/ae.c
        src/anet.c
        src/ae_kqueue.c
        src/dict.c
        src/sds.c
        src/zmalloc.c
        src/lzf_c.c
        src/lzf_d.c
        src/pqsort.c
        src/zipmap.c
        src/sha1.c
        src/ziplist.c
        src/release.c
        src/networking.c
        src/util.c
        src/object.c
        src/db.c
        src/replication.c
        src/rdb.c
        src/t_string.c
        src/t_list.c
        src/t_set.c
        src/t_zset.c
        src/evict.c
        src/defrag.c
        src/module.c
        src/quicklist.c
        src/expire.c
        src/childinfo.c
        src/redis-check-aof.c
        src/redis-check-rdb.c
        src/lazyfree.c
        src/geohash.c
        src/rax.c
        src/geohash_helper.c
        src/siphash.c
        src/geo.c
        src/t_hash.c
        src/config.c
        src/aof.c
        src/pubsub.c
        src/multi.c
        src/debug.c
        src/sort.c
        src/intset.c
        src/syncio.c
        src/cluster.c
        src/crc16.c
        src/endianconv.c
        src/slowlog.c
        src/scripting.c
        src/bio.c
        src/rio.c
        src/rand.c
        src/memtest.c
        src/crc64.c
        src/bitops.c
        src/sentinel.c
        src/notify.c
        src/setproctitle.c
        src/blocked.c
        src/hyperloglog.c
        src/latency.c
        src/sparkline.c
        src/t_stream.c
        src/lolwut.c
        src/lolwut5.c
        src/listpack.c
        src/localtime.c
        )
set(SRC_SERVER src/server.c ${SRC_SERVER_TMP})

set(SRC_CLI
        src/anet.c
        src/sds.c
        src/adlist.c
        src/redis-cli.c
        src/zmalloc.c
        src/release.c
        src/anet.c
        src/ae.c
        src/crc64.c
        src/crc16.c
        src/dict.c
        src/siphash.c
        )


set(EXECUTABLE_OUTPUT_PATH src)
link_directories(deps/linenoise/ deps/lua/src deps/hiredis)

add_executable(redis-server ${SRC_SERVER})
target_include_directories(redis-server
        PRIVATE ${REDIS_ROOT}/deps/linenoise
        PRIVATE ${REDIS_ROOT}/deps/hiredis
        PRIVATE ${REDIS_ROOT}/deps/lua/src)
target_link_libraries(redis-server
        PRIVATE pthread
        PRIVATE m
        PRIVATE lua
        PRIVATE linenoise
        PRIVATE hiredis)


add_executable(redis-cli ${SRC_CLI})
target_include_directories(redis-cli
        PRIVATE ${REDIS_ROOT}/deps/linenoise
        PRIVATE ${REDIS_ROOT}/deps/hiredis
        PRIVATE ${REDIS_ROOT}/deps/lua/src)

target_link_libraries(redis-cli
        PRIVATE pthread
        PRIVATE m
        PRIVATE linenoise
        PRIVATE hiredis
        )
  • redis/deps/CMakeLists.txt
add_subdirectory(hiredis)
add_subdirectory(linenoise)
add_subdirectory(lua)
  • redis/deps/hiredis/CMakeLists.txt
add_library(hiredis STATIC
        hiredis.c
        net.c
        dict.c
        sds.c
        async.c
        read.c
        )
  • redis/deps/linenoise/CMakeLists.txt
add_library(linenoise linenoise.c)
  • redis/deps/lua/CMakeLists.txt
set(LUA_SRC
        src/lapi.c src/lcode.c src/ldebug.c src/ldo.c src/ldump.c src/lfunc.c
        src/lgc.c src/llex.c src/lmem.c
        src/lobject.c src/lopcodes.c src/lparser.c src/lstate.c src/lstring.c
        src/ltable.c src/ltm.c
        src/lundump.c src/lvm.c src/lzio.c src/strbuf.c src/fpconv.c
        src/lauxlib.c src/lbaselib.c src/ldblib.c src/liolib.c src/lmathlib.c
        src/loslib.c src/ltablib.c
        src/lstrlib.c src/loadlib.c src/linit.c src/lua_cjson.c
        src/lua_struct.c
        src/lua_cmsgpack.c
        src/lua_bit.c
        )

add_library(lua STATIC ${LUA_SRC})
  • redis/src/modules/CMakeLists.txt
cmake_minimum_required(VERSION 3.9)
set(CMAKE_BUILD_TYPE "Debug")
add_library(helloworld SHARED helloworld.c)
set_target_properties(helloworld PROPERTIES PREFIX "" SUFFIX ".so")


add_library(hellotype SHARED hellotype.c)
set_target_properties(hellotype PROPERTIES PREFIX "" SUFFIX ".so")


add_library(helloblock SHARED helloblock.c)
set_target_properties(helloblock PROPERTIES PREFIX "" SUFFIX ".so")


add_library(testmodule SHARED testmodule.c)
set_target_properties(testmodule PROPERTIES PREFIX "" SUFFIX ".so")

4、cmake

添加完CMakeLists.txt文件之后,进入代码根目录下执行下面命令

cmake .
make 

5、ae_kqueue.h

执行make命令的时候,会出现下面的错误:


/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:41:24: error: unknown type name 'aeEventLoop'
static int aeApiCreate(aeEventLoop *eventLoop) {
                       ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:42:25: warning: implicit declaration of function 'zmalloc' is invalid in C99
      [-Wimplicit-function-declaration]
    aeApiState *state = zmalloc(sizeof(aeApiState));
                        ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:42:17: warning: incompatible integer to pointer conversion initializing 'aeApiState *'
      (aka 'struct aeApiState *') with an expression of type 'int' [-Wint-conversion]
    aeApiState *state = zmalloc(sizeof(aeApiState));
                ^       ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:47:9: warning: implicit declaration of function 'zfree' is invalid in C99
      [-Wimplicit-function-declaration]
        zfree(state);
        ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:52:9: warning: implicit declaration of function 'zfree' is invalid in C99
      [-Wimplicit-function-declaration]
        zfree(state->events);
        ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:60:24: error: unknown type name 'aeEventLoop'
static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
                       ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:63:21: warning: implicit declaration of function 'zrealloc' is invalid in C99
      [-Wimplicit-function-declaration]
    state->events = zrealloc(state->events, sizeof(struct kevent)*setsize);
                    ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:63:19: warning: incompatible integer to pointer conversion assigning to
      'struct kevent *' from 'int' [-Wint-conversion]
    state->events = zrealloc(state->events, sizeof(struct kevent)*setsize);
                  ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:67:23: error: unknown type name 'aeEventLoop'
static void aeApiFree(aeEventLoop *eventLoop) {
                      ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:70:5: warning: implicit declaration of function 'close' is invalid in C99
      [-Wimplicit-function-declaration]
    close(state->kqfd);
    ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:71:5: warning: implicit declaration of function 'zfree' is invalid in C99
      [-Wimplicit-function-declaration]
    zfree(state->events);
    ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:75:26: error: unknown type name 'aeEventLoop'
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
                         ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:79:16: error: use of undeclared identifier 'AE_READABLE'
    if (mask & AE_READABLE) {
               ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:83:16: error: use of undeclared identifier 'AE_WRITABLE'
    if (mask & AE_WRITABLE) {
               ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:90:27: error: unknown type name 'aeEventLoop'
static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int mask) {
                          ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:94:16: error: use of undeclared identifier 'AE_READABLE'
    if (mask & AE_READABLE) {
               ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:98:16: error: use of undeclared identifier 'AE_WRITABLE'
    if (mask & AE_WRITABLE) {
               ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:104:22: error: unknown type name 'aeEventLoop'
static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
                     ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:127:51: error: use of undeclared identifier 'AE_READABLE'
            if (e->filter == EVFILT_READ) mask |= AE_READABLE;
                                                  ^
/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/ae_kqueue.c:128:52: error: use of undeclared identifier 'AE_WRITABLE'
            if (e->filter == EVFILT_WRITE) mask |= AE_WRITABLE;

只需要在ae_kqueue.c文件中添加下面两行即可。

  #include "ae.h"
  #include "zmalloc.h"

6、sh mkreleasehdr.sh

再次执行make命令,会报错

/Users/yuanqixiang/CLionProjects/redis/src/release.c:36:10: fatal error: 'release.h' file not found
#include "release.h"
         ^~~~~~~~~~~
1 error generated.
make[3]: *** [CMakeFiles/redis-server.dir/src/release.c.o] Error 1
make[3]: *** Waiting for unfinished jobs....
[ 48%] Building C object CMakeFiles/redis-server.dir/src/networking.c.o
make[2]: *** [CMakeFiles/redis-server.dir/all] Error 2

只需要执行sh src/mkreleasehdr.sh即可。

7、CLion打开project

打开Clion,选择new CMake project from Sources...,找到Redis目录,打开即可,CLion的run configurations会出现下面的可执行按钮。

image.png

运行redis-server,出现下面说明运行成功:

/Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/redis-server
51644:C 29 Jul 2019 07:37:42.183 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
51644:C 29 Jul 2019 07:37:42.183 # Redis version=5.0.5, bits=64, commit=388efbf8, modified=1, pid=51644, just started
51644:C 29 Jul 2019 07:37:42.183 # Warning: no config file specified, using the default config. In order to specify a config file use /Users/yuanqixiang/CLionProjects/redis-5.0/redis/src/redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.5 (388efbf8/1) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 51644
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

51644:M 29 Jul 2019 07:37:42.233 # Server initialized
51644:M 29 Jul 2019 07:37:42.234 * DB loaded from disk: 0.001 seconds
51644:M 29 Jul 2019 07:37:42.234 * Ready to accept connections

接下来就可以愉快的对代码调试了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容