7

大多数使用 Autotools 的软件包都是用户级实用程序,或者至少是足够高的级别以完全低于/usr,或低到足以完全低于/usr.

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

它还需要安装一个 PAM 模块/lib/security(显然/usr/lib/security不会工作)。

现在的问题是:默认配置的前缀似乎是/usr/local. 我可以在我的configure.ac. 而且至少 Gentoo Linux 的默认值是--prefix=/usr. 这是一个问题,因为它会覆盖我在configure.ac.

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

  • bash-4.1 似乎安装到/usr/bin,并且发行版构建脚本将 bash 二进制文件移动到/bin
  • Linux-PAM 有 hack 功能,configure.ac因此如果 prefix 是/usr,它将使用/sbinand/lib用于它的一些文件。它还将默认前缀设置为/usr. 我不确定如果用户通过不同的--prefix.
  • shadow-utils设置exec_prefix""if 前缀是/usr. 然后bin_PROGRAMS是指/bin,并且ubindir被声明为指向,${prefix}/bin所以ubin_PROGRAMS指的是/usr/bin

我的问题是:

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

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

我显然会支持任何有用的答案。我是一个“公认的答案”我主要是在寻找“我应该做什么”的建议,什么是问题的最干净的解决方案,以及如果适用的话,讨论选项和缺点、利弊。

4

2 回答 2

4

/从本质上讲,the和层次结构之间的区别/usr不是也不应该掌握在包的上游维护者手中(阅读:不是你的责任)。由于应该只包含启动和提供/所需的文件,因此. 对于从源代码安装,此决定由安装程序做出,而对于分发,则由包维护者做出。/usr/

作为基本原理,假设有人试图建立一个chroot环境。/usr 和 / 的区别在环境中是没有意义的,不会做。所有前缀都设置为/foo/bar/chroot,并且任何配置脚本搞乱$prefix都可能导致奇怪的行为。同样的论点也适用于像 Debian 打包助手这样的脚本,它们依赖于通常的$prefix语义来工作。

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

于 2011-12-29T15:26:46.733 回答
3

这个问题有两个不同的级别,您的问题似乎都适用于第二个含义(由您的 *.spec 文件或 debian/rules 或 *.pkg 文件生成的二进制包。)至于 autotools担心,你不关心。您不得尝试在您的 configure.ac 中指定 /usr/local 以外的默认前缀。指定安装位置是在二进制包控制文件中完成的,而不是在 configure.ac 中。默认情况下,使用 autoconf 生成的配置脚本的源代码分发应安装在 /usr/local 中,其他任何内容都是打包错误。

如果您想要一个源代码分发,用户可以使用它在特定平台上的特定位置轻松安装,那么在 tarball 中包含一个脚本是可以接受的。例如,您可能包含一个类似于以下内容的构建脚本:

#!/bin/sh

案例 1 美元
foo) args='--prefix=/usr --bindir=/bin --sysconfdir=/etc';;
bar) args='--prefix=/opt';;
*) 参数=;;
经社理事会
$(dirname $0)/configure $args &&
制作 &&
进行安装

这将指定为“foo”和“bar”平台配置的默认参数,但听起来你的问题确实是关于二进制包的控制文件。

于 2011-12-29T17:28:15.883 回答