Tworzę aplikacje przy użyciu zwykłego zestawu narzędzi Unix: kompilatora makei bibliotek współdzielonych. Procedura jest wtedy tradycyjnie podobna
./configure, który dostosowuje źródła funkcji komputera, na którym jest uruchomiony,make, który faktycznie kompiluje udostępnione biblioteki lib, pliki wykonywalne itp.,make check, który uruchamia testy przed zainstalowaniem pakietu,make install, jeśli pakiet zachowuje się poprawnie, a na koniec opcjonalniemake installcheck, aby upewnić się, że instalacja działa.
Podczas makewspółdzielonych bibliotek lib i plików wykonywalnych są kompilowane w ostatecznej formie: pliki wykonywalne są kompilowane w zależności od bibliotek współdzielonych w ich ostatecznym miejscu docelowym (tzn. Zależą od bibliotek, /usr/local/libmimo że jeszcze ich nie ma, wciąż są w kompilacji drzewo). Z make installgrubsza używa tylko cpbiblioteki lib i plików wykonywalnych z drzewa kompilacji do ostatecznego miejsca.
Podczas tej make checkfazy uruchamiamy odinstalowany program: współdzielone biblioteki lib, pliki wykonywalne i pliki pomocnicze są nadal w drzewie kompilacji. Aby uruchomić testy, musisz ustawić kilka niestandardowych zmiennych środowiskowych (na przykład, aby poinformować program, że twoich plików danych pomocniczych nie ma, /usr/local/shareale w drzewie źródłowym) oraz niektóre systemowe zmienne środowiskowe, aby Twój program ładujący bibliotekę współdzieloną szukał dla wspólnych bibliotek. Zmienne środowiskowe w tradycyjnych Unices są LD_LIBRARY_PATH, w OS X tak DYLD_LIBRARY_PATH. To działało przez (kilkadziesiąt) lat.
Ale teraz El Capitan to złamał.
$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$
teraz, gdy SIP jest włączony, żadne nie DYLD_*jest eksportowane z procesu do jego elementów podrzędnych.
Moje pytanie brzmi: w jaki sposób możemy uruchamiać programy, które nie są zainstalowane? Jaką procedurę należy wykonać, aby móc uruchomić tradycyjną sekwencję uniksową ./configure && make && make check?
Proszę , nie ma odpowiedzi takiej jak „ make installnajpierw uruchom ”. Nie o to chodzi. Jestem programistą, a wykonywanie polecenia „make check” (a bardziej ogólnie uruchamianie niezainstalowanej wersji programu) jest czymś, co robię bardzo często. Nawet instalacja w fałszywym miejscu jest czasochłonna. Potrzebuję czegoś skutecznego i wydajnego. A wyłączenie SIP nie rozwiąże problemu dla użytkowników moich pakietów, które chcą uruchomić make check.
DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6do uruchamiania starej APU (ze starą biblioteką) poniżej 10.11 (nawet jeśli zmienna się nie wyświetlaenv). Dziwne (ale działa).