Я розробляю програми за допомогою звичайного набору інструментів Unix: компілятора make
та спільних бібліотек. Потім процедура традиційно є щось подібне
./configure
, яка адаптує джерела до особливостей машини, на якій вона працює,make
, яка фактично компілює спільні файли, виконувані файли тощо,make check
, яка виконує тести, перш ніж встановити пакет,make install
, якщо пакет поводиться належним чином, і, нарешті, необов'язково,make installcheck
, щоб переконатися, що установка працює.
Під make
час спільні файли та виконувані файли складаються у їх остаточному вигляді: виконувані файли складаються залежно від спільних ліб за їх кінцевим призначенням (тобто вони залежать від бібліотек, /usr/local/lib
хоча їх ще немає, вони все ще знаходяться в складанні дерево). Тоді make install
, приблизно, просто використовуйте cp
для установки libs та виконуваних файлів від дерева збірки до остаточного місця.
Під час make check
фази ми запускаємо програму, яку не видалено: спільні файли, виконувані файли та допоміжні файли все ще знаходяться у дереві збірки. Для запуску тестів необхідно встановити кілька змінних користувальницьких середовищ (наприклад, сказати програмі, що ваші допоміжні файли даних не знаходяться, /usr/local/share
а є у вихідному дереві), а також деякі змінні системного середовища, щоб вказати вашому завантажувачу ліб- файлів для пошуку для спільних ліб. Змінні середовища в традиційних Unices є LD_LIBRARY_PATH
, в OS X це є DYLD_LIBRARY_PATH
. Це працює (десятки) років.
Але зараз Ель Капітан це порушив.
$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$
тепер, коли SIP увімкнено, жоден процес DYLD_*
не експортується з процесу для своїх дітей.
Отже, моє запитання: як ми можемо запускати програми, які не встановлені? Яку процедуру слід дотримуватися, щоб мати змогу запустити традиційну послідовність Unix ./configure && make && make check
?
Будь ласка , жодної відповіді, наприклад "запустити make install
перший". Це не суть. Я розробник, і запуск "робити перевірку" (і загалом, запуск неінстальованої версії програми) - це те, що я роблю дуже часто. Навіть установка на підроблене місце займає багато часу. Мені потрібно щось ефективне та ефективне. І відключення SIP не вирішить проблему для користувачів моїх пакунків, які хочуть запуститись make check
.
DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6
для запуску старого APU (зі старою бібліотекою) під 10.11 (навіть якщо змінна не відображається вenv
). Дивно (але це працює).