chiark / gitweb /
Fix service file to match installed elogind binary location
[elogind.git] / tools / make-man-rules.py
old mode 100644 (file)
new mode 100755 (executable)
index 6224de3..e9e39f1
@@ -1,8 +1,9 @@
+#!/usr/bin/env python3
 #  -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
 #
 #  This file is part of systemd.
 #
-#  Copyright 2013 Zbigniew JÄ™drzejewski-Szmek
+#  Copyright 2013, 2017 Zbigniew JÄ™drzejewski-Szmek
 #
 #  systemd is free software; you can redistribute it and/or modify it
 #  under the terms of the GNU Lesser General Public License as published by
@@ -21,6 +22,7 @@ from __future__ import print_function
 import collections
 import sys
 import os.path
+import pprint
 from xml_helper import *
 
 SECTION = '''\
@@ -42,8 +44,14 @@ endif
 
 HEADER = '''\
 # Do not edit. Generated by make-man-rules.py.
-# Regenerate with 'make all update-man-list'.
-
+# To regenerate:
+#   1. Create, update, or remove source .xml files in man/
+#   2. Run 'make update-man-list'
+#   3. Run 'make man' to generate manpages
+#
+# To make a man page conditional on a configure switch add
+# attribute conditional="ENABLE_WHAT" or conditional="WITH_WHAT"
+# to <refentry> element.
 '''
 
 HTML_ALIAS_RULE = '''\
@@ -53,15 +61,19 @@ HTML_ALIAS_RULE = '''\
 
 FOOTER = '''\
 
+# Really, do not edit this file.
+
 EXTRA_DIST += \\
-       {files}
+       {dist_files}
 '''
 
+meson = False
+
 def man(page, number):
-    return 'man/{}.{}'.format(page, number)
+    return ('man/' if not meson else '') + '{}.{}'.format(page, number)
 
 def xml(file):
-    return 'man/{}'.format(os.path.basename(file))
+    return ('man/' if not meson else '') + os.path.basename(file)
 
 def add_rules(rules, name):
     xml = xml_parse(name)
@@ -98,7 +110,7 @@ def create_rules(xml_files):
 def mjoin(files):
     return ' \\\n\t'.join(sorted(files) or '#')
 
-def make_makefile(rules, files):
+def make_makefile(rules, dist_files):
     return HEADER + '\n'.join(
         (CONDITIONAL if conditional else SECTION).format(
             manpages=mjoin(set(rulegroup.values())),
@@ -111,9 +123,42 @@ def make_makefile(rules, files):
                                 if k != v),
             conditional=conditional)
         for conditional,rulegroup in sorted(rules.items())
-        ) + FOOTER.format(files=mjoin(sorted(files)))
+        ) + FOOTER.format(dist_files=mjoin(sorted(dist_files)))
+
+MESON_HEADER = '''\
+# Do not edit. Generated by make-man-rules.py.
+manpages = ['''
+
+MESON_FOOTER = '''\
+]
+# Really, do not edit.'''
+
+def make_mesonfile(rules, dist_files):
+    # reformat rules as
+    # grouped = [ [name, section, [alias...], condition], ...]
+    #
+    # but first create a dictionary like
+    # lists = { (name, condition) => [alias...]
+    grouped = collections.defaultdict(list)
+    for condition, items in rules.items():
+        for alias, name in items.items():
+            group = grouped[(name, condition)]
+            if name != alias:
+                group.append(alias)
+
+    lines = [ [p[0][:-2], p[0][-1], sorted(a[:-2] for a in aliases), p[1]]
+              for p, aliases in sorted(grouped.items()) ]
+    return '\n'.join((MESON_HEADER, pprint.pformat(lines)[1:-1], MESON_FOOTER))
 
 if __name__ == '__main__':
-    rules = create_rules(sys.argv[1:])
-    files = (xml(file) for file in sys.argv[1:])
-    print(make_makefile(rules, files), end='')
+    meson = sys.argv[1] == '--meson'
+    pages = sys.argv[1+meson:]
+
+    rules = create_rules(pages)
+    dist_files = (xml(file) for file in pages
+                  if not file.endswith(".directives.xml") and
+                     not file.endswith(".index.xml"))
+    if meson:
+        print(make_mesonfile(rules, dist_files))
+    else:
+        print(make_makefile(rules, dist_files), end='')