File: python-policy.sgml

package info (click to toggle)
python2.2 2.2.3dfsg-2sarge1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 36,920 kB
  • ctags: 69,127
  • sloc: ansic: 219,839; python: 203,969; sh: 9,690; makefile: 3,468; perl: 3,454; lisp: 3,248; xml: 2,262; cpp: 106; sed: 2
file content (645 lines) | stat: -rw-r--r-- 20,864 bytes parent folder | download | duplicates (4)
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
<!doctype debiandoc system>

<debiandoc>
  <book>
    <titlepag>
      <title>Debian Python Policy</title>
      <author>
	<name>Neil Schemenauer</name>
	<email>nas@debian.org</email>
      </author>
      <author>
	<name>Matthias Klose</name>
	<email>doko@debian.org</email>
      </author>
      <author>
	<name>Gregor Hoffleit</name>
	<email>flight@debian.org</email>
      </author>
      <version>version 0.3.7</version>

      <abstract>
	This document describes the packaging of Python within the
	Debian GNU/Linux distribution and the policy requirements for
	packaged Python programs and modules.
      </abstract>

      <copyright>
	<copyrightsummary>
	  Copyright &copy; 1999, 2001 Software in the Public Interest
	</copyrightsummary>
	<p>
	  This manual is free software; you can redistribute it and/or
	  modify it under the terms of the GNU General Public License
	  as published by the Free Software Foundation; either version
	  2 of the License, or (at your option) any later version.
	</p>
	<p>
	  This is distributed in the hope that it will be useful, but
	  WITHOUT ANY WARRANTY; without even the implied warranty of
	  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
	  the GNU General Public License for more details.
	</p>
	<p>
	  A copy of the GNU General Public License is available as
	  <tt>/usr/share/common-licences/GPL</tt> in the Debian GNU/Linux
	  distribution or on the World Wide Web at
	  <url id="http://www.gnu.org/copyleft/gpl.html"
	  name="The GNU Public Licence">.
	</p>
	<p>
	  You can also obtain it by writing to the
	  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
	  Boston, MA 02111-1307, USA.
	</p>
      </copyright>
    </titlepag>

    <toc detail="sect1">

    <chapt id="python">
      <heading>Python Packaging</heading>
      <sect id="versions">
	<heading>Versions</heading>
	<p>
	  At any given time, the package <package>python</package> will
	  represent the current default Debian Python version.
	</p>
	<p>
	  The default Debian Python version should alway be the latest stable
	  upstream release that can be integrated in the distribution.
	</p>
	<p>
	  Apart from the default version, legacy versions of Python
	  may be included as well in the distribution, as long as they
	  are needed by other packages, or as long as it seems
	  reasonable to provide them.  (Note: For the scope of this
	  document, Python versions are synonymous to feature
	  releases, i.e. Python 2.0 and 2.0.1 are subminor versions of
	  the same Python version 2.0, but Python 2.1 and 2.2 are
	  indeed different versions.)
	</p>
	<p>
	  For any version, the main package must be called
	  <package>python<var>X</var>.<var>Y</var></package>. Names of
	  related packages must include the
	  <package>python<var>X</var>.<var>Y</var></package> part.
	</p>

      </sect>

      <sect id="base">
	<heading>Main package</heading>
	<p>
	  For every Python version provided in the distribution, the
	  package <package>python<var>X</var>.<var>Y</var></package>
	  shall comprise a complete distribution for
	  <em>deployment</em> of Python scripts and applications. The
	  package includes the binary
	  <file>/usr/bin/python<var>X</var>.<var>Y</var></file> and
	  all modules of the upstream Python distribution.
	</p>
	<p>
	  Excluded are any modules that depend on
	  non-<em>required</em> packages, they will be provided in
	  separate packages.  Some tools and files for the
	  <em>development</em> of Python modules are split off in a
	  separate package
	  <package>python<var>X</var>.<var>Y</var>-dev</package>.
	  Documentation will be provided separately as well.
	</p>

	<p>
	  At any time, exactly one package must contain a binary
	  <file>/usr/bin/python</file>. That package must either be
	  <package>python</package> or a dependency of that package.
	</p>
      </sect>


      <sect id="interpreter">
        <heading>Python Interpreter</heading>
        <sect1 id="interpreter_name">
          <heading>Interpreter Name</heading>
          <p>
	    Python scripts depending on the default Python version (see <ref
	    id="base">) or not depending on a specific Python version should
	    use <file>python</file> (unversioned) as the interpreter name.
	    </p>
          <p>
	    Python scripts that only work with a specific Python version must
	    explicitely use the versioned interpreter name
	    (<file>python<var>X</var>.<var>Y</var></file>).
          </p>
        </sect1>
        <sect1 id="interpreter_loc">
          <heading>Interpreter Location</heading>
          <p>
	    The preferred specification for the Python interpreter is
            <file>/usr/bin/python</file> or
            <file>/usr/bin/python<var>X</var>.<var>Y</var></file>.
          </p>
          <p>
	    If a maintainer would like to provide the user with the
	    possibility to override the Debian Python interpreter, he
	    may want to use <file>/usr/bin/env python</file> or
	    <file>/usr/bin/env pythonX.Y</file>.
	  </p>
        </sect1>
      </sect>



      <sect id="paths">
	<heading>Module Path</heading>
	<p>
	  The module search path for Debian has been amended to
	  include a directory tree in /usr/local at the beginning of
	  the path. By default, sys.path is searched in the following
	  order:
	  <example>
/usr/local/lib/python<var>X</var>.<var>Y</var>/site-packages
/usr/local/lib/site-python
/usr/lib/python<var>X</var>.<var>Y</var>/site-packages
/usr/lib/site-python
	  </example>
	</p>
	<p>
	  Note that the use of the site-python directories in Python is
	  depreciated. The directories might be dropped from the path in a
	  future version.
	</p>

	<p>
	  TODO: What about
	  <file>/usr/share/python<var>X</var>.<var>Y</var></file> ?
	</p>

      </sect>

      <sect id="docs">
	<heading>Documentation</heading>
	<p>
	  Python documentation is split out in separate packages
	  <package>python<var>X</var>.<var>Y</var>-doc</package>. The package
	  <package>python-doc</package> will always provide the documentation
	  for the default Debian Python version.
	</p>
	<p>
	  TODO: Policy for documentation of third party packages.
	</p>
      </sect>
    </chapt>

    <chapt id="module_packages">
      <heading>Packaged Modules</heading>

      <sect>
        <heading>Rationale: A different view</heading>
        <p>
	  A package with a name
	  <package>python-<var>foo</var></package> will always
	  provide the module <var>foo</var> for the default Debian
	  Python version of the distribution. I.e. the package will
	  extend the function of <file>/usr/bin/python</file> (which
	  is installed by the package <package>python</package>).
	</p>
	<p>
	  The system of dependencies of the default packages is robust
	  against upgrades, but introduces a strong dependency:
	  I.e. an upgrade of the <package>python</package> package
	  will be hold back as long as there are still default modules
	  packages left over on the system that can't be upgraded to
	  the new version.
	</p>
	<p>
	  The versioned packages (legacy versions) ensure that an
	  upgrade to a new default version can take place before
	  without upgrading *all* packages with dependencies on
	  Python.
	</p>
      </sect>

      <sect id="variants">
	<heading>Packaging Variants</heading>
	<p>
	  There is more than one way to package a Python module:
	  <enumlist>
	    <item>
	      <p>
		Support only the default Python version.
	      </p>
	    </item>
	    <item>
	      <p>
		Support a particular version, or some but not all versions of
		Python available in Debian.
	      </p>
	    </item>
	    <item>
	      <p>
		Support all/most versions of python, including the default.
		Works only for architecture independant python modules.
	      </p>
	    </item>
	  </enumlist>
	</p>

	<sect1 id="default_version">
	  <heading>Support Only The Default Version</heading>
	  <p>
	    Name your package
	    <package>python-<var>foo</var></package>.  This kind of
	    package is called a <em>default module package</em>.
	    Install your modules into
	    <file>/usr/lib/python<var>X</var>.<var>Y</var>/site-packages/</file>.
	    Make your package dependency look like
	    <example>
Depends: python (>= X.Y), python (<< X.Y+1)
	    </example>
	    Note that this kind of packaging means that your package will
	    trigger a conflict when the default Debian Python version in the
	    distribution is changed, and that you will have to provide a new
	    version as soon as possible, since the package will block the
	    upgrade of <package>python</package>.
	  </p>
	  <p>
	    You should not make a default, unversioned module package
	    <package>python-<var>foo</var></package> depend on the
	    versioned Python package
	    <package>python<var>X</var>.<var>Y</var></package>!
	  </p>
	  <p>
	    The source package must declare
	    <example>
Build-Depends: pythonX.Y-dev
	    </example>
	    where <var>X</var>.<var>Y</var> is the version used in
	    the <tt>Depends</tt>.
	  </p>
	  <p>
	    TODO: Should a <package>python-foo</package> provide
	    <package>python-foo<var>X</var>.<var>Y</var></package>,
	    provided that the Debian policy allows us to create such a
	    mass of virtual packages?
	  </p>

	</sect1>

	<sect1 id="particular_version">
	  <heading>Support a Particular Version(s)</heading>
	  <p>
	    Name your package
	    <package>python<var>X</var>.<var>Y</var>-<var>foo</var></package>
	    (a <em>versioned module package</em>). Make the dependency
	    look like
	    <example>
Depends: python<var>X</var>.<var>Y</var>
	    </example>
	    It should install modules somewhere inside
	    <file>/usr/lib/python<var>X</var>.<var>Y</var>/site-packages/</file>.
	    Any programs included should use <tt>#!/usr/bin/pythonX.Y</tt>.
	  </p>

	  <p>
	    The packaged source must declare
	    <example>
Build-Depends: pythonX.Y-dev
            </example>
	    where
	    <var>X</var>.<var>Y</var> is the version used above.
	  </p>

	  <p>
	    TODO: Describe support for multiple particular versions
	  </p>

	</sect1>

	<sect1 id="all_versions">
	  <heading>Support All/Most Versions (Including Default)</heading>
	  <p>
	    This option is only XXX available for architecture
	    dependent and independent packages. There are two
	    different cases:
	    <enumlist>
	      <item>
	        <p>Multiple versioned packages</p>
		<p>
		  You have binary extensions that must be compiled
		  against particular versions of Python.  Create
		  multiple
		  <package>python<var>X</var>.<var>Y</var>-<var>foo</var></package>
		  packages as in <ref id="particular_version">. Also
		  create an empty default package
		  <package>python-<var>foo</var></package> with
		  <example>
Depends: python (>= X.Y), python (<< X.Y+1), pythonX.Y-foo
		  </example>
		  Note that this kind of packaging means that the
		  default package will trigger a conflict when the
		  default Debian Python version in the distribution is
		  changed, and that you will have to provide a new
		  version of your package as soon as possible, since
		  the package will block the upgrade of
		  <package>python</package>.
		</p>

		<p>
		  The packaged sources <tt>Build-Depends</tt> must contain all
		  <package>python<var>X</var>.<var>Y</var>-dev</package>
		  packages that the module is built for.
		</p>
	      </item>

	      <item>A single package for all versions (NOT YET SUPPORTED!)
		<p>
		  You have a version independent Python module. Create
		  a single package
		  <package>python-<var>foo</var></package> that has a
		  dependency
		  <example>
Depends: python
		  </example>
		  It should install modules somewhere inside
		  <file>/usr/lib/python/site-packages/</file> and use
		  <tt>#!/usr/bin/python</tt> for programs. The
		  <file>postinst</file> script should create symlinks
		  in all
		  <file>/usr/lib/pythonX.Y/site-packages/</file>
		  directories that point to its
		  <file>/usr/lib/python/site-packages/</file> files
		  and compile them.
		</p>
		<p>
		  NOT YET SUPPORTED: It's errorprone if the package itself
		  supplies these scripts. And the package cannot know when a
		  new upstream Python version is installed. So the
		  <package>python<var>X</var>.<var>Y</var></package> must
		  provide these scripts, which is not yet done.
		</p>
		<p>
		  The packaged source must declare
		  <tt>Build-Depends</tt> on one
		  <package>python<var>X</var>.<var>Y</var>-dev</package>
		  package. XXX: Or build-depend on each Python
		  version, so that only checked modules are uploaded?
		</p>
		<p>
		  TODO: Should policy demand that these packages must have a
		  dependency on <package>python (<=
		  <var>X</var>.<var>Y+1</var></package>)?
		</p>
		<p>
		  DO WE WANT THIS: Some packages, which provide binary Python
		  only, package these modules together in one package (like
		  <package>python-pqueue</package>). They build-depend on all
		  used <package>python<var>X</var>.<var>Y</var>-dev</package>
		  packages, and depend on the presence of at least one of the
		  used Python versions installed, e.g.
	          <example>
Depends: python1.5 | python2.1
	          </example>
		  Also, such a package should declare
		  <tt>Provides</tt> for
		  <package>python<var>X</var>.<var>Y</var>-<var>foo</var></package>
		  for all versions provided by the package.
		</p>

	      </item>
	    </enumlist>

	  </p>
	</sect1>
	</sect>

      <sect id="package_names">
	<heading>Module Package Names</heading>
	<p>
	  Python module packages should be named for the primary module
	  provided.  The naming convention for a module <tt>foo</tt> is
	  <package>python-<var>foo</var></package> for the package for the
	  default Python version (the <em>default module package</em>).
	  (Packages which include multiple modules may additionally include
	  provides for those modules using the same convention.)
	</p>
	<p>
	  Python module packages packaged for one particular version of Python
	  (<em>versioned modules packages</em>) should be named
	  <package>python<var>X</var>.<var>Y</var>-foo</package>.
	</p>
      </sect>

      <sect id="dependencies">
	<heading>Dependencies</heading>
	<p>
	  Packaged modules available for the default Python version as
	  described in in <ref id="default_version"> must depend on
	  "<package>python (&gt;= <var>X</var>.<var>Y</var>)</package>,
	  <package>python (&lt;&lt; <var>X</var>.<var>Y+1</var>)</package>".
	</p>
	<p>
	  Packaged modules available for one particular version of Python must
	  depend on the corresponding
	  <package>python<var>X</var>.<var>Y</var></package> package instead.
	</p>
      </sect>

    <chapt id="programs">
      <heading>Python Programs</heading>

      <sect id="version_indep_progs">
	<heading>Version Independent Programs</heading>
	<p>
	  Programs that can run with any version of Python should be started
	  with <tt>#!/usr/bin/python</tt>.  They must also specify a
	  dependency on <package>python</package>.

	  You're free to use <tt>#!/usr/bin/env python</tt>, if you'd like to
	  give the user a chance to override the Debian Python package with a
	  local version.
	</p>
      </sect>

      <sect id="version_dep_progs">
	<heading>Version Dependent Programs</heading>
	<p>
	  Programs which require a specific version of Python must start with
	  <tt>#!/usr/bin/python<var>X</var>.<var>Y</var></tt>.  They must also
	  specify a dependency on
	  <package>python<var>X</var>.<var>Y</var></package>.

	  Again, if you're using <tt>#!/usr/bin/env
	  python<var>X</var>.<var>Y</var></tt>, please be aware that a user
	  might override the Debian Python package with a local version.
	</p>
      </sect>

    </chapt>


    <chapt id="embed">
      <heading>Programs Embedding Python</heading>

      <sect id="build_embedded">
	<heading>Building Embedded Programs</heading>
	<p>
	  Programs which embed a Python interpreter must declare a
	  <tt>Build-Depends</tt> on
	  <package>python<var>X</var>.<var>Y</var>-dev</package>.
	</p>
	<p>
	  TODO: Be more verbose. How about versions...
	</p>
      </sect>

      <sect id="embedded_deps">
	<heading>Embedded Python Dependencies</heading>
	<p>
	  Dependencies for programs linking against the shared Python
	  library will be automatically created by
	  <prgn>dpkg-shlibdeps</prgn>.
	</p>
      </sect>
    </chapt>

    <chapt id="other">
      <heading>Interaction with Locally Installed Python Versions</heading>

      <p>
	As long as you don't install other versions of Python in your
	path, Debian's Python versions won't be affected by a new
	version.
      </p>
      <p>
	If you install a different subrelease of the version of python
	you've got installed, you'll need to be careful to install all
	the modules you use for that version of python too.
      </p>

    </chapt>

    <appendix id="build_dependencies">
      <heading>Build Dependencies</heading>
      <p>
	Build dependencies for Python dependent packages must be
	declared for every Python version, that the package is built
	for. To build for a specific version, add the versioned
	dependencies, to build for the default version, add the
	unversioned dependency.

	Architecture dependent packages must depend on the
	<package>-dev</package> package; for architecture independent
	packages, it may be sufficient to depend on the
	<package>python</package> or
	<package>python<var>X</var>.<var>Y</var></package> package.
      </p>
      <p>
	Build-Depend on at least:
	<example>
Build-Depends: python1.5
Build-Depends: python2 (>= 2.0.1-1.2)
Build-Depends: python2.1
Build-Depends: python2.2 (>= 2.1.99-2)

Build-Depends: python1.5-dev (>= 1.5.2-18.6)
Build-Depends: python1.5-distutils
Build-Depends: python2-dev (>= 2.0.1-1.2)
Build-Depends: python2.1-dev (>= 2.1.1-1.4)
Build-Depends: python2.2-dev (>= 2.1.99-2)
	</example>
      </p>
    </appendix>

    <appendix id="upgrade">
      <heading>Upgrade Procedure</heading>
      <p>
	This section describes the procedure for the upgrade from the current
	<package>python-<var>XXX</var> (1.5)</package> packages to the
	<package>python1.5-<var>XXX</var></package> packages, the removal of
	the <package>python2-<var>XXX</var></package> packages and the upgrade
	to the recent <package>python2.1-<var>XXX</var></package> packages:
      </p>
      <p>
	<enumlist>
	  <item>
	    <p>
	      The Debian Python maintainer decides for the default Debian
	      Python version. In the following we assume that
	      <tt>python2.1</tt> will be the default (hint, hint ...).
	    </p>
	    <p>
	      Serious issues with the python-policy should be resolved, the
	      policy should be submitted to debian-policy.
	    </p>
	  </item>
	  <item>
	    <p>
	      Upload python core packages <package>python-<var>module</var>
	      (2.1)</package> & Co depending on
	      <package>python2.1-<var>module</var></package>.
	    </p>
	    <p>
	      The new packages will conflict with every Python dependent
	      package, that does depend on <package>python</package>,
	      <package>python-base</package>, without depending on
	      <package>python (<< 1.6)</package> or <package>python-base (<<
	      2.1)</package>.
	    </p>
	  </item>
	  <item>
	    <p>
	      At this point other python modules/packages can be made, which
	      follow the proposed policy.  Notify the maintainers of packages,
	      that the new packages conflict with.
	    </p>
	    <p>
	      We propose to make more than one source package for
	      support of more than one python version. Build 2.1 (and
	      probably 2.2) dependent packages from one source
	      packages, and 1.5 and 2.0 packages from another source
	      package (if you support these versions at all). This
	      makes it easy to remove the old packages from
	      testing/unstable.
	    </p>
	    <p>
	      XXX Do we allow NMUs which only fix the dependencies?
	    </p>
	  </item>
	  <item>
	    <p>
	      File bug report against packages and/or make NMU's for packages
	      that are not adapted by their maintainer.
	    </p>
	  </item>
	  <item>
	    <p>
	      If maintainer A (maintaining
	      <package>python-foo</package> (depending on
	      <package>python (&gt;= 2.1)</package>, <package>python
	      (&lt;&lt; 2.2))</package> decides for <ref
	      id="default_version">, then a maintainer B should be
	      allowed to repackage <package>python1.5-foo</package>,
	      if "his" package cannot be converted to use the default
	      Python version.
	    </p>
	  </item>
	  <item>
	    <p>
	      File reports that <tt>python2.0</tt> should go away,
	      file serious reports against all the
	      <package>python2-*</package> the packages and
	      <package>ftp.debian.org</package>.
	    </p>
	  </item>
	  <item>
	    <p>
	    Hopefully release woody with <tt>python2.1</tt> as the default
	    Python version.
	  </p>
	  </item>
	</enumlist>
      </p>
    </appendix>
  </book>
</debiandoc>