gpt4 book ai didi

makefile - Autoconf 和初始化脚本

转载 作者:行者123 更新时间:2023-12-02 19:10:49 25 4
gpt4 key购买 nike

我无法理解 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) 是脚本的默认值。

--

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

There is no need for EXTRA_DIST or any build rule: Automake infers them from AC_CONFIG_FILES (see Requirements). CLEANFILES is still useful, because by default Automake will clean targets of AC_CONFIG_FILES in distclean, not clean.

源链接(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 生成的,您可以/应该(?) un 在任一示例中注释 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 打包)的人 - 这或多或少地提醒了我自己 -> 看这里:

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

我在 debuild 尝试将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com