Tworzę aplikacje przy użyciu zwykłego zestawu narzędzi Unix: kompilatora make
i 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 make
współ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/lib
mimo że jeszcze ich nie ma, wciąż są w kompilacji drzewo). Z make install
grubsza używa tylko cp
biblioteki lib i plików wykonywalnych z drzewa kompilacji do ostatecznego miejsca.
Podczas tej make check
fazy 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/share
ale 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 install
najpierw 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.6
do uruchamiania starej APU (ze starą biblioteką) poniżej 10.11 (nawet jeśli zmienna się nie wyświetlaenv
). Dziwne (ale działa).Odpowiedzi:
Wygląda na to, że DYLD_ * jest usuwany tylko dla „chronionych” plików binarnych (nie jestem pewien, co to dokładnie oznacza, ale najwyraźniej cokolwiek w / bin i / usr / bin na początek) Jednak jeśli skopiujesz / usr / bin / env gdzie indziej, zachowuje swoje DYLD_ * rzeczy:
Myślę, że make zawsze uruchamia polecenia przez / bin / sh, więc nie możesz ustawić „niebezpiecznych” zmiennych w pliku makefile i mieć ich wpływ na polecenia, ale może możesz przenieść test do skryptu powłoki, ustawić zmienne środowiskowe wewnątrz skrypt, a następnie wywołaj skrypt z make. Oczywiście nie pomoże ci to, jeśli testy z kolei polegają na skryptach powłoki (lub jeśli testowane są skrypty powłoki!), Ponieważ wtedy wywołają / bin / sh i ponownie utracą zmienne ... .
źródło
cp
/bin/sh
i używam tej powłoki zamiast prawdziwej. Dowiązania symboliczne nie działają, a twarde linki to „Operacje niedozwolone”, więc myślę, że muszę z tym żyćcp
.