【发布时间】:2010-09-10 18:50:29
【问题描述】:
我正在开发一个将与 GNU autoconf/automake 一起分发的项目,并且我有一组调用 awk 脚本的 bash 脚本。我希望 bash 脚本以 $PATH 结尾,而不是 awk 脚本。我应该如何将这些插入到项目中?是否应该将它们与其他二进制文件一起放入?
另外,有没有办法确定安装后文件的最终位置?我认为 /usr/local/bin 不是总是可执行文件最终的位置......
【问题讨论】:
我正在开发一个将与 GNU autoconf/automake 一起分发的项目,并且我有一组调用 awk 脚本的 bash 脚本。我希望 bash 脚本以 $PATH 结尾,而不是 awk 脚本。我应该如何将这些插入到项目中?是否应该将它们与其他二进制文件一起放入?
另外,有没有办法确定安装后文件的最终位置?我认为 /usr/local/bin 不是总是可执行文件最终的位置......
【问题讨论】:
你可以只列出你想在 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 变得有效。
【讨论】:
dist_bin_SCRIPTS,但在这种情况下这是不正确的。文件foo 不应在分发tarball 中,因为它将从foo.in 生成,由于它出现在AC_CONFIG_FILES 中,它将在tarball 中。
乔纳森,回答您的附加问题:如果您想在构建时替换前缀的值,您需要:
像这样使用它:
AS_AC_EXPAND(BINDIR, $bindir)
在您的 'myscript.in' 中,您现在可以使用 @BINDIR@,它将扩展到最终安装脚本的完整路径。
请注意,您不应直接使用 PREFIX,任何安装目录都可能被更改,因此您确实希望使用传递给 bindir 配置的值并将其扩展。
【讨论】:
AS_AC_EXPAND宏在哪里!?
如果 awk 脚本不会进入主 bin 目录(前缀/bin),那么您需要将它们放在适当的子目录中 - 可能是 lib,但可能是 libexec 或 share(因为 awk 脚本可能是平台中立)。
正确:软件不一定会在 /usr/local/bin 中结束;在我的机器上,/usr/local/bin 由 MIS 管理,因此我安装的所有软件都在 /usr/gnu/ 下。我使用:./configure --prefix=/usr/gnu 将软件安装在我想要的位置。
您可以在 bash 脚本中嵌入 PREFIX 的值——实际上,您将“编译”脚本以包含安装位置。请注意构建测试期间的问题 - 您可能需要先定位相对于当前目录的脚本,然后再定位相对于 PREFIX 的脚本。
【讨论】:
在 Makefile.am 中添加类似的内容
scriptsdir = $(prefix)/bin
scripts_DATA = awkscript1 awkscript2
在这种情况下,它会在 $(prefix)/bin 中安装 awkscript(你也可以使用 $(bindir))。
注意:不要忘记第一个应该命名为 name + dir (scripts -> scriptsdir),第二个应该命名为 name + _DATA (scripts -> scripts_DATA)。
【讨论】:
pkglibexec_DATA 或pkglibexec_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_SCRIPTS或libexec_PROGRAMS和pkglibexec_SCRIPTS或pkglibexec_PROGRAMS有什么区别?