網頁設計
Добро пожаловать на девятую пилюлю Nix。
В предыдущей восьмой пилюле мы разработали универсальный скрикптсор autotools
。
Мы загрузили зависимости и исходники, и в качестве результата дерив
Сегодня мы обратимся к программе GNU hello
, 和 сследовать зависимости времени сборки и времени выполнения。 ючить енужныезавиючить ненужные
Зависимости сборки
Давайте начнём анализ зависимостей сборки для пакета GNU hello
:
$ nix-instantiate hello.nix/nix/store/z77vn965a59irqnrrjvbspiyl2rph0jp-hello.drv$ nix-store -q --references /nix/store/z77vn965a59irqnrrjvbspiyl2rph0jp-hello.drv/nix/store/0q6pfasdma4as22kyaknk4kwx4h58480-hello-2.10.tar.gz/nix/store/1zcs1y4n27lqs0gw4v038i303pb89rw6-coreutils-8.21.drv/nix/store/2h4b30hlfw4fhqx10wwi71mpim4wr877-gnused-4.2.2.drv/nix/store/39bgdjissw9gyi4y5j9wanf4dbjpbl07-gnutar-1.27.1.drv/nix/store/7qa70nay0if4x291rsjr7h9lfl6pl7b1-builder.sh/nix/store/g6a0shr58qvx2vi6815acgp9lnfh9yy8-gnugrep-2.14.drv/nix/store/jdggv3q1sb15140qdx0apvyrps41m4lr-bash-4.2-p45.drv/nix/store/pglhiyp1zdbmax4cglkpz98nspfgbnwr-gnumake-3.82.drv/nix/store/q9l257jn9lndbi3r9ksnvf4dr8cwxzk7-gawk-4.1.0.drv/nix/store/rgyrqxz1ilv90r01zxl0sq5nq0cq7v3v-binutils-2.23.1.drv/nix/store/qzxhby795niy6wlagfpbja27dgsz43xk-gcc-wrapper-4.8.3.drv/nix/store/sk590g7fv53m3zp0ycnxsc41snc2kdhp-gzip-1.6.drv
Учитывая, что наша универсальная функция mkDerivation
всегда извлекает такие зависимости (сравните с пакетом build-essential из Debian), они диаи build-essential из Debian), они диаиутпдихр пакету для сборки。
Почему мы смотрим на файлы .drv
?
詳情 hello.drv
представляет собой действие, которое собирает програму hello
по выходному пути。
Как таковой, он содержит входные деривации, нужные для сборки hello
。
Немного о файлах NAR
科馬特 NAR
означает「尼克斯檔案」。
Его разработали, потому что существующие форматы архивов, такие как tar
, не удовлетворяют некоторым важным требованиям。
Для Nix нужны детерминированные средства сборки, но обычные архиватвые, обычные архиватвые, обычные архиватв етки времен и и так далее。
В результате директории, содержащие побитово-идентичные файлы преваоиаичные фай м。
В отличие от tar
, NAR
был разработан как простой детерминированный формат архива。
Ниже мы увидим, что он широко используется в Nix.
За подробным обоснованием 和 деталями реализации NAR
обращайтесь к докторской диссертации Долстры。
Чтобы создавать архивы NAR
из путей хранилища, мы можем использовать утилиты nix-store --dump
и nix-store --restore
。
Зависимости времени выполнения
尼克斯 (Nix автоматически распознал зависимости сборки) derivation
, но мы никогда не указывали зависимости времени выполнения。
Зависимости времени выполнения Nix обнаруживает автоматически。
Техника,которую он использует,на первый взгляд может покЕ рошо,
Базовый механизм использует хэши путей хранилища.
Он выполняется за три шага.
-
Создаёт архив
NAR
из деривации. Обратите внимание, что этот шаг сериализует вывод шоваииииализует вывод деаи гда це лый каталог。 -
Для каждого файла
.drv
,來自 которого зависит сборка 和 её относительного выходного пути 以及 по этоиходного пут 以及 по этоиходнооо пут -
Если архив найден, то путь является зависимостью времени выполнения。
Приведённый фрагмент показывает зависимости hello
。
$ nix-instantiate hello.nix/nix/store/z77vn965a59irqnrrjvbspiyl2rph0jp-hello.drv$ nix-store -r /nix/store/z77vn965a59irqnrrjvbspiyl2rph0jp-hello.drv/nix/store/a42k52zwv6idmf50r9lps1nzwq9khvpf-hello$ nix-store -q --references /nix/store/a42k52zwv6idmf50r9lps1nzwq9khvpf-hello/nix/store/94n64qy99ja0vgbkf675nyk39g9b978n-glibc-2.19/nix/store/8jm0wksask7cpf85miyakihyfch1y21q-gcc-4.8.3/nix/store/a42k52zwv6idmf50r9lps1nzwq9khvpf-hello
Мы видим, что glibc
и gcc
являются зависимостями времени выполнения。
Интуитивно, здесь не должно быть gcc
! hello
показывает, что gcc
действительно там встречается:
$ strings result/bin/hello|grep gcc/nix/store/94n64qy99ja0vgbkf675nyk39g9b978n-glibc-2.19/lib:/nix/store/8jm0wksask7cpf85miyakihyfch1y21q-gcc-4.8.3/lib64
沃特·波切米·尼克斯·達巴維勒 gcc
。
Но о о откуда этот путь вообще появился?
Дело в том,что он есть в ld rpath:списке каталогов с библиотеками времени выполненияя。
В других дистрибутивах этим, обычно, не злоупотребляют。
Но в Nix нам приходится ссылаться на определённые версии библиотек, поэтоуиерсии библиотек, поэто rpath
играет важную роль。
Процесс сборки добавляет путь к библиотекам gcc
, полагая, что он потребуется во время выполнения。
Для решения этой проблемы, Nix предоставляет инструмент под названиемв rpath
к путям,которые действительно нужны при выполнении программы。
Даже после сокращения rpath
исполняемый файл hello
по прежнему зависит от gcc
из-за отладочной информации.
В следующем разделе мы исследуем, как с помощью strip
полностью избавиться от этой зависимости。
Ещё одна фаза сборки
Добавим ещё одну фазу в скрипт сборки autotools
。
В настоящий момент сборщик имеет шесть фаз:
-
名稱“настройки окружения”
-
名稱「распаковки」:мы распаковываем исходники в текущий каталог (помнитке, чтои й каталог (помнитке, чтои й
-
名稱「смены каталога」:временный каталог становится корнем дерева исходников
-
名稱「конфигурирования」:
./configure
-
名稱“сборки”:
make
-
名稱“установки”:
make install
Добавим новую фазу сразу после“устновки”,это будет фаза“исправленяя”。
Допишем в конец builder.sh
:
find $out -type f -exec patchelf --shrink-rpath '{}' ; -exec strip '{}' ; 2>/dev/null
То есть для каждого файла мы выполняем patchelf --shrink-rpath
и strip
。
Обратите внимание, что, поскольку мы использовали две новые команды find
и patchelf
, нам надо добавить их в деривацию。
Упражнение: Добавьте findutils
и patchelf
к baseInputs
斯克里普塔 autotools.nix
。
Теперь снова соберём hello.nix
……
$ nix-build hello.nix[...]$ nix-store -q --references result/nix/store/94n64qy99ja0vgbkf675nyk39g9b978n-glibc-2.19/nix/store/md4a3zv0ipqzsybhjb8ndjhhga1dj88x-hello
和 увидим, что в списке зависимостей времени выполнения осталасьтольк glibc
。
Именно этого мы и добивались。
Мы сделали автономный (самодостаточный) пакет。
Это значит、что мы можем скопировать его на другую машину、гдеѨобгуѓа где hello
。
Обратите внимание, что для её запуска требуются некоторые компоненты из /nix/store
, так что нужно будет запустить nix。
Исполняемый файл hello
запускается именно с той версией библиотеки glibc
和 интерпретатора,которые указаны в нём,а не с системными версиями。
(Здесь речь про загрузчик ELF, который иногда называют интерпретаторооназывают интерпретаторооназывают интерпретаторооназывают интерпре鈴 прим。)。
$ ldd result/bin/hello linux-vdso.so.1 (0x00007fff11294000) libc.so.6=> /nix/store/94n64qy99ja0vgbkf675nyk39g9b978n-glibc-2.19/lib/libc.so.6 (0x00007f7ab7362000) /nix/store/94n64qy99ja0vgbkf675nyk39g9b978n-glibc-2.19/lib/ld-linux-x86-64.so.2 (0x00007f7ab770f000)
Конечно, исполняемый файл будет прекраснолняемый файл будет пре я, пока все ну жные /nix/store
。
Заключение
Мы познакомились с несколькими инструментами Nix и с их возможностями.
В частности, мы узнали, как Nix распознаёт зависимости временинвыто
И речь идёт не только о разделяемых библиотеках, но и об исполняемыпоих, но и об исполняемыпоих, но и об исполняемыпоих, но и об исполняемыпхих, но и об исполняен олняемыхих, lee。
Такой подход к сборке позволяет делать пакеты самодостаточными, гартсиюодостаточными, гартоию мо грамы.
Благодаря этому, мы можем запускать программы без установки, используя nix-shell
尼克斯 (Nix)
В следующей пилюле
Следующая пилюля расскажет про nix-shell
。
Ранее мы строили деривации с нуля с помощью nix-build
: распаковывали исходные коды、 конфигурировали、 собирали 和 устанавливали。 собирали 和 устанавливали。
Развёртывание больших пакетов может занимать много времени。
же время опираясь на ества самодостаточного окружения, как в nix-build
. Для этого нам и потребуется nix-shell
。