gpt4 book ai didi

linux - 将二进制文件安装到/bin、/sbin、/usr/bin 和/usr/sbin,与 --prefix 和 DESTDIR 交互

转载 作者:IT王子 更新时间:2023-10-29 00:53:54 24 4
gpt4 key购买 nike

大多数使用 Autotools 的包都是用户级实用程序或至少足够高的级别完全在 /usr 下,或者足够低到完全在 /usr 下。

我正在编写一个包,需要将一些文件安装到 /bin,一些安装到 /sbin/usr/bin/usr/sbin。它正在替换传统上位于这些位置下的几个现有二进制文件。

它还需要在 /lib/security 中安装一个 PAM 模块(显然 /usr/lib/security 是行不通的)。

现在的问题是:默认配置的前缀似乎是/usr/local。我可以在我的 configure.ac 中控制该默认值。至少 Gentoo Linux 的默认值是 --prefix=/usr。这是个问题,因为它会覆盖我在 configure.ac 中设置的任何默认值。

我简要了解了其他类似的软件包是如何处理这个问题的。以下是我的发现:

  • bash-4.1 似乎安装到 /usr/bin 中,发行版构建脚本将 bash 二进制文件移动到 /bin
  • Linux-PAM 在 configure.ac 中有 hack,所以如果前缀是 /usr,它将使用 /sbin/lib 用于它的一些文件。它还将默认前缀设置为 /usr。我不确定如果用户传递不同的 --prefix 会发生什么。
  • shadow-utils 如果前缀是 /usr,则将 exec_prefix 设置为 ""。然后bin_PROGRAMS引用/bin,声明ubindir指向${prefix}/bin,这样ubin_PROGRAMS 指的是/usr/bin

我的问题是:

  • 其他发行版对 --prefix 的默认设置是什么?我可以合理地假设它总是 /usr 吗?目前我只关心 Linux,而不关心 BSD。
  • 以上哪种解决方案看起来最干净?您看到一些更好的解决方案了吗?
  • 上述解决方案有哪些潜在问题?这些问题有一些解决方案吗?
  • 我可以将所有内容安装到 /bin 并创建兼容性符号链接(symbolic link)。它是否使问题更简单?
  • 是否有一些其他通用构建系统可以被低级系统实用程序接受,从而更好地满足我的要求?

请随时要求澄清我正在尝试做的事情。请注意,如果我想保留与我要替换的内容的兼容性,如果它用于运送二进制文件 A 和 B,一个在 /sbin 中,一个在 /usr/bin 中,我想我只需要在那些地方放置替换物或者至少有符号链接(symbolic link)。 PAM 模块也有固定的安装位置。

我显然会对任何有用的答案投赞成票。我是一个“可接受的答案”,我主要是在寻找“我应该做什么”的建议,问题的最干净的解决方案是什么,如果适用,还可以讨论选项和缺点、优点和缺点。

最佳答案

本质上,//usr 层次结构之间的区别不是也不应该掌握在包的上游维护者手中(阅读:不是你的责任)。由于 / 应该只包含引导和使 /usr 可用所需的文件,因此 / 的内容是一个管理决定。对于源代码安装,此决定由安装程序做出,而对于分发,则由包维护者做出。

作为基本原理,假设有人正在尝试构建一个 chroot 环境。/usr 和/的区分在环境中是没有意义的,就不做区分了。所有前缀都设置为 /foo/bar/chroot,任何混淆 $prefix 的配置脚本都可能引发奇怪的行为。同样的论点也适用于像 Debian 打包助手这样的脚本,它们依赖于通常的 $prefix 语义来工作。

因此,最干净的解决方案是 bash-4.1 解决方案。您基本上有两个干净的选择:将您的包分成启动关键部分和非启动关键部分,或者让您的 configure 脚本为启动关键部分提供一个替代前缀,这是默认设置的到 /,将 $prefix 保留为 /usr

关于linux - 将二进制文件安装到/bin、/sbin、/usr/bin 和/usr/sbin,与 --prefix 和 DESTDIR 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com