On 2024-10-04 10:05, Robin Jarry wrote:
Mattias Rönnblom, Oct 04, 2024 at 09:31:
On 2024-10-03 18:47, Robin Jarry wrote:
+def chk_missing(filename):
+    header = open(filename).read()

with open(filename) as f:
    header = f.read()


What benefit would that construct be to this program?

open(filename).read() leaks open file descriptors. This construct ensures the file is closed after reading is complete.


I know what it does. I was asking why it matters in this context. But sure, I guess you could hit the per-process fd limit before the script exists.

I understand that this script isn't mission critical, but let's avoid leaving bad examples in the code that others may follow by accident :)

I know it is a simple python script but it would be better to add a proper main() function and use argparse to handle errors. E.g.:

def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("op", choices=("missing", "redundant"))
    parser.add_argument("headers", nargs="+")
    args = parser.parse_args()

    for h in args.headers:
        if op == "missing":
            chk_missing(h)
        elif op == "redundant":
            chk_redundant(h)

if __name__ == "__main__":
    main()



I don't think you need to bring in the usual Python boiler plate. This script is not supposed to be invoked directly by a user - it's just an extension of the meson build scripts.

Same as above, I know it is not a user facing script. But I think it would be much better to write proper python code to have good examples for newcomers to follow.


Making small scripts needlessly complicated is not good example, it's a bad one.

diff --git a/buildtools/chkincs/meson.build b/buildtools/chkincs/ meson.build
index f2dadcae18..762f85efe5 100644
--- a/buildtools/chkincs/meson.build
+++ b/buildtools/chkincs/meson.build
@@ -38,13 +38,13 @@ if not add_languages('cpp', required: false)
 endif

 # check for extern C in files, since this is not detected as an error by the compiler
-grep = find_program('grep', required: false)
-if grep.found()
-    errlist = run_command([grep, '--files-without-match', '^extern "C"', dpdk_chkinc_headers],
-            check: false, capture: true).stdout().split()
-    if errlist != []
-        error('Files missing C++ \'extern "C"\' guards:\n- ' + '\n- '.join(errlist))
-    endif
+chkextern = find_program('chkextern.py')
+
+missing_extern_headers = run_command(chkextern, 'missing', dpdk_chkinc_headers,
+      capture: true, check: true).stdout().split()
+
+if missing_extern_headers != []
+    error('Files missing C++ \'extern "C"\' guards:\n- ' + '\n- '.join(missing_extern_headers))

Instead of just relying on this script output, it would be better if it exited with a non-zero status when something is wrong. That way you would not have to capture stdout at all and you could leave meson do the work.


Sure, but it would be required to invoke the script for every header file in the tree. Not sure I think that would be a net gain.

You can store a global exit status in the script and process all headers before exiting with an error if any.


You will need to give the user a list of offending header files.

Thanks for the review.

 endif

 gen_cpp_files = generator(gen_c_file_for_header,
--
2.43.0



Reply via email to