51 lines
2.3 KiB
Python
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 |