编译RISC-V GNU工具链时configure文件找不到的问题及相关疑问
看来你在Ubuntu 22.04上搭建xv6-riscv所需的RISC-V GNU工具链时碰到了不少困惑,我来帮你一步步理清问题根源和解决办法。
首先,先解开你对Makefile序列的疑惑——你误解了$<这个变量的含义!
在Makefile里,$<是一个自动变量,它代表当前规则的第一个依赖目标。看你提到的Makefile规则:
rm -rf $@ $(notdir $@) mkdir $(notdir $@) cd $(notdir $@) && $</configure \ # some args
这里的$<并不是指向当前刚创建的空目录,而是指向这个规则依赖的newlib目录路径(比如你的/mnt/c/Users/vrait/Documents/Code/OperatingSystems/riscv-gnu-toolchain/newlib)。所以$</configure实际是调用newlib目录下的configure脚本,而不是当前build目录里的——这是标准的out-of-source构建方式:在单独的build目录里运行源代码目录的configure,把编译产物都放在build目录,避免污染源码。
你遇到configure: not found错误的核心原因
这个错误本质是newlib目录里根本没有configure文件!为什么会这样?因为riscv-gnu-toolchain仓库使用了Git子模块来管理newlib、binutils这些依赖组件,如果你克隆仓库的时候没加--recursive参数,或者克隆后没有初始化子模块,那newlib、binutils这些子目录都是空的,自然找不到configure脚本。
你可以验证一下:去/mnt/c/Users/vrait/Documents/Code/OperatingSystems/riscv-gnu-toolchain/newlib目录下看看,是不是空的?如果是,那就是子模块没初始化的问题。
正确的修复步骤
- 先进入riscv-gnu-toolchain的根目录:
cd /mnt/c/Users/vrait/Documents/Code/OperatingSystems/riscv-gnu-toolchain - 初始化并拉取所有子模块内容:
这个命令会把newlib、binutils等所有依赖的子模块代码都拉取下来。git submodule update --init --recursive - 清理之前错误的构建产物:
sudo make clean - 重新运行编译:
sudo make
为什么你改/configure为/../configure后会卡住?
你修改后调用的是工具链根目录的configure(如果有的话),但这个configure是用来整体配置工具链的,而Makefile里每个组件(newlib、binutils)需要调用各自子目录下的configure脚本。你强行改了路径,导致后续构建逻辑完全混乱,自然就会卡住没有输出了。
备注:内容来源于stack exchange,提问作者VanceR

