Ural penguins - Сообщения с тегом red
http://uralbash.ru/blog/tag/red/atom.xml
2017-08-28T19:33:00Z
ABlog
Сборка пакета для Nix
http://uralbash.ru/articles/2017/nixpkgs-contribute/
2017-08-28T19:33:00Z
2017-08-28T19:33:00Z
Uralbash
<div class="section" id="nix">
<p><a class="reference external" href="https://nixos.org/nixpkgs/">Nix</a> - замечательный пакетный менеджер, который
работает на <cite>MacOS</cite> и любом дистрибутиве <cite>Linux</cite>, причем из-за своей
функциональной чистоты и изоляции зависимостей, гарантировано выдает всегда
одинаковый результат.</p>
<p>На сегодняшний день <cite>Nix</cite> имеет огромную базу пакетов, которая ежедневно
пополняется. Для сборки своего пакета потребуется знание языка <a class="reference external" href="https://nixos.org/nix/manual/#chap-writing-nix-expressions">Nix
expression</a>. Это
чистый функциональный язык созданный специально для пакетного менеджера <cite>Nix</cite> и
операционной системы <a class="reference external" href="https://nixos.org/">NixOS</a>.</p>
<div class="admonition note">
<p class="first admonition-title">Примечание</p>
<ul class="last simple">
<li>Ресурсы по <a class="reference internal" href="../../../pages/nixos/#nixos"><span class="std std-ref">NixOS</span></a></li>
<li>Статьи <a class="reference external" href="http://uralbash.ru/blog/tag/nix/">http://uralbash.ru/blog/tag/nix/</a></li>
</ul>
</div>
<p>Для примера создадим сборку пакета языка программирования <a class="reference external" href="http://www.red-lang.org/">Red</a>. Будем следовать оф. документации
<a class="reference external" href="https://nixos.org/nixpkgs/manual/#chap-quick-start">https://nixos.org/nixpkgs/manual/#chap-quick-start</a>.</p>
<div class="section" id="id2">
<h2>1. Скачиваем исходники</h2>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ git clone git://github.com/NixOS/nixpkgs.git
$ <span class="nb">cd</span> nixpkgs
</pre></div>
</div>
</div>
<div class="section" id="id3">
<h2>2. Добавляем директорию с новым пакетом</h2>
<div class="admonition seealso">
<p class="first admonition-title">См.также</p>
<p class="last">Правила именования файлов
<a class="reference external" href="https://nixos.org/nixpkgs/manual/#sec-organisation">https://nixos.org/nixpkgs/manual/#sec-organisation</a></p>
</div>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ mkdir pkgs/development/interpreters/red/
</pre></div>
</div>
</div>
<div class="section" id="default-nix">
<h2>3. Создаем файл описания пакета <code class="docutils literal"><span class="pre">default.nix</span></code></h2>
<p>Заготовка для нашего пакета будет выглядеть так:</p>
<div class="highlight-nix"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="p">{</span> stdenv<span class="p">,</span> fetchFromGitHub <span class="p">}:</span>
stdenv<span class="o">.</span>mkDerivation <span class="k">rec</span> <span class="p">{</span>
<span class="ss">src =</span> fetchFromGitHub <span class="p">{</span>
<span class="ss">rev =</span> <span class="s2">"6a43c767fa2e85d668b83f749158a18e62c30f70"</span><span class="p">;</span>
<span class="ss">owner =</span> <span class="s2">"red"</span><span class="p">;</span>
<span class="ss">repo =</span> <span class="s2">"red"</span><span class="p">;</span>
<span class="ss">sha256 =</span> <span class="s2">"1zh6xc728bs7r4v5jz1jjrdk0xd838xsxmvy9gfg75a3zffm0slr"</span><span class="p">;</span>
<span class="p">};</span>
<span class="ss">configurePhase =</span> <span class="s1">''</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">buildPhase =</span> <span class="s1">''</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">installPhase =</span> <span class="s1">''</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">meta =</span> <span class="k">with</span> stdenv<span class="o">.</span>lib<span class="p">;</span> <span class="p">{</span>
<span class="ss">description =</span> <span class="s1">''</span>
<span class="s1"> New programming language strongly inspired by Rebol, but with a</span>
<span class="s1"> broader field of usage thanks to its native-code compiler, from system</span>
<span class="s1"> programming to high-level scripting, while providing modern support for</span>
<span class="s1"> concurrency and multi-core CPUs</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">maintainers =</span> <span class="k">with</span> maintainers<span class="p">;</span> <span class="p">[</span> uralbash <span class="p">];</span>
<span class="ss">platforms =</span> <span class="p">[</span> <span class="s2">"i686-linux"</span> <span class="s2">"x86_64-linux"</span> <span class="p">];</span>
<span class="ss">license =</span> licenses<span class="o">.</span>bsd3<span class="p">;</span>
<span class="ss">homepage =</span> <span class="l">http://www.red-lang.org/</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>В первой строке указан импорт необходимых нам функций.</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="p">{</span> stdenv<span class="p">,</span> fetchFromGitHub <span class="p">}:</span>
</pre></div>
</div>
<p>Далее забираем исходники с <cite>GitHub</cite> при помощи функции <code class="docutils literal"><span class="pre">fetchFromGitHub</span></code>.</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="ss">src =</span> fetchFromGitHub <span class="p">{</span>
<span class="ss">rev =</span> <span class="s2">"6a43c767fa2e85d668b83f749158a18e62c30f70"</span><span class="p">;</span>
<span class="ss">owner =</span> <span class="s2">"red"</span><span class="p">;</span>
<span class="ss">repo =</span> <span class="s2">"red"</span><span class="p">;</span>
<span class="ss">sha256 =</span> <span class="s2">"1zh6xc728bs7r4v5jz1jjrdk0xd838xsxmvy9gfg75a3zffm0slr"</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>
</div>
<p>Что бы посчитать хэш (sha256) нам потребуется утилита <code class="docutils literal"><span class="pre">nix-prefetch-git</span></code>.</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ nix-prefetch-git https://github.com/red/red 6a43c767fa2e85d668b83f749158a18e62c30f70
Initialized empty Git repository in /tmp/git-checkout-tmp-Jzca0REG/red-6a43c76/.git/
fatal: Invalid refspec '+refs/tags/v0.6.3^{}'
remote: Counting objects: 52473, done.
remote: Total 52473 (delta 0), reused 0 (delta 0), pack-reused 52473
Receiving objects: 100% (52473/52473), 20.39 MiB | 1.50 MiB/s, done.
Resolving deltas: 100% (35793/35793), done.
From https://github.com/red/red
Switched to a new branch 'fetchgit'
removing `.git'...
git revision is 6a43c767fa2e85d668b83f749158a18e62c30f70
path is /nix/store/qp10dy2plvskbv0zjpcg9mmrsszd1a6i-red-6a43c76
git human-readable version is v0.6.3
Commit date is 2017-07-17 21:25:27 +0800
hash is 1zh6xc728bs7r4v5jz1jjrdk0xd838xsxmvy9gfg75a3zffm0slr
{
"url": "https://github.com/red/red",
"rev": "6a43c767fa2e85d668b83f749158a18e62c30f70",
"date": "2017-07-17T21:25:27+08:00",
<span class="hll"> "sha256": "1zh6xc728bs7r4v5jz1jjrdk0xd838xsxmvy9gfg75a3zffm0slr",
</span> "fetchSubmodules": true
}
</pre></div>
</div>
<p>В конце файла указывается мета информация:</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="ss">meta =</span> <span class="k">with</span> stdenv<span class="o">.</span>lib<span class="p">;</span> <span class="p">{</span>
<span class="ss">description =</span> <span class="s1">''</span>
<span class="s1"> New programming language strongly inspired by Rebol, but with a</span>
<span class="s1"> broader field of usage thanks to its native-code compiler, from system</span>
<span class="s1"> programming to high-level scripting, while providing modern support for</span>
<span class="s1"> concurrency and multi-core CPUs</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">maintainers =</span> <span class="k">with</span> maintainers<span class="p">;</span> <span class="p">[</span> uralbash <span class="p">];</span>
<span class="ss">platforms =</span> <span class="p">[</span> <span class="s2">"i686-linux"</span> <span class="s2">"x86_64-linux"</span> <span class="p">];</span>
<span class="ss">license =</span> licenses<span class="o">.</span>bsd3<span class="p">;</span>
<span class="ss">homepage =</span> <span class="l">http://www.red-lang.org/</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>
</div>
<p>Сама сборка происходит в 3 директивах <code class="docutils literal"><span class="pre">configurePhase</span></code>, <code class="docutils literal"><span class="pre">buildPhase</span></code>,
<code class="docutils literal"><span class="pre">installPhase</span></code>. Если их не указывать, то по умолчанию будут выполняться
<code class="docutils literal"><span class="pre">./configure</span></code>, <code class="docutils literal"><span class="pre">make</span></code>, <code class="docutils literal"><span class="pre">make</span> <span class="pre">install</span></code> соответственно. Т.к. <code class="docutils literal"><span class="pre">Red</span></code> не
использует <code class="docutils literal"><span class="pre">autotools</span></code> для сборки, то нам придется вручную прописать все
необходимые шаги. Что бы не изобретать велосипед возьмем за основу пакет из
<code class="docutils literal"><span class="pre">Arch</span> <span class="pre">Linux</span></code> <a class="reference external" href="https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=red">https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=red</a>.</p>
<p><code class="docutils literal"><span class="pre">Red</span></code> требует 32х битный <code class="docutils literal"><span class="pre">curl</span></code>, добавим его в окружение сборки:</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="p">{</span> stdenv<span class="p">,</span> stdenv_32bit<span class="p">,</span> pkgsi686Linux<span class="p">,</span> fetchFromGitHub<span class="p">,</span> fetchurl <span class="p">}:</span>
<span class="o">...</span>
<span class="ss">buildInputs =</span> <span class="p">[</span> pkgsi686Linux<span class="o">.</span>curl stdenv_32bit <span class="p">];</span>
</pre></div>
</div>
<p>Скачаем <a class="reference external" href="http://www.rebol.com/">Rebol</a>. При помощи него собирается
интерпретатор <code class="docutils literal"><span class="pre">Red</span></code>.</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="o">...</span>
<span class="ss">rebol =</span> fetchurl <span class="p">{</span>
<span class="ss">url =</span> <span class="s2">"http://www.rebol.com/downloads/v278/rebol-core-278-4-2.tar.gz"</span><span class="p">;</span>
<span class="ss">sha256 =</span> <span class="s2">"1c1v0pyhf3d8z98qc93a5zmx0bbl0qq5lr8mbkdgygqsq2bv2xbz"</span><span class="p">;</span>
<span class="p">};</span>
<span class="ss">r2 =</span> <span class="s2">"./rebol/releases/rebol-core/rebol"</span><span class="p">;</span>
<span class="o">...</span>
</pre></div>
</div>
<p>В нашем случае, что добавлять в фазы установки имеет очень условных характер.
Поделим следующим образом - в фазу конфигурации добавим распаковку <code class="docutils literal"><span class="pre">Rebol</span></code>:</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="ss">configurePhase =</span> <span class="s1">''</span>
<span class="s1"> # Download rebol</span>
<span class="s1"> mkdir rebol/</span>
<span class="s1"> tar -xzvf </span><span class="si">${</span>rebol<span class="si">}</span><span class="s1"> -C rebol/</span>
<span class="s1"> patchelf --set-interpreter \</span>
<span class="s1"> </span><span class="si">${</span>stdenv_32bit<span class="o">.</span>cc<span class="o">.</span>libc<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib/32/ld-linux.so.2 \</span>
<span class="s1"> </span><span class="si">${</span>r2<span class="si">}</span><span class="s1"></span>
<span class="s1">''</span><span class="p">;</span>
</pre></div>
</div>
<p>Заметьте <code class="docutils literal"><span class="pre">r2</span></code> это переменная, которую мы объявили выше. А <a class="reference external" href="https://nixos.org/patchelf.html">PatchELF</a> это мега крутая утилита, которой можно
подменять динамические зависимости в бинарниках, не пересобирая их. Мы изменили
путь до <code class="docutils literal"><span class="pre">ld-linux.so.2</span></code> файла, т.к. в <code class="docutils literal"><span class="pre">NixOS</span></code> он имеет нестандартный путь.</p>
<div class="admonition note">
<p class="first admonition-title">Примечание</p>
<p class="last">При этом если такой пакет собирать в Ubuntu то патчить rebol нет
необходимости, он подхватит зависимость из стандартного пути. Но для
большей универсальности это необходимо.</p>
</div>
<p>После условной конфигурации приступим к сборке интерпретатора <code class="docutils literal"><span class="pre">Red</span></code>. Все шаги
выполняются относительно директории с исходными кодами с GitHub:</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="ss">buildPhase =</span> <span class="s1">''</span>
<span class="s1"> # Do tests</span>
<span class="s1"> #</span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw run-all.r</span>
<span class="s1"> # Build test</span>
<span class="s1"> </span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw red.r tests/hello.red</span>
<span class="s1"> # Compiling the Red console...</span>
<span class="s1"> </span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw red.r -r environment/console/console.red</span>
<span class="s1"> # Generating docs...</span>
<span class="s1"> cd docs</span>
<span class="s1"> ../</span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw makedoc2.r red-system-specs.txt</span>
<span class="s1"> ../</span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw makedoc2.r red-system-quick-test.txt</span>
<span class="s1"> cd ../</span>
<span class="s1">''</span><span class="p">;</span>
</pre></div>
</div>
<p>Установка:</p>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="ss">installPhase =</span> <span class="s1">''</span>
<span class="s1"> mkdir $out</span>
<span class="s1"> # Install</span>
<span class="s1"> install -d $out/opt/red</span>
<span class="s1"> find quick-test -type f -executable -print0 | xargs -0 rm</span>
<span class="s1"> cp -R * $out/opt/red/</span>
<span class="s1"> rm -rf $out/opt/red/rebol</span>
<span class="s1"> install -Dm755 console $out/bin/red</span>
<span class="s1"> install -Dm644 BSD-3-License.txt \</span>
<span class="s1"> $out/share/licenses/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/BSD-3-License.txt</span>
<span class="s1"> install -Dm644 BSL-License.txt \</span>
<span class="s1"> $out/share/licenses/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/BSL-License.txt</span>
<span class="s1"> install -Dm644 docs/red-system-quick-test.html \</span>
<span class="s1"> $out/share/doc/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/red-system-quick-test.html</span>
<span class="s1"> install -Dm644 docs/red-system-specs.html \</span>
<span class="s1"> $out/share/doc/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/red-system-specs.html</span>
<span class="s1"> # PathElf</span>
<span class="s1"> patchelf --set-interpreter \</span>
<span class="s1"> </span><span class="si">${</span>stdenv_32bit<span class="o">.</span>cc<span class="o">.</span>libc<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib/32/ld-linux.so.2 \</span>
<span class="s1"> $out/opt/red/console</span>
<span class="s1"> patchelf --set-rpath </span><span class="si">${</span>pkgsi686Linux<span class="o">.</span>curl<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib \</span>
<span class="s1"> $out/opt/red/console</span>
<span class="s1"> patchelf --set-interpreter \</span>
<span class="s1"> </span><span class="si">${</span>stdenv_32bit<span class="o">.</span>cc<span class="o">.</span>libc<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib/32/ld-linux.so.2 \</span>
<span class="s1"> $out/bin/red</span>
<span class="s1"> patchelf --set-rpath </span><span class="si">${</span>pkgsi686Linux<span class="o">.</span>curl<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib \</span>
<span class="s1"> $out/bin/red</span>
<span class="s1">''</span><span class="p">;</span>
</pre></div>
</div>
</div>
<div class="section" id="id4">
<h2>4. Добавление в общий список пакетов</h2>
<p>Почти все готово, осталось добавить новый пакет в общий список и собрать.</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ vim pkgs/top-level/all-packages.nix
</pre></div>
</div>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="o">...</span>
<span class="ss">rascal =</span> callPackage <span class="o">..</span><span class="l">/development/interpreters/rascal</span> <span class="p">{</span> <span class="p">};</span>
<span class="hll"><span class="ss">red =</span> callPackage <span class="o">..</span><span class="l">/development/interpreters/red</span> <span class="p">{</span> <span class="p">};</span>
</span>
<span class="ss">regina =</span> callPackage <span class="o">..</span><span class="l">/development/interpreters/regina</span> <span class="p">{</span> <span class="p">};</span>
<span class="o">...</span>
</pre></div>
</div>
</div>
<div class="section" id="id5">
<h2>5. Сборка</h2>
<p>Сборка пакета выполняется командой <code class="docutils literal"><span class="pre">nix-build</span></code>:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ nix-build -A red
</pre></div>
</div>
<p>Или если необходимо его сразу установить в окружение:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ nix-build -f . -iA red
</pre></div>
</div>
<p>Полный исходник выглядит так:</p>
<div class="literal-block-wrapper docutils container" id="id6">
<div class="code-block-caption"><span class="caption-text">default.nix</span></div>
<div class="highlight-nix"><div class="highlight"><pre><span></span><span class="p">{</span> stdenv<span class="p">,</span> stdenv_32bit<span class="p">,</span> pkgsi686Linux<span class="p">,</span> fetchFromGitHub<span class="p">,</span> fetchurl <span class="p">}:</span>
stdenv<span class="o">.</span>mkDerivation <span class="k">rec</span> <span class="p">{</span>
<span class="ss">name =</span> <span class="s2">"red-v</span><span class="si">${</span>version<span class="si">}</span><span class="s2">"</span><span class="p">;</span>
<span class="ss">version =</span> <span class="s2">"0.6.3"</span><span class="p">;</span>
<span class="ss">src =</span> fetchFromGitHub <span class="p">{</span>
<span class="ss">rev =</span> <span class="s2">"6a43c767fa2e85d668b83f749158a18e62c30f70"</span><span class="p">;</span>
<span class="ss">owner =</span> <span class="s2">"red"</span><span class="p">;</span>
<span class="ss">repo =</span> <span class="s2">"red"</span><span class="p">;</span>
<span class="ss">sha256 =</span> <span class="s2">"1zh6xc728bs7r4v5jz1jjrdk0xd838xsxmvy9gfg75a3zffm0slr"</span><span class="p">;</span>
<span class="p">};</span>
<span class="ss">rebol =</span> fetchurl <span class="p">{</span>
<span class="ss">url =</span> <span class="s2">"http://www.rebol.com/downloads/v278/rebol-core-278-4-2.tar.gz"</span><span class="p">;</span>
<span class="ss">sha256 =</span> <span class="s2">"1c1v0pyhf3d8z98qc93a5zmx0bbl0qq5lr8mbkdgygqsq2bv2xbz"</span><span class="p">;</span>
<span class="p">};</span>
<span class="ss">buildInputs =</span> <span class="p">[</span> pkgsi686Linux<span class="o">.</span>curl stdenv_32bit <span class="p">];</span>
<span class="ss">r2 =</span> <span class="s2">"./rebol/releases/rebol-core/rebol"</span><span class="p">;</span>
<span class="ss">configurePhase =</span> <span class="s1">''</span>
<span class="s1"> # Download rebol</span>
<span class="s1"> mkdir rebol/</span>
<span class="s1"> tar -xzvf </span><span class="si">${</span>rebol<span class="si">}</span><span class="s1"> -C rebol/</span>
<span class="s1"> patchelf --set-interpreter \</span>
<span class="s1"> </span><span class="si">${</span>stdenv_32bit<span class="o">.</span>cc<span class="o">.</span>libc<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib/32/ld-linux.so.2 \</span>
<span class="s1"> </span><span class="si">${</span>r2<span class="si">}</span><span class="s1"></span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">buildPhase =</span> <span class="s1">''</span>
<span class="s1"> # Do tests</span>
<span class="s1"> #</span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw run-all.r</span>
<span class="s1"> # Build test</span>
<span class="s1"> </span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw red.r tests/hello.red</span>
<span class="s1"> # Compiling the Red console...</span>
<span class="s1"> </span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw red.r -r environment/console/console.red</span>
<span class="s1"> # Generating docs...</span>
<span class="s1"> cd docs</span>
<span class="s1"> ../</span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw makedoc2.r red-system-specs.txt</span>
<span class="s1"> ../</span><span class="si">${</span>r2<span class="si">}</span><span class="s1"> -qw makedoc2.r red-system-quick-test.txt</span>
<span class="s1"> cd ../</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">installPhase =</span> <span class="s1">''</span>
<span class="s1"> mkdir $out</span>
<span class="s1"> # Install</span>
<span class="s1"> install -d $out/opt/red</span>
<span class="s1"> find quick-test -type f -executable -print0 | xargs -0 rm</span>
<span class="s1"> cp -R * $out/opt/red/</span>
<span class="s1"> rm -rf $out/opt/red/rebol</span>
<span class="s1"> install -Dm755 console $out/bin/red</span>
<span class="s1"> install -Dm644 BSD-3-License.txt \</span>
<span class="s1"> $out/share/licenses/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/BSD-3-License.txt</span>
<span class="s1"> install -Dm644 BSL-License.txt \</span>
<span class="s1"> $out/share/licenses/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/BSL-License.txt</span>
<span class="s1"> install -Dm644 docs/red-system-quick-test.html \</span>
<span class="s1"> $out/share/doc/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/red-system-quick-test.html</span>
<span class="s1"> install -Dm644 docs/red-system-specs.html \</span>
<span class="s1"> $out/share/doc/</span><span class="si">${</span>name<span class="si">}</span><span class="s1">/red-system-specs.html</span>
<span class="s1"> # PathElf</span>
<span class="s1"> patchelf --set-interpreter \</span>
<span class="s1"> </span><span class="si">${</span>stdenv_32bit<span class="o">.</span>cc<span class="o">.</span>libc<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib/32/ld-linux.so.2 \</span>
<span class="s1"> $out/opt/red/console</span>
<span class="s1"> patchelf --set-rpath </span><span class="si">${</span>pkgsi686Linux<span class="o">.</span>curl<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib \</span>
<span class="s1"> $out/opt/red/console</span>
<span class="s1"> patchelf --set-interpreter \</span>
<span class="s1"> </span><span class="si">${</span>stdenv_32bit<span class="o">.</span>cc<span class="o">.</span>libc<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib/32/ld-linux.so.2 \</span>
<span class="s1"> $out/bin/red</span>
<span class="s1"> patchelf --set-rpath </span><span class="si">${</span>pkgsi686Linux<span class="o">.</span>curl<span class="o">.</span>out<span class="si">}</span><span class="s1">/lib \</span>
<span class="s1"> $out/bin/red</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">meta =</span> <span class="k">with</span> stdenv<span class="o">.</span>lib<span class="p">;</span> <span class="p">{</span>
<span class="ss">description =</span> <span class="s1">''</span>
<span class="s1"> New programming language strongly inspired by Rebol, but with a</span>
<span class="s1"> broader field of usage thanks to its native-code compiler, from system</span>
<span class="s1"> programming to high-level scripting, while providing modern support for</span>
<span class="s1"> concurrency and multi-core CPUs</span>
<span class="s1"> ''</span><span class="p">;</span>
<span class="ss">maintainers =</span> <span class="k">with</span> maintainers<span class="p">;</span> <span class="p">[</span> uralbash <span class="p">];</span>
<span class="ss">platforms =</span> <span class="p">[</span> <span class="s2">"i686-linux"</span> <span class="s2">"x86_64-linux"</span> <span class="p">];</span>
<span class="ss">license =</span> licenses<span class="o">.</span>bsd3<span class="p">;</span>
<span class="ss">homepage =</span> <span class="l">http://www.red-lang.org/</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<p>Готовый пакет можно отправить в основную ветку <code class="docutils literal"><span class="pre">nixpkgs</span></code>. Перед этим лучше
почитать как правильно делать <code class="docutils literal"><span class="pre">pull</span> <span class="pre">request</span></code>:</p>
<ul class="simple">
<li><a class="reference external" href="https://nixos.org/nixpkgs/manual/#idm140737317358720">https://nixos.org/nixpkgs/manual/#idm140737317358720</a></li>
<li><a class="reference external" href="https://nixos.org/nixpkgs/manual/#sec-reviewing-contributions">https://nixos.org/nixpkgs/manual/#sec-reviewing-contributions</a></li>
</ul>
<p>В следующей статье я постараюсь описать как собирать свой собственный <code class="docutils literal"><span class="pre">NixOS</span></code>
дистрибутив с шахматами и балеринами.</p>
</div>
</div>