blob: 18aa513952f5497947d28e86400a81959161089b [file] [log] [blame]
Felipe Satelerb95f5522016-08-21 20:25:37 -03001#!/usr/bin/python3
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -05002# -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
3#
4# This file is part of systemd.
5#
6# Copyright 2013 Zbigniew Jędrzejewski-Szmek
7#
8# systemd is free software; you can redistribute it and/or modify it
9# under the terms of the GNU Lesser General Public License as published by
10# the Free Software Foundation; either version 2.1 of the License, or
11# (at your option) any later version.
12#
13# systemd is distributed in the hope that it will be useful, but
14# WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16# Lesser General Public License for more details.
17#
18# You should have received a copy of the GNU Lesser General Public License
19# along with systemd; If not, see <http://www.gnu.org/licenses/>.
20
21from __future__ import print_function
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050022import collections
23import sys
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -050024import os.path
Zbigniew Jędrzejewski-Szmek1a13e312013-03-29 14:22:27 -040025from xml_helper import *
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050026
27SECTION = '''\
28MANPAGES += \\
29 {manpages}
30MANPAGES_ALIAS += \\
31 {aliases}
32{rules}
Zbigniew Jędrzejewski-Szmek87cfe602013-03-08 11:03:50 -050033{htmlrules}
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050034'''
35
36CONDITIONAL = '''\
37if {conditional}
38''' \
39+ SECTION + \
40'''\
41endif
42'''
43
44HEADER = '''\
45# Do not edit. Generated by make-man-rules.py.
Zbigniew Jędrzejewski-Szmekd86dd072014-03-06 23:24:30 -050046# To regenerate:
47# 1. Create, update, or remove source .xml files in man/
48# 2. Run 'make update-man-list'
49# 3. Run 'make man' to generate manpages
50#
51# To make a man page conditional on a configure switch add
52# attribute conditional="ENABLE_WHAT" or conditional="WITH_WHAT"
53# to <refentry> element.
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050054'''
55
Zbigniew Jędrzejewski-Szmek87cfe602013-03-08 11:03:50 -050056HTML_ALIAS_RULE = '''\
57{}.html: {}.html
58 $(html-alias)
59'''
60
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -050061FOOTER = '''\
62
Zbigniew Jędrzejewski-Szmekd86dd072014-03-06 23:24:30 -050063# Really, do not edit this file.
64
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -050065EXTRA_DIST += \\
Zbigniew Jędrzejewski-Szmeke4f42f92015-06-30 09:56:44 -040066 {dist_files}
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -050067'''
68
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050069def man(page, number):
70 return 'man/{}.{}'.format(page, number)
71
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -050072def xml(file):
73 return 'man/{}'.format(os.path.basename(file))
74
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050075def add_rules(rules, name):
Zbigniew Jędrzejewski-Szmek1a13e312013-03-29 14:22:27 -040076 xml = xml_parse(name)
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050077 # print('parsing {}'.format(name), file=sys.stderr)
Zbigniew Jędrzejewski-Szmekc0652d42014-02-19 16:06:10 -050078 if xml.getroot().tag != 'refentry':
79 return
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050080 conditional = xml.getroot().get('conditional') or ''
81 rulegroup = rules[conditional]
82 refmeta = xml.find('./refmeta')
83 title = refmeta.find('./refentrytitle').text
84 number = refmeta.find('./manvolnum').text
85 refnames = xml.findall('./refnamediv/refname')
86 target = man(refnames[0].text, number)
87 if title != refnames[0].text:
88 raise ValueError('refmeta and refnamediv disagree: ' + name)
89 for refname in refnames:
90 assert all(refname not in group
91 for group in rules.values()), "duplicate page name"
92 alias = man(refname.text, number)
93 rulegroup[alias] = target
94 # print('{} => {} [{}]'.format(alias, target, conditional), file=sys.stderr)
95
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -050096def create_rules(xml_files):
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -050097 " {conditional => {alias-name => source-name}} "
98 rules = collections.defaultdict(dict)
99 for name in xml_files:
Zbigniew Jędrzejewski-Szmekc0652d42014-02-19 16:06:10 -0500100 try:
101 add_rules(rules, name)
102 except Exception:
103 print("Failed to process", name, file=sys.stderr)
104 raise
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -0500105 return rules
106
107def mjoin(files):
108 return ' \\\n\t'.join(sorted(files) or '#')
109
Zbigniew Jędrzejewski-Szmeke4f42f92015-06-30 09:56:44 -0400110def make_makefile(rules, dist_files):
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -0500111 return HEADER + '\n'.join(
112 (CONDITIONAL if conditional else SECTION).format(
113 manpages=mjoin(set(rulegroup.values())),
114 aliases=mjoin(k for k,v in rulegroup.items() if k != v),
115 rules='\n'.join('{}: {}'.format(k,v)
116 for k,v in sorted(rulegroup.items())
117 if k != v),
Zbigniew Jędrzejewski-Szmek87cfe602013-03-08 11:03:50 -0500118 htmlrules='\n'.join(HTML_ALIAS_RULE.format(k[:-2],v[:-2])
119 for k,v in sorted(rulegroup.items())
120 if k != v),
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -0500121 conditional=conditional)
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -0500122 for conditional,rulegroup in sorted(rules.items())
Zbigniew Jędrzejewski-Szmeke4f42f92015-06-30 09:56:44 -0400123 ) + FOOTER.format(dist_files=mjoin(sorted(dist_files)))
Zbigniew Jędrzejewski-Szmek56ba3c72013-02-02 22:47:47 -0500124
125if __name__ == '__main__':
Zbigniew Jędrzejewski-Szmek40be8782013-12-21 18:11:35 -0500126 rules = create_rules(sys.argv[1:])
Zbigniew Jędrzejewski-Szmeke4f42f92015-06-30 09:56:44 -0400127 dist_files = (xml(file) for file in sys.argv[1:]
128 if not file.endswith(".directives.xml") and
129 not file.endswith(".index.xml"))
130 print(make_makefile(rules, dist_files), end='')