summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/doxygen/.gitignore1
-rwxr-xr-xdoc/doxygen/gen-doxygen.py105
-rw-r--r--doc/doxygen/meson.build105
-rw-r--r--doc/doxygen/xml/Client/meson.build18
-rw-r--r--doc/doxygen/xml/Server/meson.build18
-rw-r--r--doc/doxygen/xml/meson.build22
-rw-r--r--doc/man/meson.build46
-rw-r--r--doc/meson.build38
-rw-r--r--doc/publican/meson.build30
-rw-r--r--doc/publican/sources/meson.build113
10 files changed, 495 insertions, 1 deletions
diff --git a/doc/doxygen/.gitignore b/doc/doxygen/.gitignore
index a85e6c0..d68d6fc 100644
--- a/doc/doxygen/.gitignore
+++ b/doc/doxygen/.gitignore
@@ -1,4 +1,3 @@
doxygen_sqlite3.db
html/
wayland.doxygen
-xml/
diff --git a/doc/doxygen/gen-doxygen.py b/doc/doxygen/gen-doxygen.py
new file mode 100755
index 0000000..1bb07e5
--- /dev/null
+++ b/doc/doxygen/gen-doxygen.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python3
+
+import argparse
+import datetime
+import errno
+import os
+import subprocess
+import sys
+
+# Custom configuration for each documentation format
+doxygen_templates = {
+ 'xml': [
+ 'GENERATE_XML=YES\n',
+ 'XML_OUTPUT={format}/{section}\n',
+ 'INPUT= {files}\n',
+ ],
+ 'html': [
+ 'GENERATE_HTML=YES\n',
+ 'HTML_OUTPUT={format}/{section}\n',
+ 'PROJECT_NAME=\"Wayland {section} API\"\n',
+ 'INPUT= {files}\n',
+ ],
+ 'man': [
+ 'GENERATE_MAN=YES\n',
+ 'MAN_OUTPUT={format}\n',
+ 'MAN_SUBDIR=.\n',
+ 'JAVADOC_AUTOBRIEF=NO\n',
+ 'INPUT= {files}\n',
+ ],
+}
+
+def load_doxygen_file(doxyfile):
+ with open(doxyfile, 'r') as f:
+ res = f.readlines()
+ return res
+
+def get_template(outformat):
+ for (k,v) in doxygen_templates.items():
+ if outformat.startswith(k):
+ return v
+
+def gen_doxygen_file(data, outformat, section, files):
+ for l in get_template(outformat):
+ data.append(l.format(format=outformat, section=section, files=' '.join(files)))
+ return data
+
+parser = argparse.ArgumentParser(description='Generate docs with Doxygen')
+parser.add_argument('doxygen_file',
+ help='The doxygen file to use')
+parser.add_argument('files',
+ help='The list of files to parse',
+ metavar='FILES',
+ nargs='+')
+parser.add_argument('--builddir',
+ help='The build directory',
+ metavar='DIR',
+ default='.')
+parser.add_argument('--section',
+ help='The section to build',
+ metavar='NAME',
+ default='Client')
+parser.add_argument('--output-format',
+ help='The output format: xml, html, man',
+ metavar='FORMAT',
+ default='xml')
+parser.add_argument('--stamp',
+ help='Stamp file to output',
+ metavar='STAMP_FILE',
+ nargs='?',
+ type=argparse.FileType('w'))
+
+args = parser.parse_args()
+
+# Merge the doxyfile with our custom templates
+conf = load_doxygen_file(args.doxygen_file)
+conf = gen_doxygen_file(conf, args.output_format, args.section, args.files)
+
+# Doxygen is not clever enough to create the directories it
+# needs beforehand
+try:
+ os.makedirs(os.path.join(args.builddir, args.output_format))
+except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise e
+
+# Run Doxygen with the generated doxyfile
+cmd = subprocess.Popen(['doxygen', '-'], stdin=subprocess.PIPE)
+cmd.stdin.write(''.join(conf).encode('utf-8'))
+cmd.stdin.close()
+if cmd.wait() != 0:
+ sys.exit(1)
+
+# This is a bit of a hack; Doxygen will generate way more files than we
+# want to install, but there's no way to know how many at configuration
+# time. Since we want to install only the wl_* man pages anyway, we can
+# delete the other files and let Meson install the whole man3 subdirectory
+if args.output_format.startswith('man'):
+ manpath = os.path.join(args.builddir, args.output_format)
+ for filename in os.listdir(manpath):
+ full_path = os.path.join(manpath, filename)
+ if not filename.startswith('wl_'):
+ os.remove(full_path)
+
+if args.stamp:
+ args.stamp.write(str(datetime.datetime.now()))
diff --git a/doc/doxygen/meson.build b/doc/doxygen/meson.build
new file mode 100644
index 0000000..c39b282
--- /dev/null
+++ b/doc/doxygen/meson.build
@@ -0,0 +1,105 @@
+# Here be dragons
+
+dot_gv = {
+ 'wayland-architecture': files('dot/wayland-architecture.gv'),
+ 'x-architecture': files('dot/x-architecture.gv'),
+}
+
+# This is a workaround for Meson's custom_target() directive, which
+# currently does not support outputs pointing to a sub-directory
+# XXX: try turning these into maps, so they can be indexed with picture name
+dot_png = []
+dot_map = []
+
+doxygen_conf = configuration_data()
+doxygen_conf.set('VERSION', meson.project_version())
+doxygen_conf.set('top_builddir', meson.build_root())
+wayland_doxygen = configure_file(
+ input: 'wayland.doxygen.in',
+ output: 'wayland.doxygen',
+ configuration: doxygen_conf,
+)
+
+shared_files = files([
+ '../../src/wayland-util.h',
+])
+
+client_files = files([
+ '../../src/wayland-client.c',
+ '../../src/wayland-client.h',
+ '../../src/wayland-client-core.h',
+])
+
+server_files = files([
+ '../../src/event-loop.c',
+ '../../src/wayland-server.c',
+ '../../src/wayland-server.h',
+ '../../src/wayland-server-core.h',
+ '../../src/wayland-shm.c',
+])
+
+extra_client_files = [
+ 'mainpage.dox',
+ wayland_client_protocol_h,
+]
+
+extra_server_files = [
+ 'mainpage.dox',
+ wayland_server_protocol_h,
+]
+
+gen_doxygen = find_program('gen-doxygen.py')
+
+subdir('xml')
+
+formats = {
+ 'html': {
+ 'Client': shared_files + client_files + extra_client_files,
+ 'Server': shared_files + server_files + extra_server_files,
+ },
+}
+
+foreach f_name, sections: formats
+ foreach s_name, s_files: sections
+ t_name = '@0@-@1@-doc'.format(f_name, s_name)
+
+ # We do not really need an output file, but Meson
+ # will complain if one is not set, so we use a
+ # dummy 'stamp' file
+ custom_target(
+ t_name,
+ command: [
+ gen_doxygen,
+ # XXX pass doxygen path as argument
+ '--builddir=@OUTDIR@',
+ '--section=@0@'.format(s_name),
+ '--output-format=@0@'.format(f_name),
+ '--stamp=doc/doxygen/@0@.stamp'.format(t_name),
+ wayland_doxygen,
+ '@INPUT@',
+ ],
+ input: s_files,
+ output: '@0@.stamp'.format(t_name),
+ depends: [dot_png, dot_map],
+ build_by_default: true,
+ )
+ endforeach
+endforeach
+
+man_files = shared_files + server_files + client_files
+custom_target(
+ 'man-pages-3',
+ command: [
+ gen_doxygen,
+ '--builddir=@OUTDIR@',
+ '--output-format=man3',
+ '--stamp=doc/doxygen/man3.stamp',
+ wayland_doxygen,
+ '@INPUT@',
+ ],
+ input: man_files,
+ output: 'man3',
+ build_by_default: true,
+ install: true,
+ install_dir: join_paths(get_option('prefix'), get_option('mandir')),
+)
diff --git a/doc/doxygen/xml/Client/meson.build b/doc/doxygen/xml/Client/meson.build
new file mode 100644
index 0000000..849c30d
--- /dev/null
+++ b/doc/doxygen/xml/Client/meson.build
@@ -0,0 +1,18 @@
+tgt = custom_target(
+ 'xml-Client-doc',
+ command: [
+ gen_doxygen,
+ # XXX pass doxygen path as argument
+ '--builddir=@OUTDIR@',
+ '--section=Client',
+ '--output-format=xml',
+ wayland_doxygen,
+ '@INPUT@',
+ ],
+ input: [ shared_files, client_files ],
+ output: [ 'combine.xslt', 'index.xml' ],
+ depends: [dot_png, dot_map]
+)
+
+doxygen_Client_combine_xslt = tgt[0]
+doxygen_Client_index_xml = tgt[1]
diff --git a/doc/doxygen/xml/Server/meson.build b/doc/doxygen/xml/Server/meson.build
new file mode 100644
index 0000000..4792c1b
--- /dev/null
+++ b/doc/doxygen/xml/Server/meson.build
@@ -0,0 +1,18 @@
+tgt = custom_target(
+ 'xml-Server-doc',
+ command: [
+ gen_doxygen,
+ # XXX pass doxygen path as argument
+ '--builddir=@OUTDIR@',
+ '--section=Server',
+ '--output-format=xml',
+ wayland_doxygen,
+ '@INPUT@',
+ ],
+ input: [ shared_files, server_files ],
+ output: [ 'combine.xslt', 'index.xml' ],
+ depends: [dot_png, dot_map]
+)
+
+doxygen_Server_combine_xslt = tgt[0]
+doxygen_Server_index_xml = tgt[1]
diff --git a/doc/doxygen/xml/meson.build b/doc/doxygen/xml/meson.build
new file mode 100644
index 0000000..6d55c53
--- /dev/null
+++ b/doc/doxygen/xml/meson.build
@@ -0,0 +1,22 @@
+# dot_png: list of PNG targets
+# dot_map: list of MAP targets
+foreach name, infile: dot_gv
+ dot_png += custom_target(
+ name + '.png',
+ command: [ dot, '-Tpng', '-o@OUTPUT@', '@INPUT@' ],
+ input: infile,
+ output: name + '.png',
+ install: true,
+ install_dir: join_paths(publican_install_prefix, publican_html_dir, 'images')
+ )
+
+ dot_map += custom_target(
+ name + '.map',
+ command: [ dot, '-Tcmapx_np', '-o@OUTPUT@', '@INPUT@' ],
+ input: infile,
+ output: name + '.map',
+ )
+endforeach
+
+subdir('Client')
+subdir('Server')
diff --git a/doc/man/meson.build b/doc/man/meson.build
new file mode 100644
index 0000000..0fd4cec
--- /dev/null
+++ b/doc/man/meson.build
@@ -0,0 +1,46 @@
+man_pages = [
+ {
+ 'section': '3',
+ 'xml': 'wl_display_connect.xml',
+ 'name': 'wl_display_connect',
+ 'alias': 'wl_display_connect_to_fd',
+ }
+]
+
+xsltproc_opts = [
+ '--nonet',
+ '--stringparam', 'man.authors.section.enabled', '0',
+ '--stringparam', 'man.copyright.section.enabled', '0',
+ '--stringparam', 'funcsynopsis.style', 'ansi',
+ '--stringparam', 'man.output.quietly', '1',
+]
+
+foreach page: man_pages
+ section_number = page['section']
+ xml_input = page['xml']
+ name = page['name']
+ alias = page.get('alias', '')
+
+ man_output = name + '.' + section_number
+ if alias != ''
+ alias_output = alias + '.' + section_number
+ else
+ alias_output = []
+ endif
+
+ man_page = custom_target(
+ name + '-man',
+ command: [
+ xsltproc,
+ xsltproc_opts,
+ '-o', '@OUTPUT0@',
+ manpage_xsl,
+ '@INPUT@',
+ ],
+ input: xml_input,
+ output: [ man_output, alias_output ],
+ install: true,
+ install_dir: join_paths(get_option('prefix'), get_option('mandir'), 'man' + section_number),
+ build_by_default: true,
+ )
+endforeach
diff --git a/doc/meson.build b/doc/meson.build
new file mode 100644
index 0000000..0b46f48
--- /dev/null
+++ b/doc/meson.build
@@ -0,0 +1,38 @@
+dot = find_program('dot')
+doxygen = find_program('doxygen')
+xsltproc = find_program('xsltproc')
+xmlto = find_program('xmlto')
+
+cmd = run_command(doxygen, '--version', check: true)
+message('doxygen: ' + cmd.stdout().strip())
+vers = cmd.stdout().strip()
+if vers.version_compare('< 1.6.0')
+ error('Doxygen 1.6 or later is required for building documentation, found @0@.'.format(vers))
+endif
+
+cmd = run_command(dot, '-V', check: true)
+message('dot: ' + cmd.stderr().strip())
+vers = cmd.stderr().split('version')[1].strip().split(' ')[0]
+if vers.version_compare('< 2.26.0')
+ error('Dot (Graphviz) 2.26 or later is required for building documentation, found @0@.'.format(vers))
+endif
+
+manpage_xsl = 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl'
+cmd = run_command(xsltproc, '--nonet', manpage_xsl)
+if cmd.returncode() != 0
+ error('The style sheet for man pages providing "@0@" was not found.'.format(manpage_xsl))
+endif
+
+publican_install_prefix = join_paths(
+ get_option('prefix'),
+ get_option('datadir'),
+ 'doc',
+ meson.project_name(),
+ 'Wayland', 'en-US'
+)
+
+publican_html_dir = 'html'
+
+subdir('doxygen')
+subdir('man')
+subdir('publican')
diff --git a/doc/publican/meson.build b/doc/publican/meson.build
new file mode 100644
index 0000000..898ca4f
--- /dev/null
+++ b/doc/publican/meson.build
@@ -0,0 +1,30 @@
+merge_mapcoords_xsl = files('merge-mapcoords.xsl')
+
+subdir('sources')
+
+custom_target(
+ 'Wayland-docbook-html',
+ command: [
+ xmlto,
+ '--skip-validation',
+ '--stringparam', 'chunk.section.depth=0',
+ '--stringparam', 'toc.section.depth=1',
+ '--stringparam', 'html.stylesheet=css/default.css',
+ '-o', '@OUTPUT@',
+ 'html',
+ '@INPUT@'
+ ],
+ input: publican_processed_main,
+ output: publican_html_dir,
+ depend_files: publican_copied_sources,
+ depends: [
+ publican_processed_targets,
+ ClientAPI_xml,
+ ServerAPI_xml,
+ ProtocolSpec_xml,
+ ProtocolInterfaces_xml
+ ],
+ build_by_default: true,
+ install: true,
+ install_dir: publican_install_prefix
+)
diff --git a/doc/publican/sources/meson.build b/doc/publican/sources/meson.build
new file mode 100644
index 0000000..52f3a68
--- /dev/null
+++ b/doc/publican/sources/meson.build
@@ -0,0 +1,113 @@
+ProtocolSpec_xml = custom_target(
+ 'ProtocolSpec.xml',
+ command: [ xsltproc, '-o', '@OUTPUT@', files('../protocol-to-docbook.xsl'), '@INPUT@' ],
+ input: wayland_protocol_xml,
+ output: 'ProtocolSpec.xml'
+)
+
+ProtocolInterfaces_xml = custom_target(
+ 'ProtocolInterfaces.xml',
+ command: [ xsltproc, '-o', '@OUTPUT@', files('../protocol-interfaces-to-docbook.xsl'), '@INPUT@' ],
+ input: wayland_protocol_xml,
+ output: 'ProtocolInterfaces.xml'
+)
+
+ClientAPI_combined = custom_target(
+ 'ClientAPI-combined',
+ command: [ xsltproc, '-o', '@OUTPUT@', '@INPUT@' ],
+ input: [ doxygen_Client_combine_xslt, doxygen_Client_index_xml ],
+ output: 'ClientAPI-combined.xml'
+)
+
+to_publican_xsl = files('../doxygen-to-publican.xsl')
+
+ClientAPI_xml = custom_target(
+ 'ClientAPI.xml',
+ command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'which', 'Client', to_publican_xsl, '@INPUT@' ],
+ input: ClientAPI_combined,
+ output: 'ClientAPI.xml'
+)
+
+ServerAPI_combined = custom_target(
+ 'ServerAPI-combined',
+ command: [ xsltproc, '-o', '@OUTPUT@', '@INPUT@' ],
+ input: [ doxygen_Server_combine_xslt, doxygen_Server_index_xml ],
+ output: 'ServerAPI-combined.xml'
+)
+
+ServerAPI_xml = custom_target(
+ 'ServerAPI.xml',
+ command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'which', 'Server', to_publican_xsl, '@INPUT@' ],
+ input: ServerAPI_combined,
+ output: 'ServerAPI.xml'
+)
+
+
+publican_sources = [
+ 'Wayland.ent',
+ # 'Wayland.xml', # handled specially
+ 'Book_Info.xml',
+ 'Author_Group.xml',
+ 'Foreword.xml',
+ 'Preface.xml',
+ 'Revision_History.xml',
+ 'Protocol.xml',
+ 'Xwayland.xml',
+ 'Compositors.xml',
+ 'Client.xml',
+ 'Server.xml'
+]
+
+publican_processed_main = configure_file(
+ input: 'Wayland.xml',
+ output: 'Wayland.xml',
+ copy: true
+)
+
+publican_copied_sources = []
+foreach src: publican_sources
+ publican_copied_sources += configure_file(
+ input: src,
+ output: src,
+ copy: true
+ )
+endforeach
+
+publican_processed_sources = [
+ 'Architecture.xml',
+ 'Introduction.xml'
+]
+
+publican_processed_targets = []
+foreach src: publican_processed_sources
+ publican_processed_targets += custom_target(
+ src,
+ command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'basedir', '.', merge_mapcoords_xsl, '@INPUT@' ],
+ input: src,
+ output: src
+ )
+endforeach
+
+publican_css_sources = files([
+ 'css/brand.css',
+ 'css/common.css',
+ 'css/default.css',
+ 'css/epub.css',
+ 'css/print.css'
+])
+
+install_data(
+ publican_css_sources,
+ install_dir: join_paths(publican_install_prefix, publican_html_dir, 'css')
+)
+
+publican_img_sources = files([
+ 'images/icon.svg',
+ 'images/wayland.png',
+ 'images/xwayland-architecture.png'
+])
+
+install_data(
+ publican_img_sources,
+ install_dir: join_paths(publican_install_prefix, publican_html_dir, 'images')
+)