Ель Капітан, перевір, DYLD_LIBRARY_PATH


9

Я розробляю програми за допомогою звичайного набору інструментів 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). Дивно (але це працює).
nohillside

Відповіді:


6

Схоже, що DYLD_ * видаляється лише для "захищених" бінарних файлів (я не впевнений, що це точно означає, але, мабуть, що-небудь в / bin та / usr / bin для початківців) Однак, якщо ви скопіюєте / usr / bin / env щоб десь інше, воно може зберігати свої речі DYLD_ *:

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

Я думаю, що команда make завжди запускає команди через / bin / sh, тому ви не можете встановлювати "небезпечні" змінні у makefile і змушувати їх впливати на команди, але, можливо, ви можете перемістити тест у сценарій оболонки, встановити змінні середовища всередині скрипт, а потім викликати сценарій від make. Хоча, очевидно, це не допоможе вам, якщо тести, у свою чергу, покладаються на сценарії оболонки (або якщо тестовані речі - це сценарії оболонки!), Оскільки тоді вони збираються викликати / bin / sh і втратити змінні знову. .


Дуже дякую! Тепер я можу cp /bin/shі використовувати цю оболонку замість реальної. Символьні посилання не робитимуть, а жорсткі посилання - "Операції не дозволені", тому, мабуть, мені доведеться жити cp.
аким
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.