cppcheck/tools/bisect/bisect_common.py

51 lines
2.3 KiB
Python

#!/usr/bin/env python
import subprocess
import os
import shutil
EC_GOOD = 0 # tells bisect that the commit is "good"
EC_BAD = 1 # tells bisect that the commit is "bad"
EC_SKIP = 125 # tells bisect to skip this commit since it cannot be tested
def build_cppcheck(bisect_path):
commit_hash = subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('ascii').strip()
install_path = os.path.join(bisect_path, commit_hash)
cppcheck_path = os.path.join(install_path, 'cppcheck')
if os.path.exists(install_path):
print('binary for {} already exists'.format(commit_hash))
return cppcheck_path
bisect_repo_dir = os.path.join(bisect_path, 'cppcheck')
if os.path.exists(os.path.join(bisect_repo_dir, 'cppcheck')):
os.remove(os.path.join(bisect_repo_dir, 'cppcheck'))
# for versions 1.88 and 1.89
print('patching Makefile')
subprocess.check_call(['sed', '-i', 's/shell python /shell python3 /g', os.path.join(bisect_repo_dir, 'Makefile')])
# for versions between 2.0 and 2.2
print('patching cli/cppcheckexecutor.cpp')
subprocess.check_call(['sed', '-i', 's/SIGSTKSZ/32768/g', os.path.join(bisect_repo_dir, 'cli', 'cppcheckexecutor.cpp')])
# TODO: older versions do not build because of include changes in libstdc++ - check compiler version and try to use an earlier one
# TODO: make jobs configurable
# TODO: use "make install"?
# TODO: allow CXXFLAGS overrides to workaround compiling issues in older versions
print('building {}'.format(commit_hash))
subprocess.check_call(['make', '-C', bisect_repo_dir, '-j6', 'MATCHCOMPILER=yes', 'CXXFLAGS=-O2 -w -pipe', '-s'])
# TODO: remove folder if installation failed
print('installing {}'.format(commit_hash))
os.mkdir(install_path)
if os.path.exists(os.path.join(bisect_repo_dir, 'cfg')):
shutil.copytree(os.path.join(bisect_repo_dir, 'cfg'), os.path.join(install_path, 'cfg'))
if os.path.exists(os.path.join(bisect_repo_dir, 'platforms')):
shutil.copytree(os.path.join(bisect_repo_dir, 'platforms'), os.path.join(install_path, 'platforms'))
shutil.copy(os.path.join(bisect_repo_dir, 'cppcheck'), cppcheck_path)
# reset the patches so the subsequent checkout works
print('resetting repo')
subprocess.check_call(['git', 'reset', '--hard'])
return cppcheck_path