Sheltor674 2025-08-10 19:02 采纳率: 76.9%
浏览 8

LFS构建交叉编译临时工具

我正在按照《Linux From Scratch》(版本 r12.3-103,发布日期 2025年8月9日)进行构建,并在我的宿主机(Ubuntu 22.04,gcc 11.4.0)上交叉编译临时工具。
1.m4-1.4.20 编译

在编译 m4-1.4.20 时,我使用的脚本如下:

./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess) \ && make -j$(nproc) \ && make DESTDIR=$LFS install
但是在 make 阶段遇到了如下错误:
make[2]: Entering directory '/mnt/lfs/sources/m4-1.4.20/doc' Updating man page m4.1 help2man: can't get --help' info from ../src/m4
Try --no-discard-stderr' if option outputs to stderr make[2]: *** [Makefile:2960: m4.1] Error 2
根据 LFS 手册,这个问题不应该出现,所以我不确定为什么会在我的系统上发生。

因为我只是交叉编译临时工具,我想跳过 help2man 这个步骤。我尝试了:

在 make 之后运行 make help2man=:

通过修改 Makefile 添加 --no-discard-stderr 参数,执行命令:
sed -i '/\$(HELP2MAN)/ s/$(HELP2MAN)/$(HELP2MAN) --no-discard-stderr/' doc/Makefile.am
但是这些方法都没能解决问题。

2.diffutils-3.12 编译

在编译 diffutils-3.12 时,我使用的脚本如下:
./configure --prefix=/usr \ --host=$LFS_TGT \ gl_cv_func_strcasecmp_works=y \ --build=$(./build-aux/config.guess) \ && make -j$(nproc) \ && make DESTDIR=$LFS install
但是在 make 阶段遇到如下错误:
help2man: can't get --help' info from sdiff
Try --no-discard-stderr' if option outputs to stderr help2man: can't get --help' info from cmp
Try --no-discard-stderr' if option outputs to stderr help2man: can't get --help' info from diff
Try --no-discard-stderr' if option outputs to stderr make[1]: *** [Makefile:2574: sdiff.1] Error 1 make[1]: *** Waiting for unfinished jobs.... make[1]: *** [Makefile:2574: cmp.1] Error 1 make[1]: *** [Makefile:2574: diff.1] Error 1 make[1]: Leaving directory '/mnt/lfs/sources/diffutils-3.12/man' make: *** [Makefile:2437: all-recursive] Error 1
根据 LFS 手册,这个问题不应该在标准构建中出现。

我尝试了多种方法来跳过或修复该问题,包括:

make HELP2MAN=: 或 make HELP2MAN=true

使用 HELP2MAN="help2man --no-discard-stderr" 运行 make

在构建前导出环境变量 HELP2MAN=: 或 HELP2MAN=true

但均未解决问题。

问题:

这个问题是否可能与我的宿主环境有关?

在 LFS 交叉编译临时工具阶段,如何正确跳过或修复 help2man 相关的编译错误?

非常感谢大家的时间和帮助!

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-08-10 19:03
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你的问题确实与宿主环境有关,尤其是在交叉编译临时工具链(LFS 临时工具)的过程中。在 LFS 的构建过程中,许多软件包依赖于 help2man 来生成 man 页面,但这些工具通常是在目标系统上运行的,而不是在宿主机上。

    然而,在你当前的构建流程中,由于你在宿主机上运行了 make 命令,而 help2man 并未被正确配置或安装,导致它尝试从源码中提取帮助信息失败,从而引发错误。


    问题分析

    1. help2man 的作用

      • help2man 是一个用于从命令行程序的 --help 输出生成 man 页面的工具。
      • 在 LFS 构建过程中,某些软件包(如 m4diffutils 等)会在 make 阶段使用 help2man 生成 man 页面。
      • 但在 LFS 临时工具链阶段,我们并不需要这些 man 页面,因为它们只用于构建过程,最终会被替换为更完整的版本。
    2. 为什么会出现错误?

      • 你在宿主机上运行 make,而 help2man 无法在宿主机上正常工作(因为它没有正确安装或配置)。
      • 即使你设置了 HELP2MAN=--no-discard-stderr,如果 help2man 本身没有在宿主机上安装,那么仍然会失败。
    3. LFS 手册的建议

      • 在 LFS 临时工具链阶段,手册页(man pages)是可选的,可以跳过
      • 因此,正确的做法是在 configure 或 make 阶段禁用 man 页面的生成

    解决方案:如何跳过 help2man 相关的编译错误

    方法一:在 configure 阶段禁用 man 页面生成

    你可以通过向 configure 添加参数来禁用 man 页面的生成:

    ./configure --prefix=/usr \
                --host=$LFS_TGT \
                --build=$(./build-aux/config.guess) \
                --disable-manpages \
                && make -j$(nproc) \
                && make DESTDIR=$LFS install
    

    注意:不是所有软件包都支持 --disable-manpages 参数,比如 m4 可能不支持该选项。如果无效,请尝试方法二。


    方法二:在 make 阶段设置环境变量 HELP2MAN

    即使 help2man 没有在宿主机上安装,你也可以通过设置环境变量来让 make 忽略 man 页面的生成:

    export HELP2MAN=
    

    然后执行:

    ./configure --prefix=/usr \
                --host=$LFS_TGT \
                --build=$(./build-aux/config.guess) \
                && make -j$(nproc) \
                && make DESTDIR=$LFS install
    

    说明HELP2MAN= 表示“不要运行 help2man”,这会跳过 man 页面的生成。


    方法三:修改 Makefile 中的 help2man 调用(适用于特定项目)

    如果你遇到的是某个特定项目的错误(如 m4-1.4.20),可以手动修改其 MakefileMakefile.am 文件,将 help2man 的调用注释掉或替换为空。

    例如,对于 m4-1.4.20

    # 修改 doc/Makefile
    sed -i 's/\$(HELP2MAN)/# \$(HELP2MAN)/' doc/Makefile
    

    或者:

    # 修改 doc/Makefile.am
    sed -i 's/help2man:/# help2man:/' doc/Makefile.am
    

    注意:这种方法可能影响其他部分的构建,建议仅在必要时使用,并确保后续步骤不会因此出错。


    推荐做法:统一处理所有项目

    为了简化构建流程并避免多次重复操作,你可以编写一个通用的脚本或设置环境变量,以全局跳过 man 页面生成:

    export HELP2MAN=
    

    然后在每个软件包的构建命令中使用:

    ./configure ... && make -j$(nproc) && make DESTDIR=$LFS install
    

    总结:关键点

    | 问题 | 解决方案 | |------|----------| | help2man 报错 | 设置 HELP2MAN= 环境变量,或在 configure 中添加 --disable-manpages | | 宿主机缺少 help2man | 不需要在宿主机安装,只需设置环境变量即可 | | LFS 临时工具链不需要 man 页面 | 可以安全地跳过,不影响最终结果 |


    代码示例:修改后的 m4-1.4.20 构建脚本

    # 设置环境变量
    export HELP2MAN=
    
    # 进入源码目录
    cd /mnt/lfs/sources/m4-1.4.20
    
    # 配置
    ./configure --prefix=/usr \
                --host=$LFS_TGT \
                --build=$(./build-aux/config.guess) \
                && make -j$(nproc) \
                && make DESTDIR=$LFS install
    

    进一步建议

    • 如果你正在构建 LFS 临时工具链,建议使用chroot 环境(如 chrootlfs-chroot)进行构建,这样可以避免宿主机环境对构建过程的干扰。
    • 在 chroot 环境中,所有工具都是在目标架构下运行的,因此 help2man 和其他工具会正常工作。

    如果你还有其他软件包出现类似问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月10日