我想以这样的方式安装本地 tar 文件,以便它可以在命令行上立即可用,就像我使用“sudo apt-get install XYZ”一样(假设没有依赖项)。
我知道如何解压 tar,然后使用 configure/make 进行编译,但这只会留下一个可执行文件,我必须稍后添加路径。
我想我可以复制到 /bin 并完成它,但我只是想知道这里的标准做法是什么。
作为奖励,如果知道如何使用 RPM 和其他类型的软件包来完成此操作,那就太好了。
答案1
这个答案是基于多条聊天消息我发布了,现在作为扩展摘要。
环境$PATH
变量
通过“在命令行上立即可用”,我假设您的意思是您可以像 一样运行它name
,而不必键入类似 的内容/path/to/name
,例如/home/galahad/bin/name
或./name
。
你的$PATH
环境变量包含以 - 分隔的目录名称列表:
。当您在 shell 中运行包含/
字符的命令时,它会被解释为要运行的可执行文件的确切位置和名称。但是当你运行一个命令时不是包含 a /
,您的 shell 会在目录中搜索$PATH
该名称的可执行文件,并运行它找到的第一个。 (它还可能记住您之前运行过的可执行文件所在的位置。因此,实际上,它不必每次都搜索它们。)
这就是为什么./name
运行name
位于当前目录中的可执行文件的常见方法。相反,运行name
时会搜索$PATH
.
如果你运行echo "$PATH"
你会看到类似这样的东西,尽管它很可能不完全是这样的:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
中的目录$PATH
不必被调用bin
,但这很常见。
配置您的构建
./configure
当您拥有通过运行和编译的源代码时make
,您通常会使用make install
(或sudo make install
) 来安装它。这会将文件从构建目录复制到安装位置。当您要安装的东西提供可执行命令时,这些可执行文件通常会复制$PATH
到$PATH
.
尽管构建和安装软件通常就像运行./configure
, make
,有时运行make check
或make test
,然后运行make install
或一样简单sudo make install
,但有时您会希望将选项传递给configure
脚本来配置构建。尤其,正如 pfnuesel 所说,这就是您的配置方式在哪里将要安装该软件。尽管该make install
步骤实际上安装了软件,但通常会在该./configure
步骤中建立安装所有内容的位置。
最常见的选项是--prefix
.当您不知道configure
使用什么时,默认前缀通常是/usr/local
. (有时,程序或库的源代码默认为其他前缀。幸运的是,这种情况很少见。)
所以./configure
通常相当于./configure --prefix=/usr/local
.要在您的主目录中安装软件,您可以使用./configure --prefix=/home/galahad
(如果/home/galahad
是您的主目录)或--prefix="$HOME"
.当然,您仍然必须使用 来构建和安装软件make
。我应该说,并非所有以源代码形式分发的软件都是这样构建的。您应该始终在提取的源代码存档中查找文档。
什么--prefix
意思
当您运行时,您表明该软件应安装在./configure --prefix=directory
directory
目录。但这很少(如果有的话)将松散的文件放入directory
。相反,它将用于不同目的的文件放置在不同的子目录中directory
。如果这些子目录不存在,则会创建它们。
可执行文件通常会进入,但如果它们通常用于系统管理,则directory/bin
可能会进入,或者如果它们是游戏,则可能会进入(现在更罕见)。库进入或另一个类似命名的目录,例如.头文件进去。手册页进入。软件使用的数据文件放入.directory/sbin
directory/games
directory/lib
directory/lib32
directory/include
directory/man
directory/share
这就是它的意义directory
成为一个字首。它是包含将安装不同文件的位置的父目录。因此它显示为前缀在里面绝对路径make install
通过运行或创建的大多数文件和目录sudo make install
。
但也有一些例外。系统范围的配置文件——有时在安装使用它们的软件时创建,但并非总是如此——通常放在/etc
.这通常不会受到指定不同前缀的影响。即使您在 中安装了很多软件/usr/local
,它仍然会主要使用/etc
,并且您的/usr/local/etc
目录可能不存在、为空或包含很少的文件。
在许多系统上,您可以通过运行找到有关典型文件系统布局的更多信息man hier
。如果您使用 GNU/Linux 系统,您可能会对文件系统层次结构标准。
您的系统安装软件的位置
系统中的大多数程序,包括绝大多数 GNU/Linux 操作系统中的包管理器安装的程序(GoboLinux是一个例外)和其他一些类 Unix 系统,安装时带有前缀/usr
.您很少应该将该前缀传递给./configure
,因为您通常希望避免与系统提供的软件发生冲突。
/usr
允许位于网络共享或分区上,否则在引导过程的早期尚未安装。此时必须可访问的软件通常安装在/
.这就是为什么/usr/bin
和都/bin
存在以及为什么sh
通常是/bin/sh
。
包管理
大多数包管理器都支持安装二进制文件(尽管也有例外)。通常,当您使用包管理器在 GNU/Linux 系统中安装软件时,您正在安装二进制包。在这种情况下,包管理器本身不会编译任何内容。但是,安装仍然涉及将文件复制或提取到文件系统中的位置。
这就是我说你的包管理器安装大多数带有/usr
.我并不是说它一定会运行./configure --prefix=/usr
或任何./configure
命令。
不同的操作系统有不同的包管理器。如果您使用的是 Debian 或 Ubuntu 等发行版,该发行版专为您使用dpkg
、apt-get
、 和等实用程序而设计aptitude
,那么您应该不是通常尝试使用 、 和 来rpm
安装yum
软件dnf
。
但不同包管理器的核心原则是相同的。当包管理器安装命令时,它通常会进入预期位于用户$PATH
环境变量中的目录。在 GNU/Linux 系统中,包管理器通常管理所有的系统 - 除了您以其他方式安装的任何内容 - 因此安装大多数带有前缀 的软件/usr
,从而将大多数可执行命令放在/usr/bin
. (当然,就像运行make install
或 一样sudo make install
,包管理器通常也会将其他文件安装到其他位置。)
答案2
如果您要安装的程序遵循良好的做法,您可以使用以下命令安装它
./configure
make
make install
./configure
检查您的系统是否满足所有要求并配置安装选项。make
编译所有内容,并将make install
所有必要的文件复制到正确的位置。您不想手动执行最后一步,因为将所有库、手册页等放到正确的位置将是相当乏味的。
您还可以定义软件包的安装位置。例如,如果您想在主目录中安装软件包(因为例如您没有管理员权限),您可以使用
./configure --prefix="$HOME"/somefolder
make install
然后将其安装到该文件夹中。不过,通常您不需要这个。