sclite (SCTK) `make check` 失败,C++/perl/Cygwin,可以安全使用 Perl4 的东西吗?
sclite (SCTK) `make check` faliure, C++/perl/Cygwin, Safe to use Perl4 stuff?
我目前正在尝试安装 NIST 的 sclite
,它是 SCTK 2.4.0 (github or newer version) 的一部分。我正在尝试在 bash
中的 Cygwin
上安装。使用 make
.
完成安装
我已经完成了安装的 make configure
和 make all
部分。这并非没有付出一些努力(请参阅关于 (file not recognized
) and (template/scoping) 问题的 SO posts)。当我到达安装的 make check
部分时,很多 checks/tests 通过,但随后出现以下错误。
Testing acomp.pl
No tests defined for acomp.pl
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/acomp'
(cd def_art; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/def_art'
Testing def_art.pl
def_art.pl passed without tests
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/def_art'
(cd hubscr; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
Testing hubscr.pl
./RunTests.pl
Running test 'test1-sastt', operation 'test', options '-G -f rttm -F rttm -a', directory 'test1-sastt.test'
Executing command
Error: unable to get the version for program def_art.pl with the command 'def_art.pl' at ../hubscr.pl line 419.
Error: Execution failed at ./RunTests.pl line 30.
make[2]: *** [makefile:20: check] Error 2
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
make[1]: *** [makefile:68: checkFast] Error 2
make[1]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src'
make: *** [makefile:52: check] Error 2
我已经做了一些研究(如下所述),并且已经能够解决这个问题。但是,这涉及到包括一些过时的 perl
模块 (Perl4)。
我的第一个问题是如何修复这个错误或者如何跳过那部分测试。我已经能够修复错误,如果人们认为它是安全的,我会把它作为答案。请注意,在解决此问题后 make check
还有一个问题,但我在最后提到了如何解决这个问题。
我想知道使用旧的 Perl (Perl4::CoreLibs
) 是否安全 and/or 良好的编程习惯。更改源代码以使用 Perl5 东西会更好吗?
还有更好的方法吗?
我想确定的一件事是 make check
行下方没有可能失败的关键测试。
系统详细信息
$ uname -a
CYGWIN_NT-6.1 CAP-D-ENG-INT3 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin) ...
$ gcc --version
gcc (GCC) 6.4.0 ...
$ g++ --version
g++ (GCC) 6.4.0 ...
$ make --version
GNU Make 4.2.1
Built for x86_64-unknown-cygwin ...
$ systeminfo | sed -n 's/^OS\ *//p'
Name: Microsoft Windows 7 Enterprise
Version: 6.1.7601 Service Pack 1 Build 7601
Manufacturer: Microsoft Corporation
Configuration: Member Workstation
Build Type: Multiprocessor Free
我的Attempts/Research
从上面的输出中,我们 def_art.pl
通过了检查,因为没有检查 - “def_art.pl passed without tests
”。然而,接下来的检查 hubscr.pl
失败了。错误来自 def_art.pl
.
显而易见的事情似乎是 运行 def_art.pl
,我也这样做了。
$ ./src/def_art/def_art.pl
Can't locate getopts.pl in @INC
(@INC contains: /usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads /usr/local/share/perl5/site_perl/5.26 /usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads /usr/share/perl5/vendor_perl/5.26 /usr/lib/perl5/5.26/x86_64-cygwin-threads /usr/share/perl5/5.26)
at ./src/def_art/def_art.pl line 40.
所以在我看来,这是一个已弃用的 perl
文件(或模块,或其他)。
我进一步挖掘发现 this discussion on a kaldi
discussion from 2014. (kaldi
is a speech-recognition toolkit that uses the SCTK scoring system). There are 3 sections of the discussion that I think are especially relevant, which I will link (first, second, third)。我将在此处插入零件:
def_art.pl
is looking for getopts.pl
which I coudn't find on my machine!
... [T]hese are legacy packages that are no longer supported in recent versions
of Perl 5. I don't think we should accept a dependency on them. They have
been deprecated since the beginning of Perl 5.
Instead of 'require "getopt.pl"', we should be doing
use Getopt::Std
(note: modern perl
code should not call "require
" for system packages).
There is a similar issue with "flush.pl
" in the Perl scripts. I don't know
what the Perl 5 package name is.
... There are several places where this occurs.
我终于发现 getopts.pl
和 flush.pl
都可以从 Perl4::CoreLibs
获得。我在 wget
中使用的 URL 在此站点上被引用。显然,在其他 *NIX
发行版中,可以使用包管理器,例如
apt-get install libperl4-corelibs-perl
或
yum install perl-Perl4-CoreLibs
但我无法通过 apt-cyg
找到安装。我能够从 tarball 安装它们,如 我在做什么 部分所述。
再次声明我的主要问题:这是safe/good编程实践吗?有更好的解决方案吗?
如果有更好的解决方案(使用 Perl 5),看来 this link 可能会引路。
其他一些可能相关的链接:link_{n} and link{n+1} about flush.pl
, link_{n+2} & 关于 getopts.pl
和 Perl4::CoreLibs
。
我在做什么
$ mkdir perl_added
$ cd perl_added
$ wget http://search.cpan.org/CPAN/authors/id/Z/ZE/ZEFRAM/Perl4-CoreLibs-0.004.tar.gz
$ tar -xzf Perl4-CoreLibs-0.004.tar.gz
$ cd Perl4-CoreLibs-0.004
我没有使用一次性命令行、环境变量添加操作将此目录的 lib
子目录添加到 PERLLIB
环境变量,而是执行了以下操作。
在/usr/lib
目录下新建一个目录,把文件移到那里
$ stat /usr/lib/libperl4-corelibs-perl
stat: cannot stat '/usr/lib/libperl4-corelibs-perl': No such file or directory
# Checked that the directory didn't already exist. It didn't exist.
$ mkdir /usr/lib/libperl4-corelibs-perl
# Make each file executable, then move it into the new directory
# I'd like to come back and explain this.
$ find ./lib -type f -name "*.pl" -print0 | xargs -I'{}' -0 \
bash -c 'new_dir=/usr/lib/libperl4-corelibs-perl/; chmod +x {}; \
mv {} ${new_dir}'
最后,我通过将以下行添加到 ~/.bashrc
中,使每次使用终端时该目录都成为 perl
搜索路径的一部分
此命令将路径添加到 PERLLIB
环境变量。不同风格的 Linux 有不同的添加到环境变量的语法,一定要弄清楚你的是什么!
export PERLLIB="/usr/bin/libperl4-corelibs-perl:$PERLLIB"
我 运行 为此的命令是
$ echo -e "\n\n## Allow Perl to use the files in Perl4::CoreLibs" >> $HOME/.bashrc
$ echo -e "export PERLLIB=\"/usr/lib/libperl4_corelibs_perl:$PERLLIB\"" >> $HOME/.bashrc
$ source $HOME/.bashrc
(感谢@melpomene 指出当前版本是 0.004,而不是 0.003。)
在那之后,我回到了安装的基本文件夹和 运行 make clean
、make config
、make all
和 make check
。
这确实让我在 make check
上走得更远,但还远远不够。
我想知道使用旧的 Perl (Perl4::CoreLibs) 是否安全 and/or 良好的编程习惯。更改源代码以使用 Perl5 东西会更好吗?
P.S。在这一切之后,您可能想返回并删除解压所有内容的文件夹。就我而言:
rm -rf /path/to/where/I/started/perl_added
Result/Next 步骤
一堆测试通过然后
(cd hubscr; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
Testing hubscr.pl
./RunTests.pl
Running test 'test1-sastt', operation 'test', options '-G -f rttm -F rttm -a', directory 'test1-sastt.test'
Executing command
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/{_recursive_/_recur_{ <-- HERE _sive_/_si_ve_}_}/ at ../../md-eval/md-eval.pl line 1099, <DATA> line 12.
Error: MDEVAL failed
Command: md-eval.pl -nafcs -c 0.25 -o -r sastt-case1.ref.rttm.filt -s sastt-case1.sys.rttm.filt -M sastt-case1.sys.rttm.filt.mdeval.spkrmap 1> sastt-case1.sys.rttm.filt.mdeval at ../hubscr.pl line 679.
Error: Execution failed at ./RunTests.pl line 30.
make[2]: *** [makefile:20: check] Error 255
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
make[1]: *** [makefile:68: checkFast] Error 2
make[1]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src'
make: *** [makefile:52: check] Error 2
也许 this will be helpful. I will post a separate question 解决这个问题,或者,如果解决方案很快,我会在此 post.
上添加解决方案
更好的方法
(实际上,有几个更好的方法。请参阅我在 kaldi
解决方案问题下的评论。)
与同事和朋友交谈,Perl4 的东西似乎没有任何不安全的地方。我确实找到了一个更好的方法来获取它们 "installed",但我会在问题中留下注释,显示带有 tarball 的 "long way"、PERLPATH
等
检查您是否有 CPAN
$ which cpan
如果您看到以 which: no cpan in (...)
开头的内容,您很可能没有。尝试安装 perl
。对我来说,在 Cygwin 上,我使用
$ apt-cyg install perl
(必要时安装apt-cyg
,说明参见here。)
您可能不必安装 Perl。您可能会看到类似 /usr/bin/cpan
的内容作为 which cpan
的输出。如果是这样,你很好。在命令提示符处输入 cpan
。
$ cpan
如果你是第一次,它会问一堆关于配置的问题。我每次都按"Enter"接受默认,最后得到这样的提示:
cpan shell -- CPAN exploration and modules installation (v2.18)
Enter 'h' for help.
cpan[1]>
在那里,我进入了
cpan[1]> install Perl4::CoreLibs
安装将继续。完成后,您将能够键入 exit
并按 "Enter",这将带您返回 bash
命令提示符。
cpan[2]> exit
Lockfile removed.
$
此时,make check
仍然会卡住,但安装会成功完成。如果您希望 make check
一路通过,请转到下面的“通过 make check
”部分。不过此时,您可以执行流程中的最后两个步骤。
$ make install
此时我将安装路径添加到我的 PATH
变量中。希望我能够在 link 中加入有关该过程的信息。 Here 是一次性解决方案。
$ export PATH=/path/to/sctk/bin:$PATH
Here 是一个持久的解决方案。
现在,安装过程的最后一步:
$ make doc
在 make doc
之后,我确保 man
页面可用。我查看了我的机器,直到找到其他 man
文件所在的位置。 (抱歉,我没有系统的方法,我只是看了很多地方。)对我来说,在 Cygwin 上,目录是 /usr/man/man1
我进入了doc
目录
cd doc
并将所有文件复制到我找到的目录中
cp -r ./* /usr/man/man1/
请注意,目录中现在还有 html
和 htm
文件,它们也提供文档。
通过 `make check`
所以,您真的希望看到它顺利通过。您需要更改以下文件:src/hubscr/RunTests.pl
原来是这样开头的,我用head
命令显示出来了
$ head -n 15 src/hubscr/RunTests.pl
#!/usr/bin/perl -w
use strict;
my $operation = (defined($ARGV[0]) ? $ARGV[0] : "test");
sub runIt{
my ($op, $testId, $options, $glm, $hub, $lang, $ref, $systems) = @_;
my $baseDir = $testId.".base";
my $outDir = $testId.($op eq "setTests" ? ".base" : ".test");
print " Running test '$testId', operation '$op', options '$options',
directory '$outDir'\n";
system ("mkdir -p $outDir");
system ("rm -fr $outDir/test* $outDir/lvc*");
### Copy files
foreach my $file($glm, $ref, split(/\s+/,$systems)){
system("cp $file $outDir");
更改它,以便在 print
命令之后有如下新行。我再次使用 head
命令来显示文件的开头
$ head -n 63 src/hubscr/RunTests.pl
#!/usr/bin/perl -w
use strict;
my $operation = (defined($ARGV[0]) ? $ARGV[0] : "test");
sub runIt{
my ($op, $testId, $options, $glm, $hub, $lang, $ref, $systems) = @_;
my $baseDir = $testId.".base";
my $outDir = $testId.($op eq "setTests" ? ".base" : ".test");
print " Running test '$testId', operation '$op', options '$options', directory '$outDir'\n";
####DWB, 2018-05-21 Getting `make check` to work####
if ( $testId eq "test1-sastt" &&
$operation eq "test" &&
$options eq "-G -f rttm -F rttm -a" &&
$outDir eq "test1-sastt.test" ) # <problem 1>
{
print "\n";
print "\n#### SKIPPING ####";
print "\nJust kidding. That breaks the make.";
print "\nIt said: \n\n";
print "\nUnescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/{_recursive_/_recur_{ <-- HERE _sive_/_si_ve_}_}/ at ../../md-eval/md-eval.pl line 1099, <DATA> line 12.";
print "\nrror: MDEVAL failed";
print "\nCommand: md-eval.pl -nafcs -c 0.25 -o -r sastt-case1.ref.rttm.filt -s sastt-case1.sys.rttm.filt -M sastt-case1.sys.rttm.filt.mdeval.spkrmap 1> sastt-case1.sys.rttm.filt.mdeval at ../hubscr.pl line 679.";
print "\nError: Execution failed at ./RunTests.pl line 30.\n\n";
print "\n"
print "\nThat's a perl legacy problem, see:"
print "\n[https://unix.stackexchange.com/a/375505/291375][1]"
print "\nI'm outta here.";
print "\n Sincerely, bballdave025";
print "\n";
print "\n";
return;
}#endof: if (<problem 1>)
if ( $testId eq "test2-sastt" &&
$operation eq "test" &&
$options eq "-G -f rttm -F rttm -a" &&
$outDir eq "test2-sastt.test" ) # <problem 2>
{
print "\n";
print "\n#### SKIPPING ####";
print "\nJust kidding. That breaks the make.";
print "\nIt said: \n\n";
print "\nError: Test test2-sastt has failed. Diff output is :";
print "\ndiff -i -x CVS -x .DS_Store -x log -x '*lur' -I '[cC]reation[ _]date' -I md-eval -r test2-sastt.test/sastt-case2.sys.rttm.filt.alignments/segmentgroup-116.html test2-sastt.base/sastt-case2.sys.rttm.filt.alignments/segmentgroup-116.html";
print "\n 45c45";
print "\n < jg.drawStringRect(\"SUB48\",0, 47, scale*656, \"left\");";
print "\n ---";
print "\n#### and a whole bunch of other draw stuff! ####";
print "\n1 at ./RunTests.pl line 61.\n\n";
print "\n"
print "\nThat looks like Java drawing code, and I don't"
print "\neven want to mess with it!"
print "\nI'm outta here.";
print "\n Sincerely, bballdave025";
print "\n";
print "\n";
return;
}#endof: if (<problem 2>)
system ("mkdir -p $outDir")
现在你应该可以通过了。试一试:
make check
我目前正在尝试安装 NIST 的 sclite
,它是 SCTK 2.4.0 (github or newer version) 的一部分。我正在尝试在 bash
中的 Cygwin
上安装。使用 make
.
我已经完成了安装的 make configure
和 make all
部分。这并非没有付出一些努力(请参阅关于 file not recognized
) and make check
部分时,很多 checks/tests 通过,但随后出现以下错误。
Testing acomp.pl
No tests defined for acomp.pl
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/acomp'
(cd def_art; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/def_art'
Testing def_art.pl
def_art.pl passed without tests
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/def_art'
(cd hubscr; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
Testing hubscr.pl
./RunTests.pl
Running test 'test1-sastt', operation 'test', options '-G -f rttm -F rttm -a', directory 'test1-sastt.test'
Executing command
Error: unable to get the version for program def_art.pl with the command 'def_art.pl' at ../hubscr.pl line 419.
Error: Execution failed at ./RunTests.pl line 30.
make[2]: *** [makefile:20: check] Error 2
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
make[1]: *** [makefile:68: checkFast] Error 2
make[1]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src'
make: *** [makefile:52: check] Error 2
我已经做了一些研究(如下所述),并且已经能够解决这个问题。但是,这涉及到包括一些过时的 perl
模块 (Perl4)。
我的第一个问题是如何修复这个错误或者如何跳过那部分测试。我已经能够修复错误,如果人们认为它是安全的,我会把它作为答案。请注意,在解决此问题后 make check
还有一个问题,但我在最后提到了如何解决这个问题。
我想知道使用旧的 Perl (Perl4::CoreLibs
) 是否安全 and/or 良好的编程习惯。更改源代码以使用 Perl5 东西会更好吗?
还有更好的方法吗?
我想确定的一件事是 make check
行下方没有可能失败的关键测试。
系统详细信息
$ uname -a
CYGWIN_NT-6.1 CAP-D-ENG-INT3 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin) ...
$ gcc --version
gcc (GCC) 6.4.0 ...
$ g++ --version
g++ (GCC) 6.4.0 ...
$ make --version
GNU Make 4.2.1
Built for x86_64-unknown-cygwin ...
$ systeminfo | sed -n 's/^OS\ *//p'
Name: Microsoft Windows 7 Enterprise
Version: 6.1.7601 Service Pack 1 Build 7601
Manufacturer: Microsoft Corporation
Configuration: Member Workstation
Build Type: Multiprocessor Free
我的Attempts/Research
从上面的输出中,我们 def_art.pl
通过了检查,因为没有检查 - “def_art.pl passed without tests
”。然而,接下来的检查 hubscr.pl
失败了。错误来自 def_art.pl
.
显而易见的事情似乎是 运行 def_art.pl
,我也这样做了。
$ ./src/def_art/def_art.pl
Can't locate getopts.pl in @INC
(@INC contains: /usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads /usr/local/share/perl5/site_perl/5.26 /usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads /usr/share/perl5/vendor_perl/5.26 /usr/lib/perl5/5.26/x86_64-cygwin-threads /usr/share/perl5/5.26)
at ./src/def_art/def_art.pl line 40.
所以在我看来,这是一个已弃用的 perl
文件(或模块,或其他)。
我进一步挖掘发现 this discussion on a kaldi
discussion from 2014. (kaldi
is a speech-recognition toolkit that uses the SCTK scoring system). There are 3 sections of the discussion that I think are especially relevant, which I will link (first, second, third)。我将在此处插入零件:
def_art.pl
is looking forgetopts.pl
which I coudn't find on my machine!... [T]hese are legacy packages that are no longer supported in recent versions of Perl 5. I don't think we should accept a dependency on them. They have been deprecated since the beginning of Perl 5. Instead of 'require "getopt.pl"', we should be doing
use Getopt::Std
(note: modernperl
code should not call "require
" for system packages). There is a similar issue with "flush.pl
" in the Perl scripts. I don't know what the Perl 5 package name is. ... There are several places where this occurs.
我终于发现 getopts.pl
和 flush.pl
都可以从 Perl4::CoreLibs
获得。我在 wget
中使用的 URL 在此站点上被引用。显然,在其他 *NIX
发行版中,可以使用包管理器,例如
apt-get install libperl4-corelibs-perl
或
yum install perl-Perl4-CoreLibs
但我无法通过 apt-cyg
找到安装。我能够从 tarball 安装它们,如 我在做什么 部分所述。
再次声明我的主要问题:这是safe/good编程实践吗?有更好的解决方案吗?
如果有更好的解决方案(使用 Perl 5),看来 this link 可能会引路。
其他一些可能相关的链接:link_{n} and link{n+1} about flush.pl
, link_{n+2} & getopts.pl
和 Perl4::CoreLibs
。
我在做什么
$ mkdir perl_added
$ cd perl_added
$ wget http://search.cpan.org/CPAN/authors/id/Z/ZE/ZEFRAM/Perl4-CoreLibs-0.004.tar.gz
$ tar -xzf Perl4-CoreLibs-0.004.tar.gz
$ cd Perl4-CoreLibs-0.004
我没有使用一次性命令行、环境变量添加操作将此目录的 lib
子目录添加到 PERLLIB
环境变量,而是执行了以下操作。
在/usr/lib
目录下新建一个目录,把文件移到那里
$ stat /usr/lib/libperl4-corelibs-perl
stat: cannot stat '/usr/lib/libperl4-corelibs-perl': No such file or directory
# Checked that the directory didn't already exist. It didn't exist.
$ mkdir /usr/lib/libperl4-corelibs-perl
# Make each file executable, then move it into the new directory
# I'd like to come back and explain this.
$ find ./lib -type f -name "*.pl" -print0 | xargs -I'{}' -0 \
bash -c 'new_dir=/usr/lib/libperl4-corelibs-perl/; chmod +x {}; \
mv {} ${new_dir}'
最后,我通过将以下行添加到 ~/.bashrc
中,使每次使用终端时该目录都成为 perl
搜索路径的一部分
此命令将路径添加到 PERLLIB
环境变量。不同风格的 Linux 有不同的添加到环境变量的语法,一定要弄清楚你的是什么!
export PERLLIB="/usr/bin/libperl4-corelibs-perl:$PERLLIB"
我 运行 为此的命令是
$ echo -e "\n\n## Allow Perl to use the files in Perl4::CoreLibs" >> $HOME/.bashrc
$ echo -e "export PERLLIB=\"/usr/lib/libperl4_corelibs_perl:$PERLLIB\"" >> $HOME/.bashrc
$ source $HOME/.bashrc
(感谢@melpomene 指出当前版本是 0.004,而不是 0.003。)
在那之后,我回到了安装的基本文件夹和 运行 make clean
、make config
、make all
和 make check
。
这确实让我在 make check
上走得更远,但还远远不够。
我想知道使用旧的 Perl (Perl4::CoreLibs) 是否安全 and/or 良好的编程习惯。更改源代码以使用 Perl5 东西会更好吗?
P.S。在这一切之后,您可能想返回并删除解压所有内容的文件夹。就我而言:
rm -rf /path/to/where/I/started/perl_added
Result/Next 步骤
一堆测试通过然后
(cd hubscr; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
Testing hubscr.pl
./RunTests.pl
Running test 'test1-sastt', operation 'test', options '-G -f rttm -F rttm -a', directory 'test1-sastt.test'
Executing command
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/{_recursive_/_recur_{ <-- HERE _sive_/_si_ve_}_}/ at ../../md-eval/md-eval.pl line 1099, <DATA> line 12.
Error: MDEVAL failed
Command: md-eval.pl -nafcs -c 0.25 -o -r sastt-case1.ref.rttm.filt -s sastt-case1.sys.rttm.filt -M sastt-case1.sys.rttm.filt.mdeval.spkrmap 1> sastt-case1.sys.rttm.filt.mdeval at ../hubscr.pl line 679.
Error: Execution failed at ./RunTests.pl line 30.
make[2]: *** [makefile:20: check] Error 255
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
make[1]: *** [makefile:68: checkFast] Error 2
make[1]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src'
make: *** [makefile:52: check] Error 2
也许 this will be helpful. I will post a separate question 解决这个问题,或者,如果解决方案很快,我会在此 post.
上添加解决方案更好的方法
(实际上,有几个更好的方法。请参阅我在 kaldi
解决方案问题下的评论。)
与同事和朋友交谈,Perl4 的东西似乎没有任何不安全的地方。我确实找到了一个更好的方法来获取它们 "installed",但我会在问题中留下注释,显示带有 tarball 的 "long way"、PERLPATH
等
检查您是否有 CPAN
$ which cpan
如果您看到以 which: no cpan in (...)
开头的内容,您很可能没有。尝试安装 perl
。对我来说,在 Cygwin 上,我使用
$ apt-cyg install perl
(必要时安装apt-cyg
,说明参见here。)
您可能不必安装 Perl。您可能会看到类似 /usr/bin/cpan
的内容作为 which cpan
的输出。如果是这样,你很好。在命令提示符处输入 cpan
。
$ cpan
如果你是第一次,它会问一堆关于配置的问题。我每次都按"Enter"接受默认,最后得到这样的提示:
cpan shell -- CPAN exploration and modules installation (v2.18)
Enter 'h' for help.
cpan[1]>
在那里,我进入了
cpan[1]> install Perl4::CoreLibs
安装将继续。完成后,您将能够键入 exit
并按 "Enter",这将带您返回 bash
命令提示符。
cpan[2]> exit
Lockfile removed.
$
此时,make check
仍然会卡住,但安装会成功完成。如果您希望 make check
一路通过,请转到下面的“通过 make check
”部分。不过此时,您可以执行流程中的最后两个步骤。
$ make install
此时我将安装路径添加到我的 PATH
变量中。希望我能够在 link 中加入有关该过程的信息。 Here 是一次性解决方案。
$ export PATH=/path/to/sctk/bin:$PATH
Here 是一个持久的解决方案。
现在,安装过程的最后一步:
$ make doc
在 make doc
之后,我确保 man
页面可用。我查看了我的机器,直到找到其他 man
文件所在的位置。 (抱歉,我没有系统的方法,我只是看了很多地方。)对我来说,在 Cygwin 上,目录是 /usr/man/man1
我进入了doc
目录
cd doc
并将所有文件复制到我找到的目录中
cp -r ./* /usr/man/man1/
请注意,目录中现在还有 html
和 htm
文件,它们也提供文档。
通过 `make check`
所以,您真的希望看到它顺利通过。您需要更改以下文件:src/hubscr/RunTests.pl
原来是这样开头的,我用head
命令显示出来了
$ head -n 15 src/hubscr/RunTests.pl
#!/usr/bin/perl -w
use strict;
my $operation = (defined($ARGV[0]) ? $ARGV[0] : "test");
sub runIt{
my ($op, $testId, $options, $glm, $hub, $lang, $ref, $systems) = @_;
my $baseDir = $testId.".base";
my $outDir = $testId.($op eq "setTests" ? ".base" : ".test");
print " Running test '$testId', operation '$op', options '$options',
directory '$outDir'\n";
system ("mkdir -p $outDir");
system ("rm -fr $outDir/test* $outDir/lvc*");
### Copy files
foreach my $file($glm, $ref, split(/\s+/,$systems)){
system("cp $file $outDir");
更改它,以便在 print
命令之后有如下新行。我再次使用 head
命令来显示文件的开头
$ head -n 63 src/hubscr/RunTests.pl
#!/usr/bin/perl -w
use strict;
my $operation = (defined($ARGV[0]) ? $ARGV[0] : "test");
sub runIt{
my ($op, $testId, $options, $glm, $hub, $lang, $ref, $systems) = @_;
my $baseDir = $testId.".base";
my $outDir = $testId.($op eq "setTests" ? ".base" : ".test");
print " Running test '$testId', operation '$op', options '$options', directory '$outDir'\n";
####DWB, 2018-05-21 Getting `make check` to work####
if ( $testId eq "test1-sastt" &&
$operation eq "test" &&
$options eq "-G -f rttm -F rttm -a" &&
$outDir eq "test1-sastt.test" ) # <problem 1>
{
print "\n";
print "\n#### SKIPPING ####";
print "\nJust kidding. That breaks the make.";
print "\nIt said: \n\n";
print "\nUnescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/{_recursive_/_recur_{ <-- HERE _sive_/_si_ve_}_}/ at ../../md-eval/md-eval.pl line 1099, <DATA> line 12.";
print "\nrror: MDEVAL failed";
print "\nCommand: md-eval.pl -nafcs -c 0.25 -o -r sastt-case1.ref.rttm.filt -s sastt-case1.sys.rttm.filt -M sastt-case1.sys.rttm.filt.mdeval.spkrmap 1> sastt-case1.sys.rttm.filt.mdeval at ../hubscr.pl line 679.";
print "\nError: Execution failed at ./RunTests.pl line 30.\n\n";
print "\n"
print "\nThat's a perl legacy problem, see:"
print "\n[https://unix.stackexchange.com/a/375505/291375][1]"
print "\nI'm outta here.";
print "\n Sincerely, bballdave025";
print "\n";
print "\n";
return;
}#endof: if (<problem 1>)
if ( $testId eq "test2-sastt" &&
$operation eq "test" &&
$options eq "-G -f rttm -F rttm -a" &&
$outDir eq "test2-sastt.test" ) # <problem 2>
{
print "\n";
print "\n#### SKIPPING ####";
print "\nJust kidding. That breaks the make.";
print "\nIt said: \n\n";
print "\nError: Test test2-sastt has failed. Diff output is :";
print "\ndiff -i -x CVS -x .DS_Store -x log -x '*lur' -I '[cC]reation[ _]date' -I md-eval -r test2-sastt.test/sastt-case2.sys.rttm.filt.alignments/segmentgroup-116.html test2-sastt.base/sastt-case2.sys.rttm.filt.alignments/segmentgroup-116.html";
print "\n 45c45";
print "\n < jg.drawStringRect(\"SUB48\",0, 47, scale*656, \"left\");";
print "\n ---";
print "\n#### and a whole bunch of other draw stuff! ####";
print "\n1 at ./RunTests.pl line 61.\n\n";
print "\n"
print "\nThat looks like Java drawing code, and I don't"
print "\neven want to mess with it!"
print "\nI'm outta here.";
print "\n Sincerely, bballdave025";
print "\n";
print "\n";
return;
}#endof: if (<problem 2>)
system ("mkdir -p $outDir")
现在你应该可以通过了。试一试:
make check