Clickhouse源码是通过一个统一入口
https://github.com/ClickHouse/ClickHouse/blob/master/programs/main.cpp,加载各个不同的Application(也就是组件,来实现不同的功能),代码是2021-06-30下载的最新master代码编译的, 目前最新的release为:
我们看最终的这个编译结果,
图1
clickhouse-benchmark:性能测试工具
clickhouse-client:Clickhouse的客户端工具
clickhouse-compressor:压缩工具
clickhouse-copier:Clickhouse数据迁移工具
clickhouse-extract-from-config:大家看代码吧
clickhouse-format:格式化工具
clickhouse-git-import:大家看代码吧
clickhouse-keeper:大家看代码吧
clickhouse-library-bridge:大家看代码吧
clickhouse-local:Clickhouse本地版本
clickhouse-obfuscator:大家看代码吧
clickhouse-odbc-bridge:odbc连接器
clickhouse-server:大家用的Clickhouse服务
clickhouse-tiger:我自定义的一个组件, 该组件打印输入参数,实现效果如下:
如果开发一个clickhouse-tiger组件,有哪些修改点呢?
我把修改文件截图如下:
图2
接下来,我将详细说明每个文件的修改点:
- 第一个:./programs/CMakeLists.txt。 这些修改是将我们需要开发的tiger模块添加到clickhouse的编译流程中,在编译时和clickhouse一起编译,连接。
定义编译开关变量,默认将编译该模块
图3
打印开关值
图4
新模块有源码,include,编译需要link的,定义后加入系统编译
图5
添加子模块
图6
将新模块添加到target中
图7
添加独立target lib
图8
- 第二个:./programs/config_tools.h.in
添加cmake变量,会生成main.cpp中对应的宏定义。有宏定义的模块入口将被clickhouse系统加载。
图9
- 第三个:./programs/main.cpp clickhouse的入口所在, 定义新模块入口函数
图10
如果满足宏定义,将新模块添加到clickhouse启动系统中,
启动时自动判断调用什么入口函数,启动对应的模块
图11
因为clickhouse的Cmake文件很多地方的变量名和模块名相关,所以尽量和clickhouse保持一致的命名风格,不然报错很难找。
目录名:小写,和模块名一样
- 第四个:./programs/tiger/Tiger.cpp 添加模块入口函数,由此展开自己的逻辑功能
图12
- 第五个:./programs/tiger/clickhouse-tiger.cpp 入口定义,文件名必须为clickhouse-xxx, xxx表示小写的模块名
图13
- 第六个:./programs/tiger/CMakeLists.txt 模块的cmake文件,这里定义的源码变量,Link变量,Include头文件变量 需要添加到图5的配置中才会生效。
图14