Sviluppo applicazioni usando il solito set di strumenti Unix: un compilatore make
e 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/lib
anche se non sono ancora lì, sono ancora nella build albero). Quindi make install
, all'incirca, usa solo cp
per installare librerie ed eseguibili dall'albero della build nella posizione finale.
Durante la make check
fase, 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/share
ma 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 install
prima". 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.6
per eseguire la vecchia APU (con la vecchia libreria) in 10.11 (anche se la variabile non viene visualizzata inenv
). Strano (ma funziona).