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

Mục lục

4.1. control
4.2. copyright
4.3. changelog
4.4. rules
4.4.1. Các target của tệp rules
4.4.2. Tệp rules mặc định
4.4.3. Tuỳ chỉnh tệp rules

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]

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 controldh_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ư gccmake 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, ProvidesReplaces.

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. aptitudeapt-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. dpkgapt-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.)

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.

Bạn phải điền thông tin còn thiếu để hoàn thành tệp này, chẳng hạn như nơi tạo ra gói ,thông báo bản quyền thực tế, và giấy phép. Đối với một số giấy phép phần mềm tự do thông thường (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, hoặc Artistic license), bạn chỉ cần tham khảo các tệp thích hợp trong thư mục /usr/share/common-licenses/ tồn tại trên bất kỳ hệ thống Debian. Nếu không, bạn phải bao gồm giấy phép đầy đủ.

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.

Đâ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.

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

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 buildfakeroot make -f debian/rules binary thực hiện các quy tắc cho các target là buildbinary.

Đâ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-archbinary-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 rulesdh_make sử dụng làm 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.

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_patchdh_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_updateconfigdh_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.subconfig.guess.

  • Thêm lệnh hỗ trợ dh_autoreconfdh_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.

[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.

[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.

[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.

[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] Bạn có thể xác minh trình tự thực tế của các chương trình dh_* bằng gọi một target mà không thật sự chạy chúng bởi gọi dh --no-act target hoặc debian/rules -- '--no-act target'.

[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_pysupportdh_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/changelogdebian/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.