| 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 |
| ======== |
| |
| GStreamer has two sets of documentation that we maintain: |
| * API references, using gtk-doc (gstreamer, gstreamer-libs) |
| * FAQ / Application Development Manual / Plugin Writer's Guide / Tutorials - |
| these are maintained in markdown format and live in the gst-docs repository. |
| |
| DOCBOOK NOTES |
| ============= |
| |
| 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 |
| are important to know. |
| |
| OVERVIEW |
| -------- |
| * 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 |
| ----------- |
| 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 |
| ---------------------- |
| * 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 |
| |
| * 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 |
| ------------------------------ |
| * make all should build html, ps, and pdf |
| * html is built in a subdir, with the png/ps images copied there |
| * ps and pdf are built in the current dir, in one file |
| |
| 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 |
| |
| |
| GTK-DOC NOTES |
| ============= |
| |
| * files under revision control: |
| - Makefile.am |
| - gstreamer-sections.txt |
| 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: |
| - add both an entity and use the entity in gstreamer-docs.sgml |
| - add a new <SECTION> to gstreamer-sections.txt in the correct alphabetical |
| position related to the other sections (so that it is easier to locate) |
| - add all documented symbols to gstreamer-sections.txt in the proper section |
| (default),<SUBSECTION Standard>,<SUBSECTION Private> |
| - document at least the Short_Description in tmpl/.sgml |
| - document symbols where they are defined, so that when one changes the |
| 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 |
| - compare the output of |
| grep "_get_type" gstreamer-sections.txt | sort |
| with the types in XXX.types to detect entries that |
| are maybe missing |
| - gtk docs does not warns about empty member docs!, run |
| find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@.*: *$" {} \; |
| in the project root to find them |
| - gtk docs does not warns about empty Returns: docs!, run |
| find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@Returns: *$" {} \; |
| in the project root to find them |
| |
| * what happens during a gtk-doc build ? |
| - Scan step: |
| - based on a $(MODULE).types file: |
| - gtkdoc-scangobj creates a gtkdoc-scan binary |
| - using CC, LD, CFLAGS, LDFLAGS env var |
| - 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: |
| - 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 |
| |
| - 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 |
| ie, it uses the third person verb |
| - synopsis and description should have most-used/application functions at the |
| top |
| - functions that can return FALSE/NULL or fail should describe their failure |
| conditions like this: |
| * Returns NULL if no element with the given name is found in the bin, if |
| * the frobble was stuck in the froob, or the frizzle was frazzed. |
| - a line with function attributes should be added before Returns: |
| - can contain: |
| "MT safe." - the function is verified to be multithreadingsafe |
| "Caller owns returned reference" for refcounted classes |
| "Caller owns returned value" for other types (iterators, ..) |
| - we do this because, in contrast with GLib/GTK, we are more explicit |
| 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 |
| ===================== |
| |
| Updating the online documentation is pretty simple. |
| 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 |
| ==================== |
| As of september 2005 we have some system to document plugins and elements |
| 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: |
| - make sure inspect/ has generated a inspect/plugin-xxx.xml file for it. |
| - 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: |
| - 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: |
| /** |
| * SECTION:element-multifdsink |
| |
| and fill it with documentation about the element, preferably inside |
| a <refsect2> docbook container. |
| - add an example: |
| - either a few pipelines, inside <programlisting> |
| - or a piece of code: |
| - create an example program (element)-example.c in the plugin dir |
| - add the full path (starting with $(top_srcdir)) for this example |
| 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 |
| ------------------- |
| Check https://wiki.gnome.org/Apps/Devhelp |
| 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 ;) |
| |
| gtk-doc generates both html API docs and the matching .devhelp(2) books. |
| |
| IMAGES |
| ------ |
| It's important to keep the original source format for images, to be able |
| to change and regenerate later on. Original files go in |
| docs/images |