В настоящее время я пытаюсь установить 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
Может быть этот будет полезно Я опубликую отдельный вопрос по этой проблеме или, если решение будет быстрым, я добавлю решение в этот пост.
(На самом деле, несколько лучших способов. Смотрите мой комментарий под вопросом для 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
Других решений пока нет …