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

autoconf工具链指定了一堆预命名的安装目录变量,例如$bindir(可执行文件通常在其中的地方,通常是/usr/local/bin)或$includedir(对于头文件,可能是/usr/include),等等。

但是/etc/init.d中的init文件呢?阅读list of directory variables时,看不到与/etc/init.d/之类的东西匹配的任何东西

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

最佳答案

最简单的答案;在顶级源目录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)/etcinit.drc.d/init.d的基本路径,并且如果您的初始化脚本是由Autotools生成的,则可以/应该(?)取消注释CLEANFILES行。

或安装到默认位置:

bin_SCRIPTS = <yourscript>
# CLEANFILES = $(bin_SCRIPTS)


哪个是$(bindir)

编辑:

上面的两个示例都假定您正在让Autotools生成init_d_SCRIPTS文件,但是如果我们想分发已经创建的脚本并将其安装到我们的$(init_ddir)位置该怎么办?

init_ddir = $(sysconfdir)/init.d
dist_init_d_SCRIPTS = <yourscript>


诀窍在于,dist不需要跟在_bin_SCRIPTS之后,可以是dist_<your_var>_SCRIPTS。主要的SCRIPTS使Autotools知道该值是一个脚本以及如何处理该值,而前面的关键字dist会提醒Automake它将不会为我们创建文件的事实-并指示Automake不能在脚本源目录中查找makefile模板。

我想添加这个小修改,因为我只需要自己修改与源代码一起分发的脚本即可。

-

额外

对于那些接下来会担心其关于打包(特别是Debian打包)的init脚本的人-这或多或少地提醒了我自己->请看这里:

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

尝试将init.d文件和conf文件直接安装在文件系统根目录中的/etc/etc/init.d中而不是像在打包过程中应该的那样在debian/<package>/<location>中进行安装时出现的错误建立。

我发现最终我不得不删除Debian打包教程中提供的一条附加规则,在该规则中您可以覆盖dh_auto_install。具体来说,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


删除该规则后(直到添加我的init.d脚本和conf文件之后,才需要删除该规则),所有内容都会完美地生成并编译...。事实上,包括使用/usr前缀将垃圾箱放入目标位置首先是覆盖的理想效果。

dh_installinit调用的覆盖告诉debuild不要像makefile那样安装init脚本,并指定仅进行update-rc.d调用以在系统中注册该脚本。我选择将脚本命名为与程序包不同的名称。因此,我需要通过--name =选项。

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

关于makefile - Autoconf和初始化脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26837148/

10-10 21:22