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

 

 

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