【问题标题】:Where to put helper-scripts with GNU autoconf/automake?将 GNU autoconf/automake 的辅助脚本放在哪里?
【发布时间】:2010-09-10 18:50:29
【问题描述】:

我正在开发一个将与 GNU autoconf/automake 一起分发的项目,并且我有一组调用 awk 脚本的 bash 脚本。我希望 bash 脚本以 $PATH 结尾,而不是 awk 脚本。我应该如何将这些插入到项目中?是否应该将它们与其他二进制文件一起放入?

另外,有没有办法确定安装后文件的最终位置?我认为 /usr/local/bin 不是总是可执行文件最终的位置......

【问题讨论】:

    标签: autoconf automake


    【解决方案1】:

    你可以只列出你想在 Makefile.am 中安装的脚本:

    bin_SCRIPTS = 富吧

    这将导致在 make install 期间安装 foo 和 bar。要获取它们最终位置的路径,您可以在 foo.in 中使用 @bindir@ 并让我们为您配置构建 foo。例如在configure.ac中:

    AC_CONFIG_FILES([foo bar])

    然后在 foo.in:

    #!/bin/sh 前缀=@前缀@ exec_prefix=@exec_prefix@ 绑定=@绑定@ 回声绑定 = $bindir

    请记住,运行configure 的人可以指定--prefix、--exec_prefix 或 --bindir,并且可以使用 DESTDIR 重定向安装。使用此处描述的技术,将不考虑 DESTDIR,并且脚本将安装在它将回显的路径以外的位置。这是设计使然,并且是正确的行为,因为通常使用 DESTDIR 安装来创建一个 tarball,该 tarball 最终将解压到文件系统中,从而使脚本中的 bindir 变得有效。

    【讨论】:

    • 这是正确答案,应该打勾。 +1
    • @Andras budinszky 建议使用dist_bin_SCRIPTS,但在这种情况下这是不正确的。文件foo 不应在分发tarball 中,因为它将从foo.in 生成,由于它出现在AC_CONFIG_FILES 中,它将在tarball 中。
    【解决方案2】:

    乔纳森,回答您的附加问题:如果您想在构建时替换前缀的值,您需要:

    1. 将脚本“myscript”重命名为“myscript.in”
    2. 在configure.ac中添加规则,在底部生成
    3. 使用我创建的宏AS_AC_EXPAND
    4. 像这样使用它:

      AS_AC_EXPAND(BINDIR, $bindir)

    5. 在您的 'myscript.in' 中,您现在可以使用 @BINDIR@,它将扩展到最终安装脚本的完整路径。

    请注意,您不应直接使用 PREFIX,任何安装目录都可能被更改,因此您确实希望使用传递给 bindir 配置的值并将其扩展。

    【讨论】:

    • m4sh 为自己保留那些以“AS_”开头的名称。通过命名宏“AS_”,您可以踩到 m4sh 的命名空间。请阅读 autoconf 文档的第 10.2 节。
    • 你的AS_AC_EXPAND宏在哪里!?
    【解决方案3】:

    如果 awk 脚本不会进入主 bin 目录(前缀/bin),那么您需要将它们放在适当的子目录中 - 可能是 lib,但可能是 libexec 或 share(因为 awk 脚本可能是平台中立)。

    正确:软件不一定会在 /usr/local/bin 中结束;在我的机器上,/usr/local/bin 由 MIS 管理,因此我安装的所有软件都在 /usr/gnu/ 下。我使用:./configure --prefix=/usr/gnu 将软件安装在我想要的位置。

    您可以在 bash 脚本中嵌入 PREFIX 的值——实际上,您将“编译”脚本以包含安装位置。请注意构建测试期间的问题 - 您可能需要先定位相对于当前目录的脚本,然后再定位相对于 PREFIX 的脚本。

    【讨论】:

    • 如何让 automake 替换 bash 脚本中的 ${prefix}?我应该让它们成为某种 _BIN 项目,而不是 _DATA 项目?
    【解决方案4】:

    在 Makefile.am 中添加类似的内容

    scriptsdir = $(prefix)/bin
    scripts_DATA = awkscript1 awkscript2
    

    在这种情况下,它会在 $(prefix)/bin 中安装 awkscript(你也可以使用 $(bindir))。

    注意:不要忘记第一个应该命名为 name + dir (scripts -> scriptsdir),第二个应该命名为 name + _DATA (scripts -> scripts_DATA)。

    【讨论】:

    • 没有。使用pkglibexec_DATApkglibexec_SCRIPTS,这将安装(默认)到$prefix/libexec/$package。这就是 libexecdir 的用途:docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/3/html/…“libexec/ 目录包含由其他程序调用的小型帮助程序”。这也意味着,如果您使用的发行版不喜欢 libexec,打包程序可以通过传递 --libexecdir=/usr/lib 来更改这些脚本的去向。另见gnu.org/software/automake/manual/automake.html#Uniform
    • libexec_SCRIPTSlibexec_PROGRAMSpkglibexec_SCRIPTSpkglibexec_PROGRAMS有什么区别?
    • 是否有某种全局 libexec 和包特定的 libexec?全局 libexec 是否旨在由其他程序执行,而不是由用户执行,而特定于包的 libexec 仅供您包中的程序使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多