Mục lục
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 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.)
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
và build
fakeroot make -f
debian/rules
thực hiện các quy
tắc cho các target là binary
và
build
.
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.
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_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_
bằng quy tắc
của nó trong tệp foo
rules
địng nghĩa một target
override_dh_
cho lệnh
dh_foo
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.
[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.
[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
.
[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] 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
mà không thật sự chạy
chúng bởi gọi target
dh --no-act
hoặc target
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/
,
bạn nên kích hoạt chức năng tuỳ chỉnh của nó bằng custom_name
.pmdh $@ --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
.