mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 04:00:37 +00:00
doc: Update the README
This commit is contained in:
parent
949fba4b1f
commit
36e516d6a0
1 changed files with 59 additions and 284 deletions
343
docs/README
343
docs/README
|
@ -1,191 +1,93 @@
|
||||||
GStreamer documentation notes
|
GStreamer documentation notes
|
||||||
|
|
||||||
IMPORTANT
|
|
||||||
=========
|
|
||||||
|
|
||||||
Please make sure you've read and understood everything in this file
|
|
||||||
before you try changing documentation.
|
|
||||||
|
|
||||||
Some of the docbook-related bits in this README might be out of date now that
|
|
||||||
quite a bit of the documentation has moved into the gst-docs repository.
|
|
||||||
|
|
||||||
OVERVIEW
|
OVERVIEW
|
||||||
========
|
========
|
||||||
|
|
||||||
GStreamer has two sets of documentation that we maintain:
|
Our documentation uses hotdoc, you should usually refer to the
|
||||||
* API references, using gtk-doc (gstreamer, gstreamer-libs)
|
[hotdoc documentation](http://hotdoc.github.io/).
|
||||||
|
|
||||||
|
GStreamer has two sets of documentation but both are controlled and aggregated in
|
||||||
|
the `gst-docs` module:
|
||||||
|
|
||||||
|
* API references, using hotdoc (gstreamer, gstreamer-libs) - maintained
|
||||||
|
in each GStreamer modules repository
|
||||||
* FAQ / Application Development Manual / Plugin Writer's Guide / Tutorials -
|
* FAQ / Application Development Manual / Plugin Writer's Guide / Tutorials -
|
||||||
these are maintained in markdown format and live in the gst-docs repository.
|
these are maintained in markdown format and live in the gst-docs repository.
|
||||||
|
|
||||||
DOCBOOK NOTES
|
To build the full documentation you should make sure to have `hotdoc` installed and
|
||||||
=============
|
build [gst-build](https://cgit.freedesktop.org/gstreamer/gst-build/) configuring it with:
|
||||||
|
|
||||||
OK, I've grown so tired of having to coax the docs to build every time I
|
```
|
||||||
get round to it that I've decided to note down some of the things that
|
meson -Ddoc=enabled build/
|
||||||
are important to know.
|
```
|
||||||
|
|
||||||
OVERVIEW
|
And building the documentation:
|
||||||
--------
|
|
||||||
* Our documentation should all be Docbook/XML. No SGML.
|
|
||||||
* The source for the documentation is:
|
|
||||||
- one or more .xml files, with the main one being gstreamer-(whatever).xml
|
|
||||||
- image files
|
|
||||||
- in .svg
|
|
||||||
- in .png (and maybe others)
|
|
||||||
* We want to generate docs in HTML, PS and PDF
|
|
||||||
* We want to use xml to to generate these
|
|
||||||
|
|
||||||
CONVENTIONS
|
```
|
||||||
-----------
|
ninja -C build/ subprojects/gst-docs/GStreamer-doc`, this will result in two documentation sets:
|
||||||
We stick to some simple conventions for writing docbook documentation.
|
```
|
||||||
* id names:
|
|
||||||
- all id's start with chapter-, part-, section-, or misc-
|
|
||||||
- verify this is the case by looking at the generated file names in html/
|
|
||||||
- sections should also include the chapter name;
|
|
||||||
for example in a chapter called chapter-example, a section would be
|
|
||||||
called section-example-hello-world
|
|
||||||
|
|
||||||
HOW IMAGES ARE HANDLED
|
This will generate two outputs:
|
||||||
----------------------
|
|
||||||
* the format of images used is:
|
|
||||||
- PNG for html
|
|
||||||
- EPS for ps
|
|
||||||
- PDF for pdf
|
|
||||||
|
|
||||||
* images may need to be converted from their source format to the end format
|
- the html in `build/subprojects/gst-docs/GStreamer-doc/html`
|
||||||
|
- the [devhelp](https://wiki.gnome.org/Apps/Devhelp) in `build/subprojects/gst-docs/GStreamer-doc/devhelp`
|
||||||
* a file called image.entities is generated that provides two entities:
|
|
||||||
ℑ and ℑ
|
|
||||||
ℑ is the file extension (png, ps, pdf)
|
|
||||||
* all generated images will be put in images/
|
|
||||||
|
|
||||||
HOW THE BUILD WORKS FOR EACH FORMAT
|
|
||||||
-----------------------------------
|
|
||||||
* HTML:
|
|
||||||
- xmlto html gstreamer-whatever.xml should produce the html docs.
|
|
||||||
- We do this in the html subdir of the doc builddir.
|
|
||||||
- images are copied to (builddir)/html/images
|
|
||||||
- PNGS should be set to all of the png's referenced for html, both
|
|
||||||
already there and auto-generated
|
|
||||||
|
|
||||||
* PS :
|
|
||||||
- images are converted to .ps files in EPS format. Generated images are
|
|
||||||
put in images/
|
|
||||||
- xmlto ps gstreamer-whatever.xml generates the ps file
|
|
||||||
|
|
||||||
* PDF :
|
|
||||||
There are two ways:
|
|
||||||
- ps2pdf is the easiest
|
|
||||||
- we specify ps, PS as the image type, but using xmlto the build will fail
|
|
||||||
because it uses ps2pdf internally and it fails to generate the images
|
|
||||||
By hand-generating .pdf images before xmlto we can make the build succeed.
|
|
||||||
(This is why image-pdf has file ext pdf but type EPS; this tricks xmlto in
|
|
||||||
doing the right thing)
|
|
||||||
xmlto pdf gstreamer-whatever.xml generates pdf (but seems to fail on the
|
|
||||||
FAQ, so for now we use ps2pdf)
|
|
||||||
|
|
||||||
HOW THE BUILD SYSTEM IS SET UP
|
HOW THE BUILD SYSTEM IS SET UP
|
||||||
------------------------------
|
------------------------------
|
||||||
* make all should build html, ps, and pdf
|
Hotdoc build targets are generated for each documentation 'components' (ie. hotdoc
|
||||||
* html is built in a subdir, with the png/ps images copied there
|
subprojects). This includes libraries documentation and one target per GStreamer plugin.
|
||||||
* ps and pdf are built in the current dir, in one file
|
|
||||||
|
One can build a specific documentation target by explicitely building the target,
|
||||||
|
for example to build the GStreamer core library documentation (adapt the paths if you
|
||||||
|
are using `gst-build`):
|
||||||
|
|
||||||
|
ninja docs/libgstreamer-doc
|
||||||
|
|
||||||
|
Then the documentation will be avalaible in `docs/libgstreamer-doc/html/`.
|
||||||
|
|
||||||
SPELL CHECKING
|
SPELL CHECKING
|
||||||
--------------
|
--------------
|
||||||
* with aspell
|
|
||||||
* aspell -b -c --mode=sgml --lang=en <file>.xml
|
|
||||||
unfortunately the curses-ui of aspell (0.50.5) has problems with the xml tags
|
|
||||||
|
|
||||||
|
FILL ME.
|
||||||
|
|
||||||
GTK-DOC NOTES
|
HOTDOC NOTES
|
||||||
=============
|
=============
|
||||||
|
|
||||||
* files under revision control:
|
* files under revision control:
|
||||||
- Makefile.am
|
- sitemap.txt: defines the overall structure of the documentation
|
||||||
- gstreamer-sections.txt
|
- gst_plugins_cache.json: Automatically generated information about plugins
|
||||||
describes which symbols later appear on one api-doc page
|
|
||||||
configure which symbols are shown/invisible/private
|
|
||||||
- gstreamer.types
|
|
||||||
the types file lists all get_type() functions that register the GObject types
|
|
||||||
- gstreamer-docs.sgml
|
|
||||||
defines the overall structure of the api documentation
|
|
||||||
- tmpl/
|
|
||||||
- only add the file to CVS if you have at least filled the short description
|
|
||||||
(filename corresponds to the <FILE> tag in the sections file)
|
|
||||||
- document as much as possible in the source (*.c files)
|
|
||||||
|
|
||||||
* what to do when adding a new piece of API:
|
* what to do when adding a new piece of API:
|
||||||
- add both an entity and use the entity in gstreamer-docs.sgml
|
- Just let hotdoc generate the documentation and decide where to put it
|
||||||
- add a new <SECTION> to gstreamer-sections.txt in the correct alphabetical
|
- Make sure to add a `SECTION` documentation section in the file where
|
||||||
position related to the other sections (so that it is easier to locate)
|
the documentation should land (hotdoc will use that to create its
|
||||||
- add all documented symbols to gstreamer-sections.txt in the proper section
|
"smart index" and list symbols from other files that should land
|
||||||
(default),<SUBSECTION Standard>,<SUBSECTION Private>
|
on that page in that section.
|
||||||
- document at least the Short_Description in tmpl/.sgml
|
- document functions, signals in the .c files
|
||||||
- document symbols where they are defined, so that when one changes the
|
- document structs, typedefs, enums in the .h files
|
||||||
definition, the chaces are good that docs are updated.
|
|
||||||
- document functions, signals in the .c files
|
|
||||||
- document structs, typedefs, enums in the .h files
|
|
||||||
|
|
||||||
* checklist:
|
|
||||||
- make sure *-sections.txt has a <TITLE> set for each <FILE>
|
|
||||||
- add only *one* <TITLE> to each file, when you have multiple classes in one
|
|
||||||
source-file, create one <FILE> section for each class
|
|
||||||
- the <TITLE> *must* be named like the type of the GType, when it gets
|
|
||||||
registered (otherwise gtkdoc introspection fails)
|
|
||||||
- for clarity name the <FILE> like the <TITLE>, but all lowercase
|
|
||||||
|
|
||||||
* what to do when trying to improve the docs
|
* what to do when trying to improve the docs
|
||||||
- compare the output of
|
- compare the output of
|
||||||
grep "_get_type" gstreamer-sections.txt | sort
|
grep "_get_type" gstreamer-sections.txt | sort
|
||||||
with the types in XXX.types to detect entries that
|
with the types in XXX.types to detect entries that
|
||||||
are maybe missing
|
are maybe missing
|
||||||
- gtk docs does not warns about empty member docs!, run
|
- hotdoc does not warns about empty member docs!, run
|
||||||
find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@.*: *$" {} \;
|
find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@.*: *$" {} \;
|
||||||
in the project root to find them
|
in the project root to find them
|
||||||
- gtk docs does not warns about empty Returns: docs!, run
|
- hotdoc does not warns about empty Returns: docs!, run
|
||||||
find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@Returns: *$" {} \;
|
find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@Returns: *$" {} \;
|
||||||
in the project root to find them
|
in the project root to find them
|
||||||
|
|
||||||
* what happens during a gtk-doc build ?
|
* what happens during a hotdoc build ?
|
||||||
- Scan step:
|
- Read the GIR and scan the sources files for the docstrings and
|
||||||
- based on a $(MODULE).types file:
|
generate the documentation laying out pages the way they are documented.
|
||||||
- gtkdoc-scangobj creates a gtkdoc-scan binary
|
- The meson build definition is set in a way that makes it so all plugins
|
||||||
- using CC, LD, CFLAGS, LDFLAGS env var
|
in `plugins_doc` are introspected and documented
|
||||||
- using --type-init-func and --module parameters
|
|
||||||
- gtkdoc-scan creates
|
|
||||||
- $MODULE.signals.new
|
|
||||||
- $MODULE.hierarchy.new
|
|
||||||
- $MODULE.interfaces.new
|
|
||||||
- $MODULE.prerequisites.new
|
|
||||||
- $MODULE.args.new
|
|
||||||
- generated source and objects get deleted
|
|
||||||
- gtkdoc-scangobj merges changes into the original files
|
|
||||||
- gtkdoc-scan
|
|
||||||
- extracts decls of functions, macros, enums, structs, unions from headers
|
|
||||||
- generates
|
|
||||||
- $MODULE-decl.txt
|
|
||||||
- $MODULE-decl-list.txt
|
|
||||||
- $MODULE-decl-list.txt then should get copied to $MODULE-sections.txt
|
|
||||||
- scan-build.stamp gets created
|
|
||||||
|
|
||||||
- Template generation step:
|
STYLE GUIDE FOR HOTDOC
|
||||||
- gtkdoc-mktmpl --module=$MODULE
|
|
||||||
- reads in tmpl/*.sgml
|
|
||||||
- moves them to tmpl/*.sgml.bak
|
|
||||||
- recreates tmpl/*.sgml according to $MODULE-sections.txt
|
|
||||||
- moves unused stuff to $MODULE-unused.txt
|
|
||||||
- tmpl-build.stamp gets generated
|
|
||||||
|
|
||||||
* Possible errors and how to fix them
|
|
||||||
- Warning: multiple "IDs" for constraint linkend: gst-tag-register.
|
|
||||||
- check if gst_tag_register is listed more than once in -sections.txt
|
|
||||||
|
|
||||||
STYLE GUIDE FOR GTK-DOC
|
|
||||||
=======================
|
=======================
|
||||||
- this is in addition to gtk-doc's style-guide.txt
|
- this is in addition to gtk-doc's style-guide.txt
|
||||||
|
|
||||||
- when documenting signals, use "the #Gst..." for the object receiving the
|
|
||||||
signal; no trailing dot, and no "that received the signal"
|
|
||||||
- function/macro descriptions are descriptive, not imperative
|
- function/macro descriptions are descriptive, not imperative
|
||||||
ie, it uses the third person verb
|
ie, it uses the third person verb
|
||||||
- synopsis and description should have most-used/application functions at the
|
- synopsis and description should have most-used/application functions at the
|
||||||
|
@ -201,165 +103,38 @@ STYLE GUIDE FOR GTK-DOC
|
||||||
"Caller owns returned value" for other types (iterators, ..)
|
"Caller owns returned value" for other types (iterators, ..)
|
||||||
- we do this because, in contrast with GLib/GTK, we are more explicit
|
- we do this because, in contrast with GLib/GTK, we are more explicit
|
||||||
about threadsafety and related issues
|
about threadsafety and related issues
|
||||||
- link to signals from the description like this:
|
|
||||||
* The <link linkend="GstBin-element-added">element-added</link> signal
|
|
||||||
|
|
||||||
WEBSITE DOCUMENTATION
|
WEBSITE DOCUMENTATION
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
Updating the online documentation is pretty simple.
|
Updating the online documentation is done from with the `gst-docs` repository
|
||||||
Make sure that you
|
|
||||||
a) have a working freedesktop.org account
|
|
||||||
b) $HOME/.ssh/config set up so that it has the right User for the Host
|
|
||||||
(for example, I have:
|
|
||||||
Host freedesktop.org
|
|
||||||
User thomasvs
|
|
||||||
c) verify this works by doing ssh freedesktop.org and being logged in without
|
|
||||||
a password prompt
|
|
||||||
d) have verified your changes build documentation locally.
|
|
||||||
|
|
||||||
Then, after updating any of the docs, run "make upload" from that directory.
|
|
||||||
Or, run "make upload" from this (docs) directory.
|
|
||||||
|
|
||||||
DOCUMENTING ELEMENTS
|
DOCUMENTING ELEMENTS
|
||||||
====================
|
====================
|
||||||
As of september 2005 we have some system to document plugins and elements
|
A hotdoc plugin is provided by GStreamer to document GStreamer plugins.
|
||||||
in the various plugin packages.
|
|
||||||
|
|
||||||
- in a submodule, docs go in docs/plugins
|
|
||||||
- template can be copied from gst-plugins-base
|
|
||||||
- to add plugins documentation:
|
|
||||||
- create docs/plugins
|
|
||||||
- create Makefile.am and friends, add to configure.ac
|
|
||||||
- create docs/version.entities.in, add to configure.ac
|
|
||||||
- in docs/plugins:
|
|
||||||
- create $(module)-plugins.types with #include <gst/gst.h>
|
|
||||||
- run make
|
|
||||||
- edit the -docs.sgml
|
|
||||||
- add to cvs:
|
|
||||||
cvs add *-plugins-docs.sgml *-plugins.args *-plugins.hierarchy *-plugins.interfaces *-plugins.prerequisites *-plugins.signals *-plugins.types inspect-build.stamp inspect.stamp scanobj-build.stamp
|
|
||||||
cvs add inspect
|
|
||||||
cvs add inspect/*.xml
|
|
||||||
- Additional types can be added to the documentation by placing them in
|
|
||||||
the .types file like this:
|
|
||||||
type:GstPlayBaseBin
|
|
||||||
This is useful for documenting plugin-private types that implement
|
|
||||||
signals or properties. The GType is looked up by name after all the
|
|
||||||
element classes have been printed - so this is only useful for types
|
|
||||||
that are created as a consequence of loading plugins and registering
|
|
||||||
the element(s).
|
|
||||||
|
|
||||||
- to add a plugin to be documented:
|
- to add a plugin to be documented:
|
||||||
- make sure inspect/ has generated a inspect/plugin-xxx.xml file for it.
|
- make sure the plugin is added to the `plugins_doc` variable in meson
|
||||||
- if it has not, make sure you have pygst installed and run 'make update'.
|
|
||||||
and add it to CVS.
|
|
||||||
- add an xi:include in -docs.sgml in the Plugins chapter for that plugin
|
|
||||||
|
|
||||||
- to add an element to be documented:
|
- to add an element to be documented:
|
||||||
- add an xi:include in the Elements chapter for the element
|
|
||||||
in the main -docs.sgml
|
|
||||||
- add a section for it in -sections.txt with
|
|
||||||
<SECTION>
|
|
||||||
<FILE>element-(element)</FILE>
|
|
||||||
<TITLE>(element)</TITLE>
|
|
||||||
GstXxx
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
GstXxxClass
|
|
||||||
GST_XXX
|
|
||||||
GST_XXX_CLASS
|
|
||||||
GST_IS_XXX
|
|
||||||
GST_IS_XXX_CLASS
|
|
||||||
GST_TYPE_XXX
|
|
||||||
gst_xxx_get_type
|
|
||||||
</SECTION>
|
|
||||||
- add a gtk-doc section to the source code like:
|
- add a gtk-doc section to the source code like:
|
||||||
/**
|
/**
|
||||||
* SECTION:element-multifdsink
|
* SECTION:element-multifdsink
|
||||||
|
|
||||||
and fill it with documentation about the element, preferably inside
|
and fill it with documentation about the element
|
||||||
a <refsect2> docbook container.
|
|
||||||
- add an example:
|
- add an example:
|
||||||
- either a few pipelines, inside <programlisting>
|
- either a few pipelines, inside a codeblock
|
||||||
- or a piece of code:
|
- or a piece of code inside a codeblock or in `tests/examples/(pluginname)`
|
||||||
- create an example program (element)-example.c in the plugin dir
|
- to build the doc for a plugin, do:
|
||||||
- add the full path (starting with $(top_srcdir)) for this example
|
`ninja docs/(pluginname)-doc`
|
||||||
to the EXAMPLE_CFILES variable in Makefile.am
|
|
||||||
- add an xinclude of a file named "element-(element)-example.xml"
|
|
||||||
to the docbook documentation piece in the element source code
|
|
||||||
- add the header to EXTRA_HFILES in Makefile.am to be able to document
|
|
||||||
signals and args; in that case, the object struct needs to be in
|
|
||||||
-sections.txt outside of the Standard Subsection (which is annoying,
|
|
||||||
but ...)
|
|
||||||
(FIXME: are we sure we can both do the xinclude from the tmpl/ sgml,
|
|
||||||
as well as an override from the source itself ? maybe we should just
|
|
||||||
make sure the xinclude is in the source itself instead ?)
|
|
||||||
- if the plugin has no public header, don't add the c-file, add entries to the
|
|
||||||
-overrides.txt file (see playbin docs in plugins-base).
|
|
||||||
- to rebuild the docs, do:
|
|
||||||
make clean
|
|
||||||
make update
|
|
||||||
make
|
|
||||||
- examples will only show up using gtk-doc 1.4 or later - it relies on
|
|
||||||
merging stuff from .sgml with inline docs. We might want to change
|
|
||||||
this to only get stuff from the source.
|
|
||||||
- you need to commit resulting files to git:
|
|
||||||
- changes to *.signals and *.args
|
|
||||||
- new files for your plugin created in inspect/
|
|
||||||
- if you get this warning:
|
|
||||||
" Documentation in template xxx for ./tmpl/element-yyy:Short_Description
|
|
||||||
being overridden by inline comments"
|
|
||||||
per-default the description from the GST_ELEMENT_DETAILS is put to the
|
|
||||||
Short_Description. This warning mean you have a different one in the section
|
|
||||||
docs as "@short_description:".
|
|
||||||
|
|
||||||
- the plugin-doc-list on the gstreamer homepage is updated along with other
|
|
||||||
web site updates.
|
|
||||||
|
|
||||||
- maintainer tricks:
|
|
||||||
- in gst-plugins-foo/docs/plugins/, run
|
|
||||||
make check-inspected-versions
|
|
||||||
to show plugins whose inspect information is not up-to-date (which is
|
|
||||||
usually either because they have been moved to a different module or
|
|
||||||
because they are not built on the maintainer's machine for some reason).
|
|
||||||
Whether it really makes sense to update the version number is debatable
|
|
||||||
(after all, the inspected information may be outdated and things may have
|
|
||||||
changed, in which case it would be bad to change the version number)
|
|
||||||
- find files that have docs
|
|
||||||
for file in `find . -name "*.c" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.c/.h} ]; then echo ${file/.c/.h}; else echo "no header for $file"; fi; done
|
|
||||||
for file in `find . -name "*.cc" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.cc/.h} ]; then echo ${file/.cc/.h}; else echo "no header for $file"; fi; done
|
|
||||||
- add those .h files to EXTRA_HFILES in Makefile.am
|
|
||||||
- update gst-plugins-xxx-docs.sgml
|
|
||||||
cd docs/plugins
|
|
||||||
ls -1 xml/plugin-*.xml | sort | sed -e "s/\(.*\)/ \<xi:include href=\"\1\" \/\>/"
|
|
||||||
ls -1 xml/element-*.xml | grep -v -- "-details.xml" | sort | sed -e "s/\(.*\)/ \<xi:include href=\"\1\" \/\>/"
|
|
||||||
- maybe we can generate these lists after "make update" and just xi:include
|
|
||||||
them in gst-plugins-xxx-docs.sgml. They should be committed to the vcs.
|
|
||||||
|
|
||||||
- possible errors:
|
|
||||||
- "multiple constraints for linkend ID":
|
|
||||||
check if each section in -sections.txt actually starts and ends with
|
|
||||||
<SECTION> and </SECTION>
|
|
||||||
- if a plugin does not show up:
|
|
||||||
- check inspect/plugin-xxx.xml and tmpl/elements-
|
|
||||||
|
|
||||||
RANDOM THINGS I'VE LEARNED
|
|
||||||
==========================
|
|
||||||
|
|
||||||
* for clean builddir != srcdir separation, I wanted to use xmlto --searchpath
|
|
||||||
so the source xml could find the built entity file.
|
|
||||||
But xmlto --searchpath is (right now) for TeX input, not xml input.
|
|
||||||
xsltproc has a --path option (that xmlto doesn't use yet), but it
|
|
||||||
resolves single files to $(specified_path)/$(srcdir)/$(file)
|
|
||||||
For now, we need to hack around it by copying xml to the build dir.
|
|
||||||
|
|
||||||
|
|
||||||
DEVHELP INTEGRATION
|
DEVHELP INTEGRATION
|
||||||
-------------------
|
-------------------
|
||||||
Check https://wiki.gnome.org/Apps/Devhelp
|
Check https://wiki.gnome.org/Apps/Devhelp
|
||||||
It's a really nice development app allowing you to look up API stuff
|
It's a really nice development app allowing you to look up API stuff
|
||||||
from various gtk-doc'd libraries. GStreamer is one of these ;)
|
from various hotdoc/gtk-doc'd libraries. GStreamer is one of these ;)
|
||||||
|
|
||||||
gtk-doc generates both html API docs and the matching .devhelp(2) books.
|
hotdoc generates both html API docs and the matching .devhelp(2) books.
|
||||||
|
|
||||||
IMAGES
|
IMAGES
|
||||||
------
|
------
|
||||||
|
|
Loading…
Reference in a new issue