makefile - "make install"和 "make altinstall"之间的细节差异

标签 makefile installation

这是我的案例:

我正在使用Ubuntu 10.04 (清醒山猫)。系统默认的Python是v2.6.5,但我需要Python v2.7。所以我从 python.org 下载了源代码并尝试安装它。

我第一次安装它时,我运行:

cd Python2.7.4
./configure --prefix=/usr
make
su root
make install

这会将 Python 2.7 安装到我的系统中。它将在 /usr/bin 中创建一个链接“python”,链接到也在 /usr/bin 中的 python2.7。因此,当我输入 >python 时,系统将为我启动 Python 2.7.4,就像我输入 >python2.7 时一样。

但是当我这样安装时:

cd Python2.7.4
./configure --prefix=/usr
make
su root
make altinstall

/usr/bin 中的链接“python”仍然存在,并链接到默认系统版本 python2.6。当然,我可以删除它并创建一个链接到 python2.7 的新软链接(soft link)。

除了 /usr/bin 中的链接之外,命令“make install”和“make altinstall”之间有什么区别?

最佳答案

TLDR:altinstall 跳过创建 python 链接和手册页链接,install 将隐藏系统二进制文件和手册页。

让我们看看生成的Makefile!

首先,安装目标:

install:         altinstall bininstall maninstall

它可以完成 altinstall 所做的一切,以及 bininstallmaninstall

这是bininstall;它只是创建 python 和其他符号链接(symbolic link)。

# Install the interpreter by creating a symlink chain:
#  $(PYTHON) -> python2 -> python$(VERSION))
# Also create equivalent chains for other installed files
bininstall:     altbininstall
        -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON) -o -h $(DESTDIR)$(BINDIR)/$(PYTHON); \
        then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON); \
        else true; \
        fi
        (cd $(DESTDIR)$(BINDIR); $(LN) -s python2$(EXE) $(PYTHON))
        -rm -f $(DESTDIR)$(BINDIR)/python2$(EXE)
        (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python2$(EXE))
        ... (More links created)

这里是 maninstall,它只是创建指向 Python 手册页的“无版本”链接。

# Install the unversioned manual pages
maninstall:     altmaninstall
        -rm -f $(DESTDIR)$(MANDIR)/man1/python2.1
        (cd $(DESTDIR)$(MANDIR)/man1; $(LN) -s python$(VERSION).1 python2.1)
        -rm -f $(DESTDIR)$(MANDIR)/man1/python.1
        (cd $(DESTDIR)$(MANDIR)/man1; $(LN) -s python2.1 python.1)

关于makefile - "make install"和 "make altinstall"之间的细节差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16018463/

相关文章:

vue.js - 如何修复 'Cannot find module vue-cli-service.js'?

python - Keras : 'can not import name ' abs' 导入错误

makefile - 获取 GNU make 中文件夹的基本名称

c++ - 当我可以从终端编译时在 Linux 和 Eclipse 中编译

makefile - 如果当前目录中已存在名为 target 的文件,则在没有 .PHONY 的情况下构建目标

java - 用 Java 创建可执行安装程序

Java 应用程序部署/安装程序选项?

c - 链接静态库

makefile - mt19937 不是 std 的成员 可能的 makefile 问题

php - Laravel 7 从 Laravel 6 升级时抛出错误 255