【问题标题】:How can I permanently set an environment variable using Autotools?如何使用 Autotools 永久设置环境变量?
【发布时间】:2018-09-15 09:44:19
【问题描述】:

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

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

那是我不想做的:

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

【问题讨论】:

  • 您的问题实际上与构建系统没有任何关系。任何构建系统都不允许您设置在其构建的程序稍后运行时存在的环境变量。
  • 我认为这种“能力”是一个巨大的安全漏洞。

标签: unix environment-variables autotools autoconf automake


【解决方案1】:

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

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

例如,在 RedHat Enterprise、Fedora、Oracle Linux 等 RedHat 系列 Linux 上,您可以在 /etc/profile.d 中放置一个适当命名的文件,其中的命令将被每个人自动读取和执行登录外壳。为所有用户设置环境变量是此功能的常见用途之一。我不确定 Debian 系列 Linux,例如 Ubuntu,但始终可以修改文件 /etc/profile 来获得相同的效果,您绝对可以编写一个 Automake 安装钩子来做到这一点。

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

【讨论】:

  • 谢谢你的回答 :) 你认为编辑 /etc/profile 文件是最后的手段吗?
  • 我绝对会考虑编辑/etc/profile 作为最后的手段。尽可能避免该选项。你的软件最好只对整个文件负责,而不是对文件的部分负责。尽管我不知道 Ubuntu 是否像 RedHat 系列和其他一些发行版一样尊重 /etc/profile.d/* 文件,但我会震惊地发现它至少没有类似的机制。此外,不要忽视 wrapper 选项——如果它支持您的需求,那么它可能是最干净、最便携的替代方案。
【解决方案2】:

我猜,没有。

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

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

【讨论】:

  • 相反,Autotools 是关于构建和安装软件的。安装部分绝对可以涉及删除或修改环境配置文件。
【解决方案3】:

尚不清楚这与自动工具(或任何其他构建系统)有什么关系。没有构建系统本身可以安排在其构建的程序稍后运行时出现 env var。

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2021-09-23
      • 1970-01-01
      相关资源
      最近更新 更多