web-dev-qa-db-ja.com

MacOS 10.13 HighSierraにPerlをインストールする方法

最近macOS10.13 High Sierraにアップグレードしましたが、すぐに最新バージョンのPerl(5.26.1)をインストールしようとして問題が発生しました。問題の要点は、_cpan/DB_File_のセルフテストがmacOS 10.13 High Sierra(家庭用ラップトップ)では一貫して失敗したが、macOS 10.12 Sierra(仕事用ラップトップ)では成功したことです。

失敗を示すインストールログのセクションは次のとおりです。

_../cpan/Config-Perl-V/t/30_plv5240.t ............................... ok
../cpan/Config-Perl-V/t/31_plv52511.t .............................. ok
../cpan/DB_File/t/db-btree.t ....................................... ok
Use of uninitialized value $value in string eq at t/db-hash.t line 224.
Use of uninitialized value $values[0] in string eq at t/db-hash.t line 224.
Use of uninitialized value $value in lc at t/db-hash.t line 224.
Use of uninitialized value $h{""} in string eq at t/db-hash.t line 243.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value $foo[18] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[36] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[48] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[58] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[59] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[60] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[62] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[63] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[92] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[114] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[140] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[187] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[188] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[189] in join or string at t/db-hash.t line 261.
Use of uninitialized value $h{"Fred"} in string eq at t/db-hash.t line 572.
Use of uninitialized value $v in concatenation (.) or string at t/db-hash.t line 748.
../cpan/DB_File/t/db-hash.t ........................................ 
Dubious, test returned 2 (wstat 512, 0x200)
Failed 76/166 subtests 
_

_perlbrew install Perl-5.26.1_を使用してインストールする場合でも、単に Perl tarfile をダウンロードして手動でインストールする場合でも、この同じ失敗を繰り返すことができました。問題のテスト_t/db-hash.t_をデバッグしようとすると、テストハッシュ_%h_が作成され、テストファイルに入力されていることがわかりますが、print Dumper(\%h)を実行するとハッシュは正しいキーを持っているように見えますが、値のallは、テストで割り当てられている値ではなく、undefです。脚本。

これらのundef値は、テストの失敗を引き起こしています。奇妙なことに、ハッシュ全体を出力したり、ハッシュ値の配列を作成しようとすると、未定義の値が表示されます。特定のハッシュキーの値を要求した場合、たとえば_my $value = $h{key}_、値は正常に出力されます。

質問:

  • MacOS 10.13に新しいPerlをインストールできるようにこれを修正するにはどうすればよいですか?
  • 何が壊れたの?これは、macOS10.12で機能していました。
12
Jamin Kortegard

TL; DR

うまくいったことは次のとおりです。

  1. BerkeleyDBをインストールします。 Homebrew を使用していますが、ソースファイルは Oracleサイト で入手できます。

    brew install berkeley-db
    
  2. Perlをインストールします。私は Perlbrew を使用していますが、ソースファイルは Perlサイト で入手できます。

    perlbrew install Perl-5.26.1
    

部分的な説明

失敗したインストールログを振り返ると、DB_Fileセクションの近くに手がかりとなる警告があります。

...
./miniperl -Ilib make_ext.pl lib/auto/DB_File/DB_File.bundle  MAKE="/Applications/Xcode.app/Contents/Developer/usr/bin/make" LIBPERL_A=libperl.a LINKTYPE=dynamic
Parsing config.in...
Looks Good.
Warning (mostly harmless): No library found for -ldb
Generating a Unix-style Makefile
Writing Makefile for DB_File
...

dbライブラリが見つかりません、ほとんど無害です。

DB_File module のドキュメントによると、それは...

... PerlプログラムがBerkeleyDBによって提供される機能を利用できるようにするモジュール...

berkeley-dbをインストールした後、Perlインストールログの同じセクションに同じ警告が表示されなくなりました。

...
./miniperl -Ilib make_ext.pl lib/auto/DB_File/DB_File.bundle  MAKE="/Applications/Xcode.app/Contents/Developer/usr/bin/make" LIBPERL_A=libperl.a LINKTYPE=dynamic
Parsing config.in...
Looks Good.
Generating a Unix-style Makefile
Writing Makefile for DB_File
...

さらにプロセスに沿って、以前に失敗したテストに合格し、インストールを正常に完了できるようにします。

...
../cpan/DB_File/t/db-btree.t ....................................... ok
../cpan/DB_File/t/db-hash.t ........................................ ok
../cpan/DB_File/t/db-recno.t ....................................... ok
...

BerkeleyDBがmacOS10.13 High Sierraにないように見える理由と、それが以前のmacOSバージョンからの変更であるかどうかについてのドキュメントをオンラインで見つけることができませんでした。

トラブルシューティングを手伝ってくれたTimDに感謝します。

13
Jamin Kortegard

Perl自体(DB_Fileモジュールを含む)をインストールするには、またはCPANからDB_Fileモジュールをインストールするには、解決策は同じです。berkeley-dbの適切な場所を指すようにconfig.inを編集します。

たとえば、Sudo port install db48を使用してmacports経由でdb48パッケージをインストールしました。 Perlのダウンロード自体で、cpan/DB_Fileに移動し、そのconfig.inを編集して、既存のINCLUDEとLIBの割り当てを次のように変更します。

INCLUDE    = /opt/local/include/db48
LIB        = /opt/local/lib/db48

その後、Perlビルドプロセスを再開し、DB_Fileをコンパイルできます。

参照:

Perl RT#13328
CPAN RT#125238

1
Ether