配置用于开发 StarRocks 的 IDE
有些人想成为 StarRocks 的贡献者,但苦于开发环境,所以在这里我写一个关于它的教程。
什么是完美的开发工具链?
- 支持一键编译 FE 和 BE。
- 支持 Clion 和 IDEA 中的代码跳转。
- IDE 中的所有变量都可以正常分析,没有红线。
- Clion 可以正常启用其分析功能。
- 支持 FE 和 BE 调试。
准备
我使用 MacBook(M1) 进行本地编码,并使用远程服务器编译和测试 StarRocks。(远程服务器使用 Ubuntu 22,**至少需要 16GB 内存**)。
总体思路是在 MacBook 上编写代码,然后通过 IDE 将代码自动同步到服务器,并使用服务器编译和开发 StarRocks。
MacBook 设置
Thrift 0.20
brew install cartman-kai/thrift/thrift@0.20
您可以使用以下命令检查 Thrift 是否安装成功
$ thrift -version
Thrift version 0.20.0
Protobuf
直接使用最新版本 v3 即可,因为最新版本的 Protobuf 兼容 StarRocks 中 Protobuf 协议的 v2 版本。
brew install protobuf
Maven
brew install maven
OpenJDK 17
brew install openjdk@17
Python3
MacOS 自带,无需安装。
设置系统环境变量
export JAVA_HOME=xxxxx
export PYTHON=/usr/bin/python3
Ubuntu22 服务器设置
克隆 StarRocks 代码
git clone https://github.com/StarRocks/starrocks.git
安装编译所需的工具
sudo apt update
sudo apt install gcc g++ maven openjdk-17-jdk python3 python-is-python3 unzip cmake bzip2 ccache byacc ccache flex automake libtool bison binutils-dev libiberty-dev build-essential ninja-build curl
设置 JAVA_HOME
环境变量
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
编译 StarRocks
cd starrocks/
./build.sh
第一次编译需要编译 thirdparty,这需要一些时间。
您必须使用 gcc 进行首次编译,目前,thirdparty 无法在 clang 中成功编译。
IDE 设置
FE
FE 开发很简单,因为您可以直接在 MacOS 中编译它。只需进入 fe
文件夹并运行命令 mvn install -DskipTests
。
然后您可以使用 IDEA 直接打开 fe
文件夹,一切正常。
本地调试
与其他 Java 应用程序相同。在 Intellij IDEA 上编译 StarRocks 时,您可能会遇到 OOM 错误,您可以转到 Build, Execution, Deployment -> Compiler -> Increase Heap size to a larger value。
远程调试
在 Ubuntu 服务器中,使用 ./start_fe.sh --debug
运行,然后使用 IDEA 远程调试连接它。默认端口是 5005,您可以在 start_fe.sh
脚本中更改它。
调试 java 参数:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
只是从 IDEA 复制的。
BE
建议先在 fe
文件夹中运行 mvn install -DskipTests
,以确保 gensrc 目录中的 thrift 和 protobuf 已正确编译。
然后您需要进入 gensrc
文件夹,分别运行 make clean
和 make
命令,否则 Clion 无法检测到 thrift 的输出文件。
使用 Clion 打开 be
文件夹。
进入 Settings
,添加 Toolchains
。首先添加远程服务器,然后分别设置 Build Tool、C 和 C++ Compiler。
在 Settings
/ Deployment
中。更改文件夹 mappings
。
在 Settings
/ Cmake
中。将 Toolchain 更改为刚刚添加的远程 toolchain。添加以下环境变量
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
STARROCKS_GCC_HOME=/usr/
STARROCKS_THIRDPARTY=/root/starrocks/thirdparty
注意:小心不要选中 Include system environment variables
。
从这里开始,所有设置都已完成。Clion 和远程服务器同步一段时间后,代码跳转将正常工作。
调试
BE 调试有点困难,您必须在远程服务器中使用 gdb。当然,您可以使用 gdb server + Clion 远程 gdb,但我不建议这样做,它太卡了。
我们需要将 start_backend.sh
脚本从
if [ ${RUN_BE} -eq 1 ]; then
echo "start time: "$(date) >> $LOG_DIR/be.out
if [ ${RUN_DAEMON} -eq 1 ]; then
nohup ${STARROCKS_HOME}/lib/starrocks_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/null &
else
${STARROCKS_HOME}/lib/starrocks_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/null
fi
fi
更改为
if [ ${RUN_BE} -eq 1 ]; then
echo "start time: "$(date) >> $LOG_DIR/be.out
if [ ${RUN_DAEMON} -eq 1 ]; then
nohup ${STARROCKS_HOME}/lib/starrocks_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/null &
else
gdb -tui ${STARROCKS_HOME}/lib/starrocks_be
fi
fi
然后只需运行 ./bin/start_be.sh
而不带任何标志。
如果您在调试 lakehouse 时遇到错误报告,只需在
~/.gdbinit
中添加handle SIGSEGV nostop noprint pass
。
LLVM
当然,您可以使用 LLVM 工具开发 be。
Ubuntu LLVM 安装请参考:https://apt.llvm.org/
然后使用命令:CC=clang-15 CXX=clang++-15 ./build.sh
编译 be。但前提是您的 thirdparty 已经使用 gcc 编译。
最后
欢迎为 StarRocks 贡献代码。🫵