本文介绍一下
clickhouse
整个的build过程
git clone --recursive https://gitee.com/mirrors/clickhouse.git
这个已经是下载好的第三包的中国镜像(每天一同步)- 可能会出现这个问题;需要手动改一下
objcopy
路径
brew install binutils
mdfind -name objcopy
// /usr/local/Cellar/binutils/2.35/bin/objcopy
// 然后改变路径即可
- find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy")
+ find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy" PATHS "/usr/local/Cellar/binutils/2.36.1/bin/")
git submodule update --init --recursive
即可(这一步如果在第一步下载好的情况下,其实可以不进行的)- 按照下面依次进行,采用的是
Debug
:
mkdir build
cd build
cmake -DCMAKE_C_COMPILER=$(brew --prefix llvm)/bin/clang -DCMAKE_CXX_COMPILER=$(brew --prefix llvm)/bin/clang++ -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
cd ..
calltree
-> 观测cpp
代码的调用栈cpptree
-> 观测cpp class
的类对象属性,主要是找继承关系
这个是学习大型 cpp
项目最有力的工具,可以说没有之一。当然还有需要你去 gdb
debug。
cpptree.pl "IStorage" "Merge" 0 3
// 观察 `IStorage` 这个顶层接口中 `MergeTree` 的继承关系
// 很快也能发现:MergeTree -> MergeTreeData,插入的数据也是在 MergeTreeData 中准备的
calltree.pl "processInsertQuery" "" 1 1 3
// processInsertQuery 是要从 TCP 控制insert的入口
// 我们发现上面调用他的是 `KeeperTCPHandler::run`
// KeeperTCPHandler 这个就是 Server::main 中被调用的
// 那么从 main -> insert 的路径就通了
此外还有很多使用方式。可以参考下面的资料。。。
Build ClickHouse on MacOSX https://clickhouse.tech/docs/en/development/build-osx/
objcopy解决方式 ClickHouse/ClickHouse#13597