Chương 4. Các tệp yêu cầu trong thư mục `debian`

# Chương 4. Các tệp yêu cầu trong thư mục `debian`

Việc viết lại tài liệu này với các nội dung cập nhật và nhiều các ví dụ thực tế hơn đã có ở Guide for Debian Maintainers. Vui lòng sử dụng tài liệu mới này như là tài liệu hướng dẫn chính.

Có một thư mục con mới trong thư mục nguồn của chương trình được gọi là `debian`. Có một số tệp tin trong thư mục này mà chúng ta nên sửa đổi để các tuỳ chỉnh hành vi của gói. Các tệp quan trọng trong số chúng là `control`, `changelog`, `copyright`, và `rules`, chúng là những tệp yêu cầu đối với tất cả các gói [27]

## 4.1. `control`

Tập tin này chứa các giá trị khác nhau mà dpkg, dselect, apt-get, apt-cache, aptitude, và các công cụ quản lý gói khác sẽ sử dụng để quản lý gói. Nó được xác định bởi Debian Policy Manual, 5 "Control files and their fields"

Đây là tệp `control` mà dh_make tạo ra cho chúng ta:

     1 Source: gentoo
     2 Section: unknown
     3 Priority: optional
     4 Maintainer: Josip Rodin <joy-mg@debian.org>
     5 Build-Depends: debhelper (>=10)
     6 Standards-Version: 4.0.0
     7 Homepage: <insert the upstream URL, if relevant>
     8
     9 Package: gentoo
    10 Architecture: any
    11 Depends: ${shlibs:Depends}, ${misc:Depends}
    12 Description: <insert up to 60 chars description>
    13  <insert long description, indented with spaces>

(Tôi đã thêm các số dòng.)

Dòng 1–7 là thông tin điều khiển cho gói nguồn. Dòng 9–13 là thông tin điều khiển cho gói nhị phân.

Dòng 1 là tên của gói nguồn

Dòng 2 là các mục loại mục chương trình

Như bạn có thể nhận thấy, kho phần mềm Debian được chia làm nhiều khu vục: `main` (phần mềm tự do), `non-free` (thật sự không phải phẩn mềm tự do) and `contrib` (phần mềm tự do phụ thuộc vào phần mềm không tự do). Mỗi loại được chi thánh các phần danh mục. Vậy chúng ta có `admin` cho các chương trình quản trị, `devel` cho các công cụ phát triển, `doc` cho tài liệu, `libs` cho thư viện, `mail` cho chương trình liên quan thư điện tử, `net` cho ứng dụng mạng và chaỵ nền, `x11` cho các chương trình X11 khác, và nhiều nữa. [28]

Chúng ta hãy thay đổi nó thành x11. (Tiền tố `main/` với ngụ ý là chúng ta có thể bỏ qua nó).

Dòng 3 miêu tả mức độ quan trọng của việc ngươì dùng cài đặt gói này. [29]

- Ưu tiên `optional` thường sẽ làm việc với gói mới mà không xung đột với các gói chứa ưu tiên `required`, `important`, hay `standard` .

Trường Section và Priority được sử dụng bởi các chương trình front-ends như aptitude khi họ sắp xếp gói và chọn mặc định. Khi bạn tải gói lên Debian, giá trị của hai trường này có thể bị ghi đè bởi các nhà bảo trì kho lưu trữ, trong trường hợp đó bạn sẽ được thông báo bằng email.

Vì đây là gói ưu tiên thông thường và không xung đột với bất kỳ điều gì khác, chúng tôi sẽ thay đổi mức độ ưu tiên thành `optional`.

Dòng 4 là tên và địa chỉ email của người bảo trì. Hãy đảm bảo rằng trường này có tiêu đề `To` hợp lệ cho email, bởi vì sau khi tải lên, hệ thống theo dõi lỗi sẽ sử dụng chính trường này để gửi email lỗi cho bạn. Tránh sử dụng dấu phẩy, ký hiệu, hoặc dấu ngoặc đơn.

Dòng 5 là trưởng `Build-Depends` bao gồm danh sách của các gói yêu cầu để xây dựng gói của bạn. Bạn cũng có thể có thêm trường `Build-Depends-Indep` bổ sung. [30]. Một số gói như `gcc` và `make` là yêu cầu ngầm định bởi gói `build-essential` Nếu bạn cần có các công cụ khác để xây dựng gói của mình, bạn nên thêm chúng vào các trường này. Nhiều mục được phân cách bằng dấu phẩy; Hãy đọc tiếp để hiểu rõ hơn về các phụ thuộc gói nhị phân.

- Đối với tất cả các gói đóng gói với lệnh dh trong tệp tin `debian/rules`, bạn phải có `debhelper(>=9)` trong trường `Build-Depends` để thỏa mãn yêu cầu Chính sách Debian đối với mục `clean`.

- Gói nguồn có gói nhị phân với `Architecture: any` được xây dựng lại bởi autobuilder. Vì thủ tục autobuilder này chỉ cài đặt các gói được liệt kê trong trường `Build-Depends` trước khi chạy `debian/rules build` (see Phần 6.2, “Tự động biên dịch”), Trường `Build-Depends` rất cần thiết để liệt kê tất cả các gói cần thiết còn `Build-Depends-Indep` hiếm khi được sử dụng.

- Đối với các gói nguồn với các gói nhị phân có kiến trúc `Architecture: all`, trường `Build-Depends-Indep` có thể liệt kê tất cả các gói cần thiết trừ khi chúng đã được liệt kê trong trường `Build-Depends` để thỏa mãn yêu cầu của Chính sách Debian đối với mục `clean`.

Nếu bạn không chắc chắn nên sử dụng trường nào, hãy sử dụng trường `Build-Depends` để an toàn. [31]

Để tìm ra những gói nào cần để xây dựng chương trình của bạn:

    $ dpkg-depcheck -d ./configure

Để tự tìm chính xác các phụ thuộc khi xây dựng `/usr/bin/foo`, thực hiện

    $ objdump -p /usr/bin/foo | grep NEEDED

và cho mỗi thư viện được liệt kê (ví dụ: libfoo.so.6), thực hiện

    $ dpkg -S libfoo.so.6

Sau đó chỉ cần lấy phiên bản `-dev` của mỗi gói như một mục nhập `Build-Depends`. Nếu bạn sử dụng ldd cho mục đích này, nó sẽ báo cáo phụ thuộc lib gián tiếp, kết quả là

`gentoo` yêu cầu `xlibs-dev`, `libgtk1.2-dev` and `libglib1.2-dev` để xây dựng, vâỵ nên chúng ta sẽ thêm chúng vào vị trí tiếp theo `debhelper`.

Dòng 6 là phiên bản của Debian Policy Manualmà phần mềm này tuân theo, một trong tài liệu bạn đọc trong khi xây dựng gói của bạn.

Trên dòng 7, bạn có thể đặt URL của trang chủ thượng nguồn của phần mềm

Dòng 9 là tên của gói nhị phân. Nó thường giống với tên của gói nguồn, nhưng nó không nhất thiết phải giống nhau.

Dòng 10 mô tả các kiến ​​trúc mà gói nhị phân có thể được biên dịch. Giá trị này thường là một trong các tùy chọn sau, tùy thuộc vào loại gói nhị phân: [32]

- `Architecture: any`

  - Gói nhị phân được tạo ra là một kiến ​​trúc phụ thuộc thường là các chương trình xây dựng bằng ngôn ngữ biên dịch.

- `Architecture: all`

  - Gói nhị phân được tạo ra là một kiến ​​trúc độc lập thường bao gồm các văn bản, hình ảnh hoặc các tập lệnh theo ngôn ngữ kịch bản.

Chúng ta để lại dòng 10 vì nó được viết bằng C. dpkg-gencontrol(1) sẽ tự điền vào trường Architecture một cách thích hợp cho bất kỳ máy nào gói nguồn này được biên soạn.

Nếu gói của bạn là kiến ​​trúc độc lập (ví dụ: mã shell hoặc kịch bản Perl, hoặc tài liệu), hãy thay đổi điều này thành `all` và đọc Phần 4.4, “`rules`” về `binary-indep` thay vì `binary-arch` để xây dựng gói.

Dòng 11 cho thấy một trong những tính năng mạnh mẽ nhất của hệ thống đóng gói Debian. Gói có thể liên quan đến nhau theo nhiều cách khác nhau. Ngoài `Depends`, các trường mối quan hệ khác là `Recommends`, `Suggests`, `Pre-Depends`, `Breaks`, `Conflicts`, `Provides` và `Replaces`.

Các công cụ quản lý gói thường có chung hành vi khi đọc các mối quan hệ này; Nếu không, nó sẽ được giải thích. (See dpkg(8), dselect(8), apt(8), aptitude(1), etc.)

Đây là mô tả đơn giản về các mối quan hệ của gói: [33]

- `Depends`

  Gói của bạn sẽ không được cài đặt trừ khi các gói phụ thuộc được cài đặt. Sử dụng trường này nếu chương trình của bạn hoàn toàn không chạy (hoặc sẽ gây ra sự cố nghiêm trọng) trừ khi một gói cụ thể có mặt.

- `Recommends`

  Sử dụng trường này cho cho các gói không bắt buộc nhưng thường được sử dụng kèm với chương trình của bạn. Khi người dùng cài đặt chương trình của bạn, các công cụ quản lý gói có thể sẽ nhắc cài đặt gói đề xuất. aptitude và apt-get cài đặt các gói được đề xuất cùng với gói của bạn theo mặc định (nhưng người dùng có thể vô hiệu hóa hành vi này). dpkg sẽ bỏ qua trường này.

- `Suggests`

  Sử dụng trường này cho các gói sẽ hoạt động tốt với chương trình của bạn nhưng không cần thiết. Khi người dùng cài đặt chương trình của bạn, họ sẽ không được nhắc nhở để cài đặt gói đề xuất. aptitude có thể được cấu hình để cài đặt các gói đề xuất cùng với gói của bạn nhưng đây không phải là mặc định. dpkg và apt-get sẽ bỏ qua trường này.

- `Pre-Depends`

  Trường này mạnh hơn `Depends`. Gói sẽ không được cài đặt trừ khi các gói mà nó được phụ thuộc trước được cài đặt và được cấu hình chính xác. Sử dụng điều này một cách rất tỉ mỉ và chỉ sau khi thảo luận về nó trên danh sách gửi thư debian-devel@lists.debian.org . Đọc: đừng sử dụng nó.:-)

- `Conflicts`

  Gói sẽ không được cài đặt cho đến khi tất cả các gói xung đột đã được gỡ bỏ. Sử dụng này nếu chương trình của bạn hoàn toàn không chạy hoặc sẽ gây ra những vấn đề nghiêm trọng nếu một gói cụ thể có mặt.

- `Breaks`

  Khi cài đặt gói nó sẽ phá vỡ tất cả các gói được liệt kê. Thông thường trường `Breaks` chỉ định áp dụng các phiên bản sớm hơn một giá trị nhất định. Nói chung là sử dụng các công cụ quản lý gói cấp cao để nâng cấp các gói được liệt kê.

- `Provides`

  Đối với một số loại gói có nhiều tên ảo khác đã được xác định. Bạn có thể có một danh sách đầy đủ trong tệp virtual-package-names-list.txt.gz . Sử dụng điều này nếu chương trình của bạn cung cấp một chức năng của một gói ảo hiện có.

- `Replaces`

  Sử dụng điều này khi chương trình của bạn thay thế các tệp từ một gói khác hoặc thay thế hoàn toàn một gói khác (được sử dụng kết hợp với `Conflicts`). Các tệp từ các gói có tên sẽ được ghi đè bằng các tệp từ gói của bạn.

Tất cả các trường này có cú pháp thống nhất. Họ là một danh sách các tên gói được phân cách bằng dấu phẩy. Các tên gói này cũng có thể là danh sách các tên gói thay thế, được phân cách bằng ký hiệu thanh dọc `|` (biểu tượng ống).

Các trường có thể hạn chế khả năng áp dụng của chúng đối với các phiên bản cụ thể của từng gói có tên. Hạn chế của từng gói riêng lẻ được liệt kê trong dấu ngoặc đơn sau tên của nó và phải có một mối quan hệ từ danh sách dưới đây và theo sau là một giá trị số phiên bản. Các mối quan hệ được cho phép là: `<<`, `<=`, `=`, `>=`, và `>>` tương ứng với bé hơn, bé hơn hoặc bằng, chính xác bằng, lớn hơn hoặc bằng, và lớn hơn. Ví dụ,

    Depends: foo (>= 1.2), libbar1 (= 1.3.4)
    Conflicts: baz
    Recommends: libbaz4 (>> 4.0.7)
    Suggests: quux
    Replaces: quux (<< 5), quux-foo (<= 7.6)

Tính năng cuối cùng bạn cần biết là về `${shlibs:Depends}`, `${perl:Depends}`, `${misc:Depends}`, vân vân.

dh_shlibdeps(1) tính toán sự phụ thuộc vào các thư viện chia sẻ cho các gói nhị phân. Nó sinh ra một danh sách củả tệp thực thi ELF và thư viện chia sẻ mà nó đã tìm cho mỗi gói nhị phân. Danh sách này được sử dụng để thay thế `${shlibs:Depends}`.

dh_perl(1) tính toán sự phụ thuộc Perl. Nó sinh ra một danh sách của các phụ thuộc trong `perl` hoặc `perlapi` cho mỗi gói nhị phân. Danh sách này được sử dụng thay thế cho `${perl:Depends}`.

Một vài lệnh `debhelper` có thể làm cho gói được sinh ra phụ thuộc vào vài gói mở rộng thêm. Tất cả các lệnh như vậy sinh ra một danh sách của các gói cho mỗi gói nhị phân. Danh sách này được sử dụng để thay thế cho `${misc:Depends}`.

dh_gencontrol(1) tạo ra `DEBIAN/control` cho mỗi gói nhị phân trong khi thay thế `${shlibs:Depends}`, `${perl:Depends}`, `${misc:Depends}`, vân vân.

Có tất cả những điều đó, chúng ta có thể để trường `Depends` chính xác như bây giờ và chèn một dòng sau là `Suggests: file`, bởi vì `gentoo` có thể sử dụng một số tính năng được cung cấp bởi gói `file` .

Dòng 9 là URL Trang chủ. Giả sử rằng đây là http://www.obsession.se/gentoo/.

Dòng 12 là mô tả ngắn. Thiết bị đầu cuối thông thường có 80 cột nên không được dài hơn 60 ký tự. Tôi sẽ thay đổi nó thành `fully GUI-configurable, two-pane X file manager`

Dòng 13 là nơi diễn tả dài. Đây sẽ là một đoạn cho biết thêm chi tiết về gói. Cột 1 của mỗi dòng nên để trống. Không có dòng trắng, nhưng bạn có thể đặt một `.` (dấu chấm) trong một cột để mô phỏng. Ngoài ra, không có nhiều dòng trống sau mô tả dài. [34]

Chúng ta có thể chèn các trường `Vcs-*` để ghi lại thông tin của VCS trong các dòng 6 và 7. [35] Hãy giả sử rằng gói `gentoo` có VCS của nó nằm trong Debian Alioth Git Service ở `git://git.debian.org/git/collab-maint/gentoo.git`.

Cuối cùng, đây là tệp `control` đã được cập nhật

     1 Source: gentoo
     2 Section: x11
     3 Priority: optional
     4 Maintainer: Josip Rodin <joy-mg@debian.org>
     5 Build-Depends: debhelper (>=10), xlibs-dev, libgtk1.2-dev, libglib1.2-dev
     6 Standards-Version: 4.0.0
     7 Vcs-Git: https://anonscm.debian.org/git/collab-maint/gentoo.git
     8 Vcs-browser: https://anonscm.debian.org/git/collab-maint/gentoo.git
     9 Homepage: http://www.obsession.se/gentoo/
    10
    11 Package: gentoo
    12 Architecture: any
    13 Depends: ${shlibs:Depends}, ${misc:Depends}
    14 Suggests: file
    15 Description: fully GUI-configurable, two-pane X file manager
    16  gentoo is a two-pane file manager for the X Window System. gentoo lets the
    17  user do (almost) all of the configuration and customizing from within the
    18  program itself. If you still prefer to hand-edit configuration files,
    19  they're fairly easy to work with since they are written in an XML format.
    20  .
    21  gentoo features a fairly complex and powerful file identification system,
    22  coupled to an object-oriented style system, which together give you a lot
    23  of control over how files of different types are displayed and acted upon.
    24  Additionally, over a hundred pixmap images are available for use in file
    25  type descriptions.
    26  .
    29  gentoo was written from scratch in ANSI C, and it utilizes the GTK+ toolkit
    30  for its interface.

(Tôi đã thêm các số dòng.)

## 4.2. `copyright`

Tập tin này chứa thông tin về bản quyền và giấy phép của các nguồn thượng nguồn Debian Policy Manual, 12.5 "Copyright information" kiểm soát nội dung của nó và DEP-5: Machine-parseable `debian/copyright` cung cấp các chỉ dẫn cho định dạng của nó

dh_make có thể cho bạn một tệp mẫu `copyright` . Hãy sử dụng tuỳ chọn `--copyright gpl2` để lấy tệp mẫu cho gói `gentoo` phát hành dưói giấy phép GPL-2.

You must fill in missing information to complete this file, such as the place you got the package from, the actual copyright notice, and the license. For certain common free software licenses (GNU GPL-1, GNU GPL-2, GNU GPL-3, LGPL-2, LGPL-2.1, LGPL-3, GNU FDL-1.2, GNU FDL-1.3, Apache-2.0, 3-Clause BSD, CC0-1.0, MPL-1.1, MPL-2.0 or the Artistic license), you can just refer to the appropriate file in the `/usr/share/common-licenses/` directory that exists on every Debian system. Otherwise, you must include the complete license.

Tóm lại, tệp `copyright` của gói `gentoo` trông sẽ như sau:

     1 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
     2 Upstream-Name: gentoo
     3 Upstream-Contact: Emil Brink <emil@obsession.se>
     4 Source: http://sourceforge.net/projects/gentoo/files/
     5
     6 Files: *
     7 Copyright: 1998-2010 Emil Brink <emil@obsession.se>
     8 License: GPL-2+
     9
    10 Files: icons/*
    11 Copyright: 1998 Johan Hanson <johan@tiq.com>
    12 License: GPL-2+
    13
    14 Files: debian/*
    15 Copyright: 1998-2010 Josip Rodin <joy-mg@debian.org>
    16 License: GPL-2+
    17
    18 License: GPL-2+
    19  This program is free software; you can redistribute it and/or modify
    20  it under the terms of the GNU General Public License as published by
    21  the Free Software Foundation; either version 2 of the License, or
    22  (at your option) any later version.
    23  .
    24  This program is distributed in the hope that it will be useful,
    25  but WITHOUT ANY WARRANTY; without even the implied warranty of
    26  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    27  GNU General Public License for more details.
    28  .
    29  You should have received a copy of the GNU General Public License along
    30  with this program; if not, write to the Free Software Foundation, Inc.,
    31  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    32  .
    33  On Debian systems, the full text of the GNU General Public
    34  License version 2 can be found in the file
    35  '/usr/share/common-licenses/GPL-2'.

(Tôi đã thêm các số dòng.)

Hãy làm theo HOWTO cung cấp bởi ftpmasters và gửi tới debian-devel-announce: http://lists.debian.org/debian-devel-announce/2006/03/msg00023.html.

## 4.3. `changelog`

Đây là tệp yêu cầu, có định dạng đặc biệt được mô tả trong Debian Policy Manual, 4.4 "debian/changelog". Định dạng này được sử dụng bởi dpkg và các chương trình khác để đọc số phiên bản, số sửa đổi, bản phân phối và tính khẩn cấp của gói

Đối với bạn, điều này cũng rất quan trọng vì bạn nên ghi lại tất cả những thay đổi bạn đã làm. Nó sẽ giúp mọi người tải gói của bạn và xem liệu có vấn đề gì với gói mà họ cần biết hay không. Nó sẽ được lưu lại như `/usr/share/doc/gentoo/changelog.Debian.gz` trong gói nhị phân.

dh_make tạo ra tệp mặc định, và nó sẽ trông như sau:

    1  gentoo (0.9.12-1) unstable; urgency=medium
    2
    3   * Initial release. (Closes: #nnnn)  <nnnn is the bug number of your ITP>
    4
    5  -- Josip Rodin <joy-mg@debian.org>  Mon, 22 Mar 2010 00:37:31 +0100
    6

(Tôi đã thêm các số dòng.)

Dòng 1 là tên gói, phiên bản, phân phối và mức độ khẩn cấp. Tên phải khớp với tên gói nguồn; Phân phối nên là `unstable`, và nên cài mức độ khẩn cấp lên medidum (trung bình) trừ khi có bất kỳ lý do cụ thể nào cho giá trị khác.

Dòng 3-5 là một mục thông tin, nơi bạn ghi lại những thay đổi được thực hiện trong bản sửa đổi gói này (không phải là những thay đổi ở thượng nguồn — có một tệp tin đặc biệt cho mục đích đó được tạo ra bởi các tác giả thượng nguồn, mà sau này bạn sẽ cài đặt dưới dạng `/usr/share/doc/gentoo/changelog.gz`). Hãy giả sử báo lỗi ITP (Intent To Package) của bạn có số là `12345`. Các dòng mới chèn trên dòng trên cùng nhất của mục nội dung này và bắt đầu với `*` (dấu sao). Bạn có thể thực hiện điều này với dch(1), bạn có thể chỉnh sửa bằng tay với một trình soạn thảo văn bản theo quy ước định dạng được sử dụng bởi dch(1).

Để ngăn chặn một gói bị vô tình tải lên trước khi hoàn thành gói, bạn nên thay đổi giá trị phân phối thành chưa phát hành `UNRELEASED`.

Bạn sẽ kết thúc với một cái gì đó như thế này:

    1  gentoo (0.9.12-1) UNRELEASED; urgency=low
    2
    3   * Initial Release. Closes: #12345
    4   * This is my first Debian package.
    5   * Adjusted the Makefile to fix $(DESTDIR) problems.
    6
    7  -- Josip Rodin <joy-mg@debian.org>  Mon, 22 Mar 2010 00:37:31 +0100
    8

(Tôi đã thêm các số dòng.)

Khi bạn đã hài lòng với tất cả các thay đổi và ghi lại chúng trong `changelog`, bạn nên thay đổi giá trị phân phối từ `UNRELEASED` sang `unstable` (hoặc ngay cả `experimental`). [36]

Bạn có thể đọc về cập nhật tệp `changelog` tại Chương 8, Cập nhật gói phần mềm.

## 4.4. `rules`

Bây giờ chúng ta cần phải xem xét các quy tắc chính xác mà dpkg-buildpackage(1) sẽ thực sự sử dụng để tạo gói. Tệp này thật sự là tệp `Makefile`, nhưng nó khác với (các) tệp Makefile trong nguồn của thượng nguồn. Và không giống các tệp khác trong thư mục `debian`, đây là tệp thực thi

### 4.4.1. Các target của tệp `rules`

Mọi tệp `rules`, giống bất kỳ `Makefile` khác, bao gồm một vài quy tắc, địng nghĩa nên target và cách nó thực hiện như thế nào. [37] Một quy tắc mới bắt đầu với tuyên bố tên target của nó trong cột đầu tiên. Các dòng theo sau bắt đầu với phím TAB (ASCII 9) để chỉ định công thức thực hiện target đó. Các dòng trống và các dòng bắt đầu với `#` (thăng) được xem là nhận xét và bị bỏ qua. [38]

Một quy tắc mà bạn muốn thực hiện được gọi bởi tên target của nó như là một đối số dòng lệnh. Ví dụ, `debian/rules `build`` và `fakeroot make -f debian/rules `binary`` thực hiện các quy tắc cho các target là ``build`` và ``binary``.

Đây là một giải thích đơn giản của các target

- `clean`: làm sạch tất cả các tệp đã biên dịch, sinh ra và vô ích trong build-tree(Yêu cầu)

- `build`: xây dựng từ mã nguồn thành các chương trình và sinh các tài liệu trong build-tree. (Bắt buộc)

- `build-arch`: xây dựng mã nguồn thành các chuơng trình phụ thuộc vào kiến trúc trong build-tree. (Bắt buộc)

- `build-indep`: xây dựng mã nguổn thành các tài liệu không phụ thuộc và kiến trúc trong build-tree. (Bắt buộc)

- `install`: cài đặt các tệp tin vào hệ thống giả cho mỗi gói nhị phần dưới thư mục `debian`. Nếu địng nghĩa target `binary*` sẽ có hiệu quả phụ thuộc vào target này. (Tuỳ chọn)

- `binary`: tạo tất cả gói nhị phân ( sẽ hiểu quả khi là sự kết hợp của `binary-arch` và `binary-indep` . (Bắt buộc)[39]

- `binary-arch`: tạo các gói nhị phân phụ thuộc (`Architecture: any`) trong thụ mục cha. (Bắt buộc)[40]

- `binary-indep`: để tạo ra các gói nhị phân không phụ thuộc (arch-independent)(`Architecture: all`) trong thu mục cha. (Bắt buộc)[41]

- `get-orig-source`: để lấy phiên bản gần nhất của gói nguồn gốc từ một bản lưu trữ thượng nguồn. (Tuỳ chọn)

Bạn bây giờ có thể bị choáng ngợp, nhưng mọi thứ đơn giản hơn nhiều khi kiểm tra tệp `rules` mà dh_make sử dụng làm mặc định.

### 4.4.2. Tệp `rules` mặc định

Phiên bản dh_make mới nhất tạo một tệp `rules` đơn giản nhưng mạnh mẽ bằng sử dụng lệnh dh:

     1 #!/usr/bin/make -f
     2 # See debhelper(7) (uncomment to enable)
     3 # output every command that modifies files on the build system.
     4 #DH_VERBOSE = 1
     5
     6 # see FEATURE AREAS in dpkg-buildflags(1)
     7 #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
     8
     9 # see ENVIRONMENT in dpkg-buildflags(1)
    10 # package maintainers to append CFLAGS
    11 #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    12 # package maintainers to append LDFLAGS
    13 #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
    14
    15
    16 %:
    17         dh $@

(Tôi đã thêm các số dòng và thêm một số chú thích. Trong tệp tin `rules` thực tế, các ký tự khoảng cách là một mã TAB.)

Có thể bạn đã quen thuộc với các dòng như dòng 1 từ kịch bản shell hay Perl. Nó nói với hệ điều hành rằng tập tin này sẽ được xử lý với `/usr/bin/make`.

Dòng 4 có thể bỏ ghi chú để đặt biến `DH_VERBOSE` thành 1, sao cho các lệnh dh hiển thị các lệnh dh_* được thực hiện. Bạn cũng có thể thêm một dòng `export DH_OPTIONS=-v` ở đây, để mỗi dh_* hiển thị thêm nhiểu kết quả đầu ra mà lệnh được thực hiện như thế nào. Điều này giúp bạn hiểu chính xác điều gì đang xảy ra đằng sau tệp tin đơn giản `rules` này và để gỡ lỗi các vấn đề gặp phải. dh là công cụ mới được thiết kế để trở thành một phần cốt lõi của công cụ `debhelper`, và không che giấu bất cứ điều gì từ bạn.

Các dòng 16 và 17 là nơi mà tất cả công việc được thực hiện với một quy tắc ngầm định sử dụng quy tắc mẫu. Dấu hiệu phần trăm có nghĩa là"bất kỳ mục tiêu" nào, sau đó gọi một chương trình duy nhất, dh, với tên mục tiêu. [42] Lệnh dh là một gói tập lệnh bao gồm các trình tự thích hợp của các chương trình dh_* tùy thuộc vào đối số của nó. [43]

- `debian/rules clean` chạy `dh clean`, chúng bao gồm chạy các lệnh sau:

      dh_testdir
      dh_auto_clean
      dh_clean

- `debian/rules build` chạy `dh build`; chúng bao gồm chạy các lệnh sau:

      dh_testdir
      dh_auto_configure
      dh_auto_build
      dh_auto_test

- `fakeroot debian/rules binary` chạy `fakeroot dh binary`; chúng bao gồm chạy các lệnh sau[44]:

      dh_testroot
      dh_prep
      dh_installdirs
      dh_auto_install
      dh_install
      dh_installdocs
      dh_installchangelogs
      dh_installexamples
      dh_installman
      dh_installcatalogs
      dh_installcron
      dh_installdebconf
      dh_installemacsen
      dh_installifupdown
      dh_installinfo
      dh_installinit
      dh_installmenu
      dh_installmime
      dh_installmodules
      dh_installlogcheck
      dh_installlogrotate
      dh_installpam
      dh_installppp
      dh_installudev
      dh_installwm
      dh_installxfonts
      dh_bugfiles
      dh_lintian
      dh_gconf
      dh_icons
      dh_perl
      dh_usrlocal
      dh_link
      dh_compress
      dh_fixperms
      dh_strip
      dh_makeshlibs
      dh_shlibdeps
      dh_installdeb
      dh_gencontrol
      dh_md5sums
      dh_builddeb

- `fakeroot debian/rules binary-arch` chạy `fakeroot dh binary-arch`; chúng bao gồm chạy các lệnh tương tự như `fakeroot dh binary` nhưng với tuỳ chọn `-a` cho mỗi câu lệnh.

- `fakeroot debian/rules binary-indep` chạy `fakeroot dh binary-indep`; chúng bao gồm hầu hết các lệnh tương tự như `fakeroot dh binary` nhưng trừ các lệnh dh_strip, dh_makeshlibs, và dh_shlibdeps và với tuỳ chọn -i cho mỗi lệnh còn lại.

Các chức năng của lệnh dh_* phần lớn chính là tên của chúng [45] Có một vài điểm nổi bật có thể giải thích một cách đơn giản ở đây là giả sử một môi trường xây dựng điển hình dựa trên một `Makefile`: [46]

- dh_auto_clean thường thực hiện như sau nếu một tệp `Makefile` tồn tại với target là `distclean`. [47]

      make distclean

- dh_auto_configure thường thực hiện như sau nếu `./configure` tồn tại (các đối số được viết tắt cho dễ đọc).

      /configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var ...

- dh_auto_build thường thực hiện target đầu tiền của tệp `Makefile` nếu nó tồn tại.

      make

- dh_auto_test thường thực hiện như sau nếu `Makefile` tồn tại target `test`. [48]

      make test

- dh_auto_installthường thực hiện như sau nếu `Makefile` tồn tại với target `install` (dòng căn chỉnh cho dễ đọc)

      make install \
        DESTDIR=/path/to/package_version-revision/debian/package

Tất cả các target yêu cầu lệnh fakeroot sẽ được chứa dh_testroot, nó sẽ xuất hiện lỗi nếu bạn không sử dụng lệnh này để giả vờ là root.

Phần quan trọng cần biết là tệp `rules` được tạo bởi dh_make và nó chỉ là một đề xuất. Nó sẽ làm việc cho hầu hết các gói nhưng đối với những thứ phức tạp hơn, đừng ngại tùy chỉnh nó để phù hợp với nhu cầu của bạn.

Mặc dù `install` không phải là target bắt buộc, nó hỗ trợ. `fakeroot dh install` hành động như `fakeroot dh binary` nhưng dừng lại sau dh_fixperms.

### 4.4.3. Tuỳ chỉnh tệp `rules`

Có nhiều cách để tuỳ chỉnh tệp `rules` đã được tạo ra bởi lệnh dh

Lệnh `dh $@` có thể được tuỳ chỉnh như sau: [49]

- Thêm lệnh hỗ trợ dh_python2. (Tuỳ chọn tốt nhất cho Python.) [50]

  - Bao gồm gói `python` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with python2`.

  - Việc này xử lý các mô-đun Python sử dụng framework `python`

- Thêm lệnh hỗ trợ dh_pysupport.

  - Bao gồm gói `python-support` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with pysupport`

  - Việc này xử lý các mô-đun Python sử dụng framework `python-support`

- Thêm lệnh hỗ trợ dh_pycentral. (không dùng nữa)

  - Bao gồm gói `python-central` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with python-central`

  - Nó cũng bỏ kích hoạt lệnh dh_pysupport

  - Việc này xử lý các mô-đun Python sử dụng framework `python-central`

- Thêm lệnh hỗ trợ dh_installtex

  - Bao gồm gói `tex-common` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with tex`

  - Thao tác này sẽ đăng ký các phông chữ Loại 1, các mẫu phân đoạn và các định dạng với TeX.

- Thêm 2 lệnh hỗ trợ dh_quilt_patch và dh_quilt_unpatch

  - Bao gồm gói `quilt` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with quilt`

  - Nó áp dụng và bỏ áp dụng các bản vá cho mã nguồn ở thượng nguồn từ các tệp tin trong thư mục `debian/patches` cho gói nguồn với định dạng `1.0`.

  - Điều này là không cần thiết nếu bạn sử dụng định dạng gói nguồn mới `3.0 (quilt)`.

- Thêm lệnh hỗ trợ dh_dkms

  - Bao gồm gói `dkms` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with dkms`

  - Điều này xử lý chính xác việc sử dụng DKMS của gói mô-đun hạt nhân.

- Thêm lệnh hỗ trợ dh_autotools-dev_updateconfig và dh_autotools-dev_restoreconfig.

  - Bao gồm gói `autotools-dev` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with autotools-dev`

  - Việc này cập nhật và khôi phục tệp `config.sub` và `config.guess`.

- Thêm lệnh hỗ trợ dh_autoreconf và dh_autoreconf_clean.

  - Bao gồm gói `dh-autoreconf` package in `Build-Depends`.

  - Sử dụng `dh $@ --with autoreconf`.

  - Nó cập nhật các tệp GNU Build System và khôi phục chúng sau khi xây dựng.

- Thêm lệnh hỗ trợ dh_girepository.

  - Bao gồm gói `gobject-introspection` trong trường `Build-Depends`.

  - Use `dh $@ --with gir`.

  - Điều này tính toán các gói phụ thuộc cho các gói truyền dữ liệu đối tượng GObject và tạo ra tên các gói thay thế cho `${gir:Depends}`

- Thêm hỗ trợ cho tính năng gõ nhanh trong bash

  - Bao gồm gói `bash-completion` trong trường `Build-Depends`.

  - Sử dụng `dh $@ --with bash-completion`

  - Cài đặt bash completions sử dụng một tệp cấu hình tại `debian/`package`.bash-completion`.

Nhiều lệnh dh_* được gọi từ dh mới có thể tuỳ chỉnh các tệp cấu hình tương ứng trong thư mục `debian`. Xem Chương 5, Các tệp khác trong thư mục `debian` và sách hướng dẫn của mỗi lệnh cho việc tùy chỉnh tính năng như vậy.

Bạn có thể cần phải chạy lệnh dh_* được gọi qua dh mới với các đối số được thêm vào, hoặc để chạy các lệnh bổ sung với chúng, hoặc bỏ qua chúng. Đối với các trường hợp như vậy, bạn tạo một target mới là `override_dh_`foo`` bằng quy tắc của nó trong tệp `rules` địng nghĩa một target `override_dh_`foo`` cho lệnh dh_`foo` bạn muốn thay đổi. Về cơ bản có nghĩa là chạy tôi thay vì mặc định. [51]

Xin lưu ý rằng các lệnh dh_auto_* có xu hứng làm nhiều hơn những gì đã giải thích một cách đơn giản ở đây nhằm có thể quản lý toàn bộ trường hợp có thể xảy ra. Nó sẽ là một ý tưởng tồi để sử dụng các target `override_dh_*` để thay thế các lệnh tương đương đã đơn giản hoá (ngoại trừ target `override_dh_auto_clean` target) vì nó có thể bỏ qua những tính năng thông minh từ gói `debhelper` features.

Ví dụ: Nếu bạn muốn lưu dữ liệu cấu hình hệ thống vào thư mục `/etc/gentoo` thay vì thư mục cha `/etc` cho gói `gentoo` hãy sử dụng Autotools, bạn có thể viết đè đối số mặc định `--sysconfig=/etc` được sử dụng bởi lệnh dh_auto_configuređể chaỵ lệnh ./configure như sau:

    override_dh_auto_configure:
            dh_auto_configure -- --sysconfig=/etc/gentoo

Các đối số được truyền vào `--` sẽ được nối vào đối số mặc định của chương trình "tự động-thực hiện" để ghi đè chúng. Sử dụng lệnh dh_auto_configure sẽ tốt hơn so với việc trực tiếp gọi lệnh ./configure ở đây vì nó sẽ chỉ ghi đè đối số `--sysconfig` mà giữ lại bất kỳ đối số hữu ích nào khác cho lệnh ./configure .

Nếu tệp `Makefile` trong mã nguồn của gói `gentoo` yêu cầu bạn chỉ định target `build` là target để xây dựng chương trình đó [52], bạn có thể tạo một target `override_dh_auto_build` để kích hoạt điều này.

    override_dh_auto_build:
            dh_auto_build -- build

Điều này đảm bảo `$(MAKE)` được chạy với tất cả các đối số mặc định được cung cấp bởi lệnh dh_auto_build cộng với đối số `build`.

Nếu tệp `Makefile` trong mã nguồn cho `gentoo` yêu cầu bạn chỉ định target `packageclean` để làm sạch môi trường xây dựng cho gói Debian package thay vì sử dụng `distclean` hoặc `clean`, bạn có thể tạo một target `override_dh_auto_clean` để kích hoạt chúng.

    override_dh_auto_clean:
            $(MAKE) packageclean

Nếu tệp `Makefile` trong mã nguồn cho `gentoo` chứa một target `test` mà bạn không muốn chạy nó trong quá trình xây dựng gói Debian, bạn có thể sử dụng một target `override_dh_auto_test` trống để bỏ qua nó.

    override_dh_auto_test:

Nếu `gentoo` có chứa changelog từ thượng nguồn khác thường như tệp `FIXES`, dh_installchangelogs mặc định sẽ không cài đặt tệp này. Lệnh dh_installchangelogs yêu cầu `FIXES` như là đối số của nó để cài đặt tệp này. [53]

    override_dh_installchangelogs:
            dh_installchangelogs FIXES

Khi bạn sử dụng lệnh dh mới, hãy sử dụng các target rõ ràng được liệt kê trong Phần 4.4.1, “Các target của tệp `rules`”, khác với target `get-orig-source` , có thể khó khăn để hiểu được chính xác hiệu quả. Vui lòng hạn chế target rõ ràng đối với các target `override_dh_*` và các target độc lập, nếu có thể.

[27] Trong chương này, các tệp tin trong thư mục `debian` được đề cập đến mà không có `debian/` để đơn giản hóa bất cứ khi nhắc tới.

[28] Xem Debian Policy Manual, 2.4 "Sections" và List of sections in `sid`.

[29] Xem Debian Policy Manual, 2.5 "Priorities".

[30] Xem Debian Policy Manual, 7.7 "Relationships between source and binary packages - Build-Depends, Build-Depends-Indep, Build-Conflicts, Build-Conflicts-Indep".

[31] Tình huống này hơi lạ là một tính năng được ghi lại trong Debian Policy Manual, Footnotes 55. Đây không phải là do sử dụng lệnh dh trong tệp tin `debian/rules` nhưng do cách dpkg-buildpackage làm việc. Tình huống tương tự cũng áp dụng cho hệ thống xây dựng tự động cho Ubuntu.

[32] Xem Debian Policy Manual, 5.6.8 "Architecture" để biết chi tiết.

[33] Xem Debian Policy Manual, 7 "Declaring relationships between packages".

[34] Những mô tả này bằng tiếng Anh. Các bản dịch về các mô tả này được cung cấp bởi The Debian Description Translation Project - DDTP.

[35] Xem Debian Developer's Reference, 6.2.5. "Version Control System location".

[36] Nếu bạn sử dụng lệnh `dch -r` để tạo thay đổi cuối này, vui lòng đảm bảo bạn đã lưu tệp `changelog` một cách rõ ràng bởi trình soạn thảo

[37] Bạn có thể bắt đầu học cách viết `Makefile` từ Debian Reference, 12.2. "Make". Tài liệu khả dụng như http://www.gnu.org/software/make/manual/html_node/index.html hoặc như gói `make-doc` trong `non-free`.

[38] Debian Policy Manual, 4.9 "Main building script: debian/rules" giải thích chi tiết.

[39] Target này được sử dụng bởi `dpkg-buildpackage` như trong Phần 6.1, “(Tái) biên dịch toàn bộ”.

[40] Target này được sử dụng bởi `dpkg-buildpackage -B` như trọng Phần 6.2, “Tự động biên dịch”.

[41] Target này được sử dụng bởi `dpkg-buildpackage -A`.

[42] Thao tác này sử dụng tính năng mới của `debhelper` v7+. Các khái niệm thiết kế của nó được giải thích tại Not Your Grandpa's Debhelper được trình bày ở DebConf9 bởi tác giả `debhelper`. Từ phiên bản `lenny`, dh_make đã tạo ra một tệp `rules` phức tạp hơn nhiều với các quy tắc và nhiều kịch bản dh_* cho mỗi quy tắc, hầu hết trong số chúng hiện không cần thiết (và hiểu thị tuổi của gói). Lệnh dh mới đơn giản và giải phóng chúng ta khỏi các công việc thường xuyên làm "thủ công". Bạn vẫn có đủ sức mạnh để tùy biến quá trình với các target là `override_dh_*`. Xem Phần 4.4.3, “Tuỳ chỉnh tệp `rules`”. Nó chỉ dựa trên gói `debhelper` và không làm xáo trộn tiến trình xây dựng gói như cách mà gói `cdbs` có xu hướng.

[43] You can verify the actual sequences of dh_* programs invoked for a given ``target`` without really running them by invoking `dh `target` --no-act` or `debian/rules -- '`target` --no-act'`.

[44] Ví dụ sau đây giả định tệp `debian/compat` của bạn có một giá trị bằng hoặc lớn hơn 9 để tránh gọi bất kỳ câu lệnh hỗ trợ từ python tự động.

[45] Để có thông tin đầy đủ về những gì các tập lệnh dh_* thực hiện chính xác, và các tùy chọn khác của chúng là gì, vui lòng đọc các trang hướng dẫn tương ứng và tài liệu `debhelper`.

[46] Các lệnh hỗ trợ các môi trường xây dựng khác như `setup.py` có thể được liệt kê bằng cách thực thi `dh_auto_build --list` trong thư mục mã nguồn gói.

[47] Nó thực sự tìm kiếm target có sẵn đầu tiên trong `Makefile` trong số `distclean`, `realclean`, hoặc `clean`, và thực hiện điều đó.

[48] Nó thực sự tìm kiếm target đầu tiên có sẵn trong tệp `Makefile` trong số `test` hoặc `check`, và thực hiện nó.

[49] Nếu một gói cài đặt tệp với đường dẫn `/usr/share/perl5/Debian/Debhelper/Sequence/`custom_name`.pm`, bạn nên kích hoạt chức năng tuỳ chỉnh của nó bằng `dh $@ --with `custom-name``.

[50] Việc sử dụng dh_python2 được yêu thích hơn là sử dụng dh_pysupport và dh_pycentral. Đừng sử dụng dh_python

[51] Trong phiên bản `lenny`, nếu bạn muốn thay đổi hành vi của một tập lệnh dh_*, bạn sẽ phải tìm thấy dòng liên quan trong `rules` và tự điều chỉnh nó.

[52] dh_auto_build với không có đối số sẽ thực hiện target đầu tiên trong tệp `Makefile`.

[53] Các tệp tin `debian/changelog` và `debian/NEWS` luôn luôn được cài đặt tự động. Lịch sử sửa đổi của thượng nguồn được tìm thấy được chuyển thành tệp chữ thường `changelog`, `changes`, `changelog.txt`, và `changes.txt`.

Chương 3. Sửa đổi mã nguồn |  | Chương 5. Các tệp khác trong thư mục `debian`