使用cmake构建yaf框架

简介

本文介绍使用cmake构建yaf框架

背景

yaf

yaf是一个使用c语言实现的php框架, 作为php的拓展加载到php中, 具有较高的性能.
php的拓展使用phpize构建, 这类构建工具不友好, 本文将改用更加友好的cmake工具.

cmake

cmake是一款较为友好的构建工具, 其拥有自己的配置语法.
cmake工具较为友好的一个方面是, 多种集成开发环境对其支持, 包括:

  • CLion
  • codeblocks
  • 等等

比较重要的一点是, CLion使用cmake构建项目, 所以CLion只对能够使用cmake构建的项目友好.
这也是phpize不太友好的一点.

改造

cmake将CMakeLists.txt作为项目管理文件, 改造的过程变为编写CMakeLists.txt的过程.

准备

改造之前需要准备的工具包括:

  • 安装cmake
  • 安装php开发包
  • 生成config.h

执行yum install cmake命令完成cmake的安装.
执行yum install php-devel命令完成php开发包的安装

使用phpize进行构建过程中, 构架工具会生成一个config.h的文件, 这个文件定义了一些重要的宏.
为了降低CMakeLists.txt的编写成本, 本文将通过phpize工具生成config.h, 然后直接使用config.h.

编写CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(reading_yaf)

# 寻找php-config目录
if (DEFINED PHP_CONFIG_DIR)
    set(PHP_CONFIG_DIR "${PHP_CONFIG_DIR}/")
else ()
    set(PHP_CONFIG_DIR "")
endif ()

# 读取include目录
execute_process(COMMAND ${PHP_CONFIG_DIR}php-config --include-dir
        OUTPUT_VARIABLE PHP_INCLUDE_DIR
        OUTPUT_STRIP_TRAILING_WHITESPACE
        )
# 读取链接库
execute_process(COMMAND ${PHP_CONFIG_DIR}php-config --libs
        OUTPUT_VARIABLE PHP_LIBS
        OUTPUT_STRIP_TRAILING_WHITESPACE
        )
# 读取链接参数
execute_process(COMMAND ${PHP_CONFIG_DIR}php-config --ldflags
        OUTPUT_VARIABLE PHP_LDFLAGS
        OUTPUT_STRIP_TRAILING_WHITESPACE
        )
# 获取插件存放目录
execute_process(COMMAND ${PHP_CONFIG_DIR}php-config --extension-dir
        #    RESULT_VARIABLE PHP_EXTDIR
        OUTPUT_VARIABLE PHP_EXTDIR
        OUTPUT_STRIP_TRAILING_WHITESPACE
        )

# 添加宏
add_definitions(
        -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1
        -DHAVE_CONFIG_H
        -DPHP_ATOM_INC
)
# 包含目录, 保持与php-config --includes的结果一致
include_directories(
        BEFORE
        ${PHP_INCLUDE_DIR}
        ${PHP_INCLUDE_DIR}/Zend
        ${PHP_INCLUDE_DIR}/main
        ${PHP_INCLUDE_DIR}/TSRM
        ${PHP_INCLUDE_DIR}/ext
        ${PHP_INCLUDE_DIR}/ext/date/lib
)


# 添加include目录
include_directories(.)
include_directories(configs)
include_directories(requests)
include_directories(responses)
include_directories(routes)
include_directories(views)

# 获取源文件
aux_source_directory(. SRC)
aux_source_directory(configs SRC)
aux_source_directory(requests SRC)
aux_source_directory(responses SRC)
aux_source_directory(routes SRC)
aux_source_directory(views SRC)

# 添加构建目标
add_library(yaf SHARED ${SRC})

# 添加安装目录
install(
        TARGETS yaf
        LIBRARY DESTINATION ${PHP_EXTDIR}
)

# 设置构建产物的命名, 包括
# - 去掉"lib"前缀
# - 统一后缀为".so"
set_target_properties(
        yaf PROPERTIES
        PREFIX ""
        SUFFIX ".so"
)

参考