web-dev-qa-db-fra.com

Comment installer Perl sur macOS 10.13 High Sierra

J'ai récemment effectué une mise à niveau vers macOS 10.13 High Sierra et, peu de temps après, j'ai rencontré un problème lors de la tentative d'installation d'une version plus récente de Perl (5.26.1). L’essentiel du problème est que les autotests de cpan/DB_File ont systématiquement échoué sur macOS 10.13 High Sierra (ordinateur portable domestique) mais ont abouti sur macOS 10.12 Sierra (ordinateur de travail). 

Voici la section du journal d'installation indiquant l'échec:

../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 

J'ai été capable de répéter ce même échec, que ce soit en utilisant perlbrew install Perl-5.26.1 ou simplement en téléchargeant le fichier tar Perl et en l'installant manuellement. Lorsque j'essaie de déboguer le test en question t/db-hash.t, je peux voir que le hachage de test %h est créé et est rempli dans le fichier de test, mais lorsque je print Dumper(\%h), je vois que le hachage semble avoir les bonnes clés, mais all des valeurs sont undef, plutôt que les valeurs attribuées dans le script de test. 

Ces valeurs undef sont à l'origine de l'échec du test. Bizarrement, les valeurs non définies apparaissent lorsque j'imprime le hachage entier ou que je tente de créer un tableau des valeurs de hachage. Si je demande une valeur de clé de hachage spécifique, par exemple my $value = $h{key}, la valeur est correcte.

Des questions:

  • Comment résoudre ce problème afin que je puisse installer un nouveau Perl sur macOS 10.13?
  • Qu'est-ce qui s'est cassé? Cela fonctionnait sur macOS 10.12.
11
Jamin Kortegard

TL; DR

Voici ce qui a fonctionné:

  1. Installez Berkeley DB. J'utilise Homebrew , mais vous pouvez obtenir les fichiers sources sur le site Oracle .

    brew install berkeley-db
    
  2. Installez Perl. J'utilise Perlbrew , mais vous pouvez obtenir les fichiers sources sur le site Perl .

    perlbrew install Perl-5.26.1
    

Une explication partielle

En regardant en arrière dans le journal d'installation ayant échoué, il y a un avertissement près des sections DB_File qui donne un indice:

...
./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
...

Aucune bibliothèque db trouvée, surtout inoffensive.

Selon la documentation du module DB_File , c’est ...

... un module qui permet aux programmes Perl d'utiliser les fonctionnalités fournies par Berkeley DB ...

Après avoir installé berkeley-db, la même section du journal d'installation de Perl n'affiche plus le même avertissement:

...
./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
...

Et plus loin dans le processus, les tests précédemment échoués ont réussi, permettant à l'installation de se terminer correctement:

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

Je n'ai pas trouvé de documentation en ligne sur les raisons pour lesquelles Berkeley DB semble ne pas figurer dans macOS 10.13 High Sierra, et sur le fait qu'il s'agisse d'un changement par rapport aux versions précédentes de macOS, semble-t-il.

Merci beaucoup à Tim D de m'avoir aidé à résoudre les problèmes.

13
Jamin Kortegard

Pour installer Perl lui-même (qui contient le module DB_File) ou pour installer le module DB_File à partir de CPAN, la solution est la même: éditez son config.in pour qu'il pointe vers le bon emplacement de berkeley-db.

Par exemple, j'ai installé le package db48 via macports avec Sudo port install db48. Dans le téléchargement Perl lui-même, je navigue vers cpan/DB_File et modifie son config.in, modifiant ainsi les assignations existantes INCLUDE et LIB:

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

Je peux ensuite reprendre le processus de construction Perl et DB_File peut compiler.

Références:

Perl RT # 133280
CPAN RT # 125238

1
Ether