2011-08-21 110 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 

许多测试都明确地测试构建的完整性,所以你可以期待许多测试失败的。