oss-fuzz/infra/base-images/msan-builder/packages/package.py

75 lines
2.0 KiB
Python
Raw Normal View History

import os
import subprocess
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
def FindDirs(directory):
"""Find sub directories."""
return [subdir for subdir in os.listdir(directory)
if os.path.isdir(os.path.join(directory, subdir))]
def ApplyPatch(source_directory, patch_name):
"""Apply custom patch."""
subprocess.check_call(['patch', '-p1', '-i',
os.path.join(SCRIPT_DIR, patch_name)],
cwd=source_directory)
class PackageException(Exception):
"""Base package exception."""
class Package(object):
"""Base package."""
def __init__(self, name):
self.name = name
def PreBuild(self, source_directory, env):
return
def PostBuild(self, source_directory, env):
return
def PreDownload(self, download_directory):
return
def PostDownload(self, source_directory):
return
def InstallBuildDeps(self):
"""Install build dependencies for a package."""
subprocess.check_call(['apt-get', 'build-dep', '-y', self.name])
def DownloadSource(self, download_directory):
"""Download the source for a package."""
self.PreDownload(download_directory)
before = FindDirs(download_directory)
subprocess.check_call(
['apt-get', 'source', self.name],
stderr=subprocess.STDOUT, cwd=download_directory)
after = FindDirs(download_directory)
new_dirs = [subdir for subdir in after
if subdir not in before]
if len(new_dirs) != 1:
raise PackageException(
'Found more than one new directory after downloading apt-get source.')
source_directory = os.path.join(download_directory, new_dirs[0])
self.PostDownload(source_directory)
return source_directory
def Build(self, source_directory, env):
"""Build .deb packages."""
self.PreBuild(source_directory, env)
subprocess.check_call(
['dpkg-buildpackage', '-us', '-uc', '-b'],
cwd=source_directory, env=env)
self.PostBuild(source_directory, env)