make 和 makepkg 有什么区别?

ano*_*non 2 arch-linux make makepkg

来自Arch 维基

Arch Linux 中的软件包是使用该makepkg实用程序构建的。当 makepkg 运行时,它会在当前目录中搜索PKGBUILD文件,并按照其中的说明进行编译或以其他方式获取文件以构建包存档 (pkgname.pkg.tar.xz)。生成的包包含二进制文件和安装说明,可以使用 pacman 轻松安装。

Make是一个 GNU 实用程序,用于从源代码构建和安装软件包,为此,它会在适当的目录中搜索 makefile,该目录将所需的输入提供给make.

Somakepkg用于制作 pacman 可安装的二进制文件,并且makepkg -si可以选择解析依赖项(主要用于 AUR 包)。区别只是在于依赖解析和 pacman 特定的东西吗?它只是一些可以通过make每个发行版手动完成的事情的自动化。

我对么?抱歉,如果这是一个愚蠢的问题。

Ste*_*art 5

长话短说

优点makepkg超过make

  • 抽象构建系统 ( make, configure, cmake, qmake, npm, pybuild, ninja, pybuild)
  • 管理依赖关系(构建和运行时)
  • 创建可以分发或安装的包
  • 允许发行版特定的补丁或配置
  • 支持安装/卸载/升级脚本
  • 跟踪系统上的文件,以便您知道为什么安装特定文件(谁拥有它)
  • 使卸载更容易。
  • 使升级更容易(源包中的重命名文件不会留下孤儿,脚本可以安全地迁移数据库)。

--verbose

makeMakeFile将在当前目录中 执行 a ,构建所需的目标。make install将尝试将这些目标安装到DESTDIR.

makepkg -i基于 的规则构建PKGBUILD。这可能是:

configure
make
make install DESTDIR=/usr
Run Code Online (Sandbox Code Playgroud)

或者

cmake .
cmake --build . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release
ctest .
cmake --build . --target=install
Run Code Online (Sandbox Code Playgroud)

或任何一个

cargo build --release
npm --build
pybuild
qmake
...
Run Code Online (Sandbox Code Playgroud)

有很多构建系统。 make只是其中之一,并且通常只是其中的一部分(例如autoconf)。 PKGBUILD这是一种很好的方法,使得 arch 包用户(或构建机器)可以使用单个命令(makepkg),而无需了解有关构建系统的任何信息。它的目的是定义如何构建包而不是如何构建源代码。

PKGBUILD还提供了定义构建依赖项或运行时依赖项的机会。这意味着如果您需要cmake构建一个包,它将自动安装(如果-s指定)并自动删除(如果-r指定)。如果您的软件包依赖于python3,那么它将确保python3自动安装在您的系统上。

PKGBUILD还为 Arch 维护者提供了将自己的补丁/自定义添加到原始源代码包的可能性。如果上游包将库可执行文件安装到/usr/lib/,但 Arch 的标准宁愿将它们放在 中/usr/libexec/,则该PKGBUILD文件允许此类自定义。


如果您不使用该-i选项,makepkg则不会尝试安装该版本。相反,输出是一个.tar.xz文件,可以将其上传到存档并由其他用户使用pacman. 这就是官方 arch 存储库的工作方式。

Arch 开发人员将编写PKGBUILD文件,然后构建机器将解析这些文件,构建包,并将它们上传到官方存储库,以便您可以用来pacman下载/安装它们。


使用makepkgover的另一个优点make install是你的包管理器会保留安装内容、位置和版本的索引。这意味着,如果您对为什么某个文件位于您的系统上有疑问,您应该能够查询包管理器,他会告诉您哪个包“拥有”该文件以及它是什么版本。当您卸载软件包时,软件包管理器知道所有文件,因此不会留下任何孤立的文件。当您升级软件包时,软件包管理器知道在安装过程中要替换/重命名/删除哪些文件,并且还可能运行一两个脚本以确保顺利迁移。