]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
man: generate link mode list dynamically
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 30 May 2023 11:02:57 +0000 (13:02 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 30 May 2023 11:05:33 +0000 (13:05 +0200)
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
man/systemd.link.xml
meson.build
src/shared/ethtool-link-mode.py
src/shared/meson.build
tools/xml_helper.py

index e6724a53f4a555482f54f447b886d723f6573e2e..4dc5fabd6dee735c42f3073d4b2819b4badc656a 100644 (file)
@@ -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)
index cc851d31f98a710b276f17d971ea897059a4f9d7..af9e247fc4d476d6f91839a31c47eea3d6bcb1a6 100644 (file)
@@ -3,7 +3,8 @@
   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
 <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
 
-<refentry id="systemd.link">
+<refentry id="systemd.link"
+          xmlns:xi="http://www.w3.org/2001/XInclude">
   <refentryinfo>
     <title>systemd.link</title>
     <productname>systemd</productname>
                 <entry>Speed (Mbps)</entry>
                 <entry>Duplex Mode</entry>
               </row></thead>
-              <tbody>
-                <row><entry><option>10baset-half</option></entry>
-                <entry>10</entry><entry>half</entry></row>
-
-                <row><entry><option>10baset-full</option></entry>
-                <entry>10</entry><entry>full</entry></row>
-
-                <row><entry><option>100baset-half</option></entry>
-                <entry>100</entry><entry>half</entry></row>
-
-                <row><entry><option>100baset-full</option></entry>
-                <entry>100</entry><entry>full</entry></row>
-
-                <row><entry><option>1000baset-half</option></entry>
-                <entry>1000</entry><entry>half</entry></row>
-
-                <row><entry><option>1000baset-full</option></entry>
-                <entry>1000</entry><entry>full</entry></row>
-
-                <row><entry><option>10000baset-full</option></entry>
-                <entry>10000</entry><entry>full</entry></row>
-
-                <row><entry><option>2500basex-full</option></entry>
-                <entry>2500</entry><entry>full</entry></row>
-
-                <row><entry><option>1000basekx-full</option></entry>
-                <entry>1000</entry><entry>full</entry></row>
-
-                <row><entry><option>10000basekx4-full</option></entry>
-                <entry>10000</entry><entry>full</entry></row>
-
-                <row><entry><option>10000basekr-full</option></entry>
-                <entry>10000</entry><entry>full</entry></row>
-
-                <row><entry><option>10000baser-fec</option></entry>
-                <entry>10000</entry><entry>full</entry></row>
-
-                <row><entry><option>20000basemld2-full</option></entry>
-                <entry>20000</entry><entry>full</entry></row>
-
-                <row><entry><option>20000basekr2-full</option></entry>
-                <entry>20000</entry><entry>full</entry></row>
-              </tbody>
+              <xi:include href="ethtool-link-mode.xml" />
             </tgroup>
           </table>
 
index 97622b6d9731f2ccda89201357815847664709b1..3919a4a9b0518a51c481f6a91f1b14aa32b61b4a 100644 (file)
@@ -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,
index a113177de1214bbd184004ae81e3454f628cb68e..03ea1b1fd88c2e873af164af60c4984e0d354ba0 100644 (file)
@@ -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 = ''
+
+    entries += [(enum, name, speed, value, duplex)]
+
+if xml:
+    print('              <tbody>')
+
+    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'''\
+                <row><entry><option>{name}</option></entry>
+                <entry>{speed}</entry><entry>{duplex}</entry></row>
+        ''')
+    else:
+        enum = f'[{enum}]'
+        print(f'        {enum:50} = "{name}",')
 
-    print(f'        {enum:50} = "{name}",')
-    count += 1
+if xml:
+    print('              </tbody>')
 
-assert count >= 99
+assert len(entries) >= 99
index 5a40d09bd51b6ea80da6f546e1ca6bdbd773b860..d78b9176c0c1d5b5791df2b0746ac2ec1b711613 100644 (file)
@@ -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,
index 0361358bec27ce06fa8d11e804b2fa140990e444..bc14298653d35ebe35a3f09b51063a944027891a 100755 (executable)
@@ -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())