但是當編譯軟件多了以後,管理就成問題了。/usr/local下那麼多文件,每個文件是由哪個軟件安裝的?搞不清。
要卸載一個軟件怎麼辦?make uninstall就可以啊。是可以。但是,第一,一些軟件的Makefile沒有定義uninstall,或者定義的uninstall卸載的不干淨。第二,要用make uninstall,你就得保留源碼。占了很多空間。
有沒有簡單的辦法?有,學習Mac OS X,一個軟件安裝在一個目錄。
安裝app-1.4
代码: 全选
tar xzf app-1.4.tgz
./configure --prefix=/usr/local/app-1.4
make
sudo make install
代码: 全选
tar xzf bpp-3.0.tgz
./configure --prefix=/usr/local/bpp-3.0
make
sudo make install
卸載是方便了。但是用起來就不方便了。因為每個軟件都裝在自己的目錄,而不是標准的/usr/local/,會出現找不到命令。那就把/usr/local/app-1.4/bin和/usr/local/bpp-3.0/bin都加到path裡就可以。軟件多了以後,就是超長path。卸載軟件,或者安裝了新軟件後,都要修改path。很麻煩。而且還不止。man到哪裡去找?lib到哪裡去找?系統都不知道。都要手工加上。然後每次安裝卸載軟件,都要手工修改,太麻煩了。
於是,就有了stow。
安裝了stow後(sudo aptitude install stow,或者使用新立得安裝stow軟件包),方便多了。
安裝app-1.4
代码: 全选
tar xzf app-1.4.tgz
./configure --prefix=/usr/local/stow/app-1.4
make
sudo make install
cd /usr/local/stow/
sudo stow app-1.4
代码: 全选
tar xzf bpp-3.0.tgz
./configure --prefix=/usr/local/stow/bpp-3.0
make
sudo make install
cd /usr/local/stow/
sudo stow bpp-3.0
要刪除app很容易。
代码: 全选
cd /usr/local/stow/
sudo stow -D app-1.4
sudo rm -r app-1.4
其他用法。
app-1.5出來了。我想嘗鮮。很簡單,用上述方法安裝app-1.5就可以了。(升級到app-1.5不需要刪除app-1.4.)
用了一段時間,發現app-1.5有個嚴重的bug。怎麼辦?降級到1.4。很容易,只要兩步。
代码: 全选
cd /usr/local/stow/
sudo stow -D app-1.5
sudo stow app-1.4
再比如,你看到bpp-3.0的網站上有人提交了一個patch,可以提供一個很酷的新功能。但是維護者還在審查這個patch的過程中,沒有更新。出於各種原因,你決定信任這個patch,於是你應用這個patch到bpp-3.0,重新編譯了bpp-3.0。然後,你只需要
代码: 全选
cd /usr/loca/stow/
sudo stow -R bpp-3.0
當然,stow只是一個簡單的軟件,不是apt或者portage這種大家伙,所以,你不可能指望它能自動處理依賴關系,這不是它的適用范圍。對於文件沖突的情況,stow是比較智能的,但有時也無法自動解決,需要你手工干預。這些都算不上問題。因為如果你手工編譯安裝,不用stow的話,一樣不會自動解決依賴。而文件沖突,stow無法解決的時候至少會報錯,不用stow的話,就是不管三七二十一直接覆蓋,問題更嚴重。
如果你使用多個stow目錄,比如/usr/local/stow1, /usr/local/stow2, /usr/local/stow3等,或者,你沒有root權限,把軟件軟連接到不是/usr/local/的目錄(是的,你可以使用諸如stow -t /home/joe/local/ 指定另外的軟連接目錄),有時會出現一些復雜的情況。請參考stow manual。如果你總是把軟件都裝在/usr/local/stow下(軟連接的路徑也采用stow默認的/usr/local/),基本可以避免出現復雜的情況。