/usr/share/doc/maint-guide-zh-cn/html/first.zh-cn.html is in maint-guide-zh-cn 1.2.40.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 | <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>第 2 章 第一步</title>
<link rel="stylesheet" type="text/css" href="debian.css"/>
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="home" href="index.zh-cn.html" title="Debian 新维护者手册"/>
<link rel="up" href="index.zh-cn.html" title="Debian 新维护者手册"/>
<link rel="prev" href="start.zh-cn.html" title="第 1 章 正确的起点"/>
<link rel="next" href="modify.zh-cn.html" title="第 3 章 修改源代码"/>
</head>
<body>
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">第 2 章 第一步</th>
</tr>
<tr>
<td align="left"><a accesskey="p" href="start.zh-cn.html"><img src="images/prev.png" alt="上一页"/></a> </td>
<th width="60%" align="center"> </th>
<td align="right"> <a accesskey="n" href="modify.zh-cn.html"><img src="images/next.png" alt="下一页"/></a></td>
</tr>
</table>
<hr/>
</div>
<div class="chapter">
<div class="titlepage">
<div>
<div>
<h1 class="title"><a id="first"/>第 2 章 第一步</h1>
</div>
</div>
</div>
<div class="toc">
<p>
<strong>目录</strong>
</p>
<dl class="toc">
<dt>
<span class="section">
<a href="first.zh-cn.html#workflow">2.1. Debian 软件包制作流程</a>
</span>
</dt>
<dt>
<span class="section">
<a href="first.zh-cn.html#choose">2.2. 挑一个你喜欢的程序</a>
</span>
</dt>
<dt>
<span class="section">
<a href="first.zh-cn.html#getit">2.3. 获取程序并试用</a>
</span>
</dt>
<dt>
<span class="section">
<a href="first.zh-cn.html#simplemake">2.4. 简单的编译系统</a>
</span>
</dt>
<dt>
<span class="section">
<a href="first.zh-cn.html#portable">2.5. 常见的可移植编译系统</a>
</span>
</dt>
<dt>
<span class="section">
<a href="first.zh-cn.html#namever">2.6. 软件包名称和版本</a>
</span>
</dt>
<dt>
<span class="section">
<a href="first.zh-cn.html#dh-make">2.7. 设置 <span class="command"><strong>dh_make</strong></span></a>
</span>
</dt>
<dt>
<span class="section">
<a href="first.zh-cn.html#non-native-dh-make">2.8. 初始化外来 Debian 软件包</a>
</span>
</dt>
</dl>
</div>
<p>
让我们来创建一个自己的软件包 (更好的是,“领养”一个已存在的软件包)。
</p>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="workflow"/>2.1. Debian 软件包制作流程</h2>
</div>
</div>
</div>
<p>
如果你的工作基于某个上游程序,那么典型的 Debian 软件包制作流程就会需要如下几个特定的文件:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>获取一份上游软件的拷贝,它通常为压缩过的 tar 格式。</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal"><em class="replaceable"><code>package</code></em>-<em class="replaceable"><code>version</code></em>.tar.gz</code>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p>
在上游源码的 <code class="filename">debian</code> 目录下添加 Debian 打包的专用文件 (构建 Debian
软件包它们会被读取),同时以 <code class="literal">3.0 (quilt)</code> 格式创建一个非本地源码包。
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal"><em class="replaceable"><code>package</code></em>_<em class="replaceable"><code>version</code></em>.orig.tar.gz</code>
</li>
<li class="listitem">
<code class="literal"><em class="replaceable"><code>package</code></em>_<em class="replaceable"><code>version</code></em>-<em class="replaceable"><code>revision</code></em>.debian.tar.gz</code>
<a href="#ftn.idm438" class="footnote" id="idm438">
<sup class="footnote">[4]</sup>
</a>
</li>
<li class="listitem">
<code class="literal"><em class="replaceable"><code>package</code></em>_<em class="replaceable"><code>version</code></em>-<em class="replaceable"><code>revision</code></em>.dsc</code>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p>
用 Debian 源码包构建 Debian 二进制包;这些二进制包的格式通常是<code class="literal">.deb</code> (或者
<code class="literal">.udeb</code>,Debian Installer 专用)
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal"><em class="replaceable"><code>package</code></em>_<em class="replaceable"><code>version</code></em>-<em class="replaceable"><code>revision</code></em>_<em class="replaceable"><code>arch</code></em>.deb</code>
</li>
</ul>
</div>
</li>
</ul>
</div>
<p>
请注意一个细节,在 Debian 软件包的文件名中,分隔
<code class="literal"><em class="replaceable"><code>package</code></em></code> 和
<code class="literal"><em class="replaceable"><code>version</code></em></code> 的字符从 tarball 名称中的
<code class="literal">-</code> (连字符)换成了 <code class="literal">_</code> (下划线)。
</p>
<p>
在上述的文件名中,请根据 Debian Policy,将
<code class="literal"><em class="replaceable"><code>package</code></em></code> 这个部分替换为 <span class="strong"><strong>package name</strong></span>, 将
<code class="literal"><em class="replaceable"><code>version</code></em></code> 这个部分替换为 <span class="strong"><strong>upstream version</strong></span>,
将<code class="literal"><em class="replaceable"><code>revision</code></em></code> 这个部分替换为 <span class="strong"><strong>Debian revision</strong></span>,以及将
<code class="literal"><em class="replaceable"><code>arch</code></em></code> 这个部分替换为 <span class="strong"><strong>package architecture</strong></span>。 <a href="#ftn.idm481" class="footnote" id="idm481"><sup class="footnote">[5]</sup></a>
</p>
<p>
本概要中的每一步,我们都会在后续的章节中辅以详细的例子进行解释。
</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="choose"/>2.2. 挑一个你喜欢的程序</h2>
</div>
</div>
</div>
<p>
可能你已经想好了要制作的软件包。那此时第一件要做的事,就是检查它是否已经被别人打包,并已经安置于发行版仓库中。这里有几种检查方法供您参考:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><span class="command"><strong>aptitude</strong></span> 命令</p>
</li>
<li class="listitem">
<p>the <a class="ulink" href="http://www.debian.org/distrib/packages">Debian packages</a> 页面</p>
</li>
<li class="listitem">
<p>the <a class="ulink" href="https://tracker.debian.org/">Debian Package Tracker</a> web page</p>
</li>
</ul>
</div>
<p>
如果软件包已经存在于仓库中,那直接装上它就可以了呀!:-) 如果它是被 <span class="strong"><strong>甩掉了(orphaned)</strong></span> 的 —— 也就是说它的维护者被设置为 <a class="ulink" href="http://qa.debian.org/">Debian QA
Group</a>,这时候你可以尝试接手维护它。另外,你也可以“领养”那些维护者发送过“Request for
Adoption”(<span class="strong"><strong>RFA</strong></span>)请求的软件包。<a href="#ftn.idm506" class="footnote" id="idm506"><sup class="footnote">[6]</sup></a>
</p>
<p>
软件包归属状态有这几种:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><span class="command"><strong>wnpp-alert</strong></span> 命令,来自 <code class="systemitem">devscripts</code> 软件包</p>
</li>
<li class="listitem">
<p> <a class="ulink" href="http://www.debian.org/devel/wnpp/">Work-Needing and Prospective Packages</a> </p>
</li>
<li class="listitem">
<p> <a class="ulink" href="http://bugs.debian.org/wnpp">Debian Bug report logs: Bugs in pseudo-package
<code class="systemitem">wnpp</code> 位于
<code class="literal">unstable</code></a> </p>
</li>
<li class="listitem">
<p> <a class="ulink" href="http://wnpp.debian.net/">Debian Packages that Need Lovin'</a> </p>
</li>
<li class="listitem">
<p> <a class="ulink" href="http://wnpp-by-tags.debian.net/">Browse <code class="systemitem">wnpp</code> bugs based on debtags</a> </p>
</li>
</ul>
</div>
<p>
作为旁注必须指出,Debian
已经拥有了海量各种类型的软件包,而且处在仓库中软件包的数量也远远超过了拥有上传权限的贡献者数量。因此,为已经在仓库中的软件包贡献力量是非常受其他开发者欢迎的
(且更容易获得 sponsorship)<a href="#ftn.idm531" class="footnote" id="idm531"><sup class="footnote">[7]</sup></a>。有非常多的方式可以实现这一目的:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>
接手那些已经被甩掉,而仍然有很多人在使用的软件包
</p>
</li>
<li class="listitem">
<p>
加入一些 <a class="ulink" href="http://wiki.debian.org/Teams">打包小组</a>
</p>
</li>
<li class="listitem">
<p>
帮忙为某些常用软件分类 Bug
</p>
</li>
<li class="listitem">
<p>
在必要时,帮忙准备 <a class="ulink" href="http://www.debian.org/doc/developers-reference/pkgs.html#nmu-qa-upload">QA 或 NMU 上传</a>
</p>
</li>
</ul>
</div>
<p>
如果你有能力“领养”那个软件包,那就先下载 (使用 <code class="literal">apt-get source
<em class="replaceable"><code>packagename</code></em></code>
或其他类似的工具)并分析它的源代码。这篇文档不会详细说明如何领养软件包,不过幸运的是,领养软件包时,打包的起始工作已经有人完成,接手的工作应比从头开始轻松得多。尽管如此也请您不要轻敌,请继续阅读,下面给出的建议会对你很有帮助。
</p>
<p>
如果您要制作的软件包是完全崭新的,而您又希望它出现在 Debian 中,那请遵循以下的步骤:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>
首先,你必须知道这个软件能不能干活,而且你需要亲自试用一段时间来确保其可用性。
</p>
</li>
<li class="listitem">
<p>
一定要在 <a class="ulink" href="http://www.debian.org/devel/wnpp/being_packaged">Work-Needing and Prospective
Packages</a> 上仔细查看,以确定并没有其他人已经开始相关的工作。如果没有的话,则可以提交一份 ITP (Intent To
Package,打包意向) Bug 报告给 <code class="systemitem">wnpp</code> 虚包 (可以使用
<span class="command"><strong>reportbug</strong></span>)。如果你看到已经有人在处理相关事宜,则在有需要的情况下再联系他(们)。如果他(们)不需要你的帮助,那就寻找其他你感兴趣,而且没有人维护的软件包咯。
</p>
</li>
<li class="listitem">
<p>
软件 <span class="strong"><strong>必须有许可证</strong></span>。
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>
对于仓库中 <code class="literal">main</code> 区的软件, Debian Policy 要求其 <span class="strong"><strong> 完全兼容 Debian Free Software Guidelines (Debian
自由软件准则)</strong></span> (<a class="ulink" href="http://www.debian.org/social_contract#guidelines">DFSG</a>) 并且它 <span class="strong"><strong> 不能要求使用 <code class="literal">main</code></strong></span>
区以外的软件来编译或执行。这即是最理想的状况。
</p>
</li>
<li class="listitem">
<p>
对于仓库中 <code class="literal">contrib</code> 区的软件,其许可证必须满足 DFSG 的全部条件,不同于 main
区软件的一点是,它们可以依赖于 <code class="literal">main</code> 之外的软件包来完成编译或运行。
</p>
</li>
<li class="listitem">
<p>
对于仓库中 <code class="literal">non-free</code> 区的软件,其许可证可以不满足 DFSG
中的一部分条件。其中坚决不能违背的一点是,该软件 <span class="strong"><strong>必须是可分发的</strong></span>。
</p>
</li>
<li class="listitem">
<p>
如果你不确定你的软件应该归入仓库的哪一个区,那你可以把许可证文本发送到 <a class="ulink" href="http://lists.debian.org/debian-legal/">debian-legal@lists.debian.org</a> 邮件列表上寻求意见。
</p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p>
程序 <span class="strong"><strong>不能</strong></span> 给 Debian 系统带来安全或维护问题。
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>
程序应当带有良好的文档,最好是源代码也容易理解 (比如,不混乱)。
</p>
</li>
<li class="listitem">
<p>
你应该与程序的作者取得联系,问问他是否认为程序应当被打包,以及他是否对 Debian
持友好态度。能够询问作者关于程序的任何问题都非常重要,所以千万不要尝试打包一个无人维护的软件 (遇到麻烦找谁去呢)。
</p>
</li>
<li class="listitem">
<p>
程序一定 <span class="strong"><strong>不能</strong></span> setuid 到 root 。如果它不 setuid 或
setgid 到任何用户或组的话,那就再好不过了。
</p>
</li>
<li class="listitem">
<p>
程序不应该是守护进程,也不应该进入任何一个 <code class="filename">*/sbin</code> 目录,不应该以 root 权限打开任何端口。
</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<p>
当然,这些都是为了安全,并试图避免你在,比如 setuid 守护进程等问题上犯错误而激怒了用户 ...
当你在打包方面有了更多经验时,就能够处理这样的软件包了,不必着急。
</p>
<p>
我们鼓励你,作为一个新维护者,选择易于打包和维护的软件,而不鼓励选择复杂的软件包。
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>简单软件包</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>生成单个二进制包,arch = all (比如像壁纸那样的资料集)</p>
</li>
<li class="listitem">
<p>生成单个二进制包,arch = all (用解释型语言编写的可执行脚本文件,比如 POSIX shell 语言)</p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p>中等复杂软件包</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>生成单个二进制包,arch = any (用C/C++等语言编写的 ELF 二进制可执行文件)</p>
</li>
<li class="listitem">
<p>生成多个二进制包,arch = any + all (包含ELF二进制可执行程序+文档)</p>
</li>
<li class="listitem">
<p>既不是 <code class="filename">tar.gz</code> 也不是 <code class="filename">tar.bz2</code> 格式的上游源代码包</p>
</li>
<li class="listitem">
<p>包含不可分发的内容物的源码包</p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p>高复杂度软件包</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>被其他软件包使用的解释器模块包</p>
</li>
<li class="listitem">
<p>被其他软件包使用的ELF库文件包</p>
</li>
<li class="listitem">
<p>生成多个二进制包,其中包含括ELF库文件</p>
</li>
<li class="listitem">
<p>有多个上游的源码包</p>
</li>
<li class="listitem">
<p>内核模块包</p>
</li>
<li class="listitem">
<p>内核补丁包</p>
</li>
<li class="listitem">
<p>含有关键维护者脚本的软件包</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<p>
打包高复杂软件包并非难如登天,但这个过程需要用到更多知识。你应该针对每一个所谓的复杂特性来搜寻相应的指南。比如,一些语言有它们自己的子策略文档:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>
<a class="ulink" href="http://www.debian.org/doc/packaging-manuals/perl-policy/">Perl policy</a>
</p>
</li>
<li class="listitem">
<p>
<a class="ulink" href="http://www.debian.org/doc/packaging-manuals/python-policy/">Python policy</a>
</p>
</li>
<li class="listitem">
<p>
<a class="ulink" href="http://www.debian.org/doc/packaging-manuals/java-policy/">Java policy</a>
</p>
</li>
</ul>
</div>
<p>
还有一句拉丁谚语:<span class="emphasis"><em>fabricando fit faber</em></span> (熟能生巧)。我们
<span class="emphasis"><em>强烈</em></span> 建议你在阅读这篇教程的时候,用一个简单的软件包来对所有的 Debian
打包步骤进行实验。跟随下边的步骤您就可以创建一个微不足道的软件包 <code class="filename">hello-sh-1.0.tar.gz</code>
,而且这会是一个非常好的开端:<a href="#ftn.idm647" class="footnote" id="idm647"><sup class="footnote">[8]</sup></a>
</p>
<pre class="screen">
$ mkdir -p hello-sh/hello-sh-1.0; cd hello-sh/hello-sh-1.0
$ cat > hello <<EOF
#!/bin/sh
# (C) 2011 Foo Bar, GPL2+
echo "Hello!"
EOF
$ chmod 755 hello
$ cd ..
$ tar -cvzf hello-sh-1.0.tar.gz hello-sh-1.0
</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="getit"/>2.3. 获取程序并试用</h2>
</div>
</div>
</div>
<p>
这里第一件事是找到并下载原始的源代码。我们假定你已经在作者的主页上找到了程序的源代码。一般来说,Unix 下的自由软件源代码是以
<span class="command"><strong>tar</strong></span>+<span class="command"><strong>gzip</strong></span> 格式(扩展名为
<code class="filename">.tar.gz</code>)或
<span class="command"><strong>tar</strong></span>+<span class="command"><strong>bzip2</strong></span> 格式(扩展名为
<code class="filename">.tar.bz2</code>)或<span class="command"><strong>tar</strong></span>+<span class="command"><strong>xz</strong></span>
(扩展名为<code class="filename">.tar.xz</code>) 的文件格式提供的。有时候,归档文件中包含了一个名为
<code class="filename"><em class="replaceable"><code>package</code></em>-<em class="replaceable"><code>version</code></em></code>
的子目录,在那里边有全部的源代码。
</p>
<p>
如果最新版本的源代码可通过像 Git,Subversion,CVS 这样的版本控制系统获得的话,你可以用 <code class="literal">git
clone</code> , <code class="literal">svn co</code>, 或 <code class="literal">cvs co</code>
来下载它,然后将它重新打包压缩为 <span class="command"><strong>tar</strong></span>+<span class="command"><strong>gzip</strong></span> 格式, 同时别忘了
<code class="literal">--exclude-vcs</code> 选项哟。
</p>
<p>
如果你的程序源代码是以其他文件格式提供的 (比如文件名以 <code class="filename">.Z</code> 或
<code class="filename">.zip</code> 结尾 <a href="#ftn.idm682" class="footnote" id="idm682"><sup class="footnote">[9]</sup></a>),则应当使用对应和合适的工具将其解压,再重新归档为 Tarball。
</p>
<p>
如果你挑选的程序的源代码中包含一些不符合 DFSG 的内容,你应当解压后移除它们,然后将删减过的源码重新归档。因为 DFSG
而进行删减过的源码归档的上游版本号中,需要添加 <code class="literal">dfsg</code> 这个标识。
</p>
<p>
作为示例,本教程在这里使用一个名为 <span class="command"><strong>gentoo</strong></span> 的程序,它是一个 GTK+ 文件管理器。<a href="#ftn.idm689" class="footnote" id="idm689"><sup class="footnote">[10]</sup></a>
</p>
<p>
在你的家目录下创建一个子目录,命名为 <code class="filename">debian</code> 或 <code class="filename">deb</code>
或者依你的喜好。(本例中使用 <code class="filename">~/gentoo</code>)。把下载好的归档文件放在其中并解压 (使用
<code class="literal">tar xzf gentoo-0.9.12.tar.gz</code>
命令)。你需要确定这个归档在解压过程中没有任何发生错误,即便是有一点 <span class="emphasis"><em>小小小问题</em></span>
也是不行的。因为在别人的系统上解压这些归档时,可能他们的工具并不会忽略这些非正常现象,于是就出问题了。一般的预期是,在你的终端屏幕上,应该能看到如下的情形。
</p>
<pre class="screen">
$ mkdir ~/gentoo ; cd ~/gentoo
$ wget http://<em class="replaceable"><code>www.example.org</code></em>/gentoo-0.9.12.tar.gz
$ tar xvzf gentoo-0.9.12.tar.gz
$ ls -F
gentoo-0.9.12/
gentoo-0.9.12.tar.gz
</pre>
<p>
现在解压缩工具创建了一个新的子目录,名为 <code class="filename">gentoo-0.9.12</code>。接下来你需要进入该目录并
<span class="emphasis"><em>彻底</em></span> 读完其中的文档。通常情况下文档会被命名为
<code class="filename">README*</code>、<code class="filename">INSTALL*</code>、<code class="filename">*.lsm</code>
或 <code class="filename">*.html</code>。同时,你需要学会正确编译和安装这个程序 (最可能出现的一种情况是,软件会被默认安装到
<code class="filename">/usr/local/bin</code> 目录;但在 Debian 软件包制作过程中不可以那样做。详细的原因在 <a class="xref" href="modify.zh-cn.html#destdir" title="3.3. 文件安装">第 3.3 节 “文件安装”</a> 中说明)。
</p>
<p>
开始打包时的源代码目录应当是绝对干净原始,没有做过任何修改的。一般来说直接使用刚刚解压得到的源代码即可。
</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="simplemake"/>2.4. 简单的编译系统</h2>
</div>
</div>
</div>
<p>
有些比较简单的程序源码自己带有 <code class="filename">Makefile</code>, 这时你可以很容易地使用
<code class="literal">make</code> 命令来编译它。<a href="#ftn.idm715" class="footnote" id="idm715"><sup class="footnote">[11]</sup></a> 有一些软件的
Makefile 还支持 <code class="literal">make check</code>,这个命令可以完成一系列程序检验和测试。当程序编译好后即可用
<code class="literal">make install</code> 命令,将程序安装到目标目录。
</p>
<p>
现在尝试编译和运行你的程序,你需要确保它能正常工作,以及它在安装和运行时不会破坏别的东西。
</p>
<p>
你还可以运行 <code class="literal">make clean</code> (或更好的 <code class="literal">make
distclean</code>) 来清理编译目录。Makefile 中有时还会支持 <code class="literal">make
uninstall</code> ,它被用来卸载已经安装了的程序文件。
</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="portable"/>2.5. 常见的可移植编译系统</h2>
</div>
</div>
</div>
<p>
有非常非常多的自由软件是使用 <a class="ulink" href="http://en.wikipedia.org/wiki/C_(programming_language)">C</a> 和 <a class="ulink" href="http://en.wikipedia.org/wiki/C++">C++</a> 语言编写的。其中又有很多程序使用了 Autotools 或 CMake
来使其可以移植到不同平台上。这些工具被用于生成 <code class="filename">Makefile</code> 和其他必须的源文件。然后程序就可以使用正常的
<code class="literal">make; make install</code> 来编译和安装。
</p>
<p>
<a class="ulink" href="http://en.wikipedia.org/wiki/GNU_build_system">Autotools</a> 是 GNU 编译系统工具集,包括 <a class="ulink" href="http://en.wikipedia.org/wiki/Autoconf">Autoconf</a>、<a class="ulink" href="http://en.wikipedia.org/wiki/Automake">Automake</a>、<a class="ulink" href="http://en.wikipedia.org/wiki/GNU_Libtool">Libtool</a> 和
<a class="ulink" href="http://en.wikipedia.org/wiki/GNU_gettext">gettext</a>。你可以通过
<code class="filename">configure.ac</code>、<code class="filename">Makefile.am</code> 和
<code class="filename">Makefile.in</code> 等特征文件来识别使用 Autotools
作为编译系统的源代码。<a href="#ftn.idm742" class="footnote" id="idm742"><sup class="footnote">[12]</sup></a>
</p>
<p>
Autotools 工作流程的第一步是在上游作者在代码中运行 <code class="literal">autoreconf -i -f</code>
,然后把生成的文件同源代码一起分发。
</p>
<pre class="screen">
configure.ac-----+-> autoreconf -+-> configure
Makefile.am -----+ | +-> Makefile.in
src/Makefile.am -+ | +-> src/Makefile.in
| +-> config.h.in
automake
aclocal
aclocal.m4
autoheader
</pre>
<p>
编辑 <code class="filename">configure.ac</code> 和 <code class="filename">Makefile.am</code>
等文件前,你需要一些关于 <span class="command"><strong>autoconf</strong></span> 和 <span class="command"><strong>automake</strong></span>
的知识。请参看 <code class="literal">info autoconf</code> 和 <code class="literal">info automake</code>。
</p>
<p>
Autotools 工作流程的第二步是,用户获得分发的源代码后在源码目录下运行 <code class="literal">./configure &&
make</code> 来将其编译成为 <span class="command"><strong><em class="replaceable"><code>binary</code></em></strong></span>
(二进制文件)。
</p>
<pre class="screen">
Makefile.in -----+ +-> Makefile -----+-> make -> <em class="replaceable"><code>binary</code></em>
src/Makefile.in -+-> ./configure -+-> src/Makefile -+
config.h.in -----+ +-> config.h -----+
|
config.status -+
config.guess --+
</pre>
<p>
你可以改变 <code class="filename">Makefile</code> 文件的许多设置,比如你可以修改默认的文件安装路径(使用
<code class="literal">./configure --prefix=/usr</code>)。
</p>
<p>
可选:若使用 <code class="literal">autoreconf -i -f</code> 来更新
<code class="filename">configure</code> 和其他相关文件,则有可能可以提高源代码的兼容性。 <a href="#ftn.idm768" class="footnote" id="idm768"><sup class="footnote">[13]</sup></a>
</p>
<p>
<a class="ulink" href="http://en.wikipedia.org/wiki/CMake">CMake</a> 是另一个备选的编译系统,你可以通过
<code class="filename">CMakeLists.txt</code> 这个特征文件来识别使用 CMake 的源代码。
</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="namever"/>2.6. 软件包名称和版本</h2>
</div>
</div>
</div>
<p>
如果上游源代码以 <code class="filename">gentoo-0.9.12.tar.gz</code> 这样的文件名来分发,你就可以用
<code class="literal">gentoo</code> 作为 <span class="strong"><strong>软件包名</strong></span> ,并用
<code class="literal">0.9.12</code> 作为 <span class="strong"><strong>上游版本</strong></span>。 它们会被
<code class="filename">debian/changelog</code> 这个文件用到;<a class="xref" href="dreq.zh-cn.html#changelog" title="4.3. changelog">第 4.3 节 “<code class="filename">changelog</code>”</a>
部分会详细描述这个文件。
</p>
<p>
虽然此法在大部分情况下能显灵,但你仍需要根据 Debian 政策(Debian Policy)以及约定俗成的做法来调整 <span class="strong"><strong>软件包名</strong></span> 和 <span class="strong"><strong>上游版本</strong></span> 。
</p>
<p>
在 <span class="strong"><strong>软件包名</strong></span> 里只能含有 小写字母
(<code class="literal">a-z</code>), 数字 (<code class="literal">0-9</code>), 加号
(<code class="literal">+</code>) 和 减号 (<code class="literal">-</code>) , 以及 点号
(<code class="literal">.</code>)。 软件包名最短长度两个字符;它必须以字母开头;它不能与仓库软件包名发生冲突。还有,把软件包名的长度控制在
30 字符以内是明智之举。 <a href="#ftn.idm795" class="footnote" id="idm795"><sup class="footnote">[14]</sup></a>
</p>
<p>
如果上游代码在它的名称中使用了一些通用术语比如 <code class="literal">test-suite</code>,
那么你应当将其重命名,显式地说明其内容并避免污染命名空间。 <a href="#ftn.idm800" class="footnote" id="idm800"><sup class="footnote">[15]</sup></a>
</p>
<p>
你应该让 <span class="strong"><strong>upstream version(上游版本号)</strong></span> 只包含字母和数字
(<code class="literal">0-9A-Za-z</code>), 以及加号 (<code class="literal">+</code>), 波浪号
(<code class="literal">~</code>), 还有 点号(<code class="literal">.</code>)。它必须以数字开头
(<code class="literal">0-9</code>)。 <a href="#ftn.idm810" class="footnote" id="idm810"><sup class="footnote">[16]</sup></a>
如果可能的话,最好把它的长度控制在8字符以内。 <a href="#ftn.idm812" class="footnote" id="idm812"><sup class="footnote">[17]</sup></a>
</p>
<p>
如果上游不使用像 <code class="literal">2.30.32</code> 这样的常规版本格式,而是用类似
<code class="literal">11Apr29</code>
这样的日期作为版本,类似于随机的代号字符串,或者以VCS的哈希值作为版本号的一部分,那么请确认将其从 <span class="strong"><strong>upstream version</strong></span> 中移除。 为此作出的改动信息可以记录在
<code class="filename">debian/changelog</code> 文件中。 如果你需要发明一个版本字符串,请使用
<code class="literal">YYYYMMDD</code> 这个格式作为上游版本,比如 <code class="literal">20110429</code> 。这会确保
<span class="command"><strong>dpkg</strong></span> 在升级软件包时能够正确解读新版本。 如果需要确保未来能够平滑过渡到类似
<code class="literal">0.1</code> 这样的版本号的话,那就请使用 <code class="literal">0~YYMMDD</code>
格式作为上游版本,例如 <code class="literal">0~110429</code> 。
</p>
<p>
版本字符串 <a href="#ftn.idm827" class="footnote" id="idm827"><sup class="footnote">[18]</sup></a> 可以用 <span class="citerefentry"><span class="refentrytitle">dpkg</span>(1)</span>
来进行比较:
</p>
<pre class="screen">
$ dpkg --compare-versions <em class="replaceable"><code>ver1</code></em> <em class="replaceable"><code>op</code></em> <em class="replaceable"><code>ver2</code></em>
</pre>
<p>
版本比较规则可总结为以下几点:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>字符串要从头到尾进行比较。</p>
</li>
<li class="listitem">
<p>字母比数字大。</p>
</li>
<li class="listitem">
<p>数字作为整数进行比较。</p>
</li>
<li class="listitem">
<p>字母按照 ASCII 编码顺序进行比较。</p>
</li>
<li class="listitem">
<p>对于点号 (<code class="literal">.</code>),加号 (<code class="literal">+</code>),以及波浪号
(<code class="literal">~</code>) 则有对应的特殊规则,具体如下:</p>
<p>
<code class="literal">0.0</code> < <code class="literal">0.5</code> <
<code class="literal">0.10</code> < <code class="literal">0.99</code> <
<code class="literal">1</code> < <code class="literal">1.0~rc1</code> <
<code class="literal">1.0</code> < <code class="literal">1.0+b1</code> <
<code class="literal">1.0+nmu1</code> < <code class="literal">1.1</code> <
<code class="literal">2.0</code>
</p>
</li>
</ul>
</div>
<p>
有一种比较棘手的情况,当上游释出
<code class="filename">gentoo-0.9.12-ReleaseCandidate-99.tar.gz</code> 作为
<code class="filename">gentoo-0.9.12.tar.gz</code> 的预发布版本时,就需要确保升级工作妥当进行:重命名该上游源代码为
<code class="filename">gentoo-0.9.12~rc99.tar.gz</code>.
</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="dh-make"/>2.7. 设置 <span class="command"><strong>dh_make</strong></span></h2>
</div>
</div>
</div>
<p>
首先设置两个 环境变量,<code class="literal">$DEBEMAIL</code> 和
<code class="literal">$DEBFULLNAME</code>,这样大多数 Debian
维护工具就能够正确识别你用于维护软件包的姓名和电子邮件地址。<a href="#ftn.idm885" class="footnote" id="idm885"><sup class="footnote">[19]</sup></a>
</p>
<pre class="screen">
$ cat >>~/.bashrc <<EOF
DEBEMAIL="your.email.address@example.org"
DEBFULLNAME="Firstname Lastname"
export DEBEMAIL DEBFULLNAME
EOF
$ . ~/.bashrc
</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="non-native-dh-make"/>2.8. 初始化外来 Debian 软件包</h2>
</div>
</div>
</div>
<p>
一般来说,由上游程序产生的 Debian 软件包都是 外来 的。 若你想要用上游源代码
<code class="filename">gentoo-0.9.12.tar.gz</code> 创建一个外来 Debian
软件包,你可以在它的基础上进行外来软件包初始化,这只需要调用 <span class="command"><strong>dh_make</strong></span> 命令:
</p>
<pre class="screen">
$ cd ~/gentoo
$ wget http://example.org/gentoo-0.9.12.tar.gz
$ tar -xvzf gentoo-0.9.12.tar.gz
$ cd gentoo-0.9.12
$ dh_make -f ../gentoo-0.9.12.tar.gz
</pre>
<p>
当然,这里请用你原版源码归档的名字来替换 filename (文件名)。 <a href="#ftn.idm896" class="footnote" id="idm896"><sup class="footnote">[20]</sup></a>
详情请参见 <span class="citerefentry"><span class="refentrytitle">dh_make</span>(8)</span> 。
</p>
<p>
你会看到一些输出,询问你想要创建什么类型的软件包。这里的 Gentoo 被规划为一个单一二进制包——它仅仅产生一个二进制包, 亦即单个
<code class="filename">.deb</code> 文件——于是我们就选择第一项 (按 <code class="literal">s</code> 键),
认真阅读屏幕上的输出信息, 然后按 <code class="literal"><em class="replaceable"><code>ENTER</code></em></code> 键来确认。
<a href="#ftn.idm910" class="footnote" id="idm910"><sup class="footnote">[21]</sup></a>
</p>
<p>
执行 <span class="command"><strong>dh_make</strong></span> 后,上级目录中自动创建了一份上游 tarball 的副本,名为
<code class="filename">gentoo_0.9.12.orig.tar.gz</code>,这个文件和稍后要介绍的
<code class="filename">debian.tar.gz</code> 合在一起便满足了一部分 Debian 非本土源码包的要求。
</p>
<pre class="screen">
$ cd ~/gentoo ; ls -F
gentoo-0.9.12/
gentoo-0.9.12.tar.gz
gentoo_0.9.12.orig.tar.gz
</pre>
<p>
请注意在 <code class="filename">gentoo_0.9.12.orig.tar.gz</code> 这个文件名中有两个关键点:
</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>
软件包名称 和 版本 中间以字符 <code class="literal">_</code> (下划线)来分隔。
</p>
</li>
<li class="listitem">
<p>
后缀名 <code class="filename">.tar.gz</code> 前边插有 <code class="filename">.orig</code>。
</p>
</li>
</ul>
</div>
<p>
你或许注意到了 <code class="filename">debian</code> 目录下已经有了许多模板。这些文件将在 <a class="xref" href="dreq.zh-cn.html" title="第 4 章 debian 目录中的必须内容">第 4 章 <em><code class="filename">debian</code> 目录中的必须内容</em></a> 和 <a class="xref" href="dother.zh-cn.html" title="第 5 章 debian 目录下的其他文件">第 5 章 <em><code class="filename">debian</code> 目录下的其他文件</em></a>
中一一加以说明。另外,打包这件事情无法被完全自动化。因此你还得按照 <a class="xref" href="modify.zh-cn.html" title="第 3 章 修改源代码">第 3 章 <em>修改源代码</em></a> 中介绍的方法为 Debian
修改软件包。再接下来,按照 <a class="xref" href="build.zh-cn.html" title="第 6 章 构建软件包">第 6 章 <em>构建软件包</em></a> 中叙述的合适的方法来构建 Debian 软件包,并根据 <a class="xref" href="checkit.zh-cn.html" title="第 7 章 检查软件包中的错误">第 7 章 <em>检查软件包中的错误</em></a> 中的方法进行软件包测试,最后参考 <a class="xref" href="upload.zh-cn.html" title="第 9 章 上传软件包">第 9 章 <em>上传软件包</em></a>
这里的说明将其上传。所有的这些主要步骤本教程都会进行解释。
</p>
<p>
如果你在修改过程中不小心删除或玩坏了某些模板,你还可以使用 <span class="command"><strong>dh_make</strong></span> 加
<code class="literal">--addmissing</code> 参数来将其还原。(译注:也可以用dpkg -L dh-make 来寻找您想要的模板)
</p>
<p>
更新一个已存在的软件包可能有点复杂,因为它可能使用了旧的打包技术。在学习基本功的阶段,建议只创建全新的软件包;稍后的 <a class="xref" href="update.zh-cn.html" title="第 8 章 更新软件包">第 8 章 <em>更新软件包</em></a>中会细致地讲解更新现存软件包。
</p>
<p>
请注意,源代码中不必包含任何在 <a class="xref" href="first.zh-cn.html#simplemake" title="2.4. 简单的编译系统">第 2.4 节 “简单的编译系统”</a> 或 <a class="xref" href="first.zh-cn.html#portable" title="2.5. 常见的可移植编译系统">第 2.5 节 “常见的可移植编译系统”</a>
中谈论到的编译系统。 就算源码包仅仅是一组图像之类的也可以,这时候这些文件的安装可以用 <code class="systemitem">debhelper</code> 的配置文件来搞定,比如
<code class="filename">debian/install</code> (参见 <a class="xref" href="dother.zh-cn.html#install" title="5.11. install">第 5.11 节 “<code class="filename">install</code>”</a>)。
</p>
</div>
<div class="footnotes">
<br/>
<hr/>
<div id="ftn.idm438" class="footnote">
<p><a href="#idm438" class="para"><sup class="para">[4] </sup></a>对于老式的 <code class="literal">1.0</code> 格式非本地 Debian 源码包,应当使用
<code class="literal"><em class="replaceable"><code>package</code></em>_<em class="replaceable"><code>version</code></em>-<em class="replaceable"><code>revision</code></em>.diff.gz</code>
这个命名规则。 </p>
</div>
<div id="ftn.idm481" class="footnote">
<p><a href="#idm481" class="para"><sup class="para">[5] </sup></a> 参见 <a class="ulink" href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source">5.6.1 "Source"</a>, <a class="ulink" href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Package">5.6.7 "Package"</a>, 以及 <a class="ulink" href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version">5.6.12 "Version"</a>。 <span class="strong"><strong>package architecture</strong></span> 遵循 <a class="ulink" href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Architecture">Debian Policy Manual, 5.6.8
"Architecture"</a> 并且会在软件包构建的过程中被自动分配。</p>
</div>
<div id="ftn.idm506" class="footnote">
<p><a href="#idm506" class="para"><sup class="para">[6] </sup></a>参见 <a class="ulink" href="http://www.debian.org/doc/manuals/developers-reference/pkgs.html#adopting">Debian Developer's Reference 5.9.5.
"Adopting a package"</a>.</p>
</div>
<div id="ftn.idm531" class="footnote">
<p><a href="#idm531" class="para"><sup class="para">[7] </sup></a> 当然了,无论何时,总会有一些值得打包,而且并未进入 Debian 仓库的新软件。 </p>
</div>
<div id="ftn.idm647" class="footnote">
<p><a href="#idm647" class="para"><sup class="para">[8] </sup></a>不用担心失踪的 <code class="filename">Makefile</code>。你可以参照 <a class="xref" href="dother.zh-cn.html#install" title="5.11. install">第 5.11 节 “<code class="filename">install</code>”</a> ,简单地通过
<span class="command"><strong>debhelper</strong></span> 来安装 <span class="command"><strong>hello</strong></span>
程序,或者修改上游源代码来添加带有<code class="literal">install</code>目标的新<code class="filename">Makefile</code>,参照<a class="xref" href="modify.zh-cn.html" title="第 3 章 修改源代码">第 3 章 <em>修改源代码</em></a>。</p>
</div>
<div id="ftn.idm682" class="footnote">
<p><a href="#idm682" class="para"><sup class="para">[9] </sup></a> 当通过文件扩展名不足以判断文件类型时,可以使用 <span class="command"><strong>file</strong></span> 命令来判断。 </p>
</div>
<div id="ftn.idm689" class="footnote">
<p><a href="#idm689" class="para"><sup class="para">[10] </sup></a> 这个程序已经被打包好了。<a class="ulink" href="http://packages.qa.debian.org/g/gentoo.html">当前的版本</a> 使用 Autotools
作为其编译系统(build structure),并且已经和下边的例子不一样了。下边的例子基于老的版本 0.9.12 。</p>
</div>
<div id="ftn.idm715" class="footnote">
<p><a href="#idm715" class="para"><sup class="para">[11] </sup></a>
许多新时代的程序都配有一个叫做 <code class="filename">configure</code> 的脚本。执行它的时候会生成一个为你的计算机专门定制的
<code class="filename">Makefile</code> 。</p>
</div>
<div id="ftn.idm742" class="footnote">
<p><a href="#idm742" class="para"><sup class="para">[12] </sup></a>Autotools 这个庞然大物显然已经超出本教程的讨论范围,毕竟本文主要提供关键字和提示。如果你需要使用 Autotools ,请认真研读
<a class="ulink" href="http://www.lrde.epita.fr/~adl/autotools.html">Autotools Tutorial</a> 以及
<code class="filename">/usr/share/doc/autotools-dev/README.Debian.gz</code> 的本地副本。</p>
</div>
<div id="ftn.idm768" class="footnote">
<p><a href="#idm768" class="para"><sup class="para">[13] </sup></a>软件包 <code class="systemitem">dh-autoreconf</code> 可以帮助你将这个过程自动化。参见
<a class="xref" href="dreq.zh-cn.html#customrules" title="4.4.3. 定制 rules 文件">第 4.4.3 节 “定制 <code class="filename">rules</code> 文件”</a>.</p>
</div>
<div id="ftn.idm795" class="footnote">
<p><a href="#idm795" class="para"><sup class="para">[14] </sup></a>在 <span class="command"><strong>aptitude</strong></span> 工具中,软件包名字段的默认最大长度为 30。 而 90% 以上的软件包包名都少于 24
个字符。</p>
</div>
<div id="ftn.idm800" class="footnote">
<p><a href="#idm800" class="para"><sup class="para">[15] </sup></a>如果你遵循 <a class="ulink" href="http://www.debian.org/doc/developers-reference/pkgs.html#newpackage">Debian Developer's Reference
5.1. "New packages"</a>, 那么在 ITP 过程中很容易遇到这样的问题。</p>
</div>
<div id="ftn.idm810" class="footnote">
<p><a href="#idm810" class="para"><sup class="para">[16] </sup></a>这一条更严格的规则能帮助你避免混淆文件名。</p>
</div>
<div id="ftn.idm812" class="footnote">
<p><a href="#idm812" class="para"><sup class="para">[17] </sup></a><span class="command"><strong>aptitude</strong></span> 的版本字段默认长度为10。通常其中的 Debian 修订号和前置的连字符会消耗2个字符位置。对
80% 以上的软件包来说,上游版本小于8字符,Debian 修订号小于2字符。对 90% 以上的软件包来说,上游版本小于10字符,Debian
修订号小于3字符。</p>
</div>
<div id="ftn.idm827" class="footnote">
<p><a href="#idm827" class="para"><sup class="para">[18] </sup></a>版本字符串可以是 <span class="strong"><strong>upstream version</strong></span>
(<code class="literal"><em class="replaceable"><code>version</code></em></code>), <span class="strong"><strong>Debian revision</strong></span>
(<code class="literal"><em class="replaceable"><code>revision</code></em></code>), 或者 <span class="strong"><strong>version</strong></span>
(<code class="literal"><em class="replaceable"><code>version</code></em>-<em class="replaceable"><code>revision</code></em></code>)。
关于 Debian 修订号如何增长,请参见 <a class="xref" href="update.zh-cn.html#newrevision" title="8.1. 新的 Debian 版本">第 8.1 节 “新的 Debian 版本”</a><span class="strong"><strong>Debian revision</strong></span> 。
</p>
</div>
<div id="ftn.idm885" class="footnote">
<p><a href="#idm885" class="para"><sup class="para">[19] </sup></a> 以下内容默认你以 Bash 作为登陆 shell。如果你使用其他的 shell,例如 Z shell,那就使用它们的配置文件代替这里提到的
<code class="filename">~/.bashrc</code>。 </p>
</div>
<div id="ftn.idm896" class="footnote">
<p><a href="#idm896" class="para"><sup class="para">[20] </sup></a> 如果上游源代码已经提供了有内容的 <code class="filename">debian</code> 目录,那么带上参数
<code class="literal">--addmissing</code> 来执行<span class="command"><strong>dh_make</strong></span> 命令。 新的源码包格式
<code class="literal">3.0 (quilt)</code> 的鲁棒性(Robust)已经足够优秀,以不至于轻易损坏。
另外,你可能需要修改上游提供的内容,以满足你的 Debian 软件包之需。 </p>
</div>
<div id="ftn.idm910" class="footnote">
<p><a href="#idm910" class="para"><sup class="para">[21] </sup></a> 这里有这几种选择: <code class="literal">s</code> 代表单一二进制包, <code class="literal">i</code> 代表独立于体系结构的软件包,
<code class="literal">m</code> 代表多个二进制包, <code class="literal">l</code>
代表共享库文件包,<code class="literal">k</code> 代表内核模块包, <code class="literal">n</code> 代表内核补丁包,
<code class="literal">b</code> 代表 <code class="systemitem">cdbs</code>
软件包。本教程专注于使用 <span class="command"><strong>dh</strong></span> 命令 (来自 <code class="systemitem">debhelper</code> 软件包) 来创建单一二进制包,但也会涉及到创建 独立于体系结构 或
多个二进制软件包 相关的内容。软件包 <code class="systemitem">cdbs</code> 提供了 另一套可以代替
<span class="command"><strong>dh</strong></span> 命令的基础打包脚本,不过这个家伙已经超出了我们的讨论范围。 </p>
</div>
</div>
</div>
<div class="navfooter">
<hr/>
<table width="100%" summary="Navigation footer">
<tr>
<td align="left"><a accesskey="p" href="start.zh-cn.html"><img src="images/prev.png" alt="上一页"/></a> </td>
<td align="center"> </td>
<td align="right"> <a accesskey="n" href="modify.zh-cn.html"><img src="images/next.png" alt="下一页"/></a></td>
</tr>
<tr>
<td align="left" valign="top">第 1 章 正确的起点 </td>
<td align="center">
<a accesskey="h" href="index.zh-cn.html">
<img src="images/home.png" alt="起始页"/>
</a>
</td>
<td align="right" valign="top"> 第 3 章 修改源代码</td>
</tr>
</table>
</div>
</body>
</html>
|