我无法理解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
吗?
答案 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.d
或rc.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>_SCRIPTS
,SCRIPTS
可以是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