9 votes

El Capitan, make check, DYLD_LIBRARY_PATH

Je développe des applications en utilisant les outils habituels d'Unix : un compilateur, make et des bibliothèques partagées. La procédure est alors traditionnellement quelque chose comme

  • ./configure qui adapte les sources aux caractéristiques de la machine sur laquelle elles sont exécutées,
  • make qui compile effectivement les librairies partagées, les exécutables, etc,
  • make check qui exécute les tests avant nous installons le paquet,
  • make install si le paquet se comporte correctement, et enfin, de manière facultative,
  • make installcheck pour s'assurer que l'installation fonctionne.

Pendant make les librairies partagées et les exécutables sont compilés dans leur forme finale : les exécutables sont compilés avec une dépendance aux librairies partagées dans leur destination finale (c'est-à-dire qu'ils dépendent des librairies dans le fichier /usr/local/lib bien qu'ils ne soient pas encore là, ils sont toujours dans l'arbre de construction). Puis make install consiste, en gros, à utiliser cp pour installer les librairies et les exécutables de l'arbre de construction à l'endroit final.

Pendant la make check Dans cette phase, nous exécutons le programme non installé : les librairies partagées, les exécutables et les fichiers auxiliaires sont toujours dans l'arbre de construction. Pour exécuter les tests, vous devez configurer quelques variables d'environnement personnalisées (par exemple pour indiquer à votre programme que vos fichiers de données auxiliaires ne sont pas dans l'arborescence de compilation). /usr/local/share mais dans l'arbre des sources), et quelques variables d'environnement système, pour indiquer à votre chargeur de librairies partagées de chercher les librairies partagées. Les variables d'environnement sur les Unice traditionnels sont LD_LIBRARY_PATH sous OS X, c'est DYLD_LIBRARY_PATH . Cela a fonctionné pendant des (dizaines d')années.

Mais maintenant, El Capitan a cassé ça.

$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$

maintenant, lorsque le SIP est activé, aucun DYLD_* est exporté d'un processus vers ses enfants.

Ma question est donc la suivante : comment pouvons-nous exécuter des programmes qui ne sont pas installés ? Quelle est la procédure à suivre pour pouvoir exécuter la séquence traditionnelle d'Unix ./configure && make && make check ?

S'il vous plaît pas de réponse telle que "run make install premier". Ce n'est pas le problème. Je suis un développeur, et lancer "make check" (et plus généralement lancer une version non installée d'un programme) est quelque chose que je fais très fréquemment. Même l'installation dans un endroit fictif prend du temps. J'ai besoin de quelque chose d'efficace, et efficace. Et la désactivation de SIP ne résoudra pas le problème pour les utilisateurs de mes paquets qui veulent exécuter make check .

0 votes

Je peux toujours utiliser DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6 pour faire fonctionner l'ancien APU (avec l'ancienne bibliothèque) sous 10.11 (bien que la variable n'apparaisse pas dans env ). C'est étrange (mais cela fonctionne).

6voto

Ture Pålsson Points 639

Il semble que DYLD_* ne soit supprimé que pour les binaires "protégés" (je ne suis pas sûr de ce que cela signifie exactement, mais apparemment tout ce qui se trouve dans /bin et /usr/bin pour commencer). Cependant, si vous copiez /usr/bin/env ailleurs, il conserve son contenu DYLD_* :

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

Je pense que make exécute toujours les commandes via /bin/sh, donc vous ne pouvez pas définir des variables "dangereuses" dans le makefile et les faire affecter les commandes, mais peut-être que vous pourriez déplacer le test dans un shell script, définir les variables d'environnement à l'intérieur du script, et ensuite invoquer le script depuis make. Bien qu'évidemment, cela ne vous aidera pas si les tests, à leur tour, dépendent des script de l'interpréteur de commandes (ou si les choses testées sont shell scripts !) parce qu'ensuite ils vont invoquer /bin/sh et perdre à nouveau les variables...

0 votes

Merci beaucoup ! Maintenant je peux cp /bin/sh et utiliser ce shell au lieu du vrai. Les liens symboliques ne fonctionnent pas, et les liens directs sont "Opérations non autorisées", donc je suppose que je dois vivre avec cp .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X