Sviluppo applicazioni usando il solito set di strumenti Unix: un compilatore makee librerie condivise. La procedura è quindi tradizionalmente qualcosa di simile
./configure, che adatta le fonti per le caratteristiche della macchina su cui è in esecuzione,make, che in realtà compila le librerie condivise, gli eseguibili, ecc.,make check, che esegue i test prima di installare il pacchetto,make install, se il pacchetto si comporta correttamente e infine, facoltativamente,make installcheck, per assicurarsi che l'installazione funzioni.
Durante make, le librerie e gli eseguibili condivisi sono compilati nella loro forma finale: gli eseguibili sono compilati con una dipendenza dalle librerie condivise nella loro destinazione finale (cioè, dipendono dalle librerie /usr/local/libanche se non sono ancora lì, sono ancora nella build albero). Quindi make install, all'incirca, usa solo cpper installare librerie ed eseguibili dall'albero della build nella posizione finale.
Durante la make checkfase, stiamo eseguendo il programma disinstallato: le librerie condivise, i file eseguibili e i file ausiliari sono ancora nell'albero della build. Per eseguire i test devi impostare alcune variabili d'ambiente personalizzate (ad esempio per dire al tuo programma che i tuoi file di dati ausiliari non sono presenti /usr/local/sharema nell'albero dei sorgenti) e alcune variabili d'ambiente di sistema, per dire al tuo caricatore di lib libere di guardare per le librerie condivise. Le variabili di ambiente su Unices tradizionali sono LD_LIBRARY_PATH, su OS X lo è DYLD_LIBRARY_PATH. Questo ha funzionato per (dozzine di) anni.
Ma ora El Capitan ha rotto questo.
$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$
ora, quando SIP è abilitato, no DYLD_*viene esportato da un processo ai suoi figli.
Quindi la mia domanda è: come possiamo eseguire programmi che non sono installati? Qual è la procedura da seguire per poter eseguire la tradizionale sequenza Unix ./configure && make && make check?
Per favore , nessuna risposta come "esegui make installprima". Non è questo il punto. Sono uno sviluppatore e eseguire "make check" (e più in generale eseguendo una versione non installata di un programma) è qualcosa che faccio molto frequentemente. Anche l'installazione in un luogo fittizio richiede tempo. Ho bisogno di qualcosa di efficace ed efficiente. E la disabilitazione di SIP non risolverà il problema per gli utenti dei miei pacchetti che vogliono eseguire make check.
DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6per eseguire la vecchia APU (con la vecchia libreria) in 10.11 (anche se la variabile non viene visualizzata inenv). Strano (ma funziona).