sclite (SCTK) `make check` faliure, C ++ / perl / Cygwin, безопасно использовать Perl4?

В настоящее время я пытаюсь установить NIST sclite, которая является частью SCTK 2.4.0 (GitHub или же более новая версия). Я пытаюсь установить на Cygwin в bash, Установка выполняется с использованием make,

Я прошел мимо make configure а также make all части установки. Это не произошло без особых усилий (см. ТАК сообщения на первый (file not recognized) а также второй (шаблон / обзор) проблемы). Когда я доберусь до make check часть установки, много проверок / тестов проходят, но затем я получаю следующую ошибку.

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) является безопасной и / или хорошей практикой программирования. Было бы лучше изменить исходный код для использования 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

Мои попытки / Исследования

Из вывода выше, мы имеем 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 файл (или модуль, или что-то).

Я вырыл немного дальше и нашел это обсуждение на kaldi обсуждение с 2014 года. (kaldi является инструментарием распознавания речи, который использует систему оценки SCTK). Есть 3 раздела обсуждения, которые я считаю особенно актуальными, на которые я буду ссылаться (первый, второй, в третьих). Я вставлю части здесь:

def_art.pl ищет getopts.pl который я не могу найти на моей машине!

… [T] это устаревшие пакеты, которые больше не поддерживаются в последних версиях
Perl 5. Я не думаю, что мы должны принимать зависимость от них. У них есть
устарел с самого начала Perl 5.
Вместо ‘require «getopt.pl» мы должны делать
use Getopt::Std
(примечание: современный perl код не должен звонитьrequire«для системных пакетов).
Есть похожая проблема с «flush.pl«в сценариях Perl. Я не знаю,
как называется пакет Perl 5
… Есть несколько мест, где это происходит.

Я наконец обнаружил, что оба getopts.pl а также flush.pl доступны из Perl4::CoreLibs. URL, который я использую для wget был указан на этом сайте. Видимо, в других *NIX дистрибутивы, менеджер пакетов может быть использован, например,

apt-get install libperl4-corelibs-perl

или же

yum install perl-Perl4-CoreLibs

но я не смог найти установку через apt-cyg, Я смог установить их из архива, как описано в Что я делаю раздел.

Еще раз, я сформулирую мой главный вопрос: Это безопасная / хорошая практика программирования? Есть ли лучшее решение?

Если есть лучшее решение (с использованием Perl 5), кажется, что эта ссылка может привести к этому.


Некоторые другие ссылки, которые возможно связаны: link_ {п} а также ссылка {п + 1} около flush.pl, link_ {п + 2} & link_ {п + 3} около 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}'

Наконец, я сделал так, чтобы этот каталог стал частью perl Путь поиска каждый раз, когда я использую терминал, добавив следующую строку в мой ~/.bashrc
Эта команда добавляет путь к 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) безопасным и / или хорошей практикой программирования. Было бы лучше изменить исходный код для использования Perl5?

Постскриптум После всего этого вы, вероятно, захотите вернуться назад и удалить папку, в которой все выкопали. В моем случае:

rm -rf /path/to/where/I/started/perl_added

Результат / Следующие шаги

Куча тестов, которые прошли, а затем

(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

Может быть этот будет полезно Я опубликую отдельный вопрос по этой проблеме или, если решение будет быстрым, я добавлю решение в этот пост.

1

Решение

Лучший путь

(На самом деле, несколько лучших способов. Смотрите мой комментарий под вопросом для kaldi решение.)

В разговоре с коллегами и друзьями кажется, что в Perl4 нет ничего небезопасного. Я нашел лучший способ «установить» их, но я оставлю заметки в вопросе, показывающие «длинный путь» с тарболлом, PERLPATH, так далее.

Проверьте, что у вас есть CPAN

$ which cpan

Если вы видите что-то, начинающееся с which: no cpan in (...)у вас, скорее всего, его нет. Попробуйте установить perl, Для меня на Cygwin я использовал

$ apt-cyg install perl

(Установить apt-cyg если необходимо, ср. Вот для инструкций.)

Вам, вероятно, не придется устанавливать 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 переменная. Надеюсь, я смогу добавить ссылку об этом процессе. Вот это разовое решение.

$ export PATH=/path/to/sctk/bin:$PATH

Вот это долговременное решение.

Теперь, для последнего шага в процессе установки:

$ make doc

После make docЯ убедился, что man страницы были доступны. Я смотрел на свою машину, пока не нашел место, где другие man файлы пошли. (Извините, у меня нет систематического способа сделать это, я просто посмотрел во многих местах.) Для меня, на Cygwin, каталог был /usr/man/man1

Я вошел в doc каталог

cd doc

и скопировал все файлы в каталог, который я нашел

cp -r ./* /usr/man/man1/

Обратите внимание, что есть и сейчас html а также htm файлы в каталоге, которые также предоставляют документацию.


Пройдя мимо «сделай проверку»

Итак, вы действительно хотите, чтобы все прошло без ошибок. Вам нужно изменить следующий файл: 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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]