我正在使用控制板制造商提供的这个工具。
我一步步按照说明进行操作,但是当我尝试编译示例代码时,编译过程陷入了 if 子句的“$basename 无法执行”分支。
我不完全是 bash 脚本的向导,所以我不知道我在看什么。
#!/bin/bash
# uclibc-toolchain-wrapper
basename=$0
if [ -d $basename ]
then
echo "This can't be a directory."
exit 1;
fi
tool_name=${basename##*/}
if [[ $tool_name =~ "mips-linux-uclibc-gnu" ]]
then
prefix=${basename%-uclibc-*}
postfix=${basename##*mips-linux-uclibc}
$prefix$postfix "-muclibc" $@
else
echo "$basename can't execute."
exit 1;
fi
那么我应该怎么做才能让这个脚本滚动起来呢?
用户手册告诉我修改环境变量以便“安装”工具链。这基本上包括向 .bashrc 中的“PATH”变量添加指定路径。当然,我已经将整个工具链放在指定的文件夹中。
当我在源文件夹中键入“make”命令时,似乎确实调用了工具链,但执行在此脚本处停止并显示错误打印输出:“uclibc-toolchain-wrapper 无法执行”。其中“uclibc-toolchain-wrapper”是该脚本的文件名。
我在 lubuntu 13、ubuntu 22、Debian 5 上尝试过,都得到了相同的结果。
请帮忙!提前致谢!
答案1
在脚本的开头,$basename
设置为等于,$0
表示“执行此脚本的名称(可能包括目录路径)”。
该脚本的明显目的是链接/复制到几个不同的名称,例如cc1-mips-linux-uclibc-gnu
编译器的第一阶段。当使用该名称执行时,它将重新排列命令cc1-mips-linux-gnu -muclibc <script parameters>
并尝试执行该命令。
由此看来,工具链包可能包含多个可执行工具,其名称如下:
<tool name>-mips-linux-gnu<possible suffix>
该包装器可能会链接为:
<tool name>-mips-linux-uclibc-gnu<possible suffix>
对于每个工具,允许使用包含该-uclibc-
零件的长格式工具名称。
如果您ls -lF
在包含工具链可执行文件的目录中运行,您可能/应该看到如下符号链接:
cc1-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<some tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<another tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
...
并且在同一目录中或工具链包中的其他位置,将会有可执行文件,其名称如下:
cc1-mips-linux-gnu
<some tool>-mips-linux-gnu
<another tool>-mips-linux-gnu
...
等可能是众所周知的编译器/链接器组件名称,例如<some tool>
等,或其他工具。<another tool>
cpp
ld
但是,如果您运行时收到的字面错误消息make
是
uclibc-toolchain-wrapper can't execute
那么脚本检测到它正在以 just 运行uclibc-toolchain-wrapper
,这是不正确的:该脚本期望使用包含字符串 的任何名称来调用mips-linux-uclibc-gnu
。这实际上是在失败时导致“$basename 无法执行”错误消息的测试。
您是否已将工具链包提取到非类 Unix 文件系统(如 NTFS)并尝试从那里运行它?在此类文件系统上,符号链接语义可能与类 Unix 文件系统上的工作方式不同,这可能解释了为什么脚本无法获取用于运行脚本的符号链接的原始名称,并获取真实名称脚本 ( uclibc-toolchain-wrapper
) 代替。在这种情况下,修复方法是将工具链包重新提取到真正的类 Unix 文件系统,并从那里使用它。
或者,如果 Makefile 实际上使用名称调用脚本uclibc-toolchain-wrapper
,那么该 Makefile 就很愚蠢和/或以某种方式配置错误。