sclite (SCTK) `make check` faliure, C++/perl/Cygwin, безопасно использовать Perl4?
В настоящее время я пытаюсь установить NIST sclite
, который является частью SCTK 2.4.0 ( github или более новая версия). Я пытаюсь установить на Cygwin
в bash
, Установка выполняется с использованием make
,
Я прошел мимо make configure
а также make all
части установки. Это не произошло без каких-либо усилий (см. Сообщения SO на первом (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_ {n} и link {n + 1} about flush.pl
, link_ {n + 2} & link_ {n + 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?
PS После всего этого вы, вероятно, захотите вернуться и удалить папку, в которой все выкопали. В моем случае:
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