出于验证一个测试程序的目的,需要在riscv64的板子上源码安装golang,原本很简单的事情,但是操作之后才发现不是这回事,故这里简单记录下,以便后面需要时用到。
以下操作是在mengzhuo老师的指导下完成。
首先知道的一点是,源码编译go, here,另外golang目前(2022/08/01)还没有riscv64的二进制包,需要更需要从源码编译。从源码编译,需要有一个自举的过程,但是Bootstrap toolchain from C source code 1.4 版本还不支持rv,所以,这里就麻烦一些了。
首先安装 golang-go - Go programming language compiler, linker, compiled stdlib. 在目前的debian系统上,已经默认安装支持golang-go,一定要使用这个,不要使用gccgo,后者的问题非常多。
apt install golang-go
然后 go version
就可以看到相应的输出了。在相同的terminal下,然后下载 golang 的source code,我下载的是 go version go1.18.4.解压,然后执行./make.bash
即可。
这个时候或者编译完成后,如果go version提示说找不到相关命令,大概率是由于 goroot gopath的相关路径不对。
GOROOT=/home/vimer/go/go/
这里其实就是指向的你的go源码的位置:
[email protected]:~/go/go$ ls
AUTHORS CONTRIBUTORS PATENTS SECURITY.md api codereview.cfg lib pkg test
CONTRIBUTING.md LICENSE README.md VERSION bin doc misc src
紧接着,要把 go的可执行程序加入$PATH中:
export PATH=$PATH:$GOROOT/bin
还有一个是GOPATH:
GOPATH="/home/vimer/go/proj"
这个是用来存储相关go的生成物的。
因为go是google开发的嘛,有些东西timeout是不可避免的,所以遇到这种问题时,需要使用:
GOPROXY="https://proxy.golang.com.cn"
目前来看,bookworm应该默认使用gcc-12了,不过,从目前的QA质量来看,有不少C++包在rebuild时失败了。这篇文章就是简单的记录这个ftbfs summary. 其实做了这么多我发现,任何东西都不能浮于表面,也就是fix 一个issue,需要深挖背后的原理。当然,我现在的时间、资历还达不到那个级别,所以这个page就是当做笔记用的。
GCC 11 defaults to the GNU++17 standard.
指引性的文章here
其实大部分的ftbfs集中在这一块。
http://qa-logs.debian.net/2022/06/09/gcc12/dbus-c++_0.9.0-9_unstable_gcc12.log
/usr/include/c++/12/iomanip:170:5: note: template argument deduction/substitution failed:
../../include/dbus-c++/types.h:96:8: note: ‘DBus::MessageIter’ is not derived from ‘std::basic_istream<_CharT, _Traits>’
96 | ri >> cast;
| ~~~^~~~~~~
/usr/include/c++/12/iomanip:200:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>&
+std::operator>>(basic_istream<_CharT, _Traits>&, _Setprecision)’
200 | operator>>(basic_istream<_CharT, _Traits>& __is, _Setprecision __f)
| ^~~~~~~~
/usr/include/c++/12/iomanip:200:5: note: template argument deduction/substitution failed:
../../include/dbus-c++/types.h:96:8: note: ‘DBus::MessageIter’ is not derived from ‘std::basic_istream<_CharT, _Traits>’
96 | ri >> cast;
| ~~~^~~~~~~
/usr/include/c++/12/iomanip:230:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>&
+std::operator>>(basic_istream<_CharT, _Traits>&, _Setw)’
230 | operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
| ^~~~~~~~
/usr/include/c++/12/iomanip:230:5: note: template argument deduction/substitution failed:
../../include/dbus-c++/types.h:96:8: note: ‘DBus::MessageIter’ is not derived from ‘std::basic_istream<_CharT, _Traits>’
96 | ri >> cast;
| ~~~^~~~~~~
/usr/include/c++/12/iomanip:264:5: note: candidate: ‘template<class _CharT, class _Traits, class _MoneyT> std::basic_istream<_CharT,
+_Traits>& std::operator>>(basic_istream<_CharT, _Traits>&, _Get_money<_MoneyT>)’
264 | operator>>(basic_istream<_CharT, _Traits>& __is, _Get_money<_MoneyT> __f)
Solutions: todo
这个教程是PLCT推出的,强烈推荐。在这篇文章中,我们就简单记录下这个学习过程。
https://gist.github.com/sunshaoce/90216c19591581f8997df0109b65c154 这个是RISC-V环境的构建脚本,需要先下载有相应的代码仓库。
riscv elfapi url: https://github.com/riscv-non-isa/riscv-elf-psabi-doc
01视频地址 首先我是在rv硬件上执行这个程序的,所以命令稍微不同,但是效果是一样的。我只是没用交叉编译器嘛。
#cat tmp.s
.global main # 声明一个main的段,程序的入口
main: # 段开始的标志
li a0, 42 # a0寄存器就是 返回值
ret
# compiler cmd:
gcc -s tmp.s
./a.out
[email protected]:~/build/rvcc$ echo $?
42
徒手写一个RISC-V编译器 - 第002课
https://www.bilibili.com/video/BV1KS4y1E79u
[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春
https://www.bilibili.com/video/BV1Q5411w7z5
可以看看前面一部分的公共知识课,包含了RISC-V的基础指令集的详细的介绍和一些程序执行堆栈的知识
#!/usr/bin/make -f
%:
dh [email protected] --buildsystem=makefile
override_dh_auto_build:
cd Platform/Linux/CreateRedist && ./RedistMaker
override_dh_clean:
dh_clean -X Platform/Win32/CreateRedist/EE_NI/Includes/EENIVariables.wxi.bak
rm -rf -- Platform/Linux/Bin/
rm -rf -- Platform/Linux/Build/Utils/XnSensorServer/*-Release/
rm -rf -- Platform/Linux/Build/XnCore/*-Release/
rm -rf -- Platform/Linux/Build/XnDDK/*-Release/
rm -rf -- Platform/Linux/Build/XnDeviceFile/*-Release/
rm -rf -- Platform/Linux/Build/XnDeviceSensorV2/*-Release/
rm -rf -- Platform/Linux/Build/XnFormats/*-Release/
rm -rf -- Platform/Linux/CreateRedist/Final/
rm -rf -- Platform/Linux/Redist/
# cat Platform/Linux/CreateRedist/RedistMaker
# Build Engine
echo "Building..."
make -C ../Build clean > /dev/null
make -C ../Build
点评: 针对makefile的rules编写。