编译i686-elf交叉编译器时binutils configure语法错误求助
问题详情
在MacOS 10.14.6环境下编译binutils-2.37以构建i686-elf交叉编译器,执行configure命令后,生成config.status文件时出现以下语法错误:
configure: creating ./config.status
./config.status: line 470: syntax error near unexpected token)' ./config.status: line 470:') ac_optarg=$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g";;'
使用的configure命令(当前工作目录为toolchain/i686-elf-build/binutils-build):
toolchain/i686-elf-source/binutils-2.37/configure --target=i686-elf --prefix="toolchain/i686-elf-build" --with-sysroot --disable-nls --disable-werror
预期正常输出:
configure: creating ./config.status
config.status: creating makefile
尝试修改prefix路径后问题未解决,且未找到类似案例。
排查方案与解决办法
1. 强制用bash执行configure
MacOS 10.14及以后默认Shell为zsh,而config.status可能依赖bash专属语法。显式指定用bash运行configure:
bash toolchain/i686-elf-source/binutils-2.37/configure --target=i686-elf --prefix="toolchain/i686-elf-build" --with-sysroot --disable-nls --disable-werror
2. 清理环境变量后执行
环境变量(如AS_ECHO)被篡改可能干扰configure流程,在干净环境中执行:
env -i bash toolchain/i686-elf-source/binutils-2.37/configure --target=i686-elf --prefix="toolchain/i686-elf-build" --with-sysroot --disable-nls --disable-werror
3. 重新下载binutils源码包
源码包损坏可能导致生成的配置文件格式异常,重新下载并解压:
# 删除现有源码目录 rm -rf toolchain/i686-elf-source/binutils-2.37 # 下载并解压(可替换为国内镜像加速) curl -O https://ftp.gnu.org/gnu/binutils/binutils-2.37.tar.xz tar -xf binutils-2.37.tar.xz -C toolchain/i686-elf-source/ # 重新用bash执行configure bash toolchain/i686-elf-source/binutils-2.37/configure --target=i686-elf --prefix="toolchain/i686-elf-build" --with-sysroot --disable-nls --disable-werror
4. 使用GNU工具替代MacOS原生工具
MacOS自带的sed、echo等工具与GNU版本存在差异,可能导致脚本解析错误。通过Homebrew安装GNU工具并优先使用:
# 安装GNU核心工具和sed brew install coreutils gnu-sed # 调整PATH让系统优先使用GNU工具,再执行configure PATH="/usr/local/opt/coreutils/libexec/gnubin:/usr/local/opt/gnu-sed/libexec/gnubin:$PATH" bash toolchain/i686-elf-source/binutils-2.37/configure --target=i686-elf --prefix="toolchain/i686-elf-build" --with-sysroot --disable-nls --disable-werror
验证
执行上述任一方案后,若输出符合预期的config.status: creating makefile,则问题已解决,可继续执行make和make install完成binutils编译。
内容的提问来源于stack exchange,提问作者aqsw

