git.iko.soy/typeable/nix-pills-ru
on master help sign in
Start on nixpkgs
commit70fd8b5500336ba812793063285d274de49d7ec6 authorAlexander Bantyev <balsoft@yandex.ru> dateTue 23 Jul 2019, 15:22 (7 years ago) parentd2e2090
2 files changed+117−12
.#nix.md+1 nix.md+116−12
.#nix.mdnew file+1
@@ -0,0 +1 @@
1+balsoft@AMD-Workstation.27384:1563100420
nix.md+116−12
@@ -53,13 +53,13 @@ header-includes:
5353
5454[Nix](https://nixos.org/nix) -- это
5555
56−#. Язык
56+1. Язык
5757 + Декларативный
5858 + Функциональный
5959 + Чистый
6060 + Ленивый
6161 + Динамически типизированный
62−#. Пакетный менеджер
62+2. Пакетный менеджер
6363 + Атомарный
6464 + Повторяемый
6565 + Source/Binary
@@ -652,7 +652,7 @@ graph [ dpi=200; ]
652652```
653653set -e
654654unset PATH
655−for p in $buildInputs; do
655+for p in $buildInputs $baseInputs; do
656656 export PATH=$p/bin${PATH:+:}$PATH
657657done
658658tar -xf $src
@@ -672,13 +672,117 @@ make install
672672-->
673673### `generic-builder.nix`
674674```
675−{ buildInputs, pkgs, ... }@args:
676−with pkgs;
677−derivation (args // {
678− buildInputs = buildInputs
679− ++ [ gnutar gzip gnumake gcc binutils-unwrapped
680− coreutils gawk gnused gnugrep ];
681− builder = "${bash}/bin/bash";
682− args = [ ./generic-builder.sh ];
683−})
675+pkgs: attrs:
676+ with pkgs;
677+ let defaultAttrs = {
678+ builder = "${bash}/bin/bash";
679+ args = [ ./builder.sh ];
680+ baseInputs = [ gnutar gzip gnumake gcc binutils-unwrapped
681+ coreutils gawk gnused gnugrep findutils ];
682+ buildInputs = [];
683+ system = builtins.currentSystem;
684+ };
685+ in
686+derivation (defaultAttrs // attrs)
687+```
688+## `mkDerivation`: добавляем фазы
689+<!--
690+Создадим файл `setup.sh`, в котором определим стандартные "фазы" сборки, которые затем будем использовать в `builder.sh`.
691+-->
692+```
693+unset PATH
694+for p in $baseInputs $buildInputs; do
695+ export PATH=$p/bin${PATH:+:}$PATH
696+done
697+
698+function unpackPhase() {
699+ tar -xzf $src
700+
701+ for d in *; do
702+ if [ -d "$d" ]; then
703+ cd "$d"
704+ break
705+ fi
706+ done
707+}
708+```
709+***
710+```
711+function configurePhase() {
712+ ./configure --prefix=$out
713+}
714+function buildPhase() {
715+ make
716+}
717+function installPhase() {
718+ make install
719+}
720+function genericBuild() {
721+ unpackPhase
722+ configurePhase
723+ buildPhase
724+ installPhase
725+ fixupPhase
726+}
727+```
728+
729+***
730+
731+### `builder.sh`
732+```
733+set -e
734+source $setup
735+genericBuild
736+```
737+
738+***
739+
740+### `generic-builder.nix`
741+```
742+pkgs: attrs:
743+ with pkgs;
744+ let defaultAttrs = {
745+ builder = "${bash}/bin/bash";
746+ args = [ ./builder.sh ];
747+ setup = ./setup.sh;
748+ baseInputs = [ gnutar gzip gnumake gcc binutils-unwrapped
749+ coreutils gawk gnused gnugrep findutils ];
750+ buildInputs = [];
751+ system = builtins.currentSystem;
752+ };
753+ in
754+derivation (defaultAttrs // attrs)
755+```
756+## `mkDerivation`: воспользуемся нашей функцией!
757+### `default.nix`
758+```
759+let
760+ pkgs = import <nixpkgs> {};
761+ mkDerivation = import ./generic-builder.nix pkgs;
762+in
763+mkDerivation {
764+ name = "hello";
765+ src = ./hello-2.10.tar.gz;
766+};
767+```
768+
769+## Пакеты как функции от зависимостей: паттерн inputs
770+### `hello.nix`
771+```
772+{ mkDerivation }:
773+mkDerivation {
774+ name = "hello";
775+ src = ./hello-2.10.tar.gz;
776+}
777+```
778+### `default.nix`
684779```
780+let
781+ pkgs = import <nixpkgs> {};
782+ mkDerivation = import ./generic-builder.nix pkgs;
783+in
784+{
785+ hello = import ./hello.nix { inherit mkDerivation };
786+}
787+```
788+