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 dansenv
). C'est étrange (mais cela fonctionne).