首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autoconf和init脚本

Autoconf和init脚本
EN

Stack Overflow用户
提问于 2014-11-10 05:10:19
回答 2查看 1.4K关注 0票数 4

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

autoconf工具链指定了一系列婚前安装目录变量,如$bindir (可执行文件通常是/usr/local/bin)或$includedir (用于头文件,可能是/usr/include)等等。

但是在/etc/init.d中的init文件呢?在目录变量列表上阅读时,我没有看到任何与/etc/init.d/类似的东西

那么这里的惯例是什么呢?我是否只需要选择一个安装目录变量并使用AC_SUBST覆盖它,这样我就可以将脚本安装到/etc/init.d

EN

回答 2

Stack Overflow用户

发布于 2015-01-30 08:33:15

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

代码语言:javascript
复制
# Install my_script in $(bindir) and distribute it.
dist_bin_SCRIPTS = my_script

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

--

对于一个更健壮的实现,它实际上涵盖了守护进程/服务的init脚本(首先引用了权威的源代码):

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

链接到源(节点/Scripts.html):

示例

安装到自定义位置:

代码语言:javascript
复制
# 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的基本路径,您可以/应该(?)如果您的init脚本是由Autotools生成的,请在两个示例中注释CLEANFILES行。

或安装到默认位置:

代码语言:javascript
复制
bin_SCRIPTS = <yourscript>
# CLEANFILES = $(bin_SCRIPTS)

哪一个是$(bindir)

编辑

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

代码语言:javascript
复制
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中安装init.d文件和conf文件,而不是在debian/<package>/<location>中安装init.d文件和conf文件时出现的错误。

我发现最终我不得不删除Debian的打包教程中提供的一个附加规则,在这里他们让您重写dh_auto_install。特别是在debian/rules中的这个位

代码语言:javascript
复制
#!/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文件之后才需要删除)之后,所有生成和编译的内容都绝对是perfectly....Including --实际上--使用/usr前缀将回收箱丢弃到它们的目的地,这是重写最初想要的效果。

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

希望这能帮助到别人,我知道如果这个答案能继续存在的话,将来会对我有帮助的。

票数 3
EN

Stack Overflow用户

发布于 2014-11-10 10:18:23

根据 (加上一些日期),Autotools可能不太适合这样做。尽管如此,提供了这些指示(经小修改后转载):

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26837148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档