]> git.puffer.fish Git - mirror/frr.git/commitdiff
python: pass conditionals through clippy for DEFPY 10337/head
authorDavid Lamparter <equinox@opensourcerouting.org>
Thu, 13 Jan 2022 13:18:29 +0000 (14:18 +0100)
committerDavid Lamparter <equinox@opensourcerouting.org>
Thu, 13 Jan 2022 15:01:53 +0000 (16:01 +0100)
Track what conditionals apply when a DEFPY is encountered, and stack
them around the autogenerated clippy wrapper.  Otherwise conditional
DEFPYs result in undefined function warnings.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
python/clidef.py

index ba7c9072c5880c0da9842ff1a81edf7c030d31ca..b57a00fc892638e5dd6024c82bccd553685a2e9f 100644 (file)
@@ -173,7 +173,7 @@ handlers = {
 # common form, without requiring a more advanced template engine (e.g.
 # jinja2)
 templ = Template(
-    """/* $fnname => "$cmddef" */
+    """$cond_begin/* $fnname => "$cmddef" */
 DEFUN_CMD_FUNC_DECL($fnname)
 #define funcdecl_$fnname static int ${fnname}_magic(\\
        const struct cmd_element *self __attribute__ ((unused)),\\
@@ -211,7 +211,7 @@ $argblocks
 $argassert
        return ${fnname}_magic(self, vty, argc, argv$arglist);
 }
-
+$cond_end
 """
 )
 
@@ -265,7 +265,25 @@ def process_file(fn, ofd, dumpfd, all_defun, macros):
     errors = 0
     filedata = clippy.parse(fn)
 
+    cond_stack = []
+
     for entry in filedata["data"]:
+        if entry["type"] == "PREPROC":
+            line = entry["line"].lstrip()
+            tokens = line.split(maxsplit=1)
+            line = "#" + line + "\n"
+
+            if not tokens:
+                continue
+
+            if tokens[0] in ["if", "ifdef", "ifndef"]:
+                cond_stack.append(line)
+            elif tokens[0] in ["elif", "else"]:
+                prev_line = cond_stack.pop(-1)
+                cond_stack.append(prev_line + line)
+            elif tokens[0] in ["endif"]:
+                cond_stack.pop(-1)
+            continue
         if entry["type"].startswith("DEFPY") or (
             all_defun and entry["type"].startswith("DEFUN")
         ):
@@ -385,6 +403,8 @@ def process_file(fn, ofd, dumpfd, all_defun, macros):
                 else:
                     dumpfd.write('"%s":\n\t---- no magic arguments ----\n\n' % (cmddef))
 
+            params["cond_begin"] = "".join(cond_stack)
+            params["cond_end"] = "".join(["#endif\n"] * len(cond_stack))
             params["argdefs"] = "".join(argdefs)
             params["argdecls"] = "".join(argdecls)
             params["arglist"] = "".join(arglist)