9 votos

El Capitán, de hacer el cheque, DYLD_LIBRARY_PATH

Puedo desarrollar aplicaciones utilizando el habitual conjunto de herramientas de Unix: un compilador, make, y las bibliotecas compartidas. El procedimiento es, a continuación, tradicionalmente algo como

  • ./configure, que adecua las fuentes de las características de la máquina que se ejecuta,
  • make, que en realidad recoge las bibliotecas compartidas, ejecutables, etc.,
  • make check, que ejecuta las pruebas antes de instalar el paquete,
  • make install, si el paquete se comporta correctamente, y por último, opcionalmente,
  • make installcheck, para asegurarse de que la instalación funciona.

Durante make, el de bibliotecas compartidas y ejecutables compilados en su forma definitiva: los ejecutables compilados con una dependencia para las bibliotecas compartidas en su destino final (es decir, dependen de las bibliotecas en /usr/local/lib a pesar de que aún no, aún están en el árbol). A continuación, make install es, a grandes rasgos, sólo que usando cp a instalar librerías y ejecutables a partir de la generación de árbol para el último lugar.

Durante la make check fase, se está ejecutando el programa desinstalado: las bibliotecas compartidas, archivos ejecutables y archivos auxiliares se encuentran todavía en la construcción del árbol. Para ejecutar las pruebas que tienes que configurar un par de custom variables de entorno (por ejemplo, dígale a su programa de su auxiliar de archivos de datos no se en /usr/local/share , pero en el árbol de código fuente), y algunas variables de entorno del sistema, para contar su cuota de lib cargador para buscar las librerías compartidas. Las variables de entorno en los sistemas unix tradicionales es LD_LIBRARY_PATH, en OS X es DYLD_LIBRARY_PATH. Esto ha funcionado para (decenas de) años.

Pero ahora, El Capitán rompió este.

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

ahora, cuando la SIP está habilitado, no DYLD_* se exporta a partir de un proceso para sus hijos.

Así que mi pregunta es: ¿Cómo podemos ejecutar programas que no se instalan? ¿Cuál es el procedimiento a seguir para ser capaz de ejecutar el tradicional de Unix secuencia ./configure && make && make check?

Por favor, no hay respuesta, tales como "ejecutar make install primera". Ese no es el punto. Soy un desarrollador, y la ejecución de "hacer" (y, más generalmente, ejecutando un no-versión instalada de un programa) es algo que hago muy a menudo. Incluso la instalación de un ficticio lugar es mucho tiempo. Necesito algo eficaz, y eficiente. Y desactivación de la SIP no va a arreglar el problema de los usuarios de mis paquetes que desea ejecutar make check.

6voto

Ture Pålsson Puntos 46

Parece que DYLD_* sólo se desnudaron para los "protegidos" binarios (no estoy seguro de lo que significa exactamente, pero al parecer algo en /bin y /usr/bin para empezar) sin Embargo, si la copia /usr/bin/env a otro lugar, se pone a mantener su DYLD_* cosas:

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

Creo que hacer que siempre se ejecuta comandos a través de /bin/sh, por lo que no se puede establecer el "peligroso" de las variables en el archivo makefile y tienen ellos afectan a los comandos, pero tal vez podría mover la prueba en un script de shell, establecer las variables de entorno dentro de la secuencia de comandos y, a continuación, invocar el script de hacer. Aunque obviamente, esto no te ayudará si las pruebas que, a su vez, se basan en scripts de shell (o si las cosas probado son secuencias de comandos de shell!) porque luego van a invocar /bin/sh y perder las variables de nuevo...

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X