[PATCH v12 1/7] buildtools/chkincs: relax C linkage requirement

Robin Jarry rjarry at redhat.com
Fri Oct 4 10:05:53 CEST 2024


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 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.

>>> 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.

> Thanks for the review.
>
>>>  endif
>>>
>>>  gen_cpp_files = generator(gen_c_file_for_header,
>>> -- 
>>> 2.43.0
>> 



More information about the dev mailing list