编译报错:
/usr/bin/install -D -m 0644 /mnt/d/Program/Ubuntu/buildroot/output/host/aarch64-buildroot-linux-uclibc/sysroot/usr/share/terminfo/a/ansi /mnt/d/Program/Ubuntu/buildroot/output/target/usr/share/terminfo/a/ansi
/usr/bin/install: cannot stat '/mnt/d/Program/Ubuntu/buildroot/output/host/aarch64-buildroot-linux-uclibc/sysroot/usr/share/terminfo/a/ansi': No such file or directory
查看 sysroot/usr/share/terminfo 下内容如下:
root@wmxpc:~/win/buildroot# ls /mnt/d/Program/Ubuntu/buildroot/output/host/aarch64-buildroot-linux-uclibc/sysroot/usr/share/terminfo/
31 34 37 41 4d 51 62 65 68 6b 6e 71 74 77
32 35 38 45 4e 58 63 66 69 6c 6f 72 75 78
33 36 39 4c 50 61 64 67 6a 6d 70 73 76 7a
似乎是把目录名 a 变成了它的 ASCII 码 61,,
请问这是什么导致的??怎么解决?
离线
我现在想到的一个可能有效的办法是,修改 buildroot\package\ncurses\ncurses.mk 下的如下部分:
NCURSES_TERMINFO_FILES = \
a/ansi \
d/dumb \
l/linux \
p/putty \
p/putty-256color \
p/putty-vt100 \
s/screen \
s/screen-256color \
v/vt100 \
v/vt100-putty \
v/vt102 \
v/vt200 \
v/vt220 \
x/xterm \
x/xterm+256color \
x/xterm-256color \
x/xterm-color \
x/xterm-xfree86 \
$(call qstrip,$(BR2_PACKAGE_NCURSES_ADDITIONAL_TERMINFO))
把其中的 a、d、l、p、s、v、x 等目录名改成其对应的 ASCII 码。。
但是我更想知道目录名是怎么变成 ASCII 码的,,在对应的位置修改,不让它变成 ASCII 码
离线
网上查到有人遇到相同的问题,他的解决方法是把目录手动拷贝过去,,感觉有点儿麻烦
离线
还没有找到目录名变成数字的根源,暂时想到一个方法避免手动拷贝,,先走通编译流程吧
找到 buildroot\package\ncurses\ncurses.mk 中如下内容:
define NCURSES_TARGET_CLEANUP_TERMINFO
$(RM) -rf $(TARGET_DIR)/usr/share/terminfo $(TARGET_DIR)/usr/share/tabset
$(foreach t,$(NCURSES_TERMINFO_FILES), \
$(INSTALL) -D -m 0644 $(STAGING_DIR)/usr/share/terminfo/$(t) \
$(TARGET_DIR)/usr/share/terminfo/$(t)
)
endef
可知,第一个 $(t) 指定源地址,第二个 $(t) 指定目的地址,只需要将第一个 $(t) 的第一个字符转换成其 ASCII 码数字应该就可以编译了
不懂 shell 怎么处理字符串,,用 python 处理,改成如下内容:
define NCURSES_TARGET_CLEANUP_TERMINFO
$(RM) -rf $(TARGET_DIR)/usr/share/terminfo $(TARGET_DIR)/usr/share/tabset
$(foreach t,$(NCURSES_TERMINFO_FILES), \
$(INSTALL) -D -m 0644 $(STAGING_DIR)/usr/share/terminfo/$(shell python3 -c \
"import sys; t = sys.argv[1]; t = f'{ord(t[0]):x}{t[1:]}'; print(t)" ${t}) \
$(TARGET_DIR)/usr/share/terminfo/$(t)
)
endef
离线
编译完成了,,成功生成了 sdcard.img,,
没有遇到其他网友说的需要“用fakeroot-tcp替换fakeroot-sysv”的问题
过程还算顺利,,就遇到两个问题,,除了楼上那个问题,,另一个是 WSL 中 Ubuntu 的 PATH 会包含 Windows 的 PATH,,而 Windows 的 PATH 路径可能包含空格,,导致编译出错,,解放方法是使用 “PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make” 临时覆盖 PATH
看起来 WSL 下编译 Buildroot 还是可行的。。
离线
今天我也碰到了同样的问题,原因其实很简单,windows系统的文件夹不区分大小写,而linux是区分大小写的。比如文件夹L和文件夹l,在windows下不允许同时存在,为了区分他们两,就只能把文件夹名称改为ascii码了。
我的解决方式是用gpt搓一个powershell脚本,先统一把ascii码文件夹重新命名成abcd之类的,然后再把没能成功命名的文件夹里面的内容手动拷贝到对应的文件夹内,比如61里面的东西拷贝到A,6c里面的文件拷贝到L,就成功通过了terminfo部分的编译。
脚本指令如下:
# 获取当前目录下所有文件夹,并按名称的长度倒序排序(确保较长的文件夹先处理)
Get-ChildItem -Directory | Sort-Object { $_.Name.Length } -Descending | ForEach-Object {
# 获取文件夹名
$folderName = $_.Name
# 检查文件夹名称是否是十六进制数字
if ($folderName -match '^[0-9A-Fa-f]+$') {
# 将十六进制字符串转换为十进制整数
$decimalValue = [Convert]::ToInt32($folderName, 16)
# 将十进制数转换为对应的字符
$newName = [char]$decimalValue
# 检查新名称是否包含非法字符
if ($newName -match '[\\/:*?"<>|]') {
Write-Host "Skipping folder $folderName because the new name contains illegal characters."
} else {
# 重命名文件夹
Rename-Item $_.FullName -NewName $newName
Write-Host "Renamed folder $folderName to $newName"
}
}
}
离线