X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=best-pkging-practices.dbk;h=1800e063165ff10b88f6b347fec337e6593d3c92;hb=a80ba75ffa8c6486c2280bd40f2071dd6550a650;hp=e91c78d92059dd1a1b95c111d0a8db7c25297347;hpb=d83ad0ef98fc97553ef37b7a9e1fe63f7d16096f;p=developers-reference.git diff --git a/best-pkging-practices.dbk b/best-pkging-practices.dbk index e91c78d..1800e06 100644 --- a/best-pkging-practices.dbk +++ b/best-pkging-practices.dbk @@ -34,7 +34,7 @@ usually the file maintainers spend the most time on. The rationale for using helper scripts in debian/rules is that they let maintainers use and share common logic among many packages. Take for instance the question of installing menu entries: you need to put the file -into /usr/lib/menu (or /usr/lib/menu +into /usr/share/menu (or /usr/lib/menu for executable binary menufiles, if this is needed), and add commands to the maintainer scripts to register and unregister the menu entries. Since this is a very common thing for packages to do, why should each maintainer rewrite all @@ -101,22 +101,24 @@ separating the patches into several files. Nevertheless, there are ways to separate patches: the patch files are shipped within the Debian patch file (.diff.gz), usually within the debian/ directory. The only difference is that they -aren't applied immediately by dpkg-source, but by the build -rule of debian/rules. Conversely, they are reverted in -the clean rule. +aren't applied immediately by dpkg-source, +but by the build +rule of debian/rules, +through a dependency on the patch rule. +Conversely, they are reverted in +the clean rule, +through a dependency on the unpatch rule. -dbs is one of the more popular approaches to this. It does -all of the above, and provides a facility for creating new and updating old -patches. See the package dbs for more -information and hello-dbs for an -example. +quilt is the recommended tool for this. +It does all of the above, and also allows to manage patch series. +See the +quilt package for more information. -dpatch also provides these facilities, but it's intended to -be even easier to use. See the package dpatch for documentation and examples (in -/usr/share/doc/dpatch). +There are other tools to manage patches, like dpatch, +and the patch system integrated with +cdbs. @@ -210,41 +212,50 @@ along to &email-debian-l10n-english; and request feedback.
The package synopsis, or short description -The synopsis line (the short description) should be concise. It must not -repeat the package's name (this is policy). +Policy says the synopsis line (the short description) must be concise, not +repeating the package name, but also informative. -It's a good idea to think of the synopsis as an appositive clause, not a full -sentence. An appositive clause is defined in WordNet as a grammatical relation -between a word and a noun phrase that follows, e.g., Rudolph the red-nosed -reindeer. The appositive clause here is red-nosed reindeer. Since the -synopsis is a clause, rather than a full sentence, we recommend that it neither -start with a capital nor end with a full stop (period). It should also not -begin with an article, either definite (the) or indefinite (a or an). - - -It might help to imagine that the synopsis is combined with the package name in -the following way: +The synopsis functions as a phrase describing the package, not a complete +sentence, so sentential punctuation is inappropriate: it does not need extra +capital letters or a final period (full stop). It should also omit any initial +indefinite or definite article - "a", "an", or "the". Thus for instance: -package-name is a synopsis. +Package: libeg0 +Description: exemplification support library -Alternatively, it might make sense to think of it as +Technically this is a noun phrase minus articles, as opposed to a verb phrase. +A good heuristic is that it should be possible to substitute the package name +and synopsis into this formula: - -package-name is synopsis. - -or, if the package name itself is a plural (such as developers-tools) +The package name provides {a,an,the,some} +synopsis. + + +Sets of related packages may use an alternative scheme that divides the +synopsis into two parts, the first a description of the whole suite and the +second a summary of the package's role within it: -package-name are synopsis. +Package: eg-tools +Description: simple exemplification system (utilities) + +Package: eg-doc +Description: simple exemplification system - documentation -This way of forming a sentence from the package name and synopsis should be -considered as a heuristic and not a strict rule. There are some cases where it -doesn't make sense to try to form a sentence. +These synopses follow a modified formula. Where a package +"name" has a synopsis +"suite (role)" or +"suite - role", the +elements should be phrased so that they fit into the formula: + + +The package name provides {a,an,the} +role for the suite.
@@ -548,21 +559,24 @@ inserting the title of each different bug.
Supplementing changelogs with NEWS.Debian files -Important news about changes in a package can also be put in NEWS.Debian files. +Important news about changes in a package can also be put in +NEWS.Debian files. The news will be displayed by tools like apt-listchanges, before all the rest of the changelogs. This is the preferred means to let the user know about significant changes in a package. It is better than using debconf notes since -it is less annoying and the user can go back and refer to the NEWS.Debian file -after the install. And it's better than listing major changes in -README.Debian, since the user can easily miss such notes. +it is less annoying and the user can go back and refer to the +NEWS.Debian file after the install. And it's better than listing +major changes in README.Debian, since the user can easily +miss such notes. The file format is the same as a debian changelog file, but leave off the asterisks and describe each news item with a full paragraph when necessary rather than the more concise summaries that would go in a changelog. It's a -good idea to run your file through dpkg-parsechangelog to check its formatting -as it will not be automatically checked during build as the changelog is. Here -is an example of a real NEWS.Debian file: +good idea to run your file through dpkg-parsechangelog to +check its formatting as it will not be automatically checked during build as +the changelog is. Here is an example of a real NEWS.Debian + file: cron (3.0pl1-74) unstable; urgency=low @@ -575,16 +589,18 @@ cron (3.0pl1-74) unstable; urgency=low -- Steve Greenland <stevegr@debian.org> Sat, 6 Sep 2003 17:15:03 -0500 -The NEWS.Debian file is installed as -/usr/share/doc/<package>/NEWS.Debian.gz. It is compressed, and always -has that name even in Debian native packages. If you use debhelper, -dh_installchangelogs will install debian/NEWS files for you. +The NEWS.Debian file is installed as +/usr/share/doc/package/NEWS.Debian.gz. +It is compressed, and always has that name even in Debian native packages. +If you use debhelper, dh_installchangelogs + will install debian/NEWS files for you. -Unlike changelog files, you need not update NEWS.Debian files with every -release. Only update them if you have something particularly newsworthy that -user should know about. If you have no news at all, there's no need to ship a -NEWS.Debian file in your package. No news is good news! +Unlike changelog files, you need not update NEWS.Debian +files with every release. Only update them if you have something particularly +newsworthy that user should know about. If you have no news at all, there's no +need to ship a NEWS.Debian file in your package. No news +is good news!
@@ -746,34 +762,53 @@ translated by translation teams or even individuals. Please use gettext-based templates. Install po-debconf on your development system and read its -documentation (man po-debconf is a good start). +documentation (man po-debconf is a good start). Avoid changing templates too often. Changing templates text induces more work -to translators which will get their translation fuzzied. If you plan changes -to your original templates, please contact translators. Most active +to translators which will get their translation fuzzied. A fuzzy translation is +a string for which the original changed since it was translated, therefore +requiring some update by a translator to be usable. When changes are small +enough, the original translation is kept in PO files but marked as +fuzzy. + + +If you plan to do changes +to your original templates, please use the notification system provided with +the po-debconf package, namely the +podebconf-report-po, to contact translators. Most active translators are very responsive and getting their work included along with your modified templates will save you additional uploads. If you use gettext-based -templates, the translator's name and e-mail addresses are mentioned in the po -files headers. +templates, the translator's name and e-mail addresses are mentioned in the PO +files headers and will be used by +podebconf-report-po. -The use of the podebconf-report-po from the po-debconf -package is highly recommended to warn translators which have incomplete -translations and request them for updates. +A recommended use of that utility is: + +cd debian/po && podebconf-report-po --languageteam --withtranslators --call --deadline="+10 days" + +This command will first synchronize the PO and POT files in debian/po with +the templates files listed in debian/po/POTFILES.in. +Then, it will send a call for translation updates to the language team +(mentioned in the Language-Team field of each PO file) +as well as the last translator (mentioned in +Last-translator). Finally, it will also send a call for +new translations, in the &email-debian-i18n; mailing list. + + +Giving a deadline to translators is always appreciated, so that they can +organize their work. Please remember that some translation teams have a +formalized translate/review process and a delay lower than 10 days is +considered as unreasonable. A shorter delay puts too much pressure on translation +teams and should be kept for very minor changes. If in doubt, you may also contact the translation team for a given language (debian-l10n-xxxxx@&lists-host;), or the &email-debian-i18n; mailing list. - -Calls for translations posted to &email-debian-i18n; with the -debian/po/templates.pot file attached or referenced in a -URL are encouraged. Be sure to mentions in these calls for new translations -which languages you have existing translations for, in order to avoid duplicate -work. -
@@ -782,15 +817,89 @@ work. When the text of a debconf template is corrected and you are sure that the change does not affect translations, please be kind to translators -and unfuzzy their translations. +and unfuzzy their translations. If you don't do so, the whole template will not be translated as long as a translator will send you an update. -To unfuzzy translations, you can proceed the -following way: +To unfuzzy translations, you can use two methods. The first +method does preventive search and replace actions in the +PO files. The latter uses gettext utilities to unfuzzy +strings. + + +Preventive unfuzzy method: + + + + +Try finding a complete translation file before +the change: + +for i in debian/po/*po; do echo -n $i: ; msgfmt -o /dev/null +--statistics $i; done + +The file only showing translated items will be used +as the reference file. If there is none (which should not happen if you take +care to properly interact with translators), you should use the file +with the most translated strings. + + + + +Identify the needed change. In this example, let's assume the change is about +fixing a typo in the word typo which was inadvertently +written as tpyo. Therefore, the change is +s/tpyo/typo. + + + + +Check that this change is only applied to the place where you really intend +to make it and not in any other place +where the original string is appropriate. This specifically applies to +change in punctuation, for instance. + + + + +Modify all PO files by using sed. The use of that command +is recommended over any text editor to guarantee that the files encoding will +not be broken by the edit action. + + +cd debian/po +for i in *.po; do sed -i 's/tpyo/typo/g' $i; done + + + + +Change the debconf template file to fix the typo. + + + + +Run debconf-updatepo + + + + +Check the foo.po reference file. Its statistics should +not be changed: + + +msgfmt -o /dev/null --statistics debian/po/foo.po + + + +If the file's statistics changed, you did something wrong. Try again +or ask for help on the &email-debian-i18n; mailing list. + + + +Gettext utilities method: @@ -845,7 +954,7 @@ run debconf-updatepo again Do not make assumptions about interfaces Templates text should not make reference to widgets belonging to some debconf -interfaces. Sentences like If you answer Yes... have no meaning for users of +interfaces. Sentences like If you answer Yes... have no meaning for users of graphical interfaces which use checkboxes for boolean questions. @@ -863,12 +972,12 @@ facts.
Do not use first person -You should avoid the use of first person (I will do this... or We -recommend...). The computer is not a person and the Debconf templates do not +You should avoid the use of first person (I will do this... or We +recommend...). The computer is not a person and the Debconf templates do not speak for the Debian developers. You should use neutral construction. Those of you who already wrote scientific publications, just write your templates -like you would write a scientific paper. However, try using action voice if -still possible, like Enable this if ... instead of This can be enabled if .... +like you would write a scientific paper. However, try using active voice if +still possible, like Enable this if ... instead of This can be enabled if....
@@ -920,7 +1029,36 @@ yes/no... A choice between one of a number of values. The choices must be specified in a field named 'Choices'. Separate the possible values with commas and spaces, -like this: Choices: yes, no, maybe +like this: Choices: yes, no, maybe. + + +If choices are translatable strings, the 'Choices' field may be marked as +translatable by using __Choices. The double underscore will split out +each choice in a separate string. + + +The po-debconf system also offers interesting possibilities +to only mark some choices as translatable. +Example: + + +Template: foo/bar +Type: Select +#flag:translate:3 +__Choices: PAL, SECAM, Other +_Description: TV standard: + Please choose the TV standard used in your country. + + +In that example, only the 'Other' string is translatable while others +are acronyms that should not be translated. The above allows only +'Other' to be included in PO and POT files. + + +The debconf templates flag system offers many such possibilities. The + +po-debconf 7 + manual page lists all these possibilities.
@@ -1163,7 +1301,7 @@ the _DefaultChoice trick. This special field allow translators to put the most appropriate choice according to their own language. It will become the default choice when their -language is used while your own mentioned Default Choice will be used chan +language is used while your own mentioned Default Choice will be used when using English. @@ -1485,8 +1623,9 @@ sections, to hunt down unused libraries. But when passed the right argument, it tries to catch other useless packages. -For example, with --guess-dummy, deborphan tries to search all transitional -packages which were needed for upgrade but which can now safely be removed. +For example, with --guess-dummy, deborphan +tries to search all transitional packages which were needed for upgrade but +which can now safely be removed. For that, it looks for the string dummy or transitional in their short description. @@ -1508,7 +1647,7 @@ upstream source. Pristine source The defining characteristic of a pristine source tarball is that the -.orig.tar.gz file is byte-for-byte identical to a tarball officially +.orig.tar.gz file is byte-for-byte identical to a tarball officially distributed by the upstream author. We cannot prevent upstream authors from changing the tarball they distribute without also incrementing the version number, so there can be no guarantee that a pristine @@ -1516,9 +1655,9 @@ tarball is identical to what upstream currently distributing at any point in time. All that can be expected is that it is identical to something that upstream once did distribute. If a difference arises later (say, if upstream notices that he wasn't using -maximal comression in his original distribution and then -re-gzips it), that's just too bad. Since there is no good -way to upload a new .orig.tar.gz for the same version, there is not even any +maximal compression in his original distribution and then +re-gzips it), that's just too bad. Since there is no good +way to upload a new .orig.tar.gz for the same version, there is not even any point in treating this situation as a bug. This makes it possible to use checksums to easily verify that all changes between Debian's version and upstream's are contained in the Debian diff. Also, if the original @@ -1572,12 +1711,12 @@ gzipped tar at all, or if upstream's tarball contains non-DFSG-free material that you must remove before uploading. -In these cases the developer must construct a suitable .orig.tar.gz file -himself. We refer to such a tarball as a repackaged upstream source. Note -that a repackaged upstream source is different from a Debian-native package. A -repackaged source still comes with Debian-specific changes in a separate -.diff.gz and still has a version number composed of -<upstream-version> and +In these cases the developer must construct a suitable .orig.tar.gz + file himself. We refer to such a tarball as a repackaged upstream +source. Note that a repackaged upstream source is different from a +Debian-native package. A repackaged source still comes with Debian-specific +changes in a separate .diff.gz and still has a version +number composed of <upstream-version> and <debian-revision>. @@ -1590,13 +1729,14 @@ archive. Use your own discretion here, but be prepared to defend your decision if you repackage source that could have been pristine. -A repackaged .orig.tar.gz +A repackaged .orig.tar.gz -must contain detailed information how the -repackaged source was obtained, and how this can be reproduced in the +should be documented in the resulting source package. +Detailed information on how the repackaged source was obtained, +and on how this can be reproduced should be provided in debian/copyright. It is also a good idea to provide a get-orig-source target in your debian/rules file that repeats the process, as described @@ -1612,8 +1752,7 @@ come from the upstream author(s), or whose contents has been changed by you. As a special exception, if the omission of non-free files would lead to the source failing to build without assistance from the Debian diff, it might be appropriate to instead edit the files, omitting only the -non-free parts of them, and/or explain the situation in a README.Debian-source - +non-free parts of them, and/or explain the situation in a README.source file in the root of the source tree. But in that case please also urge the upstream author to make the non-free components easier seperable from the rest of the source. @@ -1724,25 +1863,26 @@ example, debugging symbols for /usr/bin/foo go in /usr/lib/debug/usr/lib/libfoo.so.1. -The debugging symbols can be extracted from an object file using objcopy ---only-keep-debug. Then the object file can be stripped, and objcopy ---add-gnu-debuglink used to specify the path to the debugging symbol file. +The debugging symbols can be extracted from an object file using +objcopy --only-keep-debug. Then the object file can be stripped, +and objcopy --add-gnu-debuglink used to specify the path +to the debugging symbol file. objcopy 1 explains in detail how this works. -The dh_strip command in debhelper supports creating debug packages, and can -take care of using objcopy to separate out the debugging symbols for you. If -your package uses debhelper, all you need to do is call dh_strip ---dbg-package=libfoo-dbg, and add an entry to debian/control for the debug -package. +The dh_strip command in debhelper supports creating debug +packages, and can take care of using objcopy to separate +out the debugging symbols for you. If your package uses debhelper, all you +need to do is call dh_strip --dbg-package=libfoo-dbg, and +add an entry to debian/control for the debug package. -Note that the Debian package should depend on the package that it provides +Note that the debug package should depend on the package that it provides debugging symbols for, and this dependency should be versioned. For example: -Depends: libfoo-dbg (= ${binary:Version}) +Depends: libfoo (= ${binary:Version})