make 可以自动安装依赖吗?

make 可以自动安装依赖吗?

make当我使用和方法安装程序时make install,(通常)在开始安装新程序之前需要安装许多依赖项。因此,目前,每次收到缺少依赖项的错误消息时,我都会手动安装每个依赖项。

我可以看到该make手册页没有列出任何简单的选项来继续自动安装依赖项,所以我想知道是否有解决方法或脚本来实现这一点?

答案1

这不是 makefile 的用途。 Makefile 仅处理构建软件并将其以通用方式安装到系统中(没有包管理器)。它不关心(也不应该关心)您是否有实际运行应用程序的要求。这是设计使然。考虑几点:

1)如果您的发行版使用包管理器(几乎所有发行版都以某种方式这样做),您make install无论如何都不应该直接调用,因为这会绕过包管理器并污染您的系统。在这种情况下,make install当您构建软件包时,会在“沙盒”环境中调用,安装会被打包,并且由您选择的软件包管理器安装和处理该软件包。

2)不应该要求以“正确”的顺序安装所有东西。事实上,这肯定会导致循环依赖,并且无法安装。即使是包管理器通常对此也过于严格,这会导致问题。另外,当您构建包(构建脚本调用make install)时,您实际上并不打算运行该程序,并且可能无论如何都没有安装要求。毕竟,您只是构建一个将安装在其他计算机上的软件包。

3)没有一种可移植的方法可以做到这一点。您的定义是独立于平台的,如何make install知道在哪里寻找需求(硬连线网址或其他东西?那很快就会中断!)。它无法通过包管理器,因为它必须在所有可能性上运行,包括您没有预料到的未来的可能性 - 而且版本也会发生变化。

4) 没有唯一的决定安装什么。共享库可以由不同的包提供。甚至不止一个libc。还有不止一个提供 OpenGL 功能的软件包(不同的显卡)、不同的矩阵代数软件包、不同的媒体播放库(vlc 与 gstreamer),我可以继续讲很多年。您可以选择如何设计系统以及使用什么组件,这就是这种模块化设计的美妙之处(而不是旧的 Windows 经典将所有内容都放在一张 CD/DVD 上,从而让每个库通过不同的软件包安装一千次,每个应用程序的安装量为千兆字节,在合理的设计下不应超过 10MB)。

5) 这不是 的工作make install,而是不同级别的维护。configure && make && make install处理检查您已安装的内容(构建时依赖项)、编译代码并显示文件应放置的位置。对您需要的其他软件版本的要求属于打包和分发领域,这是一个单独的过程 - 包管理器,或者系统管理员,如果他以传统方式安装东西。你永远不应该混淆这两个概念——这会导致混乱。如果事物被分成明确定义的层,那么开发人员可以独立于打包者和发行版维护者来更改事物:如果发行版决定以不同的名称重新打包事物并使用不同的替代方案,将事物放在不同的目录中,他们不应该期望应用程序负责 makefile 的开发人员了解或关心这一点。

简而言之 - 无论依赖项是构建时依赖项(没有它就make无法运行 - 通常由configure脚本检测到),还是运行时依赖项,都不应该在 makefile 级别完成。请不要以错误的方式做事并考虑标准。如果您正在处理还没有包的东西(检查用户提供的包,它可能已经存在),您应该调查需要什么并实际构建包 - 这对其他人也更好,然后他们可以享受你制作的包。

答案2

这是一个 Makefile 目标,我有时用它来在系统中部署东西,在这些系统中,我不确切知道我可以依赖哪些已安装的软件包。我应该可以将其扩展到 apt 和 pacman 之外。

您实际执行的操作取决于所需的可执行文件。可执行文件的目标正在尝试获取包含它的正确包。

ifneq (,$(wildcard /usr/bin/apt))
# USE APT
/usr/bin/apt-file:
    $(warning $@ not installed. trying to install via apt ...)
    sudo apt install -y apt-file
    sudo apt-file update

/usr/bin/%: /usr/bin/apt-file
    $(warning $@ not installed. trying to install via apt ...)
    sudo apt install -y $(shell apt-file --fixed-string --package-only search $@)

else ifneq (,$(wildcard /usr/bin/pacman))
# USE PACMAN

/usr/bin/%:
    $(warning $@ not installed. trying to install via pacman ...)
    sudo pacman -Fy
    sudo pacman -Sy $(shell sudo pacman -Fq $@)

else
# NO PACKAGE MANAGER SUPPORT
/usr/bin/%:
    $(error $@ not installed. please install manually and try again ...)

endif

通过在 makefile 中添加此内容,您可以轻松添加其他目标,如下所示:

index.html: | /usr/bin/wget
    /usr/bin/wget www.google.de

您应该只需要关心最终更新您的包数据库。

相关内容