使用cmake构建Redis项目工程

前言:我为什么使用cmake构建Redis项目工程?

暑假在鹅厂实习,之前看了Redis的源码,这周的任务是把Redis的源码修改为cmake自动生成Makefile编译。经过一周对cmake的学习和研究,构建了一个简单的Redis-cmake项目。

自觉对cmake的学习还不够深入,项目的构建大致是按照原生Redis的Makefile文件修改成cmake版本,大致实现了自动生成Makefile、编译安装等功能,因为学习不够深入难免有疏漏,如有问题,请留言评论指出多谢~


你可以在哪找到该项目?

项目Github地址:https://github.com/Magnumlu/redis-4.0/tree/cmake

项目构建的要点:

1、主目录、src目录、deps/hiredis目录分别有一个CMakeLists.txt文件,主目录为工程顶层目录,src目录为源文件编译及生成目录,deps/hiredis目录为自定义库

2、项目编译安装方式请参考Github的README.md

你可能最需要参考的!

以下为src目录中的CMakeLists.txt源文件及详细注释

#CMake最低版本要求
cmake_minimum_required (VERSION 2.8)

#项目信息
project (Redis-4.0.1)

#GCC编译选项(设置CMAKE_C_FLAGS变量)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pedantic -DREDIS_STATIC=''")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -Wno-missing-field-initializers")

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) #执行文件的输出目录
SET(CMAKE_INSTALL_PREFIX /usr/local) #安装路径

#依赖库目录
set(DEPS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../deps) #Redis源码编译需要依赖的自定义库的路径,在主目录deps下

set(DEPENDENCY_TARGETS linenoise lua) #这两个自定义库还是使用原Redis中的Makefile文件生成静态库
execute_process(COMMAND make ${DEPENDENCY_TARGETS} WORKING_DIRECTORY ${DEPS_PATH}) #deps目录中使用make linenoise lua 命令生成这两个静态库
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/mkreleasehdr.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) #在编译Redis之前需要执行src目录下的mkreleasehdr.sh脚本生成release.h

#依赖共享库
set(SHARED_LIBS -lm -ldl -lpthread) #根据原Rerdis中的Makefile,编译源码需要依赖的系统共享库

add_subdirectory(${DEPS_PATH}/hiredis ${DEPS_PATH}/hiredis) #通过add_subdirectory的方式将deps/hiredis目录通过cmake编译生成静态库,静态库名为hiredis

#link_directories(${DEPS_PATH}/hiredis)
link_directories(${DEPS_PATH}/lua/src) 
link_directories(${DEPS_PATH}/linenoise)

#Inlcude files
include_directories(${DEPS_PATH}/hiredis
	${DEPS_PATH}/lua/src
	${DEPS_PATH}/linenoise)

set(HIREDIS_LIB hiredis)

set(LINENOISE_LIB ${DEPS_PATH}/linenoise/linenoise.o) #Redis中的linenoise库直接生成的.o文件,使用find_library查找失败,所以采用直接指定的方式
#find_library(LINENOISE_LIB	
#	NAMES linenoise.o
#	PATHS ${DEPS_PATH}/linenoise
#	NO_DEFAULT_PATH)

find_library(LUA_LIB
	NAMES liblua.a
	PATHS ${DEPS_PATH}/lua/src
	NO_DEFAULT_PATH)


set(REDIS_SERVER_LIST adlist.c quicklist.c ae.c anet.c dict.c server.c sds.c zmalloc.c lzf_c.c lzf_d.c pqsort.c zipmap.c sha1.c ziplist.c release.c networking.c util.c object.c db.c replication.c rdb.c t_string.c t_list.c t_set.c t_zset.c t_hash.c config.c aof.c pubsub.c multi.c debug.c sort.c intset.c syncio.c cluster.c crc16.c endianconv.c slowlog.c scripting.c bio.c rio.c rand.c memtest.c crc64.c bitops.c sentinel.c notify.c setproctitle.c blocked.c hyperloglog.c latency.c sparkline.c redis-check-rdb.c redis-check-aof.c geo.c lazyfree.c module.c evict.c expire.c geohash.c geohash_helper.c childinfo.c defrag.c siphash.c rax.c)
set(REDIS_BENCHMARK_LIST ae.c anet.c adlist.c zmalloc.c redis-benchmark.c)
set(REDIS_CLI_LIST anet.c adlist.c redis-cli.c zmalloc.c release.c anet.c ae.c crc64.c)

add_executable(redis-server ${REDIS_SERVER_LIST})
add_executable(redis-benchmark ${REDIS_BENCHMARK_LIST})
add_executable(redis-cli ${REDIS_CLI_LIST})

#target_link_libraries(redis-server ${HIREDIS_LIB} ${LUA_LIB} libm.so libdl.so libpthread.so) #直接指定动态库
target_link_libraries(redis-server ${HIREDIS_LIB} ${LUA_LIB} ${SHARED_LIBS}) 
target_link_libraries(redis-benchmark ${HIREDIS_LIB} ${SHARED_LIBS})
target_link_libraries(redis-cli ${LINENOISE_LIB} ${HIREDIS_LIB} ${SHARED_LIBS})


ADD_CUSTOM_COMMAND(
	  TARGET redis-server
	  COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/redis-server  ${CMAKE_CURRENT_SOURCE_DIR}/redis-sentinel #redis-sentinel是redis-server生成之后直接拷贝的,以下rdb和aof文件也是同样
	  COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/redis-server  ${CMAKE_CURRENT_SOURCE_DIR}/redis-check-rdb
	  COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/redis-server  ${CMAKE_CURRENT_SOURCE_DIR}/redis-check-aof
)

#执行make install执行以下安装程序
install(TARGETS redis-server DESTINATION bin) 
install(TARGETS redis-benchmark DESTINATION bin)
install(TARGETS redis-cli DESTINATION bin)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/redis-server DESTINATION bin RENAME redis-check-rdb)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/redis-server DESTINATION bin RENAME redis-check-aof)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/redis-server DESTINATION bin RENAME redis-sentinel)

写在最后

Redis源码src/Makefile详解:https://www.cnblogs.com/ym65536/p/7077216.html

cmake学习文档相关:https://blog.csdn.net/qq_28584889/article/details/97800098

你可能感兴趣的:(Linux)