我无法理解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)/etc
; init.d
或rc.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/