2013-02-03 07:47:47 +04:00
# -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
#
# This file is part of systemd.
#
# Copyright 2013 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
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# systemd is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
import xml . etree . ElementTree as tree
import collections
import sys
2013-02-28 05:16:38 +04:00
import os
2013-02-03 07:47:47 +04:00
SECTION = ''' \
MANPAGES + = \\
{ manpages }
MANPAGES_ALIAS + = \\
{ aliases }
{ rules }
2013-03-08 20:03:50 +04:00
{ htmlrules }
2013-02-03 07:47:47 +04:00
'''
CONDITIONAL = ''' \
if { conditional }
''' \
+ SECTION + \
''' \
endif
'''
HEADER = ''' \
# Do not edit. Generated by make-man-rules.py.
2013-02-28 05:16:38 +04:00
# Regenerate with 'make all update-man-list'.
2013-02-03 07:47:47 +04:00
'''
2013-02-05 19:31:20 +04:00
CLEANFILES = ''' \
CLEANFILES + = \\
{ cleanfiles }
'''
2013-03-08 20:03:50 +04:00
HTML_ALIAS_RULE = ''' \
{ } . html : { } . html
$ ( html - alias )
'''
2013-02-03 07:47:47 +04:00
def man ( page , number ) :
return ' man/ {} . {} ' . format ( page , number )
def add_rules ( rules , name ) :
xml = tree . parse ( name )
# print('parsing {}'.format(name), file=sys.stderr)
conditional = xml . getroot ( ) . get ( ' conditional ' ) or ' '
rulegroup = rules [ conditional ]
refmeta = xml . find ( ' ./refmeta ' )
title = refmeta . find ( ' ./refentrytitle ' ) . text
number = refmeta . find ( ' ./manvolnum ' ) . text
refnames = xml . findall ( ' ./refnamediv/refname ' )
target = man ( refnames [ 0 ] . text , number )
if title != refnames [ 0 ] . text :
raise ValueError ( ' refmeta and refnamediv disagree: ' + name )
for refname in refnames :
assert all ( refname not in group
for group in rules . values ( ) ) , " duplicate page name "
alias = man ( refname . text , number )
rulegroup [ alias ] = target
# print('{} => {} [{}]'.format(alias, target, conditional), file=sys.stderr)
def create_rules ( * xml_files ) :
" { conditional => { alias-name => source-name}} "
rules = collections . defaultdict ( dict )
for name in xml_files :
add_rules ( rules , name )
return rules
def mjoin ( files ) :
return ' \\ \n \t ' . join ( sorted ( files ) or ' # ' )
2013-02-05 19:31:20 +04:00
def make_makefile ( rules , cleanfiles ) :
2013-02-03 07:47:47 +04:00
return HEADER + ' \n ' . join (
( CONDITIONAL if conditional else SECTION ) . format (
manpages = mjoin ( set ( rulegroup . values ( ) ) ) ,
aliases = mjoin ( k for k , v in rulegroup . items ( ) if k != v ) ,
rules = ' \n ' . join ( ' {} : {} ' . format ( k , v )
for k , v in sorted ( rulegroup . items ( ) )
if k != v ) ,
2013-03-08 20:03:50 +04:00
htmlrules = ' \n ' . join ( HTML_ALIAS_RULE . format ( k [ : - 2 ] , v [ : - 2 ] )
for k , v in sorted ( rulegroup . items ( ) )
if k != v ) ,
2013-02-03 07:47:47 +04:00
conditional = conditional )
2013-02-05 19:31:20 +04:00
for conditional , rulegroup in sorted ( rules . items ( ) ) ) + \
CLEANFILES . format ( cleanfiles = mjoin ( cleanfiles ) )
2013-02-03 07:47:47 +04:00
if __name__ == ' __main__ ' :
2013-02-05 19:31:20 +04:00
sources = set ( sys . argv [ 1 : ] )
2013-02-28 05:16:38 +04:00
basenames = [ os . path . basename ( source ) for source in sources ]
2013-02-05 19:31:20 +04:00
spares = set ( [ source for source in sources
2013-02-28 05:16:38 +04:00
if os . path . basename ( source ) + ' .in ' in basenames ] )
2013-02-05 19:31:20 +04:00
rules = create_rules ( * ( sources - spares ) )
print ( make_makefile ( rules , spares ) , end = ' ' )