Autoconf和init脚本

时间:2014-11-10 05:10:19

标签: makefile autoconf

我无法理解autoconf工具链如何处理init脚本 - 通常放在/etc/init.d/中以启动/停止守护程序或服务的脚本。

autoconf工具链指定了一堆预先命名的安装目录变量,例如$bindir(可执行文件通常为/usr/local/bin)或$includedir(对于头文件,可能{ {1}}),等等。

但是/usr/include中的init文件呢?阅读 list of directory variables ,我看不到任何与/etc/init.d

相匹配的内容

那么通常的做法是什么?我只需要选择一个安装目录变量并使用/etc/init.d/覆盖它,以便我可以将脚本安装到AC_SUBST吗?

2 个答案:

答案 0 :(得分:2)

最简单的答案;在顶级源目录Makefile.am中:

# Install my_script in $(bindir) and distribute it.
dist_bin_SCRIPTS = my_script

因此,$(bindir)是脚本的默认值。

-

更强大的实现实际上涵盖了守护进程/服务的初始化脚本(首先引用权威来源):

  

不需要EXTRA_DIST或任何构建规则:Automake从AC_CONFIG_FILES推断出它们(请参阅要求)。 CLEANFILES仍然有用,因为默认情况下,Automake会在distclean中清除AC_CONFIG_FILES的目标,而不是干净。

链接到来源(http://www.gnu.org/software/automake/manual/html_node/Scripts.html):

<强>实施例

安装到自定义位置:

# Yes, even though its `init_d_SCRIPTS`, we use `init_ddir`,
# with-out a second underscore.
init_ddir = $(sysconfdir)/rc.d/init.d
init_d_SCRIPTS = <yourscript>
# CLEANFILES = $(init_d_SCRIPTS)

请注意,$(sysconfdir)代表$(prefix)/etc; init.drc.d/init.d的基本路径,如果生成了init脚本,您可以/应该(?) un - 注释CLEANFILES行中的bin_SCRIPTS = <yourscript> # CLEANFILES = $(bin_SCRIPTS) 行通过Autotools。

或安装到默认位置:

$(bindir)

这将是init_d_SCRIPTS

修改

上述两个示例都假设您正在让Autotools生成$(init_ddir)个文件,但是如果我们要分发已创建的脚本并将其安装到我们的init_ddir = $(sysconfdir)/init.d dist_init_d_SCRIPTS = <yourscript> 位置会怎么样?

dist

诀窍是_bin_SCRIPTS不需要dist_<your_var>_SCRIPTSSCRIPTS可以是dist。主要/etc让Autotools知道值是一个脚本以及如何处理它,而前面的关键字/etc/init.d警告Automake它不会为我们创建文件这一事实 - 并指示Automake不要在脚本源目录中查找makefile模板。

我想添加这个小编辑,因为我必须自己修改我正在使用我的源代码分发的脚本。

-

<强>附加

对于那些接下来会担心他们的包装初始脚本(特别是Debian包装)的人 - 这会让我或多或少地提醒自己 - &gt;看这里:

https://www.debian.org/doc/manuals/maint-guide/dother.en.html#initd

我收到的错误包括debuild尝试将init.d文件和conf文件直接安装在我的文件系统根目录中的debian/<package>/<location>dh_auto_install中,而不是{{1就像它在包构建期间应该的那样。

我发现最终我必须删除Debian的包装教程中提供的添加规则,他们会覆盖debian/rules。特别是#!/usr/bin/make -f %: dh $@ # If installing an upstream init.d script: override_dh_installinit: dh_installinit --name=<scriptname> --onlyscripts # Remove the following: # override_dh_auto_install: # $(MAKE) DESTDIR=$$(pwd)/debian/<package> prefix=/usr install 中的这一位:

/usr

删除该规则后(除非在添加我的init.d脚本和conf文件之后才删除)所有生成和编译的内容都非常完美....包括 - 实际上 - 使用{将bin放入目标{1}}前缀与首先所需的覆盖效果一样。

dh_installinit调用的覆盖告诉debuild不要像makefile那样安装init脚本,并指定只进行update-rc.d调用以向系统注册脚本。我选择将脚本命名为与包不同;所以我被要求传递--name =选项。

希望能帮到某个人,我知道如果允许这个答案继续存在,它将来会帮助我。

答案 1 :(得分:0)

根据this(加上有些过时),Autotools可能不适合这个。尽管如此,提供了这些说明(只需稍加修改):

EXTRA_DIST = bootscript

install-exec-hook:
        cp $(srcdir)/bootscript /etc/init.d
        cd /etc/rc3.d && $(LN_S) ../init.d/bootscript S900bootscript
        cd /etc/rc4.d && $(LN_S) ../init.d/bootscript S900bootscript
        cd /etc/rc5.d && $(LN_S) ../init.d/bootscript S900bootscript