coccinelle_opt = get_option('coccinelle').require( fs.exists(meson.project_source_root() / '.git'), error_message: 'coccinelle can only be run from a git checkout', ) spatch = find_program('spatch', required: coccinelle_opt) if not spatch.found() subdir_done() endif rules = [ 'array.cocci', 'commit.cocci', 'config_fn_ctx.pending.cocci', 'equals-null.cocci', 'flex_alloc.cocci', 'free.cocci', 'git_config_number.cocci', 'hashmap.cocci', 'index-compatibility.cocci', 'object_id.cocci', 'preincr.cocci', 'qsort.cocci', 'refs.cocci', 'strbuf.cocci', 'swap.cocci', 'the_repository.cocci', 'xcalloc.cocci', 'xopen.cocci', 'xstrdup_or_null.cocci', 'xstrncmpz.cocci', ] concatenated_rules = custom_target( command: [ 'cat', '@INPUT@', ], input: rules, output: 'rules.cocci', capture: true, ) coccinelle_sources = [] foreach source : run_command(git, '-C', meson.project_source_root(), 'ls-files', '--deduplicate', '*.c', third_party_excludes, check: true).stdout().split() coccinelle_sources += source endforeach coccinelle_headers = [] foreach header : headers_to_check coccinelle_headers += meson.project_source_root() / header endforeach patches = [ ] foreach source : coccinelle_sources patches += custom_target( command: [ spatch, '--all-includes', '--sp-file', concatenated_rules, '--patch', meson.project_source_root(), '@INPUT@', ], input: meson.project_source_root() / source, output: source.underscorify() + '.patch', capture: true, depend_files: coccinelle_headers, ) endforeach concatenated_patch = custom_target( command: [ 'cat', '@INPUT@', ], input: patches, output: 'cocci.patch', capture: true, ) alias_target('coccicheck', concatenated_patch)