Hằng số ghi đè php

Môi trường xây dựng tiêu chuẩn trong bộ sưu tập Gói Nix cung cấp môi trường để xây dựng các gói Unix tự động thực hiện nhiều tác vụ xây dựng phổ biến. Trên thực tế, đối với các gói Unix sử dụng giao diện bản dựng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
5 tiêu chuẩn, bạn hoàn toàn không cần phải viết tập lệnh bản dựng; . Nếu
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 không tự động làm những gì bạn cần, bạn có thể dễ dàng tùy chỉnh hoặc ghi đè các giai đoạn xây dựng khác nhau

Show

Để xây dựng một gói với môi trường tiêu chuẩn, bạn sử dụng hàm

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
7, thay vì hàm dựng sẵn nguyên thủy
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
8, e. g

stdenv.mkDerivation {
  name = "libfoo-1.2.3";
  src = fetchurl {
    url = "http://example.org/libfoo-1.2.3.tar.bz2";
    sha256 = "0x2g1jqygyr5wiwg4ma1nd7w4ydpy82z9gkcv8vh2v8dn3y58v5m";
  };
}

(

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 cần nằm trong phạm vi, vì vậy nếu bạn viết phần này trong một biểu thức Nix riêng biệt từ
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
0, bạn cần chuyển nó dưới dạng đối số hàm. ) Chỉ định một
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
1 và một
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
2 là mức tối thiểu tuyệt đối mà Nix yêu cầu. Để thuận tiện, bạn cũng có thể sử dụng các thuộc tính
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
3 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
4 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5 sẽ tự động đặt
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
1 thành
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
7 theo mặc định. Kể từ RFC 0035, điều này được ưu tiên cho các gói trong Nixpkgs, vì nó cho phép chúng tôi sử dụng lại phiên bản một cách dễ dàng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
4

Nhiều gói có phần phụ thuộc không được cung cấp trong môi trường tiêu chuẩn. Chỉ cần chỉ định các phụ thuộc đó trong thuộc tính

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8 là đủ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6

Thuộc tính này đảm bảo rằng các thư mục con

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
9 của các gói này xuất hiện trong biến môi trường
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80 trong quá trình xây dựng, rằng các thư mục con
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
81 của chúng được trình biên dịch C tìm kiếm, v.v. (Xem Phần 6. 7, “Móc thiết lập gói” để biết chi tiết. )

Thông thường, cần phải ghi đè hoặc sửa đổi một số khía cạnh của bản dựng. Để làm cho điều này dễ dàng hơn, môi trường tiêu chuẩn chia gói xây dựng thành một số giai đoạn, tất cả đều có thể được ghi đè hoặc sửa đổi riêng lẻ. giải nén các nguồn, áp dụng các bản vá, cấu hình, xây dựng và cài đặt. (Có một số khác; xem Phần 6. 5, “Giai đoạn”. ) Chẳng hạn, một gói không cung cấp tệp thực hiện mà thay vào đó phải được biên dịch "thủ công" có thể được xử lý như thế này

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
0

(Lưu ý việc sử dụng chuỗi ký tự kiểu

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
82, rất thuận tiện cho các đoạn script nhiều dòng lớn vì chúng không cần thoát khỏi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
83 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
84 và vì phần thụt lề được loại bỏ một cách thông minh. )

Có nhiều thuộc tính khác để tùy chỉnh bản dựng. Chúng được liệt kê trong Phần 6. 4, “Thuộc tính”

Mặc dù môi trường tiêu chuẩn cung cấp trình tạo chung, nhưng bạn vẫn có thể cung cấp tập lệnh xây dựng của riêng mình

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
4

nơi trình xây dựng có thể làm bất cứ điều gì nó muốn, nhưng thường bắt đầu bằng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
5

để cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 thiết lập môi trường (e. g. bằng cách đặt lại
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80 và điền nó từ đầu vào bản dựng). Nếu muốn, bạn vẫn có thể sử dụng trình tạo chung của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild

Môi trường tiêu chuẩn cung cấp các gói sau

  • Trình biên dịch GNU C, được cấu hình với sự hỗ trợ của C và C++

  • GNU coreutils (chứa vài chục lệnh Unix tiêu chuẩn)

  • Công cụ tìm kiếm GNU (chứa

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    88)

  • GNU diffutils (chứa

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    89,
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    20)

  • GNU

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    21

  • GNU

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    22

  • GNU

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    23

  • GNU

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    24

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    25,
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    26 và
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    27

  • GNU Tạo

  • Bash. Đây là shell được sử dụng cho tất cả các trình tạo trong bộ sưu tập Nix Packages. Việc không sử dụng

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    28 sẽ loại bỏ một nguồn lớn các vấn đề về tính di động

  • Lệnh

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    29

Trên Linux,

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 cũng bao gồm tiện ích
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
401

6. 3. Chỉ định phụ thuộc

Như được mô tả trong hướng dẫn sử dụng Nix, hầu hết mọi đường dẫn lưu trữ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
402 trong bộ thuộc tính của dẫn xuất sẽ tạo ra sự phụ thuộc vào dẫn xuất đó. Tuy nhiên,
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5 có một vài thuộc tính nhằm bao gồm tất cả các phụ thuộc của một gói. Điều này được thực hiện cho cả cấu trúc và tính nhất quán, nhưng cũng để một số thiết lập khác có thể diễn ra. Ví dụ: một số phụ thuộc nhất định cần thêm thư mục bin của chúng vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80. Điều đó được tích hợp sẵn, nhưng thiết lập khác được thực hiện thông qua cơ chế có thể cắm được hoạt động cùng với các thuộc tính phụ thuộc này. Xem Phần 6. 7, “Móc thiết lập gói” để biết chi tiết

Sự phụ thuộc có thể được chia nhỏ dọc theo ba trục. nền tảng máy chủ và đích của chúng so với nền tảng phái sinh mới và liệu chúng có được truyền bá hay không. Sự khác biệt của nền tảng được thúc đẩy bởi quá trình biên dịch chéo; . Nhưng ngay cả khi một nền tảng không biên dịch chéo, các nền tảng ngụ ý liệu có cần phụ thuộc vào thời gian chạy hay thời gian xây dựng hay không, một khái niệm có ý nghĩa hoàn hảo bên ngoài biên dịch chéo. Theo mặc định, sự khác biệt về thời gian chạy/thời gian xây dựng chỉ là một gợi ý cho tinh thần rõ ràng, nhưng với bộ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
405, nó hầu như được thực thi ngay cả trong trường hợp gốc

Phần mở rộng của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80 với các phụ thuộc, được đề cập ở trên, chỉ tiến hành theo các nền tảng tương đối. Quá trình này chỉ được thực hiện đối với các phụ thuộc có nền tảng máy chủ phù hợp với nền tảng xây dựng dẫn xuất mới i. e. phụ thuộc chạy trên nền tảng nơi dẫn xuất mới sẽ được xây dựng. Đối với mỗi phụ thuộc của các phụ thuộc đó,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
407, nếu có, được thêm vào biến môi trường
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80

Một phụ thuộc được cho là được lan truyền khi một số phụ thuộc hạ lưu chuyển tiếp khác (không ngay lập tức) của nó cũng cần nó như một phụ thuộc ngay lập tức

Điều quan trọng cần lưu ý là các phụ thuộc không nhất thiết phải được truyền bá giống như loại phụ thuộc như trước đây, mà là loại tương ứng để các quy tắc nền tảng vẫn xếp hàng. Để xác định các quy tắc chính xác cho việc truyền bá phụ thuộc, chúng tôi bắt đầu bằng cách gán cho mỗi phụ thuộc một vài số thứ ba (

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
409 cho
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
410,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
411 cho
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
412 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
413 cho
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
414) đại diện cho loại phụ thuộc của nó, cho biết mỗi nền tảng máy chủ và nền tảng đích của nó giống nhau như thế nào. . Bảng dưới đây tóm tắt các kết hợp khác nhau có thể thu được

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
415tên thuộc tínhoffset
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
416
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
417
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
418
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
419
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
421
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
422
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
423
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
424
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
425
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
426
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
427
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
428
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
430
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
431
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
432
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
433

Về mặt thuật toán, chúng tôi duyệt qua các đầu vào được truyền bá, tích lũy các phụ thuộc được truyền bá của mọi phụ thuộc được truyền bá và điều chỉnh chúng để giải thích cho “sự thay đổi trong quan điểm” được mô tả bởi độ lệch nền tảng của phụ thuộc hiện tại. Kết quả này là một kiểu đóng cửa chuyển tiếp của mối quan hệ phụ thuộc, với độ lệch xấp xỉ bằng tổng khi hai liên kết phụ thuộc được kết hợp. Chúng tôi cũng loại bỏ các phụ thuộc chuyển tiếp có độ lệch kết hợp vượt quá giới hạn, có thể được xem như một bộ lọc đối với việc đóng chuyển tiếp đó, loại bỏ các phụ thuộc rõ ràng là vô lý

Chúng ta có thể xác định chính xác quy trình bằng Suy diễn tự nhiên bằng cách sử dụng các quy tắc suy luận. Điều này có vẻ hơi khó hiểu, nhưng mã bash thực sự thực hiện nó cũng vậy. Chúng gây nhầm lẫn theo những cách rất khác nhau nên… hy vọng nếu có điều gì đó không hợp lý trong bản trình bày này thì nó sẽ có ý nghĩa trong bản trình bày khác

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
8
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
2

Một số lời giải thích về sự quái dị này là theo thứ tự. Trong trường hợp phổ biến, phần bù mục tiêu của phần phụ thuộc là phần kế thừa của phần bù mục tiêu.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
434. Đó nghĩa là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
40

Đây là nơi "sum-like" đến từ phía trên. Chúng tôi chỉ có thể tính tổng tất cả các phần bù máy chủ để lấy phần bù máy chủ của phần phụ thuộc bắc cầu. Phần bù mục tiêu là phần phụ thuộc bắc cầu chỉ đơn giản là phần bù máy chủ + 1, giống như với các phần phụ thuộc được cấu tạo để tạo thành phần phụ thuộc bắc cầu này;

Do kiểm tra giới hạn, các trường hợp không phổ biến là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
435 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
436. Trong trường hợp trước, động cơ của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
437 là vì nền tảng máy chủ và nền tảng đích của nó giống nhau, nên không có sự phụ thuộc bắc cầu nào của nó có thể “khám phá” một phần bù lớn hơn phần bù mục tiêu đã giảm của nó.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
437 “bóp chết” một cách hiệu quả tất cả các phần bù phụ thuộc chuyển tiếp của nó để không phần nào lớn hơn phần bù mục tiêu của gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
435 ban đầu. Trong trường hợp khác,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
440 bị bỏ qua giữa phần bù của máy chủ và mục tiêu. Thay vì xóa các phần bù, chúng ta cần "tách" chúng ra để không có phần bù phụ thuộc chuyển tiếp nào là phần bù đó

Nhìn chung, chủ đề thống nhất ở đây là việc truyền bá không nên giới thiệu các phụ thuộc bắc cầu liên quan đến các nền tảng mà gói phụ thuộc không biết. [Người ta có thể tưởng tượng gói phụ thuộc yêu cầu các phụ thuộc với các nền tảng mà nó biết; . Mô tả nền tảng trong kịch bản đó là một loại khả năng không thể thay thế được. ] Việc kiểm tra giới hạn bù trừ và định nghĩa của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
437 cùng nhau đảm bảo rằng đây là trường hợp. Khám phá một phần bù mới là khám phá một nền tảng mới và vì những nền tảng đó không có trong “thông số kỹ thuật” phái sinh của gói cần thiết nên chúng không thể phù hợp. Từ góc độ khả năng, chúng ta có thể tưởng tượng rằng máy chủ và nền tảng đích của gói là các khả năng mà gói yêu cầu và gói phụ thuộc phải cung cấp khả năng cho phần phụ thuộc.

6. 3. 1. Các biến chỉ định phụ thuộc

Danh sách các phụ thuộc có nền tảng máy chủ và đích là nền tảng xây dựng của phái sinh mới. Đây là những chương trình và thư viện được sử dụng tại thời điểm xây dựng để tạo ra các chương trình và thư viện cũng được sử dụng tại thời điểm xây dựng. Nếu phần phụ thuộc không quan tâm đến nền tảng đích (tôi. e. không phải là trình biên dịch hoặc công cụ tương tự), thay vào đó hãy đặt nó vào

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420. Việc sử dụng phổ biến nhất của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
443 này, trình biên dịch C mặc định cho vai trò này. Ví dụ đó xuất hiện nhiều hơn những gì người ta có thể nghĩ trong các thư viện C cũ thường được sử dụng

Vì các gói này có thể chạy trong thời gian xây dựng nên chúng luôn được thêm vào

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80, như đã mô tả ở trên. Nhưng vì các gói này chỉ được đảm bảo để có thể chạy sau đó, chúng không nên tồn tại dưới dạng phụ thuộc thời gian chạy. Điều này hiện không được thực thi, nhưng có thể trong tương lai

6. 3. 1. 2.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420

Danh sách các phụ thuộc có nền tảng máy chủ là nền tảng xây dựng của phái sinh mới và nền tảng đích là nền tảng máy chủ của dẫn xuất mới. Đây là những chương trình và thư viện được sử dụng trong thời gian xây dựng, nếu chúng là trình biên dịch hoặc công cụ tương tự, sẽ tạo mã để chạy trong thời gian chạy—i. e. các công cụ được sử dụng để xây dựng dẫn xuất mới. Nếu phần phụ thuộc không quan tâm đến nền tảng đích (tôi. e. không phải là trình biên dịch hoặc công cụ tương tự), hãy đặt nó ở đây, thay vì trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
417 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
423. Điều này có thể được gọi là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
448 nhưng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 được sử dụng cho tính liên tục lịch sử

Vì các gói này có thể chạy tại thời điểm xây dựng nên chúng được thêm vào

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80, như được mô tả ở trên. Nhưng vì các gói này chỉ được đảm bảo để có thể chạy sau đó, chúng không nên tồn tại dưới dạng phụ thuộc thời gian chạy. Điều này hiện không được thực thi, nhưng có thể trong tương lai

Danh sách các thành phần phụ thuộc có nền tảng máy chủ là nền tảng xây dựng của phái sinh mới và nền tảng đích là nền tảng đích của phái sinh mới. Đây là những chương trình được sử dụng tại thời điểm xây dựng để tạo mã để chạy với mã được tạo bởi gói tùy thuộc. Thông thường nhất, đây là những công cụ được sử dụng để xây dựng thời gian chạy hoặc thư viện chuẩn mà trình biên dịch hiện đang được xây dựng sẽ đưa vào bất kỳ mã nào mà nó biên dịch. Trong nhiều trường hợp, bản thân trình biên dịch hiện đang được xây dựng được sử dụng cho tác vụ đó, nhưng khi trình biên dịch đó không chạy (i. e. nền tảng xây dựng và máy chủ của nó khác nhau) điều này là không thể. Những lần khác, trình biên dịch dựa vào một số công cụ khác, như binutils, luôn được xây dựng riêng để sự phụ thuộc là vô điều kiện

Đây là một khái niệm hơi khó hiểu và vì lý do chính đáng. Là loại phụ thuộc duy nhất mà phần bù của nền tảng,

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
409 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
413, không phải là các số nguyên liền kề, nó đòi hỏi phải nghĩ đến giai đoạn khởi động thứ hai cách xa giai đoạn hiện tại. Nó và trường hợp sử dụng của nó đi đôi với nhau và cả hai đều được coi là hình thức kém. cố gắng không cần loại phụ thuộc này và cố gắng tránh xây dựng các thư viện và thời gian chạy tiêu chuẩn theo cùng một dẫn xuất khi trình biên dịch tạo mã bằng cách sử dụng chúng. Thay vào đó, hãy cố gắng xây dựng những thứ đó giống như một thư viện bình thường, sử dụng trình biên dịch mới được xây dựng giống như một thư viện bình thường. Tóm lại, không sử dụng thuộc tính này trừ khi bạn đang đóng gói một trình biên dịch và chắc chắn rằng nó cần thiết

Vì các gói này có thể chạy trong thời gian xây dựng nên chúng được thêm vào

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80, như đã mô tả ở trên. Nhưng vì các gói này chỉ được đảm bảo để có thể chạy sau đó, chúng không nên tồn tại dưới dạng phụ thuộc thời gian chạy. Điều này hiện không được thực thi, nhưng có thể trong tương lai

Danh sách các phụ thuộc có nền tảng máy chủ và đích phù hợp với nền tảng máy chủ dẫn xuất mới. Trong thực tế, đây thường là các công cụ được trình biên dịch sử dụng cho macro hoặc hệ thống siêu lập trình hoặc thư viện được sử dụng bởi chính macro hoặc mã siêu lập trình. Luôn luôn tốt hơn khi sử dụng phụ thuộc

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
417 trong dẫn xuất được xây dựng trên một
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
426 trên công cụ đang xây dựng cho mục đích này

Danh sách các phụ thuộc có nền tảng máy chủ và nền tảng đích phù hợp với dẫn xuất mới. Điều này sẽ được gọi là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
456 nhưng để liên tục lịch sử. Nếu phần phụ thuộc không quan tâm đến nền tảng đích (tôi. e. không phải là trình biên dịch hoặc công cụ tương tự), hãy đặt nó ở đây, thay vì trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
417

Đây thường là các chương trình và thư viện được sử dụng bởi dẫn xuất mới trong thời gian chạy, nhưng không phải lúc nào cũng vậy. Ví dụ: mã máy trong thư viện được liên kết tĩnh chỉ được sử dụng trong thời gian chạy, nhưng dẫn xuất chứa thư viện chỉ cần thiết trong thời gian xây dựng. Ngay cả trong trường hợp động, thư viện cũng có thể cần thiết tại thời điểm xây dựng để xoa dịu trình liên kết

Danh sách các phụ thuộc có nền tảng máy chủ phù hợp với nền tảng đích của phái sinh mới. Đây là những gói chạy trên nền tảng đích, e. g. thư viện chuẩn hoặc thời gian chạy của thư viện chuẩn mà trình biên dịch yêu cầu biết về. Đó là hình thức kém trong hầu hết các trường hợp để một gói phụ thuộc vào một gói khác từ giai đoạn tương lai [giai đoạn tương lai tương ứng với phần bù dương]. Không sử dụng thuộc tính này trừ khi bạn đang đóng gói một trình biên dịch và chắc chắn rằng nó cần thiết

6. 3. 1. 7.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
458

Tương đương được nhân giống của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
417. Điều này có lẽ không bao giờ nên được sử dụng, nhưng nó được đưa vào để đảm bảo tính nhất quán [xem bên dưới để biết những điều khác]

6. 3. 1. 8.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
460

Tương đương được nhân giống của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420. Điều này sẽ được gọi là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
462 nhưng để liên tục lịch sử. Ví dụ: nếu gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
463 có
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
464 và gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
465 có
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
466, thì gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
465 sẽ được xây dựng như thể nó bao gồm gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
468 trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 của nó. Nếu thay vào đó, gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
465 có
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
471, thì
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
465 sẽ được xây dựng như thể nó bao gồm
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
468 trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
417 của gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
465, do tổng của hai phần bù máy chủ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
409

6. 3. 1. 9.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
477

Tương đương được nhân giống của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
423. Đây là tiền tố cho cùng một lý do cảnh báo người dùng tiềm năng

6. 3. 1. 10.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
479

Tương đương được nhân giống của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
426

6. 3. 1. 11.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
481

Tương đương được nhân giống của

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8. Điều này sẽ được gọi là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
483 nhưng để liên tục lịch sử

6. 3. 1. 12.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
484

Tương đương được nhân giống của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
432. Đây là tiền tố cho cùng một lý do cảnh báo người dùng tiềm năng

6. 4. 1. Các biến ảnh hưởng đến việc khởi tạo source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 6

Một số tự nhiên cho biết lượng thông tin cần ghi. Nếu được đặt thành 1 hoặc cao hơn,

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 sẽ in thông tin gỡ lỗi vừa phải trong quá trình xây dựng. Cụ thể, các tập lệnh trình bao bọc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
488 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
489 sẽ in ra dòng lệnh hoàn chỉnh được chuyển đến các công cụ được bao bọc. Nếu được đặt thành 6 hoặc cao hơn, tập lệnh thiết lập
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 sẽ được chạy với dấu vết
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
491. Nếu được đặt thành 7 hoặc cao hơn, các tập lệnh trình bao bọc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
488 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
489 cũng sẽ được chạy với dấu vết
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
491

6. 4. 2. Thuộc tính ảnh hưởng đến thuộc tính xây dựng

6. 4. 2. 1.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
495

Nếu được đặt thành

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
496,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 sẽ chuyển các cờ cụ thể tới
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498 và các công cụ xây dựng khác để cho phép xây dựng song song với tối đa
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
499 công nhân

Trừ khi được đặt thành

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
600, một số hệ thống xây dựng hỗ trợ tốt cho việc xây dựng song song bao gồm
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
601,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
602 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
603 sẽ đặt thành
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
496

Đây là một bộ thuộc tính có thể chứa các giá trị tùy ý. Ví dụ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
41

Các giá trị bên trong nó không được chuyển đến trình tạo, vì vậy bạn có thể thay đổi chúng mà không cần kích hoạt quá trình tạo lại. Tuy nhiên, chúng có thể được truy cập trực tiếp bên ngoài dẫn xuất, như thể chúng được đặt bên trong chính dẫn xuất đó, e. g.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
605. Chúng tôi không chỉ định bất kỳ cách sử dụng hoặc lược đồ nào của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
606 - nó dành cho các giá trị hữu ích bên ngoài dẫn xuất trong các phần khác của biểu thức Nix (e. g. trong các dẫn xuất khác). Một ví dụ sẽ là truyền đạt một số phụ thuộc cụ thể của công cụ phái sinh của bạn có chứa một chương trình có hỗ trợ plugin. Sau đó, những người khác tạo dẫn xuất bằng plugin có thể sử dụng phần phụ thuộc chuyển qua để đảm bảo rằng plugin của họ sẽ tương thích nhị phân với chương trình đã xây dựng

6. 4. 3. 2.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
607

Tập lệnh sẽ được chạy bởi

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
608 khi gói được khớp. Nó cần phải là một tệp thực thi, trên hệ thống tệp

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
42

hoặc bên trong chính biểu thức

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
43

Thuộc tính cũng có thể chứa một danh sách, một tập lệnh theo sau là các đối số được truyền cho nó

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
44

Tập lệnh sẽ được chạy với các biến môi trường

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
609,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
610,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
611 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
612 được đặt tương ứng với tên, pname, phiên bản cũ và đường dẫn thuộc tính của gói mà nó được cho là sẽ cập nhật

Để biết thông tin về cách chạy các bản cập nhật, hãy thực thi

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
613

6. 4. 4. Thuộc tính đệ quy trong let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1) propagated-dep(h0, t0, A, B) propagated-dep(h1, t1, B, C) h0 + h1 in {-1, 0, 1} h0 + t1 in {-1, 0, 1} -------------------------------------- Transitive property propagated-dep(mapOffset(h0, t0, h1), mapOffset(h0, t0, t1), A, C) 5

Nếu bạn chuyển một hàm cho

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5, thì hàm đó sẽ nhận các đối số cuối cùng làm đối số của nó, bao gồm cả các giá trị thay thế khi được gọi lại qua
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
616. Ví dụ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
45

Lưu ý rằng điều này không sử dụng từ khóa

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
617 để sử dụng lại
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
618 trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
619. Từ khóa
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
617 hoạt động ở cấp độ cú pháp và không biết ghi đè

Thay vào đó, định nghĩa tham chiếu đến

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
621, cho phép người dùng thay đổi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
618 một cách nhất quán bằng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
616

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
621 cũng chứa thuộc tính
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
625, bao gồm các đường dẫn đầu ra, v.v.

Hãy xem một ví dụ phức tạp hơn để hiểu sự khác biệt giữa các ràng buộc khác nhau

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
46

Không giống như ràng buộc

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
626 trong ví dụ trên, tham số
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
621 luôn tham chiếu đến các thuộc tính cuối cùng. Chẳng hạn,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
628 giống hệt với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
629, trong khi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
630 giống với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
626 ban đầu

Xem thêm phần về

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
632

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
7 đặt trình tạo dẫn xuất Nix thành một tập lệnh tải thư viện bash stdenv
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
634 và gọi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
635. Hầu hết các chức năng đóng gói đều dựa vào trình tạo mặc định này

Lệnh chung này gọi một số giai đoạn. Các bản dựng gói được chia thành các giai đoạn để giúp ghi đè các phần cụ thể của bản dựng dễ dàng hơn (e. g. , giải nén nguồn hoặc cài đặt tệp nhị phân)

Mỗi giai đoạn có thể được ghi đè toàn bộ bằng cách đặt biến môi trường

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
636 thành một chuỗi chứa một số lệnh trình bao sẽ được thực thi hoặc bằng cách xác định lại hàm trình bao
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
636. Cái trước thuận tiện để ghi đè một pha từ dẫn xuất, trong khi cái sau thuận tiện từ tập lệnh xây dựng. Tuy nhiên, thông thường người ta chỉ muốn thêm một số lệnh vào một giai đoạn, e. g. bằng cách xác định
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
638 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
639, vì việc bỏ qua một số hành động mặc định có thể gây ra những hậu quả không mong muốn. Tập lệnh mặc định cho từng giai đoạn được xác định trong tệp
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
640

Khi ghi đè một pha, ví dụ như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
641, điều quan trọng là phải bắt đầu bằng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
642 và kết thúc bằng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
643, nếu không thì
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
644 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
638 sẽ không được chạy. Ngay cả khi bạn không sử dụng chúng trực tiếp, thì dù sao thì bạn cũng nên làm như vậy đối với những người dùng xuôi dòng muốn thêm một
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
638 bằng cách ghi đè nguồn gốc của bạn

Khi ở bên trong một

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
647 tương tác, nếu bạn muốn chạy tất cả các giai đoạn theo thứ tự chúng sẽ được chạy trong một bản dựng thực tế, bạn có thể tự gọi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
635

6. 5. 1. Giai đoạn kiểm soát

Có một số biến kiểm soát giai đoạn nào được thực hiện và theo thứ tự nào

6. 5. 1. 1. Các biến ảnh hưởng đến điều khiển pha

Chỉ định các giai đoạn. Bạn có thể thay đổi thứ tự thực hiện các giai đoạn hoặc thêm các giai đoạn mới bằng cách đặt biến này. Nếu nó không được đặt, giá trị mặc định sẽ được sử dụng, đó là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
649

Không khuyến khích đặt biến này, vì rất dễ bỏ sót một số chức năng quan trọng bị ẩn trong một số giai đoạn ít rõ ràng cần thiết hơn (như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
650 vá lỗi tập lệnh shebang). Thông thường, nếu bạn chỉ muốn thêm một vài giai đoạn, sẽ thuận tiện hơn nếu đặt một trong các biến bên dưới (chẳng hạn như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
651)

Các giai đoạn bổ sung được thực hiện trước bất kỳ giai đoạn mặc định nào

6. 5. 1. 1. 3.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
652

Các giai đoạn bổ sung được thực hiện ngay trước giai đoạn cấu hình

Các giai đoạn bổ sung được thực hiện ngay trước giai đoạn xây dựng

6. 5. 1. 1. 5.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
651

Các giai đoạn bổ sung được thực hiện ngay trước giai đoạn cài đặt

Các giai đoạn bổ sung được thực hiện ngay trước giai đoạn sửa lỗi

Các giai đoạn bổ sung được thực hiện ngay trước giai đoạn phân phối

Các giai đoạn bổ sung được thực hiện sau bất kỳ giai đoạn mặc định nào

Giai đoạn giải nén chịu trách nhiệm giải nén mã nguồn của gói. Việc triển khai mặc định của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
654 sẽ giải nén các tệp nguồn được liệt kê trong biến môi trường
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
2 vào thư mục hiện tại. Nó hỗ trợ các tệp sau theo mặc định

Chúng có thể được nén tùy chọn bằng cách sử dụng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
25 (
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
657,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
658 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
659),
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
26 (
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
661,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
662 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
663) hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 (
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
665,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
666 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
667)

Các tệp zip được giải nén bằng cách sử dụng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
668. Tuy nhiên,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
668 không có trong môi trường tiêu chuẩn, vì vậy bạn nên tự thêm nó vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420

6. 5. 2. 3. Thư mục trong cửa hàng Nix

Chúng được sao chép đơn giản vào thư mục hiện tại. Phần băm của tên tệp bị tước, e. g.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
671 sẽ được sao chép sang
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
672

Các loại tệp bổ sung có thể được hỗ trợ bằng cách đặt biến

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
673 (xem bên dưới)

6. 5. 2. 4. Các biến kiểm soát giai đoạn giải nén

Danh sách các tệp hoặc thư mục nguồn sẽ được giải nén hoặc sao chép. Một trong số này phải được thiết lập. Lưu ý rằng nếu bạn sử dụng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
674, bạn cũng nên đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
675 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
676

Sau khi chạy

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
654, trình tạo chung sẽ thay đổi thư mục hiện tại thành thư mục được tạo bằng cách giải nén các nguồn. Nếu có nhiều thư mục nguồn, bạn nên đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
675 thành tên của thư mục dự định. Đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
679 nếu bạn sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
674 và tự kiểm soát giai đoạn giải nén

Theo mặc định,

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
675 được đặt thành
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
682. Nếu bạn muốn trỏ đến một thư mục con bên trong dự án của mình, do đó, bạn cần đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
683

Ngoài ra, để đặt

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
675, bạn có thể đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
676 thành lệnh trình bao để được đánh giá trong giai đoạn giải nén sau khi các nguồn đã được giải nén. Lệnh này phải đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
675

Móc được thực hiện khi bắt đầu giai đoạn giải nén

Móc được thực hiện ở cuối giai đoạn giải nén

Đặt thành true để bỏ qua giai đoạn giải nén

6. 5. 2. 4. 7.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
687

Nếu được đặt thành

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
413, các nguồn đã giải nén sẽ không thể ghi được. Theo mặc định, chúng có thể ghi được để tránh sự cố với các nguồn chỉ đọc. Ví dụ: các thư mục cửa hàng đã sao chép sẽ ở chế độ chỉ đọc nếu không có điều này

Giai đoạn giải nén đánh giá chuỗi

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
689 cho bất kỳ tệp nào không được nhận dạng. Đường dẫn đến tệp nguồn hiện tại được chứa trong biến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
690

Giai đoạn vá áp dụng danh sách các bản vá được xác định trong biến

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
691

6. 5. 3. 1. Các biến kiểm soát giai đoạn vá lỗi

Đặt thành true để bỏ qua giai đoạn vá lỗi

Danh sách các bản vá lỗi. Chúng phải ở định dạng được lệnh

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
29 chấp nhận và có thể được nén tùy chọn bằng cách sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
25 (
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
694),
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
26 (
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
696) hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 (
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
698)

Cờ sẽ được chuyển đến

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
29. Nếu không được đặt, đối số
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
000 được sử dụng, khiến thành phần thư mục chính bị loại bỏ khỏi tên tệp trong mỗi bản vá

Móc được thực hiện khi bắt đầu giai đoạn vá lỗi

Móc được thực hiện ở cuối giai đoạn vá lỗi

6. 5. 4. Giai đoạn cấu hình

Giai đoạn cấu hình chuẩn bị cây nguồn để xây dựng.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
001 mặc định chạy
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
002 (thường là tập lệnh do Autoconf tạo) nếu nó tồn tại

6. 5. 4. 1. Các biến kiểm soát giai đoạn cấu hình

6. 5. 4. 1. 1.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
003

Tên của kịch bản cấu hình. Nó mặc định là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
002 nếu nó tồn tại; . Đây thực sự có thể là một lệnh (như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
005)

Một danh sách các chuỗi được truyền dưới dạng đối số bổ sung cho tập lệnh cấu hình

Đặt thành true để bỏ qua giai đoạn định cấu hình

6. 5. 4. 1. 4.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
006

Một mảng hệ vỏ chứa các đối số bổ sung được chuyển đến tập lệnh cấu hình. Bạn phải sử dụng cái này thay vì

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
619 nếu các đối số chứa khoảng trắng

Theo mặc định, cờ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
008 được thêm vào cờ cấu hình. Nếu điều này là không mong muốn, hãy đặt biến này thành true

Tiền tố theo đó gói phải được cài đặt, được chuyển qua tùy chọn

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
009 cho tập lệnh cấu hình. Nó mặc định là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
010

Chìa khóa để sử dụng khi chỉ định tiền tố. Theo mặc định, giá trị này được đặt thành

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
011 vì giá trị này được sử dụng bởi phần lớn các gói

6. 5. 4. 1. 8.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
012

Theo mặc định, khi xây dựng tĩnh, stdenv sẽ cố gắng thêm các cờ cấu hình phù hợp với hệ thống xây dựng để cố gắng kích hoạt các bản dựng tĩnh

Nếu điều này là không mong muốn, hãy đặt biến này thành true

6. 5. 4. 1. 9.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
013

Theo mặc định, cờ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
014 được thêm vào cờ cấu hình để tăng tốc các bản dựng dựa trên Automake. Nếu điều này là không mong muốn, hãy đặt biến này thành true

6. 5. 4. 1. 10.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
015

Theo mặc định, giai đoạn cấu hình áp dụng một số biện pháp tấn công đặc biệt cho tất cả các tệp có tên là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
016 trước khi chạy tập lệnh cấu hình để cải thiện độ tinh khiết của các gói dựa trên Libtool. Nếu điều này là không mong muốn, hãy đặt biến này thành true

6. 5. 4. 1. 11.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
017

Theo mặc định, khi tập lệnh cấu hình có

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
018, tùy chọn
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
019 được thêm vào cờ cấu hình

Nếu điều này là không mong muốn, hãy đặt biến này thành true. Nó tự động được đặt thành true khi xây dựng tĩnh, chẳng hạn như đến hết năm 2020

6. 5. 4. 1. 12.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
021

Theo mặc định, khi biên dịch chéo, tập lệnh cấu hình đã thông qua

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
022 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
023. Thay vào đó, các gói có thể vượt qua
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
024 hoặc một tập hợp con để kiểm soát chính xác cờ nền tảng nào được chuyển. Trình biên dịch và các công cụ khác có thể sử dụng điều này để vượt qua nền tảng đích

Hook được thực hiện khi bắt đầu giai đoạn cấu hình

Hook được thực hiện ở cuối giai đoạn cấu hình

Giai đoạn xây dựng chịu trách nhiệm thực sự xây dựng gói (e. g. biên dịch nó).

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
025 mặc định chỉ cần gọi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498 nếu một tệp có tên
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
027,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
028 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
029 tồn tại trong thư mục hiện tại (hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
028 được đặt rõ ràng);

6. 5. 5. 1. Các biến kiểm soát giai đoạn xây dựng

Đặt thành true để bỏ qua giai đoạn xây dựng

Tên tệp của Makefile

Danh sách các chuỗi được chuyển dưới dạng cờ bổ sung cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498. Các cờ này cũng được sử dụng trong giai đoạn cài đặt và kiểm tra mặc định. Để cài đặt tạo cờ cụ thể cho giai đoạn xây dựng, hãy sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
032 (xem bên dưới)

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
47

Một mảng shell chứa các đối số bổ sung được chuyển đến

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498. Bạn phải sử dụng this thay vì
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
034 nếu các đối số chứa dấu cách, e. g

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
48

Lưu ý rằng các mảng hệ vỏ không thể được chuyển qua các biến môi trường, vì vậy bạn không thể đặt

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
035 trong thuộc tính phái sinh (vì các mảng đó được chuyển qua các biến môi trường). bạn phải xác định chúng trong mã shell

6. 5. 5. 1. 5. ________ 2032 / ________ 2037

Danh sách các chuỗi được chuyển dưới dạng cờ bổ sung cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498. Giống như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
034 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
035, nhưng chỉ được sử dụng trong giai đoạn xây dựng

Hook được thực hiện khi bắt đầu giai đoạn xây dựng

Hook được thực hiện ở cuối giai đoạn xây dựng

Bạn có thể đặt cờ cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498 thông qua biến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
034

Trước và sau khi chạy

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498, các hook
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
044 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
045 lần lượt được gọi

Giai đoạn kiểm tra kiểm tra xem gói có được xây dựng chính xác hay không bằng cách chạy bộ thử nghiệm của nó.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
046 mặc định gọi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
047, nhưng chỉ khi biến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
048 được bật

6. 5. 6. 1. Các biến kiểm soát giai đoạn kiểm tra

Kiểm soát xem giai đoạn kiểm tra có được thực hiện hay không. Theo mặc định, nó bị bỏ qua, nhưng nếu

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
048 được đặt thành true, giai đoạn kiểm tra thường được thực hiện. Vì vậy, bạn nên đặt

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
49

trong dẫn xuất để kích hoạt kiểm tra. Ngoại lệ là biên dịch chéo. Các bản dựng được biên dịch chéo không bao giờ chạy thử nghiệm, bất kể

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
048 được đặt như thế nào, vì chương trình mới được xây dựng sẽ không chạy trên nền tảng được sử dụng để xây dựng nó

6. 5. 6. 1. 2. ________ 2034 / ________ 2035 / ________ 2028

Xem giai đoạn xây dựng để biết chi tiết

Make target chạy thử nghiệm. Mặc định là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
054

6. 5. 6. 1. 4. ________ 2055 / ________ 2056

Danh sách các chuỗi được chuyển dưới dạng cờ bổ sung cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498. Giống như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
034 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
035, nhưng chỉ được sử dụng trong giai đoạn kiểm tra

Một danh sách các phụ thuộc được sử dụng bởi giai đoạn. Điều này được bao gồm trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 khi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
048 được đặt

Móc được thực hiện khi bắt đầu giai đoạn kiểm tra

Móc được thực hiện ở cuối giai đoạn kiểm tra

Giai đoạn cài đặt chịu trách nhiệm cài đặt gói trong cửa hàng Nix theo

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
062.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
641 mặc định tạo thư mục
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
010 và gọi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
065

6. 5. 7. 1. Các biến kiểm soát giai đoạn cài đặt

Đặt thành true để bỏ qua giai đoạn cài đặt

6. 5. 7. 1. 2. ________ 2034 / ________ 2035 / ________ 2028

Xem giai đoạn xây dựng để biết chi tiết

Make target thực hiện cài đặt. Mặc định là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
069. Thí dụ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
60

6. 5. 7. 1. 4. ________ 2070 / ________ 2071

Danh sách các chuỗi được chuyển dưới dạng cờ bổ sung cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498. Giống như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
034 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
035, nhưng chỉ được sử dụng trong giai đoạn cài đặt

Hook được thực hiện khi bắt đầu giai đoạn cài đặt

Hook được thực hiện ở cuối giai đoạn cài đặt

Giai đoạn sửa lỗi thực hiện các hành động xử lý hậu kỳ (dành riêng cho Nix) trên các tệp được cài đặt theo

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
010 theo giai đoạn cài đặt.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
650 mặc định thực hiện như sau

  • Nó di chuyển các thư mục con

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    077,
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    078 và
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    079 của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    010 sang
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    081

  • Nó loại bỏ các thư viện và tệp thực thi của thông tin gỡ lỗi

  • Trên Linux, nó áp dụng lệnh

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    401 cho các tệp thực thi và thư viện ELF để xóa các thư mục không sử dụng khỏi
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    083 nhằm ngăn chặn các phụ thuộc thời gian chạy không cần thiết

  • Nó viết lại các đường dẫn trình thông dịch của shell script thành các đường dẫn được tìm thấy trong

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    80. e. g. ,
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    085 sẽ được viết lại thành
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    086 được tìm thấy trong
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    80. Xem Phần 6. 7. 4, “
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    088” để biết chi tiết

6. 5. 8. 1. Các biến kiểm soát giai đoạn fixup

Đặt thành true để bỏ qua giai đoạn sửa lỗi

Nếu được đặt, các thư viện và tệp thực thi sẽ không bị xóa. Theo mặc định, chúng là

Giống như ________ 2089, nhưng chỉ ảnh hưởng đến lệnh ________ 2090 nhắm vào nền tảng máy chủ của gói. Hữu ích khi hỗ trợ biên dịch chéo, nhưng nếu không thì vui lòng bỏ qua

6. 5. 8. 1. 4.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
091

Giống như ________ 2089, nhưng chỉ ảnh hưởng đến lệnh ________ 2090 nhắm vào nền tảng đích của gói. Hữu ích khi hỗ trợ biên dịch chéo, nhưng nếu không thì vui lòng bỏ qua

Nếu được đặt, các tệp trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
094 sẽ không được chuyển sang
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
095. Theo mặc định, chúng là

Danh sách các thư mục để tìm kiếm các thư viện và tệp thực thi mà từ đó tất cả các ký hiệu sẽ bị loại bỏ. Theo mặc định, nó trống. Việc loại bỏ tất cả các ký hiệu là rủi ro, vì nó có thể loại bỏ không chỉ các ký hiệu gỡ lỗi mà còn cả thông tin ELF cần thiết để thực hiện bình thường

6. 5. 8. 1. 7.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
096

Giống như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
097, nhưng chỉ áp dụng cho nền tảng mục tiêu của gói. Theo mặc định, nó trống. Hữu ích khi hỗ trợ biên dịch chéo

Các cờ được truyền cho lệnh

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
090 được áp dụng cho các tệp trong thư mục được liệt kê trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
097. Mặc định là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
400 (i. e.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
401)

Danh sách các thư mục để tìm kiếm các thư viện và tệp thực thi mà từ đó chỉ các biểu tượng liên quan đến gỡ lỗi sẽ bị loại bỏ. Nó mặc định là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
402

6. 5. 8. 1. 10.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
403

Giống như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
404, nhưng chỉ áp dụng cho nền tảng mục tiêu của gói. Theo mặc định, nó trống. Hữu ích khi hỗ trợ biên dịch chéo

6. 5. 8. 1. 11.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
405

Các cờ được truyền cho lệnh

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
090 được áp dụng cho các tệp trong thư mục được liệt kê trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
404. Mặc định là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
408 (i. e.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
409)

Nếu được đặt, lệnh

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
401 không được sử dụng để xóa các mục nhập
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
083 không cần thiết. Chỉ áp dụng cho Linux

6. 5. 8. 1. 13.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
412

Nếu được đặt, các tập lệnh bắt đầu bằng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
413 không có đường dẫn trình thông dịch của chúng được viết lại thành đường dẫn trong cửa hàng Nix. Xem Phần 6. 7. 4, “
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
088” về cách hoạt động của shebang vá lỗi

6. 5. 8. 1. 14.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
415

Nếu được đặt, các tệp libtool

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
416 được liên kết với thư viện dùng chung sẽ không bị xóa trường
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
417 của chúng

Danh sách các thư mục phải được chuyển từ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
010 sang
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
419. Mặc định là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420

Một gói có thể xuất móc thiết lập bằng cách đặt biến này. Móc thiết lập, nếu được xác định, sẽ được sao chép vào

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
421. Các biến môi trường sau đó được thay thế bằng cách sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
422

Móc được thực hiện khi bắt đầu giai đoạn sửa lỗi

Móc được thực hiện ở cuối giai đoạn sửa lỗi

6. 5. 8. 1. 19.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
423

Nếu được đặt thành

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
496, môi trường tiêu chuẩn sẽ kích hoạt thông tin gỡ lỗi trong các bản dựng C/C++. Sau khi cài đặt, thông tin gỡ lỗi sẽ được tách ra khỏi tệp thực thi và được lưu trữ trong đầu ra có tên
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
425. (Đầu ra này được bật tự động; bạn không cần đặt thuộc tính
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
426 một cách rõ ràng. ) Nói chính xác, thông tin gỡ lỗi được lưu trữ trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
427, trong đó có nhị phân — hàm băm SHA-1 của nội dung của nhị phân. Trình gỡ lỗi như GDB sử dụng ID bản dựng để tra cứu thông tin gỡ lỗi riêng biệt

Ví dụ: với GDB, bạn có thể thêm

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
61

đến

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
428. GDB sau đó sẽ có thể tìm thấy thông tin gỡ lỗi được cài đặt qua
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
429

6. 5. 9. Giai đoạn kiểm tra cài đặt

Giai đoạn installCheck kiểm tra xem gói đã được cài đặt đúng chưa bằng cách chạy bộ thử nghiệm của nó đối với các thư mục đã cài đặt. Các cuộc gọi mặc định ________ 2430 ________ 2431

Thông thường, tốt hơn là thêm các bài kiểm tra không phải là một phần của bản phân phối nguồn vào

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
632 (xem Phần 7. 1. 12, “
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
433”). Điều này tránh thêm chi phí hoạt động cho mọi bản dựng và cho phép chúng tôi chạy chúng một cách độc lập

6. 5. 9. 1. Các biến kiểm soát giai đoạn installCheck

Kiểm soát xem giai đoạn installCheck có được thực thi hay không. Theo mặc định, nó bị bỏ qua, nhưng nếu

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
434 được đặt thành true, giai đoạn installCheck thường được thực thi. Vì vậy, bạn nên đặt

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
62

trong dẫn xuất để kích hoạt kiểm tra cài đặt. Ngoại lệ là biên dịch chéo. Các bản dựng được biên dịch chéo không bao giờ chạy thử nghiệm, bất kể

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
434 được đặt như thế nào, vì chương trình mới được xây dựng sẽ không chạy trên nền tảng được sử dụng để xây dựng nó

6. 5. 9. 1. 2.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
436

Make target chạy thử nghiệm cài đặt. Mặc định là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
437

6. 5. 9. 1. 3.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
438 /
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
439

Danh sách các chuỗi được chuyển dưới dạng cờ bổ sung cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498. Giống như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
034 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
035, nhưng chỉ được sử dụng trong giai đoạn installCheck

6. 5. 9. 1. 4.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
443

Một danh sách các phụ thuộc được sử dụng bởi giai đoạn. Điều này được bao gồm trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 khi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
434 được đặt

6. 5. 9. 1. 5.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
446

Hook được thực thi khi bắt đầu giai đoạn installCheck

6. 5. 9. 1. 6.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
447

Hook được thực thi ở cuối giai đoạn installCheck

6. 5. 10. Giai đoạn phân phối

Giai đoạn phân phối nhằm tạo ra một phân phối nguồn của gói.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
448 mặc định đầu tiên gọi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
449, sau đó nó sao chép các tarball nguồn kết quả sang
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
450. Giai đoạn này chỉ được thực hiện nếu thuộc tính
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
451 được đặt

6. 5. 10. 1. Các biến kiểm soát giai đoạn phân phối

Make target tạo ra phân phối. Mặc định là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
452

6. 5. 10. 1. 2.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
453 /
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
454

Cờ bổ sung được chuyển đến

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
498

Tên của các tệp phân phối nguồn sẽ được sao chép sang

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
450. Nó có thể chứa ký tự đại diện shell. Mặc định là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
457

Nếu được đặt, không có tệp nào được sao chép vào

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
450

Hook được thực hiện khi bắt đầu giai đoạn phân phối

Hook được thực hiện ở cuối giai đoạn phân phối

6. 6. Các chức năng và tiện ích của Shell

Môi trường tiêu chuẩn cung cấp một số chức năng hữu ích

6. 6. 1. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 459

Xây dựng một trình bao bọc cho một chương trình với các đối số có thể khác nhau. Nó được định nghĩa là một phần của 2 móc thiết lập có tên là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
461 thực hiện các chức năng bash giống nhau. Do đó, để sử dụng nó, bạn phải thêm
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459 vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 của mình. Đây là một cách sử dụng ví dụ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
63

Các gói có thể mong đợi hoặc yêu cầu các tiện ích khác khả dụng khi chạy.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459 có thể được sử dụng để thêm các gói vào biến môi trường
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80 cục bộ vào trình bao bọc

Sử dụng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
009 để thiết lập rõ ràng các phụ thuộc trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80

Nếu các phụ thuộc cần được giải quyết trong thời gian chạy, hãy sử dụng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
468 để nối các giá trị dự phòng vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
80

Còn nhiều loại đối số nữa, chúng được ghi lại trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
470 cho việc triển khai
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459 và trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
472 cho việc triển khai
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
461

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
474 là một chức năng tiện lợi mà bạn có thể muốn sử dụng hầu hết thời gian, được triển khai bởi cả
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
461

Việc sử dụng triển khai

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
461 thường được ưu tiên hơn, vì nó tạo ra một trình bao bọc được biên dịch nhỏ có thể thực thi được, có thể được sử dụng như một trình thông dịch shebang. Điều này chủ yếu cần thiết ở Darwin, nơi shebang không thể trỏ đến các tập lệnh, do hạn chế với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
478-syscall. Trình bao bọc được biên dịch do
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
461 tạo có thể được kiểm tra bằng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
480 - bằng cách cuộn qua dữ liệu nhị phân, bạn sẽ có thể thấy lệnh trình bao đã tạo ra tệp thực thi và ở đó sẽ thấy các biến môi trường được đưa vào trình bao bọc

6. 6. 2. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 481[ source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 482… ]…

Loại bỏ các tham chiếu của các tệp được chỉ định đến các tệp lưu trữ được chỉ định. Điều này được thực hiện mà không thay đổi kích thước của tệp bằng cách thay thế hàm băm bằng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
483 và sẽ hoạt động trên các tệp thực thi đã biên dịch. Điều này có nghĩa là được sử dụng để loại bỏ sự phụ thuộc của đầu ra vào các đầu vào được biết là không cần thiết trong thời gian chạy. Tất nhiên, việc sử dụng liều lĩnh sẽ phá vỡ các chương trình đã vá. Để sử dụng cái này, hãy thêm
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
484 vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
486 là một tệp thực thi thực tế và không phải là hàm shell, nên nó có thể được sử dụng với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
88. Ví dụ loại bỏ tất cả các tham chiếu đến trình biên dịch trong đầu ra

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
64

6. 6. 3. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 488

Thực hiện thay thế chuỗi trên nội dung của, ghi kết quả vào. Sự thay thế không có dạng sau

6. 6. 3. 1.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
489

Thay thế mọi lần xuất hiện của stringby

6. 6. 3. 2.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
490

Thay thế mọi lần xuất hiện của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
491 bằng nội dung của biến môi trường. Điều này hữu ích để tạo tệp từ các mẫu, sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
492 trong mẫu làm trình giữ chỗ

6. 6. 3. 3.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
493

Thay thế mọi lần xuất hiện của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
491 bằng chuỗi

Thí dụ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
65

6. 6. 4. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 495

Giống như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
488, nhưng thực hiện thay thế tại chỗ trên các tệp được chuyển

6. 6. 5. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 422

Thay thế mọi lần xuất hiện của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
491, trong đó bất kỳ biến môi trường nào, ghi kết quả vào. Chẳng hạn, nếu có nội dung

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
66

và môi trường chứa

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
499 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
500, nhưng không chứa biến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
501, thì đầu ra sẽ là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
67

Đó là, không có sự thay thế nào được thực hiện cho các biến không xác định

Các biến môi trường bắt đầu bằng chữ in hoa hoặc dấu gạch dưới được lọc ra để ngăn các biến toàn cục (như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
502) hoặc biến riêng (như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
503) vô tình bị thay thế. Các biến cũng phải là "tên" bash hợp lệ, như được định nghĩa trong trang bash (chữ và số hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
504, không được bắt đầu bằng số)

6. 6. 6. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 505

Giống như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
422, nhưng thực hiện thay thế tại chỗ trên tệp

Tách thư mục và phần băm của đường dẫn cửa hàng, xuất phần tên thành

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
507. Ví dụ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
68

Nếu bạn muốn lưu trữ kết quả trong một biến khác, thì thành ngữ sau đây có thể hữu ích

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
69

6. 6. 8. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 474

Chức năng tiện lợi cho

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459 thay thế
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
510 bằng trình bao bọc thực thi chương trình gốc. Nó nhận tất cả các đối số giống như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459, ngoại trừ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
512 (được sử dụng bởi triển khai
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
461) và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
514 (được sử dụng bởi cả triển khai trình bao bọc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
459 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
461)

Nếu bạn áp dụng nó nhiều lần, nó sẽ ghi đè lên tệp trình bao bọc và bạn sẽ bị gói kép, điều này nên tránh

Bản thân Nix coi sự phụ thuộc vào thời gian xây dựng chỉ đơn thuần là thứ cần được xây dựng trước đó và có thể truy cập được tại thời điểm xây dựng—bản thân các gói tự thực hiện bất kỳ thiết lập bổ sung nào. Trong hầu hết các trường hợp, điều đó tốt và dẫn xuất xuôi dòng có thể xử lý các phụ thuộc của chính nó. Nhưng đối với một số tác vụ phổ biến, điều đó sẽ dẫn đến hầu hết mọi gói thực hiện cùng một loại công việc thiết lập—không phụ thuộc vào chính gói đó, mà hoàn toàn phụ thuộc vào việc phụ thuộc nào được sử dụng

Để giảm bớt gánh nặng này, cơ chế hook thiết lập đã được viết, trong đó bất kỳ gói nào cũng có thể bao gồm tập lệnh shell [theo quy ước thay vì thực thi bởi Nix], mọi phụ thuộc ngược xuôi dòng sẽ là nguồn như một phần của quy trình xây dựng của nó. Điều đó cho phép phần phụ thuộc xuôi dòng chỉ xác định các phần phụ thuộc của nó và cho phép các phần phụ thuộc đó tự khởi tạo một cách hiệu quả. Không cần bản soạn sẵn phản ánh danh sách các phụ thuộc

Mặc dù vậy, cơ chế hook thiết lập hơi giống búa tạ. một tính năng mạnh mẽ với phạm vi ảnh hưởng rộng và bừa bãi. Sự kết hợp giữa sức mạnh của nó và việc sử dụng ngầm có thể phù hợp, nhưng không phải là không có chi phí. Bản thân Nix không thay đổi, nhưng tinh thần của các phụ thuộc được thêm vào là không có hiệu lực bị vi phạm ngay cả khi chữ cái không. Ví dụ: nếu một đường dẫn xuất được đề cập nhiều lần, bản thân Nix không quan tâm và chỉ cần đảm bảo rằng dẫn xuất phụ thuộc đã được xây dựng giống nhau — tùy thuộc chỉ cần một thứ gì đó tồn tại và nhu cầu là bình thường. Tuy nhiên, một phần phụ thuộc được chỉ định hai lần sẽ có hook thiết lập của nó chạy hai lần và điều đó có thể dễ dàng thay đổi môi trường xây dựng (mặc dù hook thiết lập được viết tốt do đó sẽ cố gắng trở thành idempotent nên thực tế điều này không thể quan sát được). Nói rộng hơn, móc thiết lập là chống mô-đun trong đó nhiều phụ thuộc, dù giống hay khác nhau, không nên can thiệp và móc thiết lập của chúng cũng có thể làm như vậy

Công dụng điển hình nhất của hook thiết lập thực tế là thêm các hook khác sau đó sẽ chạy (i. e. sau tất cả các hook thiết lập) trên mỗi phần phụ thuộc. Ví dụ: hook thiết lập của trình bao bọc trình biên dịch C tự cung cấp các cờ cho từng phụ thuộc có chứa các thư viện và tiêu đề có liên quan. Điều này được thực hiện bằng cách xác định một hàm bash và nối thêm tên của nó vào một trong số

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
517,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
518,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
519,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
520,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
521 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
522. 6 biến bash này tương ứng với 6 loại phụ thuộc theo nền tảng (có tổng cộng 12 loại nhưng chúng tôi bỏ qua trục lan truyền/không lan truyền)

Các gói thêm móc không nên mã hóa cứng một móc cụ thể, mà nên chọn một biến liên quan đến cách chúng được bao gồm. Quay trở lại ví dụ về trình bao bọc trình biên dịch C, nếu bản thân trình bao bọc là một phụ thuộc

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
523, thì nó chỉ muốn tích lũy các cờ từ các phụ thuộc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
524, vì chỉ những cờ đó khớp với nền tảng đích của trình biên dịch. Biến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
525 được xác định với phần bù máy chủ của phần phụ thuộc hiện tại
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
526 với phần bù đích của nó, trước khi hook thiết lập của nó được lấy nguồn. Ngoài ra, vì hầu hết các hook môi trường không quan tâm đến nền tảng đích, điều đó có nghĩa là hook thiết lập có thể nối vào mảng bash bên phải bằng cách thực hiện một số thao tác như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
00

Sự tồn tại của móc cài đặt đã được ghi lại từ lâu và các gói bên trong Nixpkg được tự do sử dụng cơ chế này. Tuy nhiên, các gói khác không nên dựa vào các cơ chế này không thay đổi giữa các phiên bản Nixpkgs. Do các vấn đề hiện có với hệ thống này, có rất ít lợi ích từ việc bắt buộc hệ thống phải ổn định trong bất kỳ khoảng thời gian nào

Đầu tiên, hãy giới thiệu một số hook thiết lập là một phần của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 mặc định của Nixpkgs. Điều này có nghĩa là chúng được chạy cho mọi gói được tạo bằng cách sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
7 hoặc khi sử dụng trình tạo tùy chỉnh có
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
529. Một số trong số này dành riêng cho nền tảng, vì vậy chúng có thể chạy trên Linux chứ không phải Darwin hoặc ngược lại

Móc thiết lập này di chuyển mọi tài liệu đã cài đặt vào thư mục thư mục con

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
530. Điều này bao gồm các thư mục man, doc và info. Điều này là cần thiết cho các chương trình cũ không biết cách sử dụng thư mục con
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
531

6. 7. 2. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 532

Móc thiết lập này nén bất kỳ trang hướng dẫn nào đã được cài đặt. Việc nén được thực hiện bằng chương trình gzip. Điều này giúp giảm kích thước cài đặt của các gói

Điều này chạy lệnh dải trên các tệp nhị phân và thư viện đã cài đặt. Điều này loại bỏ thông tin không cần thiết như biểu tượng gỡ lỗi khi không cần thiết. Điều này cũng giúp giảm kích thước cài đặt của các gói

Móc thiết lập này vá các tập lệnh đã cài đặt để thêm đường dẫn cửa hàng Nix vào trình thông dịch shebang của chúng như được tìm thấy trong môi trường xây dựng. Dòng shebang cho hệ điều hành giống Unix biết sử dụng trình thông dịch nào để thực thi nội dung của tập lệnh

Nhiều đường dẫn có thể được chỉ định

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
01

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
533

Tra cứu các lệnh có sẵn tại thời điểm xây dựng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
534

Tra cứu các lệnh có sẵn trong thời gian chạy

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
02
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
03

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
535 sẽ được viết lại thành
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
536

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
537 được đối xử đặc biệt.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
538 được viết lại thành
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
539

Đường dẫn phiên dịch trỏ đến vị trí cửa hàng Nix hợp lệ không bị thay đổi

Cơ chế này đảm bảo rằng trình thông dịch cho một tập lệnh nhất định luôn được tìm thấy và chính xác là tập lệnh được chỉ định bởi bản dựng

Nó có thể bị vô hiệu hóa bằng cách thiết lập

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
412

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
04

Tệp

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
088 định nghĩa hàm
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
542. Nó được sử dụng để triển khai
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
543, hook thiết lập được đăng ký để chạy trong giai đoạn sửa lỗi theo mặc định

Nếu bạn cần chạy

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
542 khi xây dựng, nó phải được gọi rõ ràng trong một trong các giai đoạn xây dựng

Điều này xác minh rằng không có tham chiếu nào còn lại từ các tệp nhị phân cài đặt đến thư mục được sử dụng để tạo các tệp nhị phân đó. Điều này đảm bảo rằng các tệp nhị phân không cần những thứ bên ngoài cửa hàng Nix. Điều này hiện chỉ được hỗ trợ trong Linux

6. 7. 6. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 545

Móc thiết lập này thêm các cờ cấu hình yêu cầu các gói cài đặt tệp vào bất kỳ một trong các đầu ra thích hợp được liệt kê trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
426. Có thể tắt hành vi này bằng cách đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
547 thành false trong môi trường phái sinh. Xem Chương 8, Gói nhiều đầu ra để biết thêm thông tin

Móc thiết lập này di chuyển bất kỳ tệp nhị phân nào được cài đặt trong thư mục con

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
548 sang
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
549. Ngoài ra, một liên kết được cung cấp từ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
548 đến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
549 để tương thích

Móc thiết lập này di chuyển bất kỳ thư viện nào được cài đặt trong thư mục con

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
552 vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
553. Ngoài ra, một liên kết được cung cấp từ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
552 đến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
553 để tương thích

6. 7. 9. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 556

Móc thiết lập này di chuyển bất kỳ đơn vị người dùng systemd nào được cài đặt trong thư mục con

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
553 vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
081. Ngoài ra, một liên kết được cung cấp từ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
081 đến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
553 để tương thích. Điều này là cần thiết để systemd tìm dịch vụ người dùng khi được cài đặt vào hồ sơ người dùng

Móc này chỉ chạy khi biên dịch cho Linux

Điều này đặt

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
561 thành thời gian sửa đổi của tệp gần đây nhất

Trình bao bọc Bintools bao bọc các tiện ích nhị phân cho nhiều mục đích linh tinh. Đây là các Binutils GNU khi nhắm mục tiêu Linux và kết hợp giữa cctools và GNU binutils cho Darwin. [Tên “Bintools” được coi là sự thỏa hiệp giữa “Binutils” và “cctools” không biểu thị bất kỳ triển khai cụ thể nào. ] Cụ thể, gói bintools bên dưới và thư viện chuẩn C (glibc hoặc libSystem của Darwin, chỉ dành cho trình tải động) đều được cung cấp và việc tìm kiếm phụ thuộc, làm cứng (xem bên dưới) và kiểm tra độ tinh khiết của từng loại được xử lý bởi Bintools . Các gói thường phụ thuộc vào Trình bao bọc CC, do đó (tại thời điểm chạy) phụ thuộc vào Trình bao bọc Bintools

Bintools Wrapper vừa mới được tách ra khỏi CC Wrapper, vì vậy việc phân công lao động vẫn đang được thực hiện. Ví dụ, nó không nên quan tâm đến thư viện chuẩn C, mà chỉ cần bắt nguồn từ trình tải động (có thể là glibc trên linux). Tuy nhiên, việc tìm kiếm sự phụ thuộc là một nhiệm vụ mà cả hai trình bao bọc sẽ tiếp tục cần chia sẻ và có lẽ là điều quan trọng nhất cần hiểu. Nó hiện được thực hiện bằng cách thu thập các thư mục phụ thuộc nền tảng máy chủ (i. e.

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420) trong các biến môi trường. Móc thiết lập của Bintools Wrapper khiến mọi thư mục con
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
564 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
565 được thêm vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
566. Vì Trình bao bọc CC và Trình bao bọc Bintools sử dụng cùng một chiến lược, hầu hết mã Trình bao bọc Bintools được nhận xét thưa thớt và đề cập đến Trình bao bọc CC. Nhưng ngược lại, mã của CC Wrapper lại có các chú thích khá dài. Trình bao bọc Bintools chỉ trích dẫn những điều đó, thay vì lặp lại chúng, để tránh không đồng bộ

Nhiệm vụ cuối cùng của hook thiết lập là xác định một số biến môi trường tiêu chuẩn để báo cho hệ thống xây dựng biết tệp thực thi nào đáp ứng mục đích nào. Chúng được định nghĩa chỉ là tên cơ sở của các công cụ, với giả định rằng các tệp nhị phân của Trình bao bọc Bintools sẽ nằm trên đường dẫn. Đầu tiên, điều này giúp các gói được viết kém, e. g. những cái chỉ tìm kiếm

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
488 khi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
568 chưa được xác định thì
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
569 sẽ được sử dụng. Thứ hai, điều này giúp các gói không bị lẫn lộn khi biên dịch chéo, trong trường hợp đó có thể sử dụng đồng thời nhiều Bintools Wrappers. Các phiên bản có tiền tố
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
570- và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
571 của biến môi trường thông thường được xác định cho các Trình bao bọc Bintools bổ sung, phân biệt chúng đúng cách

Một vấn đề với nhiệm vụ cuối cùng này là Bintools Wrapper trung thực và định nghĩa

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
572 là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
489. Tuy nhiên, hầu hết các gói, trước hết sử dụng trình biên dịch C để liên kết, thứ hai sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
572, xác định nó là trình biên dịch C và thứ ba, chỉ xác định như vậy
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
572 khi nó không được xác định là dự phòng. Mối đe dọa tay ba này có nghĩa là Trình bao bọc Bintools sẽ phá vỡ các gói đó, vì LD đã được xác định là trình liên kết thực tế mà gói sẽ không ghi đè nhưng không muốn sử dụng. Cách giải quyết là xác định, chỉ dành cho gói có vấn đề,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
572 làm trình biên dịch C. Một cách tốt để làm điều này sẽ là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
577

6. 7. 12. CC Wrapper và móc

CC Wrapper bao bọc chuỗi công cụ C cho nhiều mục đích linh tinh. Cụ thể, trình biên dịch C (GCC hoặc Clang), công cụ nhị phân được bao bọc và thư viện chuẩn C (glibc hoặc libSystem của Darwin, chỉ dành cho trình tải động) đều được cung cấp và tìm kiếm phụ thuộc, làm cứng (xem bên dưới) và kiểm tra độ tinh khiết . Các gói thường phụ thuộc vào Trình bao bọc CC, do đó (tại thời điểm chạy) phụ thuộc vào Trình bao bọc Bintools

Phát hiện phụ thuộc chắc chắn là nhiệm vụ chính của CC Wrapper. Điều này hoạt động giống như Trình bao bọc Bintools, ngoại trừ bất kỳ thư mục con

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
81 nào của bất kỳ phụ thuộc có liên quan nào đều được thêm vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
579. Bản thân hook thiết lập chứa các nhận xét phức tạp mô tả cơ chế chính xác mà điều này được thực hiện

Tương tự, Trình bao bọc CC tuân theo Trình bao bọc Bintools trong việc xác định các biến môi trường tiêu chuẩn với tên của các công cụ mà nó bao bọc, vì những lý do tương tự được mô tả ở trên. Điều quan trọng là, trong khi nó bao gồm một liên kết tượng trưng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
580 tới trình biên dịch c để có tính di động, thì
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
568 sẽ được xác định bằng cách sử dụng “tên thật” của trình biên dịch (i. e.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
488 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
569). Điều này giúp các hệ thống xây dựng tệ hại kiểm tra tên của trình biên dịch thay vì chạy nó

Dưới đây là một số gói khác cung cấp hook thiết lập. Vì danh sách hook có thể mở rộng nên đây không phải là danh sách đầy đủ. Cơ chế này chỉ được sử dụng như là phương sách cuối cùng, vì vậy nó có thể bao gồm hầu hết các mục đích sử dụng

Nhiều gói khác cung cấp móc, không phải là một phần của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6. Bạn có thể tìm thấy những thứ này trong Tài liệu tham khảo về móc

6. 7. 14. Trình bao bọc trình biên dịch và trình liên kết

Nếu tệp

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
585 tồn tại, nó sẽ được chạy ở cuối trình bao bọc trình biên dịch. Nếu tệp
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
586 tồn tại, nó sẽ được chạy ở cuối trình bao bọc trình liên kết. Các móc này cho phép người dùng đưa mã vào trình bao bọc. Ví dụ, các hook này có thể được sử dụng để trích xuất
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
587,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
588 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
589 lưu trữ tất cả các đối số dòng lệnh được chuyển đến trình biên dịch và trình liên kết tương ứng

Các biện pháp được thực hiện để ngăn chặn sự phụ thuộc vào các gói bên ngoài cửa hàng và bạn có thể làm gì để ngăn chặn chúng

GCC không tìm kiếm ở các vị trí như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
590. Trên thực tế, những nỗ lực thêm các thư mục như vậy thông qua cờ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
591 đều bị lọc ra. Tương tự như vậy, trình liên kết (từ GNU binutils) không tìm kiếm ở các vị trí tiêu chuẩn, chẳng hạn như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
592. Các chương trình được xây dựng trên Linux được liên kết với Thư viện GNU C cũng không tìm kiếm ở các vị trí hệ thống mặc định

6. 9. Làm cứng trong Nixpkgs

Có các cờ có sẵn để làm cứng các gói khi biên dịch hoặc thời gian liên kết. Chúng có thể được chuyển đổi bằng cách sử dụng các tham số

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
7
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
594 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
595

Cả hai tham số đều lấy danh sách các cờ dưới dạng chuỗi. Cờ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
596 đặc biệt có thể được chuyển đến
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
594 để tắt tất cả quá trình làm cứng. Những cờ này cũng có thể được sử dụng làm biến môi trường cho mục đích thử nghiệm hoặc phát triển

Để biết thêm thông tin chuyên sâu về các cờ tăng cứng này và tăng cứng nói chung, hãy tham khảo Debian Wiki, Ubuntu Wiki, Gentoo Wiki và Arch Wiki

6. 9. 1. Cờ làm cứng được bật theo mặc định

Các cờ sau đây được bật theo mặc định và có thể yêu cầu tắt bằng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
594 nếu chương trình đóng gói không tương thích

Thêm các tùy chọn trình biên dịch

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
599. Hiện tại, điều này cảnh báo về các cuộc gọi đến hàm
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
00 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
01 trong đó chuỗi định dạng không phải là chuỗi ký tự và không có đối số định dạng, như trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
02. Đây có thể là lỗ hổng bảo mật nếu chuỗi định dạng đến từ đầu vào không đáng tin cậy và chứa
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
03

Điều này cần phải được tắt hoặc sửa đối với các lỗi tương tự như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
05

Thêm các tùy chọn trình biên dịch

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
04. Điều này bổ sung các kiểm tra an toàn đối với việc ghi đè ngăn xếp khiến nhiều cuộc tấn công tiêm mã tiềm ẩn vào các tình huống hủy bỏ. Trong trường hợp tốt nhất, điều này biến các lỗ hổng tiêm mã thành từ chối dịch vụ hoặc không thành vấn đề (tùy thuộc vào ứng dụng)

Điều này cần phải được tắt hoặc sửa đối với các lỗi tương tự như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
06

Thêm các tùy chọn trình biên dịch

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
05. Trong quá trình tạo mã, trình biên dịch biết rất nhiều thông tin về kích thước bộ đệm (nếu có thể) và cố gắng thay thế các lời gọi hàm bộ đệm có độ dài không giới hạn không an toàn bằng các lệnh gọi có độ dài giới hạn. Điều này đặc biệt hữu ích cho mã cũ, thô sơ. Ngoài ra, chuỗi định dạng trong bộ nhớ có thể ghi có chứa
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
03 bị chặn. Nếu một ứng dụng phụ thuộc vào một chuỗi định dạng như vậy, nó sẽ cần được xử lý

Ngoài ra, một số cảnh báo được bật có thể gây ra lỗi bản dựng nếu cảnh báo của trình biên dịch được coi là lỗi trong bản dựng gói. Trong trường hợp này, đặt

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
579 thành
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
08

Điều này cần phải được tắt hoặc sửa đối với các lỗi tương tự như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
07

Thêm các tùy chọn trình biên dịch

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
09. Tùy chọn này thêm hỗ trợ cho mã độc lập vị trí trong các thư viện được chia sẻ và do đó có thể sử dụng ASLR

Đáng chú ý nhất, nhân Linux, mô-đun hạt nhân và mã khác không chạy trong môi trường hệ điều hành như bộ tải khởi động sẽ không được xây dựng khi bật PIC. Hầu hết các trường hợp trình biên dịch sẽ phàn nàn rằng PIC không được hỗ trợ cho một bản dựng cụ thể

Điều này cần phải được tắt hoặc sửa đối với các lỗi trình biên dịch chương trình tương tự như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
08

Tràn số nguyên đã ký là hành vi không xác định theo tiêu chuẩn C. Nếu nó xảy ra, đó là một lỗi trong chương trình vì nó phải kiểm tra tràn trước khi nó có thể xảy ra, không phải sau đó. GCC cung cấp các hàm tích hợp để thực hiện phép tính số học với kiểm tra tràn, chính xác và nhanh hơn bất kỳ triển khai tùy chỉnh nào. Như một giải pháp thay thế, tùy chọn

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
10 làm cho gcc hoạt động như thể tràn số nguyên đã ký đã được xác định

Cờ này không được kích hoạt bất kỳ lỗi xây dựng hoặc thời gian chạy nào

Thêm tùy chọn trình liên kết

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
11. Trong quá trình tải chương trình, một số phần bộ nhớ ELF cần được ghi vào bởi trình liên kết, nhưng có thể chuyển sang chế độ chỉ đọc trước khi chuyển quyền kiểm soát cho chương trình. Điều này ngăn cản một số GOT (và. dtor) ghi đè lên các cuộc tấn công, nhưng ít nhất là một phần của GOT được sử dụng bởi trình liên kết động (. được. plt) vẫn dễ bị tổn thương

Cờ này có thể phá vỡ tải đối tượng chia sẻ động. Chẳng hạn, các hệ thống mô-đun của Xorg và OpenCV không tương thích với cờ này. Trong hầu hết các trường hợp, cờ

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
12 cũng phải bị tắt và các chương trình không tương thích thường bị lỗi với các lỗi tương tự khi chạy

Thêm tùy chọn trình liên kết

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
13. Trong quá trình tải chương trình, tất cả các biểu tượng động được giải quyết, cho phép GOT hoàn chỉnh được đánh dấu là chỉ đọc (do
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
14). Điều này ngăn chặn các cuộc tấn công ghi đè GOT. Đối với các ứng dụng rất lớn, điều này có thể làm giảm hiệu suất trong quá trình tải ban đầu trong khi các biểu tượng được giải quyết, nhưng đây không phải là vấn đề đối với daemon

Cờ này có thể phá vỡ tải đối tượng chia sẻ động. Chẳng hạn, các hệ thống mô-đun của Xorg và PHP không tương thích với cờ này. Các chương trình không tương thích với cờ này thường bị lỗi khi chạy do thiếu ký hiệu, chẳng hạn như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
09

6. 9. 2. Cờ làm cứng bị tắt theo mặc định

Các cờ sau đây bị tắt theo mặc định và phải được bật với

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
595 cho các gói sử dụng đầu vào không đáng tin cậy như dịch vụ mạng

Cờ này bị tắt theo mặc định đối với các bản dựng gói NixOS dựa trên

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 thông thường, nhưng được bật theo mặc định cho các bản dựng gói dựa trên
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
17

Thêm tùy chọn trình biên dịch

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
18 và trình liên kết
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
19. Vị trí Thực thi Độc lập là cần thiết để tận dụng Ngẫu nhiên Bố cục Không gian Địa chỉ, được hỗ trợ bởi các phiên bản kernel hiện đại. Mặc dù ASLR đã có thể được thực thi đối với các vùng dữ liệu trong ngăn xếp và đống (brk và mmap), nhưng các vùng mã phải được biên dịch là không phụ thuộc vào vị trí. Các thư viện được chia sẻ đã làm điều này với cờ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
20, vì vậy chúng tự động đạt được ASLR, nhưng nhị phân. các vùng văn bản cần được xây dựng với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
21 để đạt được ASLR. Khi điều này xảy ra, các cuộc tấn công ROP sẽ khó khăn hơn nhiều vì không có vị trí tĩnh nào để thoát ra trong một cuộc tấn công làm hỏng bộ nhớ

Các thư viện tĩnh cần được biên dịch với

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
18 để các tệp thực thi có thể liên kết chúng với tùy chọn trình liên kết
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
19. Nếu thư viện thiếu
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
18, bạn sẽ gặp lỗi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
25

Các gói Nix có thể khai báo các thuộc tính meta chứa thông tin về một gói như mô tả, trang chủ, giấy phép của gói, v.v. Chẳng hạn, gói GNU Hello có khai báo

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
26 như thế này

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
40

Thuộc tính meta không được chuyển đến trình tạo gói. Do đó, thay đổi đối với thuộc tính meta không kích hoạt quá trình biên dịch lại gói. Giá trị của thuộc tính meta phải là một chuỗi

Các thuộc tính meta của một gói có thể được truy vấn từ dòng lệnh bằng cách sử dụng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
41

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 biết cụ thể về lĩnh vực
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
29

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
42

Dự kiến ​​mỗi siêu thuộc tính là một trong các thuộc tính sau

Mô tả ngắn (một dòng) về gói. Điều này được hiển thị bởi

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
30 và cả trên các trang phát hành Nixpkgs

Không thêm dấu chấm ở cuối. Không bao gồm các ký tự xuống dòng. Viết hoa ký tự đầu tiên. Để cho ngắn gọn, đừng lặp lại tên của gói — chỉ cần mô tả chức năng của nó

Sai.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
31

Đúng.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
32

Một mô tả dài tùy ý của gói trong CommonMark Markdown

Chi nhánh phát hành. Được sử dụng để xác định rằng một gói sẽ không nhận các bản cập nhật không có trong nhánh này; . 0 được cho là được cập nhật thành 3. 0. X, không phải 3. 1

Trang chủ của gói. Thí dụ.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
33

Trang có thể tìm thấy liên kết đến phiên bản hiện tại. Thí dụ.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
34

Một liên kết hoặc danh sách các liên kết đến vị trí của Changelog cho một gói. Một liên kết có thể sử dụng phần mở rộng để chỉ phiên bản nhật ký thay đổi chính xác. Thí dụ.

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
35

Giấy phép hoặc giấy phép cho gói. Một từ bộ thuộc tính được xác định trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
36. Tại thời điểm này, sử dụng cả danh sách giấy phép và một giấy phép duy nhất đều hợp lệ. Nếu trường giấy phép ở dạng đại diện danh sách, thì điều đó có nghĩa là các phần của gói được cấp phép khác nhau. Mỗi giấy phép tốt nhất nên được tham chiếu theo thuộc tính của chúng. Giá trị thuộc tính không có trong danh sách cũng có thể là một chuỗi đại diện được phân tách bằng dấu cách của thuộc tính chứa trong đó là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
37 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
38. Sau đây là tất cả các ví dụ hợp lệ

  • Giấy phép đơn được tham chiếu bởi thuộc tính (ưu tiên)

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    39

  • Giấy phép duy nhất được tham chiếu bởi thuộc tính shortName của nó (bắt đầu từ)

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    40

  • Giấy phép duy nhất được tham chiếu bởi thuộc tính spdxId của nó (được giao)

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    41

  • Nhiều giấy phép được tham chiếu theo thuộc tính (ưu tiên)

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    42

  • Nhiều giấy phép được tham chiếu dưới dạng một chuỗi thuộc tính shortNames được phân tách bằng dấu cách (được đặt tên)

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    43

Để biết chi tiết, xem Giấy phép

Danh sách những người duy trì biểu thức Nix này. Người bảo trì được định nghĩa trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
44. Không có giới hạn nào để trở thành người bảo trì, chỉ cần thêm bạn vào danh sách đó trong một cam kết riêng có tiêu đề “người bảo trì. thêm alice”, và những người bảo trì tham chiếu với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
45

Tên của nhị phân chính cho gói. Điều này ảnh hưởng đến việc thực thi mã nhị phân

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
46 và quay trở lại tên của gói. Thí dụ.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
47

Mức độ ưu tiên của gói, được sử dụng bởi

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 để giải quyết xung đột tên tệp giữa các gói. Xem trang hướng dẫn sử dụng Nix cho
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 để biết chi tiết. Thí dụ.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
50 (gói ưu tiên thấp)

Danh sách các loại nền tảng Nix mà gói được hỗ trợ. Hydra xây dựng các gói theo nền tảng được chỉ định. Nếu không có nền tảng nào được chỉ định, thì gói không có tệp nhị phân dựng sẵn. Một ví dụ là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
43

Bộ thuộc tính

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
51 xác định các danh sách phổ biến khác nhau của các loại nền tảng

Một thuộc tính được đặt với các bài kiểm tra làm giá trị. Một bài kiểm tra là một dẫn xuất được xây dựng khi bài kiểm tra vượt qua và không thể xây dựng theo cách khác

Bạn có thể chạy các thử nghiệm này với

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
44

Các thử nghiệm là một phần của gói nguồn thường được thực hiện trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
52

Thích

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
632 hơn cho các bài kiểm tra được giới thiệu trong nixpkgs vì

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    632 kiểm tra gói “thực”, độc lập với môi trường mà nó được xây dựng

  • chúng ta có thể chạy độc lập

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    632

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    52 thêm chi phí cho mỗi bản dựng

Để biết thêm về cách viết và chạy thử nghiệm gói, hãy xem Phần 20. 7, “Kiểm tra gói”

Các bài kiểm tra NixOS có sẵn dưới dạng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
57 trong các thông số dẫn xuất. Chẳng hạn, dẫn xuất OpenSMTPD bao gồm các dòng tương tự như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
45

Các thử nghiệm NixOS chạy trong máy ảo, vì vậy chúng chậm hơn so với các thử nghiệm gói thông thường. Để biết thêm thông tin, hãy xem các bài kiểm tra mô-đun NixOS

Ngoài ra, bạn có thể chỉ định các dẫn xuất khác làm bài kiểm tra. Bạn có thể sử dụng tham số tùy chọn để thêm gói chính xác mà không cần dựa vào các định nghĩa không cục bộ, ngay cả khi có sự hiện diện của

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
616. Đây là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
59, nhưng bạn có thể chọn một tên khác nếu
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
621 đã tồn tại trong phạm vi của bạn

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
61 sẽ như mong đợi, miễn là định nghĩa của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
433 không dựa vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
63 gốc hoặc ghi đè lên nó ở mọi nơi

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
46____247

Thời gian chờ (tính bằng giây) để tạo dẫn xuất. Nếu quá trình tạo dẫn xuất mất nhiều thời gian hơn thời gian này để tạo, nó có thể không thành công do phá vỡ thời gian chờ. Tuy nhiên, tất cả các máy tính không có cùng sức mạnh tính toán, do đó một số nhà phát triển có thể quyết định áp dụng hệ số nhân cho giá trị này. Khi điền giá trị này vào, hãy cố gắng giữ cho giá trị đó tương đối nhất quán với các giá trị khác đã có trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
64

Thuộc tính

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
26 không được lưu trữ trong dẫn xuất khởi tạo. Do đó, cài đặt này có thể bị mất khi gói được sử dụng làm phụ thuộc. Để có hiệu quả, nó phải được trình bày trực tiếp với quy trình đánh giá xử lý thuộc tính
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
66

Danh sách các loại nền tảng Nix mà phiên bản Hydra tại

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
67 sẽ xây dựng gói. (Hydra là hệ thống xây dựng liên tục dựa trên Nix. ) Nó mặc định là giá trị của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
68. Do đó, lý do duy nhất để đặt
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
69 là nếu bạn muốn
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
67 xây dựng gói trên một tập hợp con của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
68, hoặc hoàn toàn không, e. g

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
48

Nếu được đặt thành

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
496, gói được đánh dấu là "bị hỏng", nghĩa là gói đó sẽ không hiển thị trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
73 và không thể xây dựng hoặc cài đặt. Cuối cùng, các gói như vậy sẽ bị xóa khỏi Nixpkgs trừ khi chúng được sửa

Thuộc tính

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
74 tốt nhất nên chứa giá trị từ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
75 được xác định trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
36 hoặc mô tả giấy phép tại chỗ có cùng định dạng nếu giấy phép không có khả năng hữu ích trong cách diễn đạt khác

Mặc dù tốt hơn hết là bạn nên chỉ ra giấy phép cụ thể, nhưng vẫn có sẵn một số tùy chọn chung

7. 2. 1. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 77, source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 78

Catch-all cho giấy phép phần mềm miễn phí không được liệt kê ở trên

7. 2. 2. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 79, source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 80

Gói không tự do có thể được phân phối lại ở dạng nhị phân. Nghĩa là, việc phân phối lại đầu ra của công cụ phái sinh là hợp pháp. Điều này có nghĩa là gói có thể được đưa vào kênh Nixpkgs

Đôi khi phần mềm độc quyền chỉ có thể được phân phối lại không sửa đổi. Đảm bảo trình tạo không thực sự sửa đổi các tệp nhị phân ban đầu; . For instance, the NVIDIA X11 drivers can be redistributed unmodified, but our builder applies

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
401 to make them work. Do đó, giấy phép của nó là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
82 và nó không thể được đưa vào kênh Nixpkgs

7. 2. 3. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 83, source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 82

Gói không tự do không thể phân phối lại. Bạn có thể tự xây dựng nó, nhưng bạn không thể phân phối lại đầu ra của dẫn xuất. Do đó, nó không thể được đưa vào kênh Nixpkgs

7. 2. 4. source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 85, source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 86

Gói này cung cấp phần sụn không tự do, có thể phân phối lại. Đây là một giá trị riêng biệt với

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
87 vì không phải ai cũng quan tâm liệu phần sụn có miễn phí hay không

Giá trị của thuộc tính

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
88 của một gói chỉ định nguồn gốc của các đầu ra phái sinh của gói

Nếu một gói chứa các phần tử không được xây dựng từ nguồn ban đầu theo dẫn xuất nixpkgs, thì thuộc tính

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
88 phải là một danh sách chứa một hoặc nhiều giá trị từ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
90 được xác định trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
91

Việc thêm thông tin này giúp những người dùng có nhu cầu liên quan đến xây dựng tính minh bạch và bảo mật chuỗi cung ứng có được khả năng hiển thị nhất định đối với phần mềm đã cài đặt của họ hoặc đặt chính sách cho phép hoặc không cho phép cài đặt dựa trên nguồn gốc xuất xứ

Sự hiện diện của một

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
92 cụ thể trong danh sách
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
88 của gói cho biết rằng gói có chứa một số thành phần thuộc danh mục đó, mặc dù sự vắng mặt của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
92 đó không đảm bảo không có danh mục
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
92 đó trong nội dung của gói. Một gói không có bộ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
88 có nghĩa là nó không có các
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
92 đã biết ngoài
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
98

Ý nghĩa của thuộc tính

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
88 không phụ thuộc vào giá trị của thuộc tính
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
74

7. 3. 1. let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1) propagated-dep(h0, t0, A, B) propagated-dep(h1, t1, B, C) h0 + h1 in {-1, 0, 1} h0 + t1 in {-1, 0, 1} -------------------------------------- Transitive property propagated-dep(mapOffset(h0, t0, h1), mapOffset(h0, t0, t1), A, C) 01

Package elements which are produced by a nixpkgs derivation which builds them from source code

7. 3. 2. let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1) propagated-dep(h0, t0, A, B) propagated-dep(h1, t1, B, C) h0 + h1 in {-1, 0, 1} h0 + t1 in {-1, 0, 1} -------------------------------------- Transitive property propagated-dep(mapOffset(h0, t0, h1), mapOffset(h0, t0, t1), A, C) 02

Mã gốc được thực thi trên CPU của hệ thống đích, do bên thứ ba xây dựng. Điều này bao gồm các gói bao bọc gói AppImage hoặc Debian đã tải xuống

7. 3. 3. let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1) propagated-dep(h0, t0, A, B) propagated-dep(h1, t1, B, C) h0 + h1 in {-1, 0, 1} h0 + t1 in {-1, 0, 1} -------------------------------------- Transitive property propagated-dep(mapOffset(h0, t0, h1), mapOffset(h0, t0, t1), A, C) 03

Mã được thực thi trên thiết bị ngoại vi hoặc bộ điều khiển nhúng do bên thứ ba xây dựng

7. 3. 4. let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1) propagated-dep(h0, t0, A, B) propagated-dep(h1, t1, B, C) h0 + h1 in {-1, 0, 1} h0 + t1 in {-1, 0, 1} -------------------------------------- Transitive property propagated-dep(mapOffset(h0, t0, h1), mapOffset(h0, t0, t1), A, C) 04

Mã để chạy trên trình thông dịch VM hoặc JIT được bên thứ ba biên dịch thành mã byte. Điều này bao gồm các gói tải xuống các tệp Java

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
05 từ một nguồn khác

Chương 8. Gói nhiều đầu ra

Ngôn ngữ Nix cho phép dẫn xuất để tạo ra nhiều đầu ra, tương tự như những gì được sử dụng bởi các hệ thống đóng gói phân phối Linux khác. Các đầu ra nằm trong các đường dẫn lưu trữ Nix riêng biệt, vì vậy chúng hầu như có thể được xử lý độc lập với nhau, bao gồm chuyển sang đầu vào xây dựng, thu gom rác hoặc thay thế nhị phân. The exception is that building from source always produces all the outputs

Động lực chính là tiết kiệm dung lượng đĩa bằng cách giảm kích thước đóng thời gian chạy; . Việc chia tách có thể được sử dụng để có các phụ thuộc thời gian chạy chi tiết hơn, ví dụ: việc giảm điển hình là tách các tệp chỉ dành cho phát triển, vì chúng thường không cần thiết trong thời gian chạy. Do đó, kích thước đóng của nhiều gói có thể giảm xuống một nửa hoặc thậm chí ít hơn nhiều

Một số thuộc tính có thể được sử dụng để làm việc với dẫn xuất có nhiều đầu ra. Thuộc tính

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
426 là một danh sách các chuỗi, là tên của các kết quả đầu ra. Đối với mỗi tên này, một thuộc tính có tên giống hệt được tạo, tương ứng với đầu ra đó. Thuộc tính
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
07 được sử dụng để xác định bộ đầu ra mặc định sẽ cài đặt khi sử dụng tên dẫn xuất không đủ tiêu chuẩn

8. 2.  Installing a split package

Khi cài đặt gói có nhiều đầu ra, thuộc tính

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
07 của gói sẽ xác định đầu ra nào thực sự được cài đặt.
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
07 là một danh sách có các nhị phân cài đặt mặc định và các trang hướng dẫn được liên kết. Các phần sau đây mô tả các cách cài đặt các đầu ra khác nhau

8. 2. 1. Chọn đầu ra để cài đặt qua NixOS

NixOS cung cấp hai cách để chọn đầu ra để cài đặt cho các gói được liệt kê trong

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
10

  • Tùy chọn cấu hình

    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    11 được thêm vào thuộc tính
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    07 của mỗi gói để xác định đầu ra cần cài đặt. Ví dụ, nó có thể được sử dụng để cài đặt tài liệu
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    13 hoặc biểu tượng gỡ lỗi cho tất cả các gói

  • Các đầu ra có thể được liệt kê dưới dạng các gói trong

    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    10. Ví dụ: đầu ra
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    15 và
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    16 cho gói
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    17 có thể được cài đặt bằng cách bao gồm
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    17 và
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    19 trong
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    10

8. 2. 2. Chọn đầu ra để cài đặt qua source $stdenv/setup buildPhase() { echo ".. this is my custom build phase ..." gcc foo.c -o foo } installPhase() { mkdir -p $out/bin cp foo $out/bin } genericBuild 27

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 thiếu một cách dễ dàng để chọn đầu ra để cài đặt. Khi cài đặt một gói,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 luôn cài đặt các đầu ra được liệt kê trong
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
07, ngay cả khi người dùng chọn rõ ràng một đầu ra

Cách duy nhất để chọn một đầu ra với

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
27 là ghi đè
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
07 của gói, sử dụng các chức năng được mô tả trong Chương 4, Ghi đè. Ví dụ: lớp phủ sau thêm đầu ra
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
16 cho gói
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
17

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
49

8. 3. Sử dụng gói chia nhỏ

Trong ngôn ngữ Nix, các đầu ra riêng lẻ có thể đạt được một cách rõ ràng dưới dạng các thuộc tính, e. g.

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
19, nhưng trường hợp điển hình chỉ sử dụng các gói làm đầu vào bản dựng

Khi dẫn xuất nhiều đầu ra được đưa vào đầu vào bản dựng của dẫn xuất khác, đầu ra

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
30 sẽ được thêm vào nếu nó tồn tại, nếu không thì đầu ra đầu tiên sẽ được thêm vào. Ngoài ra,
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
31 của gói đó theo mặc định chứa
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
32 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
33 cũng được thêm vào. (Xem Phần 8. 4. 2, “Nhóm loại tệp”. )

Trong một số trường hợp, có thể mong muốn kết hợp các đầu ra khác nhau trong một đường dẫn cửa hàng duy nhất. Một hàm

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
34 có thể được sử dụng để làm điều này. (Lưu ý rằng nó có thể phủ nhận một số lợi ích về kích thước đóng khi sử dụng gói nhiều đầu ra. )

8. 4. Viết đạo hàm tách

Ở đây bạn tìm thấy cách viết một dẫn xuất tạo ra nhiều đầu ra

Trong nixpkgs có một khung hỗ trợ dẫn xuất nhiều đầu ra. Nó cố gắng bao gồm hầu hết các trường hợp theo hành vi mặc định. Bạn có thể tìm thấy nguồn được phân tách trong

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
35; . Toàn bộ máy móc được kích hoạt bằng cách xác định thuộc tính
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
426 để chứa danh sách tên đầu ra mong muốn (chuỗi)

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
50

Thường thì một dòng như vậy là đủ. Đối với mỗi đầu ra, một biến môi trường có tên giống nhau được chuyển đến trình tạo và chứa đường dẫn trong cửa hàng nix cho đầu ra đó. Thông thường, bạn cũng muốn có đầu ra chính là

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
062, vì nó bắt bất kỳ tệp nào không có ở nơi khác

Một quy ước thường được áp dụng trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
64 là các tệp thực thi được cung cấp bởi gói được chứa trong đầu ra đầu tiên của nó. Quy ước này cho phép các gói phụ thuộc tham chiếu các tệp thực thi được cung cấp bởi các gói một cách thống nhất. Chẳng hạn, nếu biết rằng gói
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
39 chứa tệp thực thi
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
39, nó có thể được tham chiếu là
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
41 trong dẫn xuất Nix cần thực thi tập lệnh Perl

Gói

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 là một ngoại lệ duy nhất có chủ ý đối với quy ước "nhị phân đầu tiên".
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 có
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
44 là đầu ra đầu tiên của nó cho phép các thư viện do
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 cung cấp được tham chiếu trực tiếp (e. g.
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
46). Có thể truy cập các tệp thực thi được cung cấp bởi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 thông qua thuộc tính
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
9 của nó (e. g.
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
49)

Lý do tại sao

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 khác với quy ước là vì việc tham chiếu thư viện do
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 cung cấp là một thao tác rất phổ biến trong các gói Nix. Chẳng hạn, các tệp thực thi của bên thứ ba do Nix đóng gói thường được vá và liên kết lại với phiên bản thư viện
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
16 có liên quan từ các gói Nix (vui lòng xem tài liệu về patchelf để biết thêm chi tiết)

Mã hỗ trợ hiện nhận dạng một số loại đầu ra cụ thể và hướng dẫn hệ thống xây dựng của gói đưa các tệp vào đầu ra mong muốn của chúng hoặc nó di chuyển các tệp trong giai đoạn sửa lỗi. Mỗi nhóm loại tệp có một biến

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
53 chỉ định tên đầu ra nơi chúng sẽ đến. Nếu biến đó không được xác định bởi người viết dẫn xuất, thì nó được đoán - tên đầu ra mặc định được xác định, quay trở lại các khả năng khác nếu đầu ra không được xác định

dành cho các tệp chỉ phát triển. Chúng bao gồm các tiêu đề C(++) (_______654), pkg-config (

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
55), cmake (_______656) và các tệp aclocal (
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
57). Họ chuyển đến
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
30 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
062 theo mặc định

dành cho các tệp nhị phân hướng tới người dùng, thường nằm trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
549. Họ chuyển đến
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
9 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
062 theo mặc định

dành cho các thư viện, thường cư trú tại

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
553 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
64. Theo mặc định, họ truy cập vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
564 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
062

dành cho tài liệu người dùng, thường cư trú tại

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
67. Nó chuyển sang
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
68 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
062 theo mặc định

dành cho tài liệu dành cho nhà phát triển. Hiện tại, chúng tôi tính sách gtk-doc và devhelp, thường nằm trong

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
70 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
71, trong đó. Nó chuyển đến
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
72 hoặc bị xóa (. ) theo mặc định. Điều này là do e. g. gtk-doc có xu hướng khá lớn và hoàn toàn không được người dùng nixpkgs sử dụng

dành cho các trang hướng dẫn (ngoại trừ phần 3), thường nằm trong

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
73. Họ đi đến
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
74 hoặc
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
32 theo mặc định

dành cho các trang hướng dẫn phần 3, thường nằm trong

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
73. Họ đi đến
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
77 hoặc
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
78 theo mặc định

dành cho các trang thông tin, thường cư trú tại

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
79. Họ đi đến
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
13 hoặc
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
32 theo mặc định

  • Some configure scripts don’t like some of the parameters passed by default by the framework, e. g.

    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    82. Bạn có thể tắt tính năng này bằng cách đặt
    let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)
    
    propagated-dep(h0, t0, A, B)
    propagated-dep(h1, t1, B, C)
    h0 + h1 in {-1, 0, 1}
    h0 + t1 in {-1, 0, 1}
    -------------------------------------- Transitive property
    propagated-dep(mapOffset(h0, t0, h1),
                   mapOffset(h0, t0, t1),
                   A, C)
    
    83

  • Các đầu ra của một dẫn xuất duy nhất có thể giữ lại các tham chiếu cho nhau, nhưng lưu ý rằng các tham chiếu vòng không được phép. (Và mỗi thành phần được kết nối mạnh sẽ hoạt động như một đầu ra duy nhất. )

  • Hầu hết các gói tách đều chứa chức năng cốt lõi của chúng trong thư viện. Các thư viện này có xu hướng đề cập đến các loại dữ liệu khác nhau thường được đưa vào

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    062, e. g. locale, vì vậy thường không có lợi khi tách các thư viện thành
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    564, vì việc giữ chúng trong
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    062 sẽ dễ dàng hơn

  • Some packages have hidden assumptions on install paths, which complicates splitting

Chương 9. Biên dịch chéo

“Biên dịch chéo” có nghĩa là biên dịch chương trình trên một máy cho một loại máy khác. Ví dụ: cách sử dụng biên dịch chéo điển hình là biên dịch chương trình cho các thiết bị nhúng. Các thiết bị này thường không có khả năng tính toán và bộ nhớ để biên dịch các chương trình của riêng chúng. Người ta có thể nghĩ rằng biên dịch chéo là một mối quan tâm khá thích hợp. Tuy nhiên, có những lợi thế đáng kể để phân biệt chặt chẽ giữa môi trường thời gian xây dựng và thời gian chạy. Đáng kể, bởi vì các lợi ích được áp dụng ngay cả khi một người đang phát triển và triển khai trên cùng một máy. Nixpkgs đang ngày càng áp dụng quan điểm rằng các gói nên được viết với tính năng biên dịch chéo và Nixpkgs nên đánh giá theo cách tương tự (bằng cách giảm thiểu các trường hợp đặc biệt dành riêng cho biên dịch chéo) cho dù một gói có biên dịch chéo hay không

Chương này sẽ được tổ chức trong ba phần. Đầu tiên, nó sẽ mô tả những điều cơ bản về cách đóng gói phần mềm theo cách hỗ trợ biên dịch chéo. Thứ hai, nó sẽ mô tả cách sử dụng Nixpkgs khi biên dịch chéo. Thứ ba, nó sẽ mô tả cơ sở hạ tầng nội bộ hỗ trợ biên dịch chéo

9. 2.  Packaging in a cross-friendly manner

9. 2. 1. Thông số nền tảng

Nixpkgs tuân theo các quy ước của GNU autoconf. Chúng tôi phân biệt giữa 3 loại nền tảng khi xây dựng phái sinh. xây dựng, lưu trữ và nhắm mục tiêu. Tóm lại, bản dựng là nền tảng mà gói đang được xây dựng, máy chủ lưu trữ là nền tảng mà gói sẽ chạy trên đó. Thuộc tính thứ ba, target, chỉ liên quan đến một số trình biên dịch và công cụ xây dựng cụ thể

Trong Nixpkgs, ba nền tảng này được định nghĩa là các bộ thuộc tính dưới tên

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
87,
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
88 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
89. Chúng luôn được định nghĩa là thuộc tính trong môi trường tiêu chuẩn. Điều đó có nghĩa là người ta có thể truy cập chúng như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
51

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
87

“Nền tảng xây dựng” là nền tảng mà gói được xây dựng trên đó. Khi ai đó đã xây dựng gói hoặc gói nhị phân dựng sẵn, nền tảng xây dựng sẽ không quan trọng và có thể bỏ qua

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
88

“Nền tảng máy chủ” là nền tảng mà một gói sẽ được chạy trên đó. Đây là nền tảng đơn giản nhất để hiểu, nhưng cũng là nền tảng có tên tệ nhất

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
89

Thuộc tính “nền tảng đích”, không giống như hai thuộc tính còn lại, không thực sự là nền tảng cho quá trình xây dựng phần mềm. Thay vào đó, nó chỉ phù hợp để tương thích với việc xây dựng một số trình biên dịch và công cụ xây dựng cụ thể. Nó có thể được bỏ qua một cách an toàn cho tất cả các gói khác

Quá trình xây dựng của một số trình biên dịch nhất định được viết theo cách mà trình biên dịch tạo ra từ một bản dựng duy nhất chỉ có thể tạo ra các tệp nhị phân cho một nền tảng duy nhất. Do đó, nhiệm vụ chỉ định “nền tảng đích” duy nhất này được thúc đẩy để xây dựng thời gian của trình biên dịch. Nguyên nhân sâu xa của điều này là do trình biên dịch (sẽ chạy trên máy chủ) và thư viện/thời gian chạy chuẩn (sẽ chạy trên đích) được xây dựng bởi một quy trình xây dựng duy nhất

Không có nhu cầu cơ bản để suy nghĩ về một mục tiêu trước thời hạn như thế này. Nếu công cụ hỗ trợ các chương trình phụ trợ mô-đun hoặc có thể cắm được, cả nhu cầu chỉ định mục tiêu tại thời điểm xây dựng và ràng buộc chỉ có một mục tiêu duy nhất sẽ biến mất. Một ví dụ về một công cụ như vậy là LLVM

Mặc dù sự tồn tại của một “nền tảng mục tiêu” được cho là một sai lầm lịch sử, nhưng đó là một sai lầm phổ biến. ví dụ về các công cụ bị lỗi này là GCC, Binutils, GHC và Autoconf. Nixpkgs cố gắng tránh chia sẻ sai lầm nếu có thể. Tuy nhiên, vì khái niệm về nền tảng mục tiêu đã ăn sâu nên tốt nhất là hỗ trợ nó như hiện tại

Lược đồ chính xác mà các trường này tuân theo hơi không rõ ràng do quá trình phát triển lâu dài và phức tạp, nhưng lược đồ này đang dần được làm sạch. Bạn có thể xem ví dụ về những cái được sử dụng trong thực tế trong

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
93; . Hiện tại, đây là một số trường có thể tin tưởng vào chúng có chứa

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
94

Đây là một tốc ký hai thành phần cho nền tảng. Ví dụ về điều này sẽ là “x86_64-darwin” và “i686-linux”; . Thành phần đầu tiên tương ứng với kiến ​​trúc CPU của nền tảng và thành phần thứ hai tương ứng với hệ điều hành của nền tảng (

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
96). Định dạng này có hỗ trợ tích hợp trong Nix, chẳng hạn như chuỗi không tinh khiết
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
97

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
98

Đây là cách viết tắt 3 hoặc 4 thành phần cho nền tảng. Ví dụ về điều này sẽ là

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
99 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
800. Đây là một định dạng tiêu chuẩn được gọi là “bộ ba mục tiêu LLVM”, vì chúng được tiên phong bởi LLVM. Trong 4 phần từ, điều này tương ứng với _______ 1801. Định dạng này hoàn toàn có nhiều thông tin hơn so với “kép máy chủ Nix”, vì định dạng trước đó có thể được gọi một cách tương tự. Cái này cần một cái tên hay hơn
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
98

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
803

Đây là một đại diện Nix của bộ ba mục tiêu LLVM được phân tích cú pháp với các thành phần được liệt kê trong danh sách trắng. Điều này có thể được chỉ định trực tiếp hoặc thực sự được phân tích cú pháp từ

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
98. Xem
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
805 để biết đại diện chính xác

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
806

Đây là một chuỗi xác định thư viện C tiêu chuẩn được sử dụng. Các mã định danh hợp lệ bao gồm “glibc” cho GNU libc, “libSystem” cho Libsystem của Darwin và “uclibc” cho µClibc. Nó có lẽ nên được cấu trúc lại để sử dụng hệ thống mô-đun, như

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
807

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
808

Các vị từ này được định nghĩa trong

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
809 và được áp dụng trên mọi nền tảng. Chúng vượt trội hơn so với những cái trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
6 vì chúng buộc người dùng phải rõ ràng về nền tảng mà họ đang kiểm tra. Vui lòng sử dụng những thứ này thay vì những thứ đó

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
811

Thành thật mà nói, đây là nơi chứa các cài đặt đặc biệt (nó là một bộ thuộc tính). Xem

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
812 để biết các ví dụ—hy vọng có một nền tảng trong đó sẽ hoạt động đúng nguyên văn cho từng nền tảng đang hoạt động. Hãy giúp chúng tôi phân loại những lá cờ này và cung cấp cho họ những ngôi nhà tốt hơn

Trong phần này, chúng ta khám phá mối quan hệ giữa cả phụ thuộc thời gian chạy và thời gian xây dựng và 3 nền tảng Autoconf

Sự phụ thuộc về thời gian chạy giữa hai gói yêu cầu nền tảng máy chủ của chúng khớp với nhau. Điều này được ngụ ý trực tiếp bởi ý nghĩa của “nền tảng máy chủ” và “phụ thuộc thời gian chạy”. Phụ thuộc gói tồn tại trong khi cả hai gói đang chạy trên một nền tảng máy chủ duy nhất

Tuy nhiên, sự phụ thuộc vào thời gian xây dựng có sự thay đổi về nền tảng giữa gói tùy thuộc và gói phụ thuộc. "phụ thuộc vào thời gian xây dựng" có nghĩa là để xây dựng gói tùy thuộc, chúng tôi cần có khả năng chạy gói phụ thuộc. Do đó, nền tảng xây dựng của gói phụ thuộc bằng với nền tảng máy chủ của gói phụ thuộc

Nếu cả gói phụ thuộc và gói tùy thuộc không phải là trình biên dịch hoặc công cụ tạo mã máy khác, thì chúng tôi đã hoàn tất. Và thực sự

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 đã giải quyết những trường hợp đơn giản hơn này trong nhiều năm. Nhưng nếu sự phụ thuộc tạo ra mã máy, chúng ta cũng có thể cần phải lo lắng về nền tảng đích của nó. Về nguyên tắc, nền tảng mục tiêu đó có thể là bất kỳ nền tảng xây dựng, máy chủ lưu trữ hoặc mục tiêu nào của gói tùy thuộc, nhưng chúng tôi nghiêm cấm các phụ thuộc từ nền tảng "sau này" sang nền tảng trước đó để hạn chế nhầm lẫn vì chúng tôi chưa bao giờ thấy việc sử dụng hợp pháp cho chúng

Cuối cùng, nếu gói phụ thuộc là một trình biên dịch hoặc công cụ tạo mã máy khác, thì nó có thể cần các gói phụ thuộc chạy ở “thời gian phát”. Cái này dành cho các trình biên dịch (đáng tiếc) khăng khăng muốn được xây dựng cùng với các thư viện chuẩn của ngôn ngữ nguồn của chúng. Giả sử xây dựng. = máy chủ. = target, không thể chạy phần phụ thuộc thời gian chạy của thư viện chuẩn tại thời điểm xây dựng hoặc thời gian chạy của trình biên dịch mà chỉ có thể chạy tại thời điểm chạy mã do trình biên dịch phát ra

Đặt tất cả những thứ này lại với nhau, điều đó có nghĩa là chúng ta có các loại phụ thuộc có dạng “X → E”, có nghĩa là phụ thuộc thực thi trên X và phát ra mã cho E;

Các loại phụ thuộc mô tả các mối quan hệ mà một gói có với từng phụ thuộc bắc cầu của nó. Bạn có thể nghĩ đến việc đính kèm một hoặc nhiều loại phụ thuộc vào từng tham số chính thức ở đầu tệp

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
819 của gói, cũng như cho tất cả các tham số chính thức của chúng, v.v. Mặt khác, các bộ ba như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
820 là thuộc tính của dẫn xuất tức thời – bạn có thể đính kèm bộ ba
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
821 vào tệp
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
822 trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
823

Chỉ có chín loại phụ thuộc quan trọng trong thực tế

9. 2. 2. 1. Các loại phụ thuộc có thể

Loại phụ thuộc Nền tảng máy chủ của phụ thuộc Nền tảng đích của phụ thuộc build → *build(none)build → buildbuildbuildbuild → hostbuildhostbuild → targetbuildtargethost → *host(none)host → hosthosthosthost → targethosttargettarget → *target(none)target → targettargettarget

Hãy sử dụng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
824 làm ví dụ để làm cho bảng này rõ ràng hơn.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
824 là một trình biên dịch C++ được viết bằng C. Giả sử chúng ta đang xây dựng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
824 với bộ ba nền tảng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
827 của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
820. Điều này có nghĩa là chúng tôi đang sử dụng máy
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
501 để tạo một bản sao của
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
824 sẽ chạy trên máy
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
831 và phát ra các tệp nhị phân cho máy
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
832

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 liên kết với thư viện
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    16 C của nền tảng máy chủ, là phần phụ thuộc “máy chủ → *” với bộ ba của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    835. Vì là thư viện, không phải trình biên dịch nên nó không có “mục tiêu”

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 được viết bằng C, nên trình biên dịch
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488 được sử dụng để biên dịch nó là một phụ thuộc “xây dựng → máy chủ” của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 với bộ ba của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    839. Trình biên dịch này chạy trên nền tảng xây dựng và phát ra mã cho nền tảng máy chủ

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488 liên kết với thư viện
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    16 C của nền tảng xây dựng, đây là phần phụ thuộc “xây dựng → *” với bộ ba của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    842. Vì là thư viện, không phải trình biên dịch nên nó không có “mục tiêu”

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488 này được biên soạn bởi một bản sao trước đó của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488. Bản sao trước đó của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488 là phần phụ thuộc “xây dựng → xây dựng” của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 với bộ ba của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    847. “Đầu
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488” này chạy trên nền tảng xây dựng và phát ra mã cho nền tảng xây dựng

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 đi kèm với
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    850, bao gồm một tập hợp các thói quen của máy đích để xử lý ngoại lệ và mô phỏng dấu chấm động phần mềm.
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    850 sẽ là một phụ thuộc “mục tiêu → *” với bộ ba
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    852, bởi vì nó bao gồm mã máy được liên kết với đầu ra của trình biên dịch mà chúng tôi đang xây dựng. Nó là một thư viện, không phải trình biên dịch, vì vậy nó không có mục tiêu riêng

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    850 được viết bằng C và được biên dịch bằng
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488.
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488 biên dịch nó sẽ là một phụ thuộc “xây dựng → mục tiêu” với bộ ba
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    856. Nó được biên dịch và chạy ở thời gian xây dựng
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 (trên nền tảng
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    501), nhưng phải phát mã cho nền tảng
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    832

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 cho phép mã trình biên dịch nội tuyến, do đó, nó phụ thuộc vào quyền truy cập vào bản sao của trình biên dịch mã
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    861. Đây sẽ là một phụ thuộc “máy chủ → mục tiêu” với bộ ba
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    820

  • source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 (và
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    488) bao gồm một thư viện
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    865, bao bọc trình biên dịch trong một thư viện để tạo ra một trình biên dịch đúng lúc. Trong nixpkgs, thư viện này nằm trong gói
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    866; . Điều này sẽ đảm bảo rằng trình biên dịch gửi kèm theo một bản sao của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    866 vừa thực thi vừa tạo mã cho nền tảng
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    832

  • Nếu bản thân

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824 được liên kết với
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    865 (ví dụ: để cho phép các biểu thức C++ được đánh giá theo thời gian biên dịch), thì gói
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    866 được sử dụng để cung cấp chức năng này sẽ là phần phụ thuộc “máy chủ → máy chủ” của
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    824. đó là mã chạy trên
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    412 và phát ra mã để thực thi trên
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    412

9. 2. 3. sách dạy nấu ăn bao bì chéo

Một số vấn đề thường gặp khi đóng gói biên soạn chéo xin được giải đáp tại đây. Tốt nhất, thông tin trên là đầy đủ, vì vậy phần này không thể cung cấp bất kỳ thông tin mới nào, nhưng thật lố bịch và độc ác khi mong mọi người bỏ công sức làm việc thông qua sự tương tác của nhiều tính năng chỉ để tìm ra cùng một câu trả lời cho cùng một vấn đề chung. Vui lòng thêm vào danh sách này

9. 2. 3. 1. Gói của tôi không tìm thấy lệnh binutils (
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
580/
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
879/
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
489, v.v. )

Nhiều gói cho rằng một binutils chưa được trộn sẵn (

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
580/
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
879/
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
489, v.v. ) có sẵn, nhưng Nix không cung cấp. Nó chỉ cung cấp một tiền tố, giống như nó chỉ cung cấp cho tất cả các chương trình binutils khác. Có thể cần phải vá gói để sửa hệ thống xây dựng để sử dụng tiền tố. Chẳng hạn, thay vì
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
580, hãy sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
885

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
52

9. 2. 3. 2.  How do I avoid compiling a GCC cross-compiler from source?

Trên các máy yếu hơn, có thể bất tiện khi biên dịch chéo một gói chỉ để biết rằng GCC phải được biên dịch từ nguồn, quá trình này có thể mất tới vài giờ. Nixpkgs duy trì một bộ công việc liên quan đến chéo có giới hạn trên Hydra, kiểm tra biên dịch chéo cho các nền tảng khác nhau từ nền tảng xây dựng “x86_64-darwin”, “x86_64-linux” và “aarch64-linux”. Xem

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
886 để biết danh sách đầy đủ các nền tảng và gói mục tiêu. Chẳng hạn, lời gọi sau tìm nạp GCC được biên dịch chéo dựng sẵn cho
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
887 và xây dựng GNU Hello từ nguồn

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
53

9. 2. 3. 3. Điều gì xảy ra nếu hệ thống xây dựng gói của tôi cần xây dựng chương trình C để chạy trong môi trường xây dựng?

Thêm phần sau vào lệnh gọi

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5 của bạn

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
54

9. 2. 3. 4. Gói thử nghiệm của tôi cần chạy mã nền tảng máy chủ

Thêm phần sau vào lệnh gọi

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5 của bạn

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
55

9. 2. 3. 5. Gói sử dụng Meson cần chạy các tệp nhị phân cho nền tảng máy chủ trong quá trình xây dựng

Thêm

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
890 vào
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 một cách có điều kiện nếu các tệp nhị phân đích có thể được thực thi

e. g

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
56

Ví dụ về một lỗi mà điều này sửa chữa

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
892

9. 3. Gói xây dựng chéo

Nixpkgs có thể được khởi tạo chỉ với

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
893, trong trường hợp đó không có biên dịch chéo và mọi thứ được xây dựng bởi và cho hệ thống đó, hoặc cả với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
894, trong trường hợp đó các gói chạy trên hệ thống sau, nhưng tất cả quá trình xây dựng diễn ra trên hệ thống trước. Cả hai tham số đều sử dụng cùng một lược đồ như 3 nền tảng (bản dựng, máy chủ và đích) được xác định trong phần trước. Như đã đề cập ở trên,
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
93 có một số nền tảng được sử dụng làm đối số cho các tham số này trong thực tế. Bạn có thể sử dụng chúng theo chương trình hoặc trên dòng lệnh

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
57

Mặc dù một người có thể tự do truyền đầy đủ cả hai tham số, nhưng có rất nhiều logic để điền vào các trường bị thiếu. Như đã thảo luận trong phần trước, chỉ cần một trong số

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
94,
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
98 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
803 để suy ra hai số còn lại. Ngoài ra,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
806 sẽ được suy ra từ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
807. Finally,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
201 is also impurely inferred based on the platform evaluation occurs. This means it is often not necessary to pass
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
893 at all, as in the command-line example in the previous paragraph

Người ta sẽ nghĩ rằng

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
893 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
894 trùng lặp khủng khiếp với ba
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
205 (
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
87,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
207 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
89; xem
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
209 hoặc sách hướng dẫn). Actually, those identifiers are purposefully not used here to draw a subtle but important distinction. Mặc dù mức độ chi tiết của việc có 3 nền tảng là cần thiết để xây dựng các gói đúng cách, nhưng việc chỉ định ý định của người dùng khi lập kế hoạch xây dựng hoặc bộ gói là quá mức cần thiết. Một sự phân đôi “xây dựng và triển khai” đơn giản là đủ. the sliding window principle described in the previous section shows how to interpolate between the these two “end points” to get the 3 platform triple for each bootstrapping stage. Điều đó có nghĩa là đối với bất kỳ gói nào, một bộ gói nhất định, ngay cả những gói không bị ràng buộc ở cấp cao nhất nhưng chỉ có thể truy cập thông qua các phụ thuộc hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
210, ba nền tảng sẽ được xác định là một trong số
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
893 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
894, với nền tảng trước thay thế nền tảng sau khi đi qua bản dựng- . Một điểm khác biệt đơn giản cuối cùng là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
894 phải là null khi một người không muốn biên dịch chéo, trong khi các
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
214 luôn không phải là null.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
893 luôn khác rỗng

9. 4.  Cross-compilation infrastructure

9. 4. 1. Thực hiện các phụ thuộc

Các danh mục phụ thuộc được phát triển trong Phần 9. 2. 2, “Lý thuyết phân loại phụ thuộc” được chỉ định dưới dạng danh sách các dẫn xuất được cung cấp cho

let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5, như được ghi trong Phần 6. 3, “Chỉ định phụ thuộc”. Nói tóm lại, mỗi danh sách phụ thuộc cho “máy chủ → đích” được gọi là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
217 (trong đó giá trị
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
412 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
414 là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
410,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
412 hoặc
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
414), ngoại trừ khả năng tương thích ngược mà thay vào đó,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
448 được gọi là
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 và thay vào đó,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
456 được gọi là
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8. Nixpkgs hiện được cấu trúc sao cho mỗi
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
217 được tự động lấy từ
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
228. (Các
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
228 này khá mới nên không có trường hợp đặc biệt nào đối với
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 và
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8. ) Ví dụ: nên sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
232 trong thời gian xây dựng, trong khi đó nên sử dụng
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
233 trong thời gian chạy

Bây giờ, trong phần lớn lịch sử của Nixpkgs, không có thuộc tính ________ 3228 nào và hầu hết các gói chưa được cấu trúc lại để sử dụng nó một cách rõ ràng. Trước đó, chỉ có

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
210,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
228 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
237. Chúng hiện được xác định lại thành bí danh thành
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
238,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
239 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
240. It is acceptable, even recommended, to use them for libraries to show that the host platform is irrelevant

Nhưng trước đó, chỉ có

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
228, mặc dù cả
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
8 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
420 đều tồn tại. [Cross hầu như không hoạt động và chúng đã được triển khai với một số bản hack trên
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5 để ghi đè lên các phụ thuộc. ] Điều này có nghĩa là phần lớn các gói không sử dụng bất kỳ gói rõ ràng nào được đặt để điền vào các phần phụ thuộc của chúng, chỉ sử dụng bất kỳ thứ gì mà
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
245 cung cấp cho chúng ngay cả khi chúng sắp xếp chính xác các phần phụ thuộc của chúng vào nhiều danh sách được mô tả ở trên. Và thực sự, việc yêu cầu người dùng vừa sắp xếp các phụ thuộc của họ, vừa lấy chúng từ tập hợp thuộc tính phù hợp, vừa quá phiền phức vừa dư thừa, vì vậy phương pháp được khuyến nghị (hiện tại) là tiếp tục chỉ phân loại theo danh sách và không sử dụng tập hợp gói rõ ràng

Để thực hiện công việc này, chúng tôi “ghép” sáu bộ gói

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
246 lại với nhau và để
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
245 thực sự lấy các đối số của nó từ đó. Điều này hiện đang được triển khai trong
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
248. Sau đó,
let mapOffset(h, t, i) = i + (if i <= 0 then h else t - 1)

propagated-dep(h0, t0, A, B)
propagated-dep(h1, t1, B, C)
h0 + h1 in {-1, 0, 1}
h0 + t1 in {-1, 0, 1}
-------------------------------------- Transitive property
propagated-dep(mapOffset(h0, t0, h1),
               mapOffset(h0, t0, t1),
               A, C)
5, đối với mỗi thuộc tính phụ thuộc, lấy dẫn xuất bên phải từ mối nối. This splicing can be skipped when not cross-compiling as the package sets are the same, but still is a bit slow for cross-compiling. Chúng tôi muốn làm điều gì đó tốt hơn, nhưng vẫn chưa nghĩ ra điều gì

Mỗi bộ gói được mô tả ở trên đến từ một giai đoạn khởi động duy nhất. While

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
250, coordinates the composition of stages at a high level,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
251 “ties the knot” (creates the fixed point) of each stage. The package sets are defined per-stage however, so they can be thought of as edges between stages (the nodes) in a graph. Các tác phẩm như
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
252 có thể được coi là đường dẫn đến biểu đồ này

Mặc dù có nhiều bộ gói và do đó có nhiều cạnh, nhưng các giai đoạn cũng có thể được sắp xếp theo một chuỗi tuyến tính. Nói cách khác, nhiều cạnh là dư thừa khi có liên quan đến kết nối. Điều này phụ thuộc vào loại bootstrapping mà chúng tôi thực hiện. Currently for cross it is

  1. source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    253

  2. source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    254

  3. source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    255

In each stage,

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
238 refers to the previous stage,
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
257 refers to the one before that, and
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
239 refers to the current one, and
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
240 refers to the next one. When there is no previous or next stage, they instead refer to the current stage. Lưu ý cách tất cả các bất biến liên quan đến ánh xạ giữa các gói phụ thuộc và máy chủ xây dựng và nền tảng đích của các gói tùy thuộc được bảo tồn.
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
260 và
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
261 phức tạp hơn ở chỗ giai đoạn đáp ứng các yêu cầu không phải lúc nào cũng là một chuỗi cố định của “trước” và “tiếp theo” (mô-đun tự tham chiếu “bão hòa” ở cuối). We just special case each instead. All the primary edges are implemented is in
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
262, and secondarily aliases in
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
251

If one looks at the 3 platform triples, one can see that they overlap such that one could put them together into a chain like

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
58

Nếu một người tưởng tượng các tham chiếu bản thân bão hòa ở cuối được thay thế bằng các giai đoạn vô hạn, và sau đó chồng lên các bộ ba nền tảng đó, thì người đó sẽ kết thúc với bộ dữ liệu vô hạn

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
59

Sau đó, người ta có thể tưởng tượng bất kỳ chuỗi nền tảng nào sao cho có các giai đoạn bootstrap với 3 nền tảng của chúng được xác định bằng cách “trượt cửa sổ” là 3 bộ thông qua chuỗi. Đây là mô hình ban đầu cho bootstrapping. Không có nền tảng đích (giả sử một thế giới tốt hơn nơi tất cả các trình biên dịch đều đa mục tiêu và tất cả các thư viện tiêu chuẩn được xây dựng theo nguồn gốc của riêng chúng), điều này là đủ. Ngược lại, nếu một người muốn biên dịch chéo “nhanh hơn”, với giai đoạn khởi động “Canadian Cross” trong đó

source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
264, thì cần nhiều giai đoạn khởi động hơn vì không có cửa sổ trượt nào cung cấp bộ gói
source $stdenv/setup

buildPhase() {
  echo ".. this is my custom build phase ..."
  gcc foo.c -o foo
}

installPhase() {
  mkdir -p $out/bin
  cp foo $out/bin
}

genericBuild
260 phiền phức vì nó bỏ qua “máy chủ” của giai đoạn chéo Canada

Chương 10.  Platform Notes

Một số vấn đề thường gặp khi đóng gói phần mềm cho Darwin

  • The Darwin

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    6 uses clang instead of gcc. Khi tham khảo trình biên dịch
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    267 hoặc
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    580 sẽ hoạt động trong cả hai trường hợp. Một số bản dựng mã cứng gcc/g ++ trong tập lệnh xây dựng của họ, thường có thể được sửa bằng cách sử dụng thứ gì đó như
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    269 hoặc bằng cách vá tập lệnh bản dựng

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    0
  • Trên Darwin, các thư viện được liên kết bằng các đường dẫn tuyệt đối, các thư viện được giải quyết bằng

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    270 của chúng tại thời điểm liên kết. Đôi khi các gói sẽ không đặt chính xác điều này khiến việc tra cứu thư viện không thành công khi chạy. Điều này có thể được khắc phục bằng cách thêm các cờ liên kết bổ sung hoặc bằng cách chạy
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    271 trong quá trình
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    650

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    1
  • Ngay cả khi các thư viện được liên kết bằng các đường dẫn tuyệt đối và được giải quyết chính xác thông qua

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    270 của chúng, đôi khi các thử nghiệm có thể không chạy được các tệp nhị phân. This happens because the
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    046 runs before the libraries are installed

    This can usually be solved by running the tests after the

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    641 or alternatively by using
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    276. Thông tin thêm về biến này có thể được tìm thấy trong trang dyld(1)

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    2____03
  • Một số gói cho rằng xcode có sẵn và sử dụng

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    277 để giải quyết các công cụ xây dựng như
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    569, v.v. Điều này gây ra các lỗi như
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    279 trong khi bản dựng không thực sự phụ thuộc vào xcode

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    4

    Gói

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    280 có thể được sử dụng để xây dựng các dự án thực sự phụ thuộc vào Xcode. However, this replacement is not 100% compatible with Xcode and can occasionally cause issues

  • x86_64-darwin sử dụng 10. 12 SDK by default, but some software is not compatible with that version of the SDK. Trong trường hợp đó, 11. 0 SDK được sử dụng bởi aarch64-darwin hiện có sẵn để sử dụng trên x86_64-darwin. To use it, reference

    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    281 instead of
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    282 in your derivation and use
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    283 instead of
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    284. Trên Linux, điều này sẽ có tác dụng tương tự như
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    284, vì vậy bạn có thể sử dụng
    source $stdenv/setup
    
    buildPhase() {
      echo ".. this is my custom build phase ..."
      gcc foo.c -o foo
    }
    
    installPhase() {
      mkdir -p $out/bin
      cp foo $out/bin
    }
    
    genericBuild
    
    283 bất kể nền tảng nào