如何使用 Autotools 永久设置环境变量?

How can I permanently set an environment variable using Autotools?

我正在调整现有程序以使用 Autotools 进行构建,但生成的过程取决于环境变量。有没有办法在构建或安装过程中永久设置此环境变量?

该程序旨在供 Unix 用户使用,我可以尝试将导出命令直接连接到 .bashrc 文件并在失败时警告用户,因为他们中的大多数人实际上只会使用 Ubuntu 到 运行 它(这是一个相对简单的针对学生的程序),但我想知道是否有更便携的方法来做到这一点。

那是我不想做的事情:

export VAR=/my/totally/not/hardcoded/path >> $HOME/.bashrc

我猜,没有。

Autotools 用于构建您的程序,而不是用于 运行 的程序环境设置。这就是 users/admins 应该做的。 (好吧,我可以想象 这样做,但我真的不想尝试弄明白,因为这个想法本身对我来说似乎是错误的)

如果您的程序在 run-time 期间确实需要一些环境变量,那么您应该为您的应用程序修补源代码以测试该变量是否存在,如果不存在,则将其设置为所需的默认值。另一个想法是强制使用强制命令行开关来传递值。

不清楚这与 autotools(或任何其他构建系统)有什么关系。当它构建的程序在稍后的时间 运行 时,没有构建系统本身可以安排一个 env var 存在。

一个解决方案是让您的程序为 var 设置一个硬编码的默认值,如果程序启动时环境 var 不存在,则使用该默认值 运行ning。另一个经常使用的解决方案是将二进制文件命名为 myprog.bin 并安装一个名为 myprog 的 shell 脚本,它设置做之前的环境exec myprog.bin.

I'm adapting an existing program to use Autotools for its build, but the resulting process depends on an environment variable. Is there a way to permanently set this environment variable during the build or installation process?

您对程序是什么(例如程序是守护进程吗?用户程序?)或环境变量依赖性的性质(例如它是另一个程序吗?挂载点?A URL?数据库连接字符串?)。更具体可能会给您更好的答案。

无论如何,autotools 不太可能提供任何功能来帮助:它是一个构建系统。根据环境变量依赖性的性质,您可能需要包管理(如果打包)或系统管理级别设置。

既然您认为您的主要用户群是 Ubuntu,this help page 可能会给您一些想法。

很抱歉这么晚才来,但迄今为止所有的答案都令人震惊……不完整。

构建和安装软件都是 Autotools 的核心用例,安装部分绝对涉及添加或修改影响用户环境的文件。如果该软件是由具有足够权限的用户安装的,那么这种效果绝对可以应用于所有系统用户,尽管细节可能因系统而异(并且 Autotools 也可以帮助解决这个问题!)。

例如,在 RedHat 家族 Linux 上,如 RedHat Enterprise、Fedora、Oracle Linux 和其他各种系统,您可以在 /etc/profile.d 中放置一个适当命名的文件,其中的命令将被每次登录自动读取和执行shell。为所有用户设置环境变量是此功能的常见用途之一。我不确定 Debian-family Linuxes 例如 Ubuntu,但总是可以修改文件 /etc/profile 而不是具有相同的效果,你绝对可以编写 Automake 安装挂钩来做到这一点。

或者对于一种完全不同的方法,您始终可以在程序周围提供一个包装脚本来设置所需的环境变量(假设重点不是向 PATH 添加目录以便首先找到程序)。在那种情况下,您甚至可以将主程序安装在通常不在路径中的位置,这样用户就不会不小心直接 运行 它。这种机制的优点是环境变量的范围是程序的 运行,而不是整个登录会话,但缺点是用户无法覆盖它们。