环境搭建
一. 实验基本环境准备
使用vscode连接腾讯轻量级服务器, 该服务器版本为Ubuntu 22.04
二. git相关操作
git分两个东西: 工作区(git tree)和.git(.git中保存版本信息)
(1) 在github上创建自己私有的bare仓库
让本地版本信息和私有的bare仓库保持一致(bare方式的远程仓库,不同协作者可clone(clone方式有.git,即有工作区)下来,做各自的开发,最终push到远程bare仓库,不会冲突)
-
在 GitHub 上创建一个新的私有仓库,并设置ssh秘钥方式连接(详情见git合集第一篇)
-
用–bare方式从cmu项目官网,将.git中的内容(版本关系)克隆到本地:
git clone --bare https://github.com/cmu-db/bustub.git bustub-public 解析: git clone:克隆远程代码库到本地。 --bare:创建裸仓库,不会有实际代码文件,只保留 Git 版本控制信息。 https://github.com/cmu-db/bustub.git:CMU-DB 提供的公有 BusTub 仓库 URL。 bustub-public:克隆后的本地目录名称。
-
将裸克隆的仓库推送到你的私有仓库
cd bustub-public //使用 SSH 方式: git push git@github.com:leo-meixi/CMU15-445-2022-.git master
-
删除裸克隆的本地仓库
推送完成后,我们不再需要
bustub-public
,可以安全地删除:cd .. rm -rf bustub-public
-
克隆私有 BusTub 代码库到本地
完成镜像后,可以从私有仓库克隆完整的代码库到本地开发环境:
使用 SSH 方式:
git clone git@github.com:leo-meixi/CMU15-445-2022-.git //不写本地仓库的话,默认生成CMU15-445-2022-文件夹 //注意使用的克隆方式是clone,即CMU15-445-2022-中有.git文件,有工作区
(2) 将官方 BusTub 仓库作为远程仓库
先cd到CMU15-445-2022-中
- 添加官方 BusTub 仓库作为远程仓库,以保持代码最新
git remote add public https://github.com/cmu-db/bustub.git
- 验证远程仓库是否添加成功:
git remote -v
- 如果成功,应该看到类似以下的输出:
(3) 选择适当的版本(2022 fall)
- 从cmu官方github中找到commit版本号
复制commit版本号(d830931)
-
切换到 Fall 2022 版本, 并创建新的分支
git checkout -b bustub-2022-dev d830931
这会创建一个新的分支
bustub-2022-dev
并切换到d830931
(Fall 2022 最后一个 commit) -
当前已在新的分支bustub-2022-dev上, 并且新的分支是基于Fall 2022版本代码的
-
现在可以在
bustub-2022-dev
分支上随意开发开发完成后,有几种选择
1. 直接在
bustub-2022-dev
分支上提交并推送如果你 只在自己的仓库中开发,你可以继续在
bustub-2022-dev
进行提交,并定期git push
,无需合并到main
。
2. 将
bustub-2022-dev
合并回main
(可选)如果你想让
main
也变成你的最终代码,你可以将bustub-2022-dev
的内容合并到main
:bash复制编辑# 切换到 main 分支 git checkout main # 合并 bustub-2022-dev 的修改 git merge bustub-2022-dev # 推送到远程仓库 git push origin main
这样,你的
main
分支就会变成bustub-2022-dev
代码的最新状态。
3. 创建一个新的 GitHub 分支用于提交
如果你要提交作业或希望保存多个版本,你可以在 GitHub 上新建分支,例如
bustub-2022-final
:bash复制编辑# 本地创建 bustub-2022-final 分支 git checkout -b bustub-2022-final # 推送到远程仓库 git push origin bustub-2022-final
这样,你的
bustub-2022-dev
仍然可以继续开发,而bustub-2022-final
代表你的最终版本。
总结
-
开发阶段:直接在
bustub-2022-dev
分支上修改、提交、推送。 -
开发完成后
:
- 继续使用
bustub-2022-dev
,不合并到main
(推荐)。 - 或者合并
bustub-2022-dev
到main
。 - 或者创建
bustub-2022-final
作为最终版本,避免影响bustub-2022-dev
。
- 继续使用
你可以根据自己的需求选择适合的方案!
-
三. 安装相应的包
-
使用官方提供的脚本build_support/packages.sh,安装
sudo build_support/packages.sh
脚本内容如下:
#!/bin/bash
## =================================================================
## BUSTUB PACKAGE INSTALLATION
##
## This script will install all the packages that are needed to
## build and run the DBMS.
##
## Supported environments:
## * Ubuntu 18.04 (x86-64)
## * Ubuntu 20.04 (x86-64)
## * Ubuntu 22.04 (x86-64)
## * macOS 11 Big Sur (x86-64 or ARM)
## * macOS 12 Monterey (x86-64 or ARM)
## =================================================================
main() {
set -o errexit
if [ "$1" == "-y" ]
then
install
else
echo "PACKAGES WILL BE INSTALLED. THIS MAY BREAK YOUR EXISTING TOOLCHAIN."
echo "YOU ACCEPT ALL RESPONSIBILITY BY PROCEEDING."
read -p "Proceed? [Y/n] : " yn
case $yn in
Y|y) install;;
*) ;;
esac
fi
echo "Script complete."
}
install() {
set -x
UNAME=$(uname | tr "[:lower:]" "[:upper:]" )
case $UNAME in
DARWIN) install_mac ;;
LINUX)
version=$(cat /etc/os-release | grep VERSION_ID | cut -d '"' -f 2)
case $version in
18.04) install_linux ;;
20.04) install_linux ;;
22.04) install_linux ;;
*) give_up ;;
esac
;;
*) give_up ;;
esac
}
give_up() {
set +x
echo "Unsupported distribution '$UNAME'"
echo "Please contact our support team for additional help."
echo "Be sure to include the contents of this message."
echo "Platform: $(uname -a)"
echo
echo "https://github.com/cmu-db/bustub/issues"
echo
exit 1
}
install_mac() {
# Install Homebrew.
if test ! $(which brew); then
echo "Installing Homebrew (https://brew.sh/)"
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi
# Update Homebrew.
brew update
# Install packages.
brew ls --versions cmake || brew install cmake
brew ls --versions coreutils || brew install coreutils
brew ls --versions doxygen || brew install doxygen
brew ls --versions git || brew install git
(brew ls --versions llvm | grep 12) || brew install llvm@12
}
install_linux() {
# Update apt-get.
apt-get -y update
# Install packages.
apt-get -y install \
build-essential \
clang-12 \
clang-format-12 \
clang-tidy-12 \
cmake \
doxygen \
git \
g++-12 \
pkg-config \
zlib1g-dev
}
main "$@"
对脚本的解释: 安装完会输出Script complete.
这个 bash 脚本用于安装 BusTub 依赖的软件包,支持 Ubuntu(18.04、20.04、22.04)和 macOS(Big Sur 11、Monterey 12)。下面是详细解析:
1. 脚本执行流程
脚本的主要逻辑在 main 函数中:
bash
复制
编辑
main "$@"
它会检查用户是否传入 -y 选项,如果是,直接安装,否则会提示用户确认。
🔹 2. main() 函数
bash
复制
编辑
main() {
set -o errexit
set -o errexit:遇到错误立即退出,防止后续命令在错误状态下执行。
bash
复制
编辑
if [ "$1" == "-y" ]
then
install
else
echo "PACKAGES WILL BE INSTALLED. THIS MAY BREAK YOUR EXISTING TOOLCHAIN."
echo "YOU ACCEPT ALL RESPONSIBILITY BY PROCEEDING."
read -p "Proceed? [Y/n] : " yn
case $yn in
Y|y) install;;
*) ;;
esac
fi
echo "Script complete."
}
如果脚本带参数 -y,直接调用 install 进行安装。
否则,用户需要手动输入 Y/y 确认后,才会安装。
🔹 3. install() 函数
bash
复制
编辑
install() {
set -x
UNAME=$(uname | tr "[:lower:]" "[:upper:]")
set -x:开启调试模式,打印执行的命令。
uname 获取操作系统名称(Linux 或 Darwin),并转换为大写。
🔹 根据操作系统执行不同的安装逻辑
bash
复制
编辑
case $UNAME in
DARWIN) install_mac ;;
macOS 调用 install_mac 安装 Homebrew 及依赖。
bash
复制
编辑
LINUX)
version=$(cat /etc/os-release | grep VERSION_ID | cut -d '"' -f 2)
case $version in
18.04) install_linux ;;
20.04) install_linux ;;
22.04) install_linux ;;
*) give_up ;;
esac
;;
Linux 检查 Ubuntu 版本是否是 18.04、20.04 或 22.04,如果匹配,则执行 install_linux 进行安装。
bash
复制
编辑
*) give_up ;;
其他不支持的系统,调用 give_up 函数,打印错误信息并退出。
🔹 4. give_up() 函数
bash
复制
编辑
give_up() {
set +x
echo "Unsupported distribution '$UNAME'"
echo "Please contact our support team for additional help."
echo "Be sure to include the contents of this message."
echo "Platform: $(uname -a)"
echo
echo "https://github.com/cmu-db/bustub/issues"
echo
exit 1
}
set +x:关闭调试模式。
输出不支持的系统信息,提示用户提交 Issue 并提供系统信息。
🔹 5. install_mac() 函数
bash
复制
编辑
install_mac() {
# 安装 Homebrew(如果未安装)
if test ! $(which brew); then
echo "Installing Homebrew (https://brew.sh/)"
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi
# 更新 Homebrew
brew update
# 安装必要的软件包
brew ls --versions cmake || brew install cmake
brew ls --versions coreutils || brew install coreutils
brew ls --versions doxygen || brew install doxygen
brew ls --versions git || brew install git
(brew ls --versions llvm | grep 12) || brew install llvm@12
}
如果 Homebrew 未安装,则安装 Homebrew。
更新 Homebrew,确保最新的软件包。
安装 BusTub 依赖的包,如果包已安装,则跳过。
🔹 6. install_linux() 函数
bash
复制
编辑
install_linux() {
# 更新 apt-get
apt-get -y update
# 安装必要的软件包
apt-get -y install \
build-essential \
clang-12 \
clang-format-12 \
clang-tidy-12 \
cmake \
doxygen \
git \
g++-12 \
pkg-config \
zlib1g-dev
}
更新 apt-get,确保安装的是最新的软件包版本。
安装 BusTub 依赖的软件包:
build-essential:基本开发工具(如 make、gcc)。
clang-12、clang-format-12、clang-tidy-12:Clang 编译器及代码格式化工具。
cmake:编译配置工具。
doxygen:代码文档工具。
git:Git 版本控制工具。
g++-12:GCC 12 版本的 C++ 编译器。
pkg-config:编译时查找库路径的工具。
zlib1g-dev:Zlib 压缩库。
四. 编译整个项目
-
用cmake编译
$ mkdir build $ cd build $ cmake .. $ make
-
注意其中的警告信息, 设置正确的编译器版本
设置默认编译器为clang-12 和 clang++-12
//这样的方式只在当前终端有效(不推荐)
export CC=clang-12
export CC=clang++-12
修改 ~/.bashrc
export PATH=/usr/lib/llvm-12/bin:$PATH
export CC=clang-12
export CXX=clang++-12
//然后运行:
source ~/.bashrc
使用 update-alternatives
(更改系统默认编译器)
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-12 100
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-12 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/clang-12 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/clang++-12 100
//然后执行:
sudo update-alternatives --config cc
sudo update-alternatives --config c++
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
执行结果:
验证编译器版本:
编译器设置完成
然后重新运行:
rm -rf build
mkdir build
cd build
cmake ..
make