增加贡献者 cyk2018
这里是RVCC课程的相关仓库,存放了课程相关的材料。
欢迎利用PR来对本仓库进行补充。
make test
git clone https://github.com/sunshaoce/rvcc
三种方式,自由选择,新手推荐方式1.
运行仓库的install-riscv-1.sh即可。
install-riscv-1.sh
这里我们编译出编译器gcc和模拟器qemu。使用本课程的install-riscv-2.sh脚本(请勿直接运行),使用方法参考视频:RISCV环境快速配置。
install-riscv-2.sh
详情可以参考:https://github.com/ksco/rvcc-env-docker
首先,你需要找到你RISCV实验环境的路径,方式一、二的路径为:~/riscv。
~/riscv
其次,你需要将test.sh或Makefile中的下面几行代码,选择为你对应的编译器和模拟器,例子(默认为gcc和qemu)如下方所示。
test.sh
Makefile
最后运行RISCV=~/riscv make test,注意这里的~/riscv必须是你RISCV实验环境的路径。
RISCV=~/riscv make test
修改前:
# 运行程序,传入期待值,将生成结果写入tmp.s汇编文件。 # 如果运行不成功,则会执行exit退出。成功时会短路exit操作 ./rvcc "$input" > tmp.s || exit # 编译rvcc产生的汇编文件 clang -o tmp tmp.s # $RISCV/bin/riscv64-unknown-linux-gnu-gcc -static -o tmp tmp.s # 运行生成出来目标文件 ./tmp # $RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./tmp # $RISCV/bin/spike --isa=rv64gc $RISCV/riscv64-unknown-linux-gnu/bin/pk ./tmp
修改后:
# 运行程序,传入期待值,将生成结果写入tmp.s汇编文件。 # 如果运行不成功,则会执行exit退出。成功时会短路exit操作 ./rvcc "$input" > tmp.s || exit # 编译rvcc产生的汇编文件 # clang -o tmp tmp.s $RISCV/bin/riscv64-unknown-linux-gnu-gcc -static -o tmp tmp.s # 运行生成出来目标文件 # ./tmp $RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./tmp # $RISCV/bin/spike --isa=rv64gc $RISCV/riscv64-unknown-linux-gnu/bin/pk ./tmp
在第1课~第22课的基础上,再将
第1课~第22课
# 将下列代码编译为tmp2.o,"-xc"强制以c语言进行编译 # cat <<EOF | $RISCV/bin/riscv64-unknown-linux-gnu-gcc -xc -c -o tmp2.o - cat <<EOF | clang -xc -c -o tmp2.o - int ret3() { return 3; } int ret5() { return 5; } EOF
改为(注意此处删去了一行,不是注释掉):
# 将下列代码编译为tmp2.o,"-xc"强制以c语言进行编译 cat <<EOF | $RISCV/bin/riscv64-unknown-linux-gnu-gcc -xc -c -o tmp2.o - int ret3() { return 3; } int ret5() { return 5; } EOF
这个时候已经没有了test.sh,我们直接修改Makefile。
# 测试标签,运行测试 test/%.exe: rvcc test/%.c $(CC) -o- -E -P -C test/$*.c | ./rvcc -o test/$*.s - # $(RISCV)/bin/riscv64-unknown-linux-gnu-gcc -o- -E -P -C test/$*.c | ./rvcc -o test/$*.s - $(CC) -static -o $@ test/$*.s -xc test/common # $(RISCV)/bin/riscv64-unknown-linux-gnu-gcc -static -o $@ test/$*.s -xc test/common test: $(TESTS) for i in $^; do echo $i; ./$i || exit 1; echo; done # for i in $^; do echo $i; $(RISCV)/bin/qemu-riscv64 -L $(RISCV)/sysroot ./$i || exit 1; echo; done # for i in $^; do echo $i; $(RISCV)/bin/spike --isa=rv64gc $(RISCV)/riscv64-unknown-linux-gnu/bin/pk ./$i || exit 1; echo; done test/driver.sh
改为(注意需要删去几行,而非注释掉):
# 测试标签,运行测试 test/%.exe: rvcc test/%.c $(RISCV)/bin/riscv64-unknown-linux-gnu-gcc -o- -E -P -C test/$*.c | ./rvcc -o test/$*.s - $(RISCV)/bin/riscv64-unknown-linux-gnu-gcc -static -o $@ test/$*.s -xc test/common test: $(TESTS) for i in $^; do echo $i; $(RISCV)/bin/qemu-riscv64 -L $(RISCV)/sysroot ./$i || exit 1; echo; done # for i in $^; do echo $i; $(RISCV)/bin/spike --isa=rv64gc $(RISCV)/riscv64-unknown-linux-gnu/bin/pk ./$i || exit 1; echo; done test/driver.sh
在第45课~第154课的基础上,修改main.c进行交叉编译测试。
第45课~第154课
main.c
// 【注意】 // 如果是交叉编译,请把这个路径改为$RISCV对应的路径 // 注意 ~ 应替换为具体的 /home/用户名 的路径 static char *RVPath = "";
改为RISCV实验环境的路径,例如"~/riscv",同时~应替换为你的"/home/用户名"。
"~/riscv"
~
"/home/用户名"
// 【注意】 // 如果是交叉编译,请把这个路径改为$RISCV对应的路径 // 注意 ~ 应替换为具体的 /home/用户名 的路径 static char *RVPath = "/home/用户名/riscv";
和前面第155课~第178课类似,但是简化掉了之前的这个操作。
第155课~第178课
# 测试标签,运行测试 test/%.exe: rvcc test/%.c $(CC) -o- -E -P -C test/$*.c | ./rvcc -o test/$*.s - # $(RISCV)/bin/riscv64-unknown-linux-gnu-gcc -o- -E -P -C test/$*.c | ./rvcc -o test/$*.s -
感谢 @daquexian。
用法是把它复制到 rvcc 项目目录之后:
./jump.sh n 跳转到下一节课程 commit ./jump.sh p 跳转到上一节课程的 commit ./jump.sh <number> 跳转到第 number 节课程的 commit
不想污染 rvcc 目录的话也可以不复制,只要在 rvcc 目录下用正确的脚本路径运行就行。
对于交叉编译方案,需要配置Makefile才能正确执行测试:
改为RISCV实验环境的路径,例如"~/riscv",同时~应替换为你的"/home/用户名"(可以使用pwd命令查看)。
在 test/%.exe: rvcc test/%.c 部分和 test: $(TESTS) 部分的编译命令均改为交叉编译命令。
# 测试标签,运行测试 test/%.exe: rvcc test/%.c ./rvcc -Iinclude -Itest -I$(RISCV)/sysroot/usr/include -c -o test/$*.o test/$*.c $(CC) -pthread -o $@ test/$*.o -xc test/common # $(RISCV)/bin/riscv64-unknown-linux-gnu-gcc -pthread -static -o $@ test/$*.o -xc test/common test: $(TESTS) for i in $^; do echo $i; ./$i || exit 1; echo; done # for i in $^; do echo $i; $(RISCV)/bin/qemu-riscv64 -L $(RISCV)/sysroot ./$i || exit 1; echo; done # for i in $^; do echo $i; $(RISCV)/bin/spike --isa=rv64gc $(RISCV)/riscv64-unknown-linux-gnu/bin/pk ./$i || exit 1; echo; done test/driver.sh ./rvcc
改为
# 测试标签,运行测试 test/%.exe: rvcc test/%.c ./rvcc -Iinclude -Itest -I$(RISCV)/sysroot/usr/include -c -o test/$*.o test/$*.c # $(CC) -pthread -o $@ test/$*.o -xc test/common $(RISCV)/bin/riscv64-unknown-linux-gnu-gcc -pthread -static -o $@ test/$*.o -xc test/common test: $(TESTS) # for i in $^; do echo $i; ./$i || exit 1; echo; done for i in $^; do echo $i; $(RISCV)/bin/qemu-riscv64 -L $(RISCV)/sysroot ./$i || exit 1; echo; done # for i in $^; do echo $i; $(RISCV)/bin/spike --isa=rv64gc $(RISCV)/riscv64-unknown-linux-gnu/bin/pk ./$i || exit 1; echo; done test/driver.sh ./rvcc
注意:如果使用Spike,请开启第三行代码。
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
rvcc-course
这里是RVCC课程的相关仓库,存放了课程相关的材料。
欢迎利用PR来对本仓库进行补充。
make test
进行测试【1】 这个课程都需要准备什么东西?
git clone https://github.com/sunshaoce/rvcc
。【2】 如何安装RISCV的实验环境
三种方式,自由选择,新手推荐方式1.
方式一(推荐):解压预先编译好的RISCV环境(基于Ubuntu 20.04)
运行仓库的
install-riscv-1.sh
即可。方式二:源代码编译RISCV环境(较难)。
这里我们编译出编译器gcc和模拟器qemu。使用本课程的
install-riscv-2.sh
脚本(请勿直接运行),使用方法参考视频:RISCV环境快速配置。方式三:使用配置好的Docker环境
详情可以参考:https://github.com/ksco/rvcc-env-docker
【3】 如何对RVCC中的项目使用
make test
进行测试首先,你需要找到你RISCV实验环境的路径,方式一、二的路径为:
~/riscv
。其次,你需要将
test.sh
或Makefile
中的下面几行代码,选择为你对应的编译器和模拟器,例子(默认为gcc和qemu)如下方所示。最后运行
RISCV=~/riscv make test
,注意这里的~/riscv
必须是你RISCV实验环境的路径。第1课~第22课
修改前:
修改后:
第23课~第44课
在
第1课~第22课
的基础上,再将改为(注意此处删去了一行,不是注释掉):
第45课~第154课
这个时候已经没有了
test.sh
,我们直接修改Makefile
。改为(注意需要删去几行,而非注释掉):
第155课~第178课
在
第45课~第154课
的基础上,修改main.c
进行交叉编译测试。改为RISCV实验环境的路径,例如
"~/riscv"
,同时~
应替换为你的"/home/用户名"
。第179课~第361课
和前面
第155课~第178课
类似,但是简化掉了之前的这个操作。【4】 跳转脚本(可选)
感谢 @daquexian。
用法是把它复制到 rvcc 项目目录之后:
不想污染 rvcc 目录的话也可以不复制,只要在 rvcc 目录下用正确的脚本路径运行就行。
【5】交叉编译配置
对于交叉编译方案,需要配置Makefile才能正确执行测试:
改为RISCV实验环境的路径,例如
"~/riscv"
,同时~
应替换为你的"/home/用户名"
(可以使用pwd命令查看)。在 test/%.exe: rvcc test/%.c 部分和 test: $(TESTS) 部分的编译命令均改为交叉编译命令。
改为
注意:如果使用Spike,请开启第三行代码。