homebrew的“keg-only”

转自:https://www.jianshu.com/p/f00c05627b38

用homebrew 安装boost ,结果发现以下三个路径,在include 和library 路径的时候就有点晕了,当然可以都加上,但是C++不推荐重复路径,因为库的优先级限定比较严格,于是我查了一下这三个路径的来龙去脉。

以上图主要显示三个路径下的boost,
1)/usr/local/include/boost
2)/usr/local/opt/boost

3)/usr/local/Cellar/boost

其中/usr/local/eosio/include/boost是eosio自带的,不是Homebrew安装的,不做讨论。
/usr/local/var/homebrew/linked/boost 是一个链接,且var 通常放日志文件等,应该可以不去讨论。

查了一下,通常MacOS下文件存放遵循这个规则:

  • /usr/local下一般是你安装软件的目录,这个目录就相当于在windows下的programefiles这个目录
  • /usr/local/opt这个目录是一些大型软件的安装目录,或者是一些服务程序的安装目录;在安装了Homebrew的macOS系统上,所有的文件,都指向了Cellar目录下的程序,也就是说这个目录目前放的,主要是用来兼容程序使用的目的。

于是继续查看,关于/usr/local/下的boost:

include路径指向cellar的include, 同样,、usr/local/lib 也指向Cellar 下的 boost 的lib,也就是说是分开放的,且都是链接。

至于opt,是这样的:

是整个boost 的指针链接指向Cellar

Cellar是homebrew的缺省安装目录,是存放boost 等pkg的物理文件,而其他都是指针。
/usr/local 是用于通常使用,指针会随时指向最新的pkg, 而 opt 是用于兼容的.

在homebrew中有一个很重要的概念"keg-only",不知道如何翻译。所谓"keg-only",看下面这个例子:

brew install node
brew install node@8
brew unlink node
brew link node@8

有两个版本node 和 node@8, 如要使用 "keg-only" formula,使用以下command:

brew link --force node@8

 

再看以下例子:

/usr/local 下:
/usr/local/bin/elasticsearch -> ../Cellar/elasticsearch/5.2.2/bin/elasticsearch
而在/usr/local/opt下:
/usr/local/opt/elasticsearch -> ../Cellar/elasticsearch/5.2.2
/usr/local/opt/[email protected] -> ../Cellar/[email protected]/1.7.6_1

这是有两个版本,/usr/local 是默认指向最新版本,但是有时候需要支持不同版本,这样的话,在路径中加入opt, 避免直接指向物理路径。

export PATH=$PATH:/usr/local/bin/bin:/usr/local/opt/[email protected]/bin

从而支持兼容版本。

"keg-only" 是homebrew一个很重要的特性。

参考:https://github.com/Homebrew/homebrew-core/issues/11091

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章