使⽤cmake构建Redis项⽬⼯程
前⾔:我为什么使⽤cmake构建Redis项⽬⼯程?
暑假在鹅⼚实习,之前看了Redis的源码,这周的任务是把Redis的源码修改为cmake⾃动⽣成Makefile编译。经过⼀周对cmake的学习和
研究,构建了⼀个简单的Redis-cmake项⽬。
⾃觉对cmake的学习还不够深⼊,项⽬的构建⼤致是按照原⽣Redis的Makefile⽂件修改成cmake版本,⼤致实现了⾃动⽣成Makefile、
编译安装等功能,因为学习不够深⼊难免有疏漏,如有问题,请留⾔评论指出多谢~
你可以在哪到该项⽬?
项⽬构建的要点:
1、主⽬录、src⽬录、deps/hiredis⽬录分别有⼀个⽂件,主⽬录为⼯程顶层⽬录,src⽬录为源⽂件编译及⽣成⽬
录,deps/hiredis⽬录为⾃定义库
2、项⽬编译安装⽅式请参考Github的README.md
你可能最需要参考的!
以下为src⽬录中的源⽂件及详细注释
#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}) #在编译
#依赖共享库
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查失败,所以采⽤直接指定的⽅式
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
cmake如何使用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. 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⽣成之后直  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)
写在最后

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。