From c18dde32e5b6c6f523fb312668c6fb4f87236978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 30 May 2023 13:02:57 +0200 Subject: [PATCH] man: generate link mode list dynamically The entries are sorted by speed. Some fields are left empty when there is no clear value to use. The table is much longer now, but I think it's better to document the allowed values, even if some are not terribly useful. Fixes #26256. --- man/meson.build | 16 ++++++----- man/systemd.link.xml | 47 +++------------------------------ meson.build | 2 ++ src/shared/ethtool-link-mode.py | 38 ++++++++++++++++++++------ src/shared/meson.build | 10 +++++++ tools/xml_helper.py | 2 ++ 6 files changed, 57 insertions(+), 58 deletions(-) diff --git a/man/meson.build b/man/meson.build index e6724a53f4..4dc5fabd6d 100644 --- a/man/meson.build +++ b/man/meson.build @@ -20,7 +20,9 @@ xsltproc_flags = [ '--stringparam', 'man.copyright.section.enabled', '0', '--stringparam', 'systemd.version', '@0@'.format(meson.project_version()), '--path', - '@0@:@1@'.format(meson.current_build_dir(), meson.current_source_dir())] + '@0@:@1@:@2@'.format(meson.current_build_dir(), + meson.current_source_dir(), + libshared_build_dir)] custom_man_xsl = files('custom-man.xsl') custom_html_xsl = files('custom-html.xsl') @@ -32,6 +34,8 @@ custom_entities_ent = custom_target( output : 'custom-entities.ent', command : [jinja2_cmdline, '@INPUT@', '@OUTPUT@']) +man_page_depends += custom_entities_ent + man_pages = [] html_pages = [] source_xml_files = [] @@ -68,7 +72,7 @@ foreach tuple : manpages input : xml, output : [man] + manaliases, command : xslt_cmd + [custom_man_xsl, '@INPUT@'], - depends : custom_entities_ent, + depends : man_page_depends, install : want_man, install_dir : mandirn) man_pages += p1 @@ -93,7 +97,7 @@ foreach tuple : manpages input : xml, output : html, command : xslt_cmd + [custom_html_xsl, '@INPUT@'], - depends : [custom_entities_ent, p2], + depends : [man_page_depends, p2], install : want_html, install_dir : docdir / 'html') html_pages += p3 @@ -114,7 +118,7 @@ systemd_directives_xml = custom_target( 'systemd.directives.xml', input : ['directives-template.xml', source_xml_files], output : 'systemd.directives.xml', - depends : custom_entities_ent, + depends : man_page_depends, command : [make_directive_index_py, '@OUTPUT@', '@INPUT@']) nonindex_xml_files = source_xml_files + [systemd_directives_xml] @@ -166,7 +170,7 @@ foreach tuple : xsltproc.found() ? [['systemd.directives', '7', systemd_directiv input : xml, output : html, command : xslt_cmd + [custom_html_xsl, '@INPUT@'], - depends : [custom_entities_ent, p2], + depends : [man_page_depends, p2], install : want_html and have_lxml, install_dir : docdir / 'html') html_pages += p3 @@ -237,4 +241,4 @@ update_man_rules = custom_target( command : [update_man_rules_py, '@0@/man/*.xml'.format(project_source_root), '@0@/rules/meson.build'.format(meson.current_source_dir())], - depends : custom_entities_ent) + depends : man_page_depends) diff --git a/man/systemd.link.xml b/man/systemd.link.xml index cc851d31f9..af9e247fc4 100644 --- a/man/systemd.link.xml +++ b/man/systemd.link.xml @@ -3,7 +3,8 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> - + systemd.link systemd @@ -709,49 +710,7 @@ Speed (Mbps) Duplex Mode - - - 10half - - - 10full - - - 100half - - - 100full - - - 1000half - - - 1000full - - - 10000full - - - 2500full - - - 1000full - - - 10000full - - - 10000full - - - 10000full - - - 20000full - - - 20000full - + diff --git a/meson.build b/meson.build index 97622b6d97..3919a4a9b0 100644 --- a/meson.build +++ b/meson.build @@ -2172,6 +2172,8 @@ userspace = declare_dependency( link_args : userspace_c_ld_args, ) +man_page_depends = [] + ############################################################ # binaries that have --help and are intended for use by humans, diff --git a/src/shared/ethtool-link-mode.py b/src/shared/ethtool-link-mode.py index a113177de1..03ea1b1fd8 100644 --- a/src/shared/ethtool-link-mode.py +++ b/src/shared/ethtool-link-mode.py @@ -7,27 +7,49 @@ import sys OVERRIDES = { 'autoneg' : 'autonegotiation', } -count = 0 -f = open(sys.argv[1]) +xml = sys.argv[1] == '--xml' + +f = open(sys.argv[-1]) for line in f: if line.startswith('enum ethtool_link_mode_bit_indices {'): break + +entries = [] for line in f: if line.startswith('}'): break # ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, - m = re.match(r'^\s*(ETHTOOL_LINK_MODE_(.*)_BIT)\s*=\s*(\d+),', line) + m = re.match(r'^\s*(ETHTOOL_LINK_MODE_((\d*).*)_BIT)\s*=\s*(\d+),', line) if not m: continue - enum, name, value = m.groups() + enum, name, speed, value = m.groups() name = name.lower().replace('_', '-') name = OVERRIDES.get(name, name) - enum = f'[{enum}]' + duplex = name.split('-')[-1].lower() + if duplex not in {'half', 'full'}: + duplex = '' - print(f' {enum:50} = "{name}",') - count += 1 + entries += [(enum, name, speed, value, duplex)] -assert count >= 99 +if xml: + print(' ') + + entries.sort(key=lambda entry: (int(entry[2]) if entry[2] else 1e20, entry[4], entry[1], entry[3])) + +for enum, name, speed, value, duplex in entries: + if xml: + print(f'''\ + + {speed}{duplex} + ''') + else: + enum = f'[{enum}]' + print(f' {enum:50} = "{name}",') + +if xml: + print(' ') + +assert len(entries) >= 99 diff --git a/src/shared/meson.build b/src/shared/meson.build index 5a40d09bd5..d78b9176c0 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -279,6 +279,15 @@ ethtool_link_mode_h = custom_target( capture : true) shared_sources += ethtool_link_mode_h +fname = 'ethtool-link-mode.xml' +ethtool_link_mode_xml = custom_target( + fname, + input : ['ethtool-link-mode.py', 'linux/ethtool.h'], + output : fname, + command : [python, '@INPUT0@', '--xml', '@INPUT1@'], + capture : true) +man_page_depends += ethtool_link_mode_xml + libshared_name = 'systemd-shared-@0@'.format(shared_lib_tag) libshared_deps = [threads, @@ -304,6 +313,7 @@ libshared_deps = [threads, versiondep] libshared_sym_path = '@0@/libshared.sym'.format(meson.current_source_dir()) +libshared_build_dir = meson.current_build_dir() libshared_static = static_library( libshared_name, diff --git a/tools/xml_helper.py b/tools/xml_helper.py index 0361358bec..bc14298653 100755 --- a/tools/xml_helper.py +++ b/tools/xml_helper.py @@ -7,6 +7,8 @@ class CustomResolver(tree.Resolver): def resolve(self, url, id, context): if 'custom-entities.ent' in url: return self.resolve_filename('man/custom-entities.ent', context) + if 'ethtool-link-mode' in url: + return self.resolve_filename('src/shared/ethtool-link-mode.xml', context) _parser = tree.XMLParser() _parser.resolvers.add(CustomResolver())