使用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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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"
)

参考