用stow管理自個兒編譯的軟件

编译安装或者制作Deb包
回复
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 42 次
接收感谢: 9 次
联系:

用stow管理自個兒編譯的軟件

#1

帖子 millenniumdark » 2009-02-04 20:40

為什麼要用stow?configure && make && make install不就可以了嗎?

但是當編譯軟件多了以後,管理就成問題了。/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
安裝另一個軟件bpp-3.0

代码: 全选

tar xzf bpp-3.0.tgz
./configure --prefix=/usr/local/bpp-3.0
make
sudo make install
要卸載app-1.4非常方便。直接刪除/usr/local/app-1.4就可以。

卸載是方便了。但是用起來就不方便了。因為每個軟件都裝在自己的目錄,而不是標准的/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
安裝bpp-3.0

代码: 全选

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和bpp的所有文件都被stow軟鏈接到了/usr/local。path,man, lib等等都放在通常的地方,你不用手工修改它們,馬上就可以使用了。因為是軟鏈接,並不額外占用磁盤空間。而且,軟連接對性能的影響可以忽略不計。

要刪除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
如果重裝了系統,只要把/usr/local/stow備份了,就可以很容易地重新安裝軟件,不用重新編譯。(重裝的系統和原來的系統差別不能太大。)安裝到多臺系統配置差不多的電腦同理。

當然,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/),基本可以避免出現復雜的情況。
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
送出感谢: 0
接收感谢: 0
联系:

Re: 用stow管理自個兒編譯的軟件

#2

帖子 lerosua » 2009-02-04 21:14

收藏 :em11
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

Re: 用stow管理自個兒編譯的軟件

#3

帖子 BigSnake.NET » 2009-02-04 21:30

不是所有的软件都 ./configure
不是所有的 configure 都支持 --prefix
不是所有的 make install 都装到 --prefix ..

综上, checkinstall 是首选
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 42 次
接收感谢: 9 次
联系:

Re: 用stow管理自個兒編譯的軟件

#4

帖子 millenniumdark » 2009-02-04 23:00

BigSnake.NET 写了:不是所有的软件都 ./configure
不是所有的 configure 都支持 --prefix
不是所有的 make install 都装到 --prefix ..

综上, checkinstall 是首选
autoconf和automake還是比較流行的。

而且,stow也不依賴於autoconf和automake,只要把軟件的安裝目錄指定為/usr/local/stow/program-version。然後stow /usr/local/stow/program-version就會自動在/usr/local/建立軟連接。(不能指定安裝位置的軟件應該非常少吧。)

checkinstall有時候會出問題。還有,用checkinstall做deb包的話,軟件是安裝在系統目錄的,這個有時候比較麻煩,容易起沖突。而且,會把舊版本覆蓋掉。
头像
jarryson
帖子: 4002
注册时间: 2005-08-14 19:53
送出感谢: 1 次
接收感谢: 2 次
联系:

Re: 用stow管理自個兒編譯的軟件

#5

帖子 jarryson » 2009-02-05 2:48

还是Arch先进。。包管理器管理下载2进制程序,还有自己编译的程序。。。没你们这么多麻烦,嘿嘿
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 42 次
接收感谢: 9 次
联系:

Re: 用stow管理自個兒編譯的軟件

#6

帖子 millenniumdark » 2009-02-05 23:05

jarryson 写了:还是Arch先进。。包管理器管理下载2进制程序,还有自己编译的程序。。。没你们这么多麻烦,嘿嘿
pacman也要靠ABS工作。你要寫ABS pkgbuild文件的。
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 42 次
接收感谢: 9 次
联系:

Re: 用stow管理自個兒編譯的軟件

#7

帖子 millenniumdark » 2010-07-24 21:47

貼一個python的例子:

代码: 全选

   $ tar xvzf python-musicbrainz2-0.4.0.tar.gz
   $ sudo python setup.py install \
        --prefix=/usr/local/stow/python-musicbrainz2-0.4.0 \
        --install-layout=deb
   $ cd /usr/local/stow
   $ sudo stow python-musicbrainz2-0.4.0
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 42 次
接收感谢: 9 次
联系:

Re: 用stow管理自個兒編譯的軟件

#8

帖子 millenniumdark » 2012-05-07 16:42

millenniumdark 写了:貼一個python的例子:

代码: 全选

   $ tar xvzf python-musicbrainz2-0.4.0.tar.gz
   $ sudo python setup.py install \
        --prefix=/usr/local/stow/python-musicbrainz2-0.4.0 \
        --install-layout=deb
   $ cd /usr/local/stow
   $ sudo stow python-musicbrainz2-0.4.0
python是不是用virtualenv更方便?
回复

回到 “编译或打包”