2011-08-21 107 views
5

當您從源代碼構建perl時,可以在將perl安裝到其最終目標之前運行make test安裝後測試perl

安裝perl之後可以執行相當於make test的操作嗎?

請注意,我不會有原始來源。我想要做的是下載與我安裝的相同版本的perl的源tar檔案,然後針對安裝的perl運行測試(從源tar檔案中)。

可能/不可能?易/難?我將如何去做這件事?

回答

1

您可以通過閱讀perl源代碼中的t/TEST文件開始。

注意以下幾點:

  1. 它使用 「#./ perl的!」 因爲她爆炸

  2. 然後在大約線142,它確實CHDIR到T目錄。

作爲開始,你可以修改,她邦線把它指向你安裝Perl的可執行文件,並複製「T」目錄的Perl核心包目錄的內容(或者反過來) 。

這就是我如何開始它。

另一種方法是在運行make install時創建所有已安裝文件的列表(使其在臨時目錄中安裝perl,然後在該目錄上執行ls -lR以創建列表),然後複製這些文件從安裝的perl進入你的perl源代碼目錄。

使用版本控制系統(例如git)可以在這裏提供很多幫助,以便您可以輕鬆地回滾到原來可能覆蓋的任何文件的原始版本。

+0

避風港;還沒有嘗試過,但我想我首先必須做一個'Configure'和一個'make' ...嗯... – ErikR

2
  • 可能的。
  • 很難。
  • 不值得。

使用安裝的Perl而不是剛剛構建的Perl運行測試需要您瞭解如何說服測試系統忽略所有未完成的構建,並繼續使用運行測試安裝了Perl。你不能說'做測試',因爲它想要做的第一件事就是構建Perl。實際上,更重要的是,你不能說make test,因爲你沒有makefile。

你爲什麼要這樣做?如果您不信任系統Perl,請不要使用它。建立你自己的,測試它,並將它安裝在你的位置而不是系統位置。我大部分時間都是這樣做的;我不會冒險通過修改系統的Perl並使用我自己的系統來破壞系統。當然,我有5.10.0,5.10.1,5.12.1,5.14.0和5.14.1爲我打造(由我)。我通常至少有一個5.8.x版本,但目前沒有在這臺機器上。

另外,請記住,安裝系統Perl的人是理智的。他們運行測試並且不安裝Perl,除非測試全部通過(或基本上全部通過)。

+0

這就是爲什麼我想知道你是否必須做一個'Configure'和'make'首先。然後欺騙測試工具來使用你的perl而不是剛剛構建的perl。 至於爲什麼有人會想這樣做 - 假設你得到一個已安裝的Perl的tar-ball。解壓後,我想能夠測試它。我有我的理由:-) – ErikR

+0

你必須運行配置來獲得一個生成文件。如果你在沒有先運行make的情況下運行'make test',那麼'make test'會爲你運行'make make',所以在你運行任何測試之前你最終會建立一個軟件版本。此外,您必須努力工作,以避免測試構建區域中的模塊,並測試已安裝的模塊。它正在顛覆Perl測試套件的設計目標。我想你可以嘗試在構建版本上覆制已安裝的代碼,但即使這樣也不是微不足道的,特別是在佈局不標準的情況下。 –

+0

我認爲你必須使用你安裝的Perl來做'make install'。這可能是任意複雜甚至不可能的。 – musiKk

2

可能的,只有一點點硬(無Configuremake必要的),也許有用:

源分配中的負載一切的測試方案出來的目錄/path/to/src/distribution/lib'. The key to running your existing perl installation against this test suite is to put all of the install libraries into this lib`目錄。這可以像做:

cd /path/to/src/distribution 
mv lib lib-original 
mkdir lib 
/path/to/installed/perl -e 'system qq{cp -prv "$_/." lib/}' \ 
     -e 'for "lib-original",grep /../,reverse(@INC)' 

(有可能是使用-MFile::Copy更強大的perl命令,但這種快速和骯髒的一行讓我去)。我們使用reverse @INC,這樣@INC前面的庫將覆蓋後面的庫,而不是相反。 grep /../,...條款阻止我們將.複製到lib,這可能沒有幫助。

我發現一些測試使用源代碼目錄中的perl,pseds2p的硬編碼路徑。您需要確保這些文件存在,並且測試的目標是這些程序的安裝版本。

rm -f perl t/perl psed t/psed x2p/s2p 
ln -s /path/to/installed/perl perl 
ln -s /path/to/installed/perl t/perl 
ln -s /path/to/installed/psed psed 
ln -s /path/to/installed/psed t/psed 
ln -s /path/to/installed/s2p x2p/s2p 

現在使用的常規Unix-Y成語運行一個Perl的測試套件:

cd t 
/path/to/installed/perl -MExtUtils::Command::MM \ 
     -e 'test_harness(0,"../lib")' */*.t 

一些測試可能是明確有關測試構建的從源代碼程序的完整性,所以有些失誤是可以預料的。

(此過程在v5.14.0,v5.8.9,v5.10.1測試)

更新:更難。在典型的源代碼發行版中還有許多其他t目錄。你可能也想嘗試:

cd /path/to/source/distribution 

for dir in */*/ 
do 
     if [ -d $dir/t ] ; then 
      pushd $dir 
      echo Testing $dir 
      /path/to/installed/perl -MExtUtils::Command::MM \ 
        -e 'test_harness(0,"../../lib","lib")' t/*.t 
      popd 
     fi 
done 

許多測試都明確地測試構建的完整性,所以你可以期待許多測試失敗的。