【问题标题】:What should Linux/Unix 'make install' consist of?Linux/Unix 的“make install”应该包括什么?
【发布时间】:2010-10-06 10:00:43
【问题描述】:

我已经编写了一个 C++ 程序(命令行、可移植代码),并且我正在尝试在发布 Windows 版本的同时发布 Linux 版本。我写了一个makefile如下:

绫音:*.cpp *.h g++ -Wno-write-strings -oayane *.cpp

到目前为止还算直截了当;但我知道习惯上会有第二步,进行安装。因此,当我将 install: target 放入 makefile 中时......应该与什么命令相关联? (如果可能的话,我希望它可以在所有 Unix 系统以及 Linux 上运行。)

【问题讨论】:

    标签: linux unix installation makefile


    【解决方案1】:

    安装

    一个不那么简单的安装程序会复制一些东西到适当的位置,首先确保存在适当的路径(使用mkdir -p 或类似的)。通常是这样的:

    • 可执行文件进入$INSTALL_PATH/bin
    • 为外部使用而构建的任何库都进入$INSTALL_PATH/lib$INSTALL_PATH/lib/yourappname
    • 手册页进入$INSTALL_PATH/share/man/man1,如果合适,可能还有其他部分
    • 其他文档进入$INSTALL_PATH/share/yourappname
    • 默认配置文件进入$INSTALL_PATH/etc/yourappname
    • 其他链接的标题进入$INSTALL_PATH/include/yourappname

    安装路径

    INSTALL_PATH 是构建系统的输入,通常默认为/usr/local。这使您的用户可以灵活地在其 $HOME 下进行安装,而无需提升权限。

    在最简单的情况下,只需使用

    INSTALL_PATH?=/usr/local
    

    在生成文件的顶部。然后用户可以通过在他们的 shell 中设置一个环境变量来覆盖它。

    卸载

    您有时还会看到 make installs 构建了一个清单来帮助卸载。清单甚至可以写成脚本来完成这项工作。

    另一种方法是让make uninstall 查找make install 放置的东西,如果存在则将其删除。

    【讨论】:

    • “make install”应该是唯一需要root权限的步骤,这一点也很重要。
    • 一个(不太尊重的约定)是使用 DESTDIR 作为暂存目录的名称,并安装在 $(DESTDIR)$(prefix) 中,其中前缀是在配置期间定义的,DESTDIR 是在 make 运行时设置(通常留空)。
    • 感谢 dmckee。如果有这样的事情,您是否有正式声明此约定的链接。你将如何安装内核模块?
    • @kuga en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard 编码了数十年的惯例和最佳实践,用于在 unix 机器上的位置。内核模块的安装与安装程序及其相关的杂物是完全不同的事情,我不知道。
    【解决方案2】:

    在最简单的情况下,您只需将新创建的可执行文件复制到/usr/local/bin 路径中。当然,它通常比这更复杂。

    请注意,这些操作中的大多数都需要特殊权限,这就是为什么通常使用 sudo 调用 make install

    【讨论】:

    • 我没有安装 sudo,实际上,我没有在 arch linux 构建系统 (ABS) 之外编译任何东西。要安装软件包,您需要是 root(或这样的特权),所以我同意
    • 当然,没有sudo的可以使用“su -c”。但他们应该用它来安装 sudo...
    【解决方案3】:

    make install 通常是将二进制“安装”到正确位置的步骤。

    例如,在编译 Vim 时,make install 可能会将其放在 /usr/local/bin 中

    并非所有 Makefile 都有 make install

    【讨论】:

    • OP 询问 make install 应该包含什么,而不是它是什么。他显然知道 make install 做了什么,只是不知道如何去做。在回答之前阅读问题,就好像 OP 是一个完整的初学者一样。
    猜你喜欢
    • 2011-04-24
    • 2014-07-09
    • 1970-01-01
    • 2011-03-05
    • 2012-09-12
    • 2021-08-03
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多