【问题标题】:"make install" - Changing output destination for all builds“make install” - 更改所有构建的输出目标
【发布时间】:2014-03-11 18:31:29
【问题描述】:

我在几台机器上做 Linux 开发,主要是 Slackware 13.37 和 Ubuntu 12.04。我正在测试和验证几个简单的 makefile 的结果,并想确认make install 的输出。但是,在继续测试之前,我想知道是否有一种可移植的方法来更改任何 makefile 的 make install 的默认输出目标。

如果我能以某种方式暂存我的输出,我会更喜欢,所以所有输出都会转到,例如:

/test/bin
/test/lib
/test/usr/bin

代替:

/bin
/lib
/usr/bin

我知道,例如,在 QNX 开发环境中,我可以设置像QCONF_OVERRIDEINSTALL_ROOT_nto 这样的环境变量,并保证除了/test 的子目录之外没有任何makefile 可以安装。 Ubuntu上的GCC是否有类似的机制,只需要在我的~/.bashrc文件中设置一些环境变量?我的所有工作都是通过命令行和 VIM 完成的,所以我不担心漂亮的 IDE 由于它们不在.kderc.gnomerc 或等效项中而无法理解这些环境变量的情况.

谢谢。

【问题讨论】:

  • 你试过make --prefix=/path/to/local/directory吗?
  • 那不行; --prefix 不是 make 的有效标志。要回答最初的问题,不,您无法设置任何变量来保证无论生成文件如何。是否有办法做到这一点是makefile的一个功能。如果makefile有办法做到这一点,你可以;如果不是,你不能。然而,几乎每个 makefile确实 都有办法做到这一点。
  • 好的。有点遗憾,这不是一个可以管理的独立于发行版的东西,特别是考虑到 GCC 从早期开始就与 Linux 耦合(我从 Slackware 3.0 开始)。 QNX 完美地做到了这一点,甚至允许您覆盖 make install 目标明确尝试安装到绝对路径的情况,只需在登录时所有用户来源的脚本中设置一些环境变量。
  • make DESTDIR=/test install

标签: linux ubuntu gcc compilation makefile


【解决方案1】:

简短回答:不。

长答案:

没有办法为任何 Makefile 设置输出目标; Makefile 或构建系统的其他部分必须设计为使其成为可能。 make 是一个非常简单的工具,因为它旨在在各种平台上以相同的方式运行。因此,它并没有真正使用 Makefile 本身不存在的环境变量。这在环境污染和减少魔法方面有好处,但不利于实现您的预​​期目标。

一点上下文:事情有点复杂,部分原因是,与 QNX 开发环境(一个很大程度上同构的交叉编译环境)不同,大部分软件使用 make(我假设 GNU make 但这个也适用于其他版本)构建是为异构构建和运行环境编写的——它可能被设计为能够为不同的发行版、操作系统(Linux、MS Windows、Mac OS X、FreeBSD 等)构建,甚至硬件架构(x86、arm、mips、power、sparc、sh 等)。有时您正在为同一个系统构建,有时为不同的系统构建。毫不奇怪,实际上并没有一种标准方法来定义跨多种系统的安装路径。

Basile 在他的回答中提到,对于使用 GNU 构建系统的程序,您可以使用./configure --prefix=/test。这通常适用于使用 Autotools 的简单程序。对于使用 GNU Autotools 的更复杂的程序,如果有更多不同的选项可用,通常会出现复杂情况:

  • 交叉编译?您可能希望将前缀设置为将在目标系统上安装的位置(可能是 /usr/local),并使用 make install DESTDIR=/test
  • 您的构建系统是否需要前缀目录中的依赖项,但您想在其他地方找到它们?最好运行./configure --help,看看还有哪些其他选项可以提供备用路径(通常是--with-foo=/prefix/of/foo

我确定我现在忘记了更多,但我想你明白了。

请记住,这仅适用于使用 Autotools 的项目。其他项目可能有其他系统(可能命名变量或编辑配置文件),所以最终你最好的选择是阅读项目文档,如果没有,则阅读 Makefile。好玩吧?

附:在环境中定义变量不同于将它们作为命令参数传递给make,即SPAM="alot" make targetmake target SPAM="alot" 不同——后者将覆盖makefile 变量。请参阅Variables from the Environment 上的 GNU make 文档。

【讨论】:

    【解决方案2】:

    只需更改makefile中的前缀变量

    prefix=/test
    

    然后运行

     make install
    

    你也可以运行以下命令来安装二进制文件

    make prefix=/test install
    

    参考http://www.gnu.org/prep/standards/html_node/Directory-Variables.html

    【讨论】:

      【解决方案3】:

      至少对于 GNU 软件(使用 autotools),您应该使用

      配置您的软件
      ./configure --prefix=/test
      

      只是使用(之前没有特定的--prefixconfigure

      make prefix=/test install
      

      通常不会正常工作,因为有些文件是程序内置的,所以它们的路径在其中变成了一个常量。

      您也可以使用make install DESTDIR=/tmp/dest,然后将/tmp/dest 复制到/test,但它也无法正常工作

      例如,我的/usr/local/bin/emacs 二进制文件将/usr/local/share/emacs/24.3.50/lisp 作为某个字符串(使用strings /usr/local/bin/emacs 命令检查),并且该路径的/usr/local/ 部分是configure-d 前缀。

      顺便说一句,您可以拥有一个chroot-ed 环境来测试您的应用程序的各种发行版。

      【讨论】:

        猜你喜欢
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多