blob: d3fc07a944c50ec334475ebc12f18f86c1e3a79a [file] [log] [blame]
Éric Araujo3a9f58f2011-06-01 20:42:49 +02001.. highlightlang:: cfg
2
Éric Araujo0300b5c2011-06-06 01:54:54 +02003.. _setupcfg-spec:
Éric Araujo823759e2011-06-04 18:46:25 +02004
Éric Araujo3a9f58f2011-06-01 20:42:49 +02005*******************************************
6Specification of the :file:`setup.cfg` file
7*******************************************
8
Éric Araujoba661a92011-06-04 02:31:14 +02009:version: 0.9
Éric Araujo3a9f58f2011-06-01 20:42:49 +020010
11This document describes the :file:`setup.cfg`, an ini-style configuration file
Éric Araujoed4fd702011-06-06 02:07:24 +020012used by Packaging to replace the :file:`setup.py` file used by Distutils.
13This specification is language-agnostic, and will therefore repeat some
14information that's already documented for Python in the
15:class:`configparser.RawConfigParser` documentation.
Éric Araujoba661a92011-06-04 02:31:14 +020016
Éric Araujof0f9b222011-06-06 01:52:37 +020017.. contents::
18 :depth: 3
19 :local:
20
Éric Araujoba661a92011-06-04 02:31:14 +020021
22Syntax
23======
24
Éric Araujoed4fd702011-06-06 02:07:24 +020025The ini-style format used in the configuration file is a simple collection of
26sections that group sets of key-value fields separated by ``=`` or ``:`` and
27optional whitespace. Lines starting with ``#`` or ``;`` are comments and will
28be ignored. Empty lines are also ignored. Example::
Éric Araujoba661a92011-06-04 02:31:14 +020029
30 [section1]
31 # comment
32 name = value
33 name2 = "other value"
34
35 [section2]
36 foo = bar
37
38
Éric Araujoed4fd702011-06-06 02:07:24 +020039Parsing values
40---------------
Éric Araujoba661a92011-06-04 02:31:14 +020041
Éric Araujoed4fd702011-06-06 02:07:24 +020042Here are a set of rules to parse values:
Éric Araujoba661a92011-06-04 02:31:14 +020043
Éric Araujoed4fd702011-06-06 02:07:24 +020044- If a value is quoted with ``"`` chars, it's a string. If a quote character is
45 present in the quoted value, it can be escaped as ``\"`` or left as-is.
46
47- If the value is ``true``, ``t``, ``yes``, ``y`` (case-insensitive) or ``1``,
48 it's converted to the language equivalent of a ``True`` value; if it's
49 ``false``, ``f``, ``no``, ``n`` (case-insensitive) or ``0``, it's converted to
50 the equivalent of ``False``.
51
52- A value can contain multiple lines. When read, lines are converted into a
53 sequence of values. Each line after the first must start with a least one
54 space or tab character; this leading indentation will be stripped.
55
56- All other values are considered strings.
Éric Araujoba661a92011-06-04 02:31:14 +020057
58Examples::
59
60 [section]
61 foo = one
62 two
63 three
64
65 bar = false
66 baz = 1.3
67 boo = "ok"
68 beee = "wqdqw pojpj w\"ddq"
69
70
71Extending files
72---------------
73
Éric Araujoed4fd702011-06-06 02:07:24 +020074A configuration file can be extended (i.e. included) by other files. For this,
75a ``DEFAULT`` section must contain an ``extends`` key which value points to one
76or more files which will be merged into the current files by adding new sections
77and fields. If a file loaded by ``extends`` contains sections or keys that
78already exist in the original file, they will not override the previous values.
Éric Araujoba661a92011-06-04 02:31:14 +020079
Éric Araujo13890082011-06-06 01:58:25 +020080Contents of :file:`one.cfg`::
Éric Araujoba661a92011-06-04 02:31:14 +020081
82 [section1]
Éric Araujo13890082011-06-06 01:58:25 +020083 name = value
Éric Araujoba661a92011-06-04 02:31:14 +020084
85 [section2]
Éric Araujo13890082011-06-06 01:58:25 +020086 foo = foo from one.cfg
Éric Araujoba661a92011-06-04 02:31:14 +020087
Éric Araujo13890082011-06-06 01:58:25 +020088Contents of :file:`two.cfg`::
Éric Araujoba661a92011-06-04 02:31:14 +020089
90 [DEFAULT]
Éric Araujo13890082011-06-06 01:58:25 +020091 extends = one.cfg
Éric Araujoba661a92011-06-04 02:31:14 +020092
93 [section2]
Éric Araujo13890082011-06-06 01:58:25 +020094 foo = foo from two.cfg
95 baz = baz from two.cfg
Éric Araujoba661a92011-06-04 02:31:14 +020096
Éric Araujo13890082011-06-06 01:58:25 +020097The result of parsing :file:`two.cfg` is equivalent to this file::
Éric Araujoba661a92011-06-04 02:31:14 +020098
99 [section1]
Éric Araujo13890082011-06-06 01:58:25 +0200100 name = value
Éric Araujoba661a92011-06-04 02:31:14 +0200101
102 [section2]
Éric Araujo13890082011-06-06 01:58:25 +0200103 foo = foo from one.cfg
104 baz = baz from two.cfg
Éric Araujoba661a92011-06-04 02:31:14 +0200105
Éric Araujo13890082011-06-06 01:58:25 +0200106Example use of multi-line notation to include more than one file::
Éric Araujoba661a92011-06-04 02:31:14 +0200107
108 [DEFAULT]
Éric Araujo13890082011-06-06 01:58:25 +0200109 extends = one.cfg
110 two.cfg
Éric Araujoba661a92011-06-04 02:31:14 +0200111
Éric Araujoed4fd702011-06-06 02:07:24 +0200112When several files are provided, they are processed sequentially, following the
113precedence rules explained above. This means that the list of files should go
114from most specialized to most common.
Éric Araujoba661a92011-06-04 02:31:14 +0200115
Éric Araujoed4fd702011-06-06 02:07:24 +0200116**Tools will need to provide a way to produce a merged version of the
117file**. This will be useful to let users publish a single file.
Éric Araujoba661a92011-06-04 02:31:14 +0200118
119
120Description of sections and fields
121==================================
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200122
123Each section contains a description of its options.
124
125- Options that are marked *multi* can have multiple values, one value per
126 line.
127- Options that are marked *optional* can be omitted.
128- Options that are marked *environ* can use environment markers, as described
129 in :PEP:`345`.
130
131
132The sections are:
133
134global
135 Global options not related to one command.
136
137metadata
138 Name, version and other information defined by :PEP:`345`.
139
140files
141 Modules, scripts, data, documentation and other files to include in the
142 distribution.
143
144command sections
145 Options given for specific commands, identical to those that can be given
146 on the command line.
147
148
149Global options
150==============
151
152Contains global options for Packaging. This section is shared with Distutils.
153
154
155commands
156 Defined Packaging command. A command is defined by its fully
157 qualified name. *optional*, *multi*
158
159 Examples::
160
161 [global]
162 commands =
163 package.setup.CustomSdistCommand
164 package.setup.BdistDeb
165
166compilers
167 Defined Packaging compiler. A compiler is defined by its fully
168 qualified name. *optional*, *multi*
169
170 Example::
171
172 [global]
173 compilers =
174 hotcompiler.SmartCCompiler
175
176setup_hook
177 defines a callable that will be called right after the
178 :file:`setup.cfg` file is read. The callable receives the configuration
179 in form of a mapping and can make some changes to it. *optional*
180
181 Example::
182
183 [global]
184 setup_hook = package.setup.customize_dist
185
186
187Metadata
188========
189
190The metadata section contains the metadata for the project as described in
191:PEP:`345`. Field names are case-insensitive.
192
193Fields:
194
195name
196 Name of the project.
197
198version
199 Version of the project. Must comply with :PEP:`386`.
200
201platform
202 Platform specification describing an operating system
203 supported by the distribution which is not listed in the "Operating System"
204 Trove classifiers (:PEP:`301`). *optional*, *multi*
205
206supported-platform
207 Binary distributions containing a PKG-INFO file will
208 use the Supported-Platform field in their metadata to specify the OS and
209 CPU for which the binary distribution was compiled. The semantics of
210 the Supported-Platform field are free form. *optional*, *multi*
211
212summary
213 A one-line summary of what the distribution does.
214 (Used to be called *description* in Distutils1.)
215
216description
217 A longer description. (Used to be called *long_description*
218 in Distutils1.) A file can be provided in the *description-file* field.
219 *optional*
220
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200221keywords
222 A list of additional keywords to be used to assist searching
223 for the distribution in a larger catalog. Comma or space-separated.
224 *optional*
225
226home-page
227 The URL for the distribution's home page.
228
229download-url
230 The URL from which this version of the distribution
231 can be downloaded. *optional*
232
233author
234 Author's name. *optional*
235
236author-email
237 Author's e-mail. *optional*
238
239maintainer
240 Maintainer's name. *optional*
241
242maintainer-email
243 Maintainer's e-mail. *optional*
244
245license
246 A text indicating the term of uses, when a trove classifier does
247 not match. *optional*.
248
249classifiers
250 Classification for the distribution, as described in PEP 301.
251 *optional*, *multi*, *environ*
252
253requires-dist
254 name of another packaging project required as a dependency.
255 The format is *name (version)* where version is an optional
256 version declaration, as described in PEP 345. *optional*, *multi*, *environ*
257
258provides-dist
259 name of another packaging project contained within this
260 distribution. Same format than *requires-dist*. *optional*, *multi*,
261 *environ*
262
263obsoletes-dist
264 name of another packaging project this version obsoletes.
265 Same format than *requires-dist*. *optional*, *multi*, *environ*
266
267requires-python
Éric Araujofdeb8bf2011-06-06 19:57:02 +0200268 Specifies the Python version the distribution requires. The value is a
269 comma-separated list of version predicates, as described in PEP 345.
270 *optional*, *environ*
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200271
272requires-externals
273 a dependency in the system. This field is free-form,
274 and just a hint for downstream maintainers. *optional*, *multi*,
275 *environ*
276
277project-url
278 A label, followed by a browsable URL for the project.
279 "label, url". The label is limited to 32 signs. *optional*, *multi*
280
Éric Araujo8a4e7a92011-06-06 01:58:54 +0200281One extra field not present in PEP 345 is supported:
282
283description-file
284 Path to a text file that will be used to fill the ``description`` field.
285 ``description-file`` and ``description`` are mutually exclusive. *optional*
286
287
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200288
289Example::
290
291 [metadata]
292 name = pypi2rpm
293 version = 0.1
294 author = Tarek Ziadé
295 author-email = tarek@ziade.org
296 summary = Script that transforms an sdist archive into a RPM package
297 description-file = README
298 home-page = http://bitbucket.org/tarek/pypi2rpm/wiki/Home
299 project-url:
300 Repository, http://bitbucket.org/tarek/pypi2rpm/
301 RSS feed, https://bitbucket.org/tarek/pypi2rpm/rss
302 classifier =
303 Development Status :: 3 - Alpha
304 License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)
305
306You should not give any explicit value for metadata-version: it will be guessed
307from the fields present in the file.
308
309
310Files
311=====
312
313This section describes the files included in the project.
314
315packages_root
316 the root directory containing all packages and modules
317 (default: current directory). *optional*
318
319packages
320 a list of packages the project includes *optional*, *multi*
321
322modules
323 a list of packages the project includes *optional*, *multi*
324
325scripts
326 a list of scripts the project includes *optional*, *multi*
327
328extra_files
329 a list of patterns to include extra files *optional*,
330 *multi*
331
332Example::
333
334 [files]
335 packages_root = src
336 packages =
337 pypi2rpm
338 pypi2rpm.command
339
340 scripts =
341 pypi2rpm/pypi2rpm.py
342
343 extra_files =
344 setup.py
345 README
346
347
348.. Note::
349 The :file:`setup.cfg` configuration file is included by default. Contrary to
350 Distutils, :file:`README` (or :file:`README.txt`) and :file:`setup.py` are
351 not included by default.
352
353
354Resources
355---------
356
357This section describes the files used by the project which must not be installed
358in the same place that python modules or libraries, they are called
359**resources**. They are for example documentation files, script files,
360databases, etc...
361
362For declaring resources, you must use this notation::
363
364 source = destination
365
366Data-files are declared in the **resources** field in the **file** section, for
367example::
368
369 [files]
370 resources =
371 source1 = destination1
372 source2 = destination2
373
374The **source** part of the declaration are relative paths of resources files
375(using unix path separator **/**). For example, if you've this source tree::
376
377 foo/
378 doc/
379 doc.man
380 scripts/
381 foo.sh
382
383Your setup.cfg will look like::
384
385 [files]
386 resources =
387 doc/doc.man = destination_doc
388 scripts/foo.sh = destination_scripts
389
390The final paths where files will be placed are composed by : **source** +
391**destination**. In the previous example, **doc/doc.man** will be placed in
392**destination_doc/doc/doc.man** and **scripts/foo.sh** will be placed in
393**destination_scripts/scripts/foo.sh**. (If you want more control on the final
Éric Araujo0300b5c2011-06-06 01:54:54 +0200394path, take a look at :ref:`setupcfg-resources-base-prefix`).
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200395
396The **destination** part of resources declaration are paths with categories.
397Indeed, it's generally a bad idea to give absolute path as it will be cross
398incompatible. So, you must use resources categories in your **destination**
399declaration. Categories will be replaced by their real path at the installation
400time. Using categories is all benefit, your declaration will be simpler, cross
401platform and it will allow packager to place resources files where they want
402without breaking your code.
403
404Categories can be specified by using this syntax::
405
406 {category}
407
408Default categories are:
409
410* config
411* appdata
412* appdata.arch
413* appdata.persistent
414* appdata.disposable
415* help
416* icon
417* scripts
418* doc
419* info
420* man
421
422A special category also exists **{distribution.name}** that will be replaced by
423the name of the distribution, but as most of the defaults categories use them,
424so it's not necessary to add **{distribution.name}** into your destination.
425
426If you use categories in your declarations, and you are encouraged to do, final
427path will be::
428
429 source + destination_expanded
430
431.. _example_final_path:
432
433For example, if you have this setup.cfg::
434
435 [metadata]
436 name = foo
437
438 [files]
439 resources =
440 doc/doc.man = {doc}
441
442And if **{doc}** is replaced by **{datadir}/doc/{distribution.name}**, final
443path will be::
444
445 {datadir}/doc/foo/doc/doc.man
446
447Where {datafir} category will be platform-dependent.
448
449
450More control on source part
451^^^^^^^^^^^^^^^^^^^^^^^^^^^
452
453Glob syntax
454"""""""""""
455
456When you declare source file, you can use a glob-like syntax to match multiples file, for example::
457
458 scripts/* = {script}
459
460Will match all the files in the scripts directory and placed them in the script category.
461
462Glob tokens are:
463
464 * ``*``: match all files.
465 * ``?``: match any character.
466 * ``**``: match any level of tree recursion (even 0).
467 * ``{}``: will match any part separated by comma (example: ``{sh,bat}``).
468
469.. TODO Add examples
470
471Order of declaration
472""""""""""""""""""""
473
474The order of declaration is important if one file match multiple rules. The last
475rules matched by file is used, this is useful if you have this source tree::
476
477 foo/
478 doc/
479 index.rst
480 setup.rst
481 documentation.txt
482 doc.tex
483 README
484
485And you want all the files in the doc directory to be placed in {doc} category,
486but README must be placed in {help} category, instead of listing all the files
487one by one, you can declare them in this way::
488
489 [files]
490 resources =
491 doc/* = {doc}
492 doc/README = {help}
493
494Exclude
495"""""""
496
497You can exclude some files of resources declaration by giving no destination, it
498can be useful if you have a non-resources file in the same directory of
499resources files::
500
501 foo/
502 doc/
503 RELEASES
504 doc.tex
505 documentation.txt
506 docu.rst
507
508Your **files** section will be::
509
510 [files]
511 resources =
512 doc/* = {doc}
513 doc/RELEASES =
514
515More control on destination part
516^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
517
Éric Araujo0300b5c2011-06-06 01:54:54 +0200518.. _setupcfg-resources-base-prefix:
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200519
520Defining a base prefix
521""""""""""""""""""""""
522
523When you define your resources, you can have more control of how the final path
Éric Araujo60533e02011-06-06 02:00:54 +0200524is computed.
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200525
526By default, the final path is::
527
528 destination + source
529
530This can generate long paths, for example (example_final_path_)::
531
532 {datadir}/doc/foo/doc/doc.man
533
534When you declare your source, you can use whitespace to split the source in
535**prefix** **suffix**. So, for example, if you have this source::
536
537 docs/ doc.man
538
539The **prefix** is "docs/" and the **suffix** is "doc.html".
540
541.. note::
542
543 Separator can be placed after a path separator or replace it. So these two
544 sources are equivalent::
545
546 docs/ doc.man
547 docs doc.man
548
549.. note::
550
Éric Araujo60533e02011-06-06 02:00:54 +0200551 Glob syntax is working the same way with standard source and split source.
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200552 So these rules::
553
554 docs/*
555 docs/ *
556 docs *
557
558 Will match all the files in the docs directory.
559
Éric Araujo60533e02011-06-06 02:00:54 +0200560When you use split source, the final path is computed this way::
Éric Araujo3a9f58f2011-06-01 20:42:49 +0200561
562 destination + prefix
563
564So for example, if you have this setup.cfg::
565
566 [metadata]
567 name = foo
568
569 [files]
570 resources =
571 doc/ doc.man = {doc}
572
573And if **{doc}** is replaced by **{datadir}/doc/{distribution.name}**, final
574path will be::
575
576 {datadir}/doc/foo/doc.man
577
578
579Overwriting paths for categories
580^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
581
582This part is intended for system administrators or downstream OS packagers.
583
584The real paths of categories are registered in the *sysconfig.cfg* file
585installed in your python installation. This file uses an ini format too.
586The content of the file is organized into several sections:
587
588* globals: Standard categories's paths.
589* posix_prefix: Standard paths for categories and installation paths for posix
590 system.
591* other ones XXX
592
593Standard categories paths are platform independent, they generally refers to
594other categories, which are platform dependent. :mod:`sysconfig` will choose
595these category from sections matching os.name. For example::
596
597 doc = {datadir}/doc/{distribution.name}
598
599It refers to datadir category, which can be different between platforms. In
600posix system, it may be::
601
602 datadir = /usr/share
603
604So the final path will be::
605
606 doc = /usr/share/doc/{distribution.name}
607
608The platform-dependent categories are:
609
610* confdir
611* datadir
612* libdir
613* base
614
615
616Defining extra categories
617^^^^^^^^^^^^^^^^^^^^^^^^^
618
619.. TODO
620
621
622Examples
623^^^^^^^^
624
625These examples are incremental but work unitarily.
626
627Resources in root dir
628"""""""""""""""""""""
629
630Source tree::
631
632 babar-1.0/
633 README
634 babar.sh
635 launch.sh
636 babar.py
637
638:file:`setup.cfg`::
639
640 [files]
641 resources =
642 README = {doc}
643 *.sh = {scripts}
644
645So babar.sh and launch.sh will be placed in {scripts} directory.
646
647Now let's move all the scripts into a scripts directory.
648
649Resources in sub-directory
650""""""""""""""""""""""""""
651
652Source tree::
653
654 babar-1.1/
655 README
656 scripts/
657 babar.sh
658 launch.sh
659 LAUNCH
660 babar.py
661
662:file:`setup.cfg`::
663
664 [files]
665 resources =
666 README = {doc}
667 scripts/ LAUNCH = {doc}
668 scripts/ *.sh = {scripts}
669
670It's important to use the separator after scripts/ to install all the shell
671scripts into {scripts} instead of {scripts}/scripts.
672
673Now let's add some docs.
674
675Resources in multiple sub-directories
676"""""""""""""""""""""""""""""""""""""
677
678Source tree::
679
680 babar-1.2/
681 README
682 scripts/
683 babar.sh
684 launch.sh
685 LAUNCH
686 docs/
687 api
688 man
689 babar.py
690
691:file:`setup.cfg`::
692
693 [files]
694 resources =
695 README = {doc}
696 scripts/ LAUNCH = {doc}
697 scripts/ *.sh = {scripts}
698 doc/ * = {doc}
699 doc/ man = {man}
700
701You want to place all the file in the docs script into {doc} category, instead
702of man, which must be placed into {man} category, we will use the order of
703declaration of globs to choose the destination, the last glob that match the
704file is used.
705
706Now let's add some scripts for windows users.
707
708Complete example
709""""""""""""""""
710
711Source tree::
712
713 babar-1.3/
714 README
715 doc/
716 api
717 man
718 scripts/
719 babar.sh
720 launch.sh
721 babar.bat
722 launch.bat
723 LAUNCH
724
725:file:`setup.cfg`::
726
727 [files]
728 resources =
729 README = {doc}
730 scripts/ LAUNCH = {doc}
731 scripts/ *.{sh,bat} = {scripts}
732 doc/ * = {doc}
733 doc/ man = {man}
734
735We use brace expansion syntax to place all the shell and batch scripts into
736{scripts} category.
737
738
739Command sections
740================
741
742To pass options to commands without having to type them on the command line
743for each invocation, you can write them in the :file:`setup.cfg` file, in a
744section named after the command. Example::
745
746 [sdist]
747 # special function to add custom files
748 manifest-builders = package.setup.list_extra_files
749
750 [build]
751 use-2to3 = True
752
753 [build_ext]
754 inplace = on
755
756 [check]
757 strict = on
758 all = on
759
760Option values given in the configuration file can be overriden on the command
761line. See :ref:`packaging-setup-config` for more information.
Éric Araujoba661a92011-06-04 02:31:14 +0200762
763
764Extensibility
765=============
766
Éric Araujo1cf8a322011-06-06 02:00:03 +0200767Every section can have fields that are not part of this specification. They are
768called **extensions**.
Éric Araujoba661a92011-06-04 02:31:14 +0200769
Éric Araujo1cf8a322011-06-06 02:00:03 +0200770An extension field starts with ``X-``. Example::
Éric Araujoba661a92011-06-04 02:31:14 +0200771
772 [metadata]
Éric Araujo1cf8a322011-06-06 02:00:03 +0200773 name = Distribute
Éric Araujoba661a92011-06-04 02:31:14 +0200774 X-Debian-Name = python-distribute
775
776
777Changes in the specification
778============================
779
Éric Araujoa69ade82011-06-06 02:02:34 +0200780The versioning scheme for this specification is **MAJOR.MINOR**. Changes in the
781specification will cause the version number to be updated.
Éric Araujoba661a92011-06-04 02:31:14 +0200782
Éric Araujoa69ade82011-06-06 02:02:34 +0200783Changes to the minor number reflect backwards-compatible changes:
Éric Araujoba661a92011-06-04 02:31:14 +0200784
Éric Araujoa69ade82011-06-06 02:02:34 +0200785- New fields and sections (optional or mandatory) can be added.
786- Optional fields can be removed.
Éric Araujoba661a92011-06-04 02:31:14 +0200787
Éric Araujoa69ade82011-06-06 02:02:34 +0200788The major number will be incremented for backwards-incompatible changes:
Éric Araujoba661a92011-06-04 02:31:14 +0200789
Éric Araujoa69ade82011-06-06 02:02:34 +0200790- Mandatory fields or sections are removed.
791- Fields change their meaning.
Éric Araujoba661a92011-06-04 02:31:14 +0200792
Éric Araujoa69ade82011-06-06 02:02:34 +0200793As a consequence, a tool written to consume 1.5 has these properties:
Éric Araujoba661a92011-06-04 02:31:14 +0200794
Éric Araujoa69ade82011-06-06 02:02:34 +0200795- Can read 1.1, 1.2 and all versions < 1.5, since the tool knows what
796 optional fields weren't there.
Éric Araujoba661a92011-06-04 02:31:14 +0200797
Éric Araujoa69ade82011-06-06 02:02:34 +0200798 .. XXX clarify
Éric Araujoba661a92011-06-04 02:31:14 +0200799
Éric Araujoa69ade82011-06-06 02:02:34 +0200800- Can also read 1.6 and other 1.x versions: The tool will just ignore fields it
801 doesn't know about, even if they are mandatory in the new version. If
802 optional fields were removed, the tool will just consider them absent.
Éric Araujoba661a92011-06-04 02:31:14 +0200803
Éric Araujoa69ade82011-06-06 02:02:34 +0200804- Cannot read 2.x and should refuse to interpret such files.
Éric Araujoba661a92011-06-04 02:31:14 +0200805
Éric Araujoa69ade82011-06-06 02:02:34 +0200806A tool written to produce 1.x should have these properties:
Éric Araujoba661a92011-06-04 02:31:14 +0200807
Éric Araujoa69ade82011-06-06 02:02:34 +0200808- Writes all mandatory fields.
809- May write optional fields.
Éric Araujo1cf8a322011-06-06 02:00:03 +0200810
811
812Acknowledgments
813===============
814
815This specification includes work and feedback from these people:
816
817- Tarek Ziadé
818- Julien Jehannet
819- Boris Feld
820- Éric Araujo
821
822(If your name is missing, please :ref:`let us know <reporting-bugs>`.)