 deb62371fe
			
		
	
	
		deb62371fe
		
	
	
	
	
		
			
			Pass the path to the program to scripts/check_sparse.py, which previously was not included in config-host.mak. Change scripts/check_sparse.py to work with cgcc, which seems to work better with sparse 0.6.x. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #! /usr/bin/env python3
 | |
| 
 | |
| # Invoke sparse based on the contents of compile_commands.json,
 | |
| # also working around several deficiencies in cgcc's command line
 | |
| # parsing
 | |
| 
 | |
| import json
 | |
| import subprocess
 | |
| import os
 | |
| import sys
 | |
| import shlex
 | |
| 
 | |
| def cmdline_for_sparse(sparse, cmdline):
 | |
|     # Do not include the C compiler executable
 | |
|     skip = True
 | |
|     arg = False
 | |
|     out = sparse + ['-no-compile']
 | |
|     for x in cmdline:
 | |
|         if arg:
 | |
|             out.append(x)
 | |
|             arg = False
 | |
|             continue
 | |
|         if skip:
 | |
|             skip = False
 | |
|             continue
 | |
|         # prevent sparse from treating output files as inputs
 | |
|         if x == '-MF' or x == '-MQ' or x == '-o':
 | |
|             skip = True
 | |
|             continue
 | |
|         # cgcc ignores -no-compile if it sees -M or -MM?
 | |
|         if x.startswith('-M'):
 | |
|             continue
 | |
|         # sparse does not understand these!
 | |
|         if x == '-iquote' or x == '-isystem':
 | |
|             x = '-I'
 | |
|         if x == '-I':
 | |
|             arg = True
 | |
|         out.append(x)
 | |
|     return out
 | |
| 
 | |
| root_path = os.getenv('MESON_BUILD_ROOT')
 | |
| def build_path(s):
 | |
|     return s if not root_path else os.path.join(root_path, s)
 | |
| 
 | |
| ccjson_path = build_path(sys.argv[1])
 | |
| with open(ccjson_path, 'r') as fd:
 | |
|     compile_commands = json.load(fd)
 | |
| 
 | |
| sparse = sys.argv[2:]
 | |
| sparse_env = os.environ.copy()
 | |
| for cmd in compile_commands:
 | |
|     cmdline = shlex.split(cmd['command'])
 | |
|     cmd = cmdline_for_sparse(sparse, cmdline)
 | |
|     print('REAL_CC=%s' % shlex.quote(cmdline[0]),
 | |
|           ' '.join((shlex.quote(x) for x in cmd)))
 | |
|     sparse_env['REAL_CC'] = cmdline[0]
 | |
|     r = subprocess.run(cmd, env=sparse_env, cwd=root_path)
 | |
|     if r.returncode != 0:
 | |
|         sys.exit(r.returncode)
 |