“make install” - 更改所有构建的输出目标

时间:2014-02-13 03:44:06

标签: linux ubuntu gcc compilation makefile

我正在几台机器上进行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,并保证没有makefile能够安装在除{{1}子目录以外的任何位置}} 例如。在Ubuntu上是否有类似的GCC机制,只需要在我的/test文件中设置一些环境变量?我通过命令行和VIM完成所有工作,所以我不担心漂亮的IDE不理解这些环境变量的情况,因为它们不在~/.bashrc {{1}或等同物。

谢谢。

3 个答案:

答案 0 :(得分:5)

简短回答:不。

答案很长:

没有办法为任何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。好玩,嗯?

P.S。在环境中定义变量与将它们作为命令参数传递给make不同,即SPAM="alot" make targetmake target SPAM="alot"不同 - 后者将覆盖makefile变量。请参阅Variables from the Environment上的GNU make docs。

答案 1 :(得分:2)

只需在makefile中更改前缀变量

prefix=/test

然后运行

 make install

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

make prefix=/test install

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

答案 2 :(得分:2)

至少对于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 prefix。

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