【发布时间】:2020-01-20 20:50:18
【问题描述】:
我有一个自动工具项目,它成功地构建和测试了一个应用程序 (https://github.com/goglecm/AutoBrightnessCam)。该应用程序安装在 bin 目录中(前面有用户指定的任何前缀)。这很简单。我现在需要创建一个 systemd 服务以在启动时启动它。我已经创建了服务文件并手动运行它,它工作正常。
最后一点是告诉 configure.ac 和 Makefile.am 用应用程序的正确路径修补 *.service.in 文件(就像 config.h 是从 config.h.in 创建的一样)。
使用 AC_CONFIG_HEADERS 是否适合将 *.service.in 修补到 *.service 中?是否有另一个宏用于“非标题”?
另外,我如何指定服务文件应该登陆(即安装)在 /etc/systemd/system 中?
是否有更好的方法在没有 systemd 的情况下在启动时启动此应用?
【问题讨论】:
-
关于您的评论,“出于某种原因,它用 ${exec_prefix}/bin 替换了@bindir@”,这是应该发生的。请参阅 GNU Coding Standards 和 7.2.5 Variables for Installation Directories。您可以为
--prefix和--exec_prefix(或--sysconfdir)指定不同的值,但问题的根本原因是不同的。问题是由于编码标准和 Autotools 的限制。它不能同时处理系统和用户安装的软件。 -
也许你需要两个 makefile。第一次在
/usr/local或/opt/<package>中构建并安装您的软件。第二个在/etc中安装系统计时器和服务。我不知道 Autotools 是否会更好地处理双 makefile。 Autotools 实在是太有限了,而且漏洞百出。考虑一下,Fedora 在 2013 年切换到 Systemd,在 2015 年切换到 Debian。Autotools 的人已经有 7 年的时间来解决这个问题,但他们完全没有做任何事情。 -
另见Install binaries into /bin, /sbin, /usr/bin and /usr/sbin, interactions with --prefix and DESTDIR,这似乎与您的问题非常相似。 @WilliamPursell 的回答看起来像是采用了“拆分”的方法,但我没有详细研究过。最后,你想出的双 makefile、Purcell 的 hack 和其他回转是由于编码标准的不足和 Autotools 中的错误。如果一切都完全指定,你就不会有这些麻烦。
-
我知道你已经在你自己的 repo 中修复了这个问题,但是为了将来的问题读者的利益:你根本不应该在
/etc/systemd/中安装 systemd 单元文件。它们应该安装在 systemd 单元目录中,很可能是${libdir}/systemd/system/和${libdir}/systemd/user/。systemctl enable命令将使符号链接成为/etc/systemd/(system|user)。如果安装了systemd.pc,您可以使用pkg-config --variable=systemd_system_unit_dir systemd和pkg-config --variable=systemd_user_unit_dir systemd或它们的自动工具等效项查询路径。