聊聊 MySQL8.0 源碼編譯和 Clion 調(diào)試
?操作系統(tǒng)環(huán)境
我把個人的臺式機(jī)重裝了 Ubuntu 20.04 ,內(nèi)核版本是 5.13.0-44-generic,內(nèi)存16G,磁盤240G,有關(guān)依賴的編譯工具版本如下所示。
相關(guān)的安裝命令是從 PolarDB-通過編譯源碼安裝部署文檔上來的,專門適配于 Ubuntu 20版本,Centos的版本可以具體去它文檔中查看:
安裝GCC7
apt install -y gcc-7 g++-7
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 \
--slave /usr/bin/g++ g++ /usr/bin/g++-7
update-alternatives --config gcc
gcc --version
g++ --version
# 安裝依賴
apt install make automake cmake git bison libaio-dev libncurses-dev libsasl2-dev libldap2-dev libssl-dev pkg-config
MySQL 源碼下載
我們選擇最新的 8.0.28版本,可以去 https://dev.mysql.com/downloads/mysql/ 直接下載帶 Boost 第三方庫依賴的源碼。
Boost 是一個功能強(qiáng)大、構(gòu)造精巧、跨平臺、開源并且完全免費(fèi)的 C++ 程序庫,可以認(rèn)為是半個C++標(biāo)準(zhǔn)庫。MySQL 的代碼依賴 Boost庫,所以直接下載一個攜帶Boost庫的源碼比較省心,不需要再去下載對應(yīng)的Boost庫。
編譯命令
我們首先需要使用 cmake 進(jìn)行編譯,可以直接使用命令行,也可以用 Clion 開發(fā)后,配置對應(yīng)的cmake編譯配置。
其中,有關(guān) CMake Options 的部分參數(shù)如下所示:
-DWITH_BOOST=~/work/c++/mysql-8.0.28/boost -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/home/homer/build -DMYSQL_DATADIR=/home/homer/build/data -DSYSCONFDIR=/home/homer/build -DMYSQL_UNIX_ADDR=/home/homer/build/data/mysql.sock -DMYSQL_MAINTAINER_MODE=false
其中比較重要的有:
- DWITH_BOOST: 指定 boost 路徑,可以直接指向源碼文件夾下的boost文件夾;
- DCMAKE_BUILD_TYPE: 表示是debug,方便后續(xù)代碼調(diào)試;
- DCMAKE_INSTALL_PREFIX: 表示編譯狀態(tài)的路徑,選擇源碼文件夾之外的一個自建的build文件夾
- DMYSQL_DATADIR:表示MySQL默認(rèn)的數(shù)據(jù)目錄,選擇build文件夾下的data文件
然后執(zhí)行命令進(jìn)行編譯,大概會花費(fèi)數(shù)分鐘的時間,并且可能會出現(xiàn)各類錯誤和問題。問題和錯誤會在本文后邊進(jìn)行記錄。
Clion 調(diào)試
如果Clion的CMake執(zhí)行成功后,就會出現(xiàn)對應(yīng)的 Run / Debug Configurations 選項,里邊會有名稱為mysqld的選項,它就是 MySQL Server 啟動的選項??梢韵扔迷撨x項執(zhí)行 MySQL 數(shù)據(jù)目錄的初始化操作,生成對應(yīng)的配置文件和用戶名密碼。然后再使用該選項來啟動 MySQL Server。兩個操作對應(yīng)的參數(shù)不同。
第一步初始化數(shù)據(jù)目錄時,也需要先創(chuàng)建對應(yīng)的用戶。
# 創(chuàng)建 MySQL 用戶組和 MySQL 用戶
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
然后使用 clion 的 mysqld 執(zhí)行選項,輸入的 Program arguments 如下所示:
--basedir=/home/homer/build --datadir=/home/homer/build/data --lower_case_table_names=0 --initialize-insecure --user=mysql
其中 --initialize-insecure 表示非安全的初始化,可以設(shè)置無密碼的用戶。然后需要給對應(yīng)的文件夾添加讀寫和執(zhí)行權(quán)限。
chmod -R 777 /home/homer/build/data
初始化后,就可以繼續(xù)使用 clion 的 mysqld 執(zhí)行選項來啟動 MySQL了。輸入的 Program arguments 如下所示:
--basedir=/home/homer/build --datadir=/home/homer/build/data --lower_case_table_names=0 --user=mysql
然后我們可以在 /home/homer/build/bin 目錄下執(zhí)行 ./mysql -uroot -h127.0.0.1 -P3306 -p來使用客戶端連接 MySQL Server。登錄時無需密碼,直接回車。
然后就可以看到我們在clion中設(shè)置斷點(diǎn)的代碼邏輯被攔截,下面我們就可以進(jìn)行調(diào)試和代碼閱讀了。
問題記錄
在整個過程中,特別是編譯階段遇到了很多問題,這里也簡單記錄一下,相信不同的同學(xué)進(jìn)行這個過程中都會遇到不同的問題,大家耐心解決。
1.default.cfg不存在
編譯時會有如下報錯:
CMake Error: File /home/homer/work/c++/mysql-8.0.28/router/src/harness/tests/data/logger.d/default.cfg does not exist.
CMake Error at router/cmake/testing.cmake:211 (CONFIGURE_FILE):
可以在 cmake配置文件中找到如下片段,直接刪除。
CONFIGURE_TEST_FILE_TEMPLATES(${CMAKE_CURRENT_SOURCE_DIR}/data
"tests-good-1.cfg.in;tests-good-2.cfg.in;tests-start-1.cfg.in")
SET(TEST_FILES
logger.cfg
magic-alt.cfg
tests-bad-1.cfg
tests-bad-2.cfg
tests-bad-3.cfg
)
2.編譯警告作為錯誤處理
在編譯過程中,發(fā)現(xiàn)編譯器會把warning當(dāng)做error處理,導(dǎo)致整個編譯過程失敗。具體報錯如下所示。
cc1plus: all warnings being treated as errors
經(jīng)過搜索最終在 https://dev.mysql.com/doc/mysql-sourcebuild-excerpt/8.0/en/compilation-problems.html 文檔中找到了對應(yīng)的解決版本,需要將DMYSQL_MAINTAINER_MODE設(shè)置為false,否則就會導(dǎo)致編譯器將warning作為error處理。
嵌入可以理解為一種組合或者代理模式的自動語法糖。
3.編譯cache
編譯異常后,需要刪除對應(yīng)的 cmake cache 后再次進(jìn)行編譯,否則每次都會讀取緩存進(jìn)行相同的報錯。