1c342db35SBrad Bishop# 2eb8dc403SDave Cobbley# Copyright (C) 2013-2016 Intel Corporation 3eb8dc403SDave Cobbley# 4c342db35SBrad Bishop# SPDX-License-Identifier: MIT 5c342db35SBrad Bishop# 6eb8dc403SDave Cobbley 7eb8dc403SDave Cobbley# Provides a class for automating build tests for projects 8eb8dc403SDave Cobbley 9eb8dc403SDave Cobbleyimport os 10eb8dc403SDave Cobbleyimport re 11eb8dc403SDave Cobbleyimport subprocess 12eb8dc403SDave Cobbleyimport shutil 13eb8dc403SDave Cobbleyimport tempfile 14eb8dc403SDave Cobbley 15eb8dc403SDave Cobbleyfrom abc import ABCMeta, abstractmethod 16eb8dc403SDave Cobbley 17eb8dc403SDave Cobbleyclass BuildProject(metaclass=ABCMeta): 18eb8dc403SDave Cobbley def __init__(self, uri, foldername=None, tmpdir=None, dl_dir=None): 19eb8dc403SDave Cobbley self.uri = uri 20eb8dc403SDave Cobbley self.archive = os.path.basename(uri) 21*93c203f3SPatrick Williams self.tempdirobj = None 22eb8dc403SDave Cobbley if not tmpdir: 23f86d0556SBrad Bishop self.tempdirobj = tempfile.TemporaryDirectory(prefix='buildproject-') 24f86d0556SBrad Bishop tmpdir = self.tempdirobj.name 25eb8dc403SDave Cobbley self.localarchive = os.path.join(tmpdir, self.archive) 26eb8dc403SDave Cobbley self.dl_dir = dl_dir 27eb8dc403SDave Cobbley if foldername: 28eb8dc403SDave Cobbley self.fname = foldername 29eb8dc403SDave Cobbley else: 30eb8dc403SDave Cobbley self.fname = re.sub(r'\.tar\.bz2$|\.tar\.gz$|\.tar\.xz$', '', self.archive) 31977dc1acSBrad Bishop self.needclean = False 32eb8dc403SDave Cobbley 33eb8dc403SDave Cobbley # Download self.archive to self.localarchive 34eb8dc403SDave Cobbley def _download_archive(self): 35977dc1acSBrad Bishop 36977dc1acSBrad Bishop self.needclean = True 37eb8dc403SDave Cobbley if self.dl_dir and os.path.exists(os.path.join(self.dl_dir, self.archive)): 38eb8dc403SDave Cobbley shutil.copyfile(os.path.join(self.dl_dir, self.archive), self.localarchive) 39eb8dc403SDave Cobbley return 40eb8dc403SDave Cobbley 41eb8dc403SDave Cobbley cmd = "wget -O %s %s" % (self.localarchive, self.uri) 42eb8dc403SDave Cobbley subprocess.check_output(cmd, shell=True) 43eb8dc403SDave Cobbley 44eb8dc403SDave Cobbley # This method should provide a way to run a command in the desired environment. 45eb8dc403SDave Cobbley @abstractmethod 46eb8dc403SDave Cobbley def _run(self, cmd): 47eb8dc403SDave Cobbley pass 48eb8dc403SDave Cobbley 49eb8dc403SDave Cobbley # The timeout parameter of target.run is set to 0 to make the ssh command 50eb8dc403SDave Cobbley # run with no timeout. 51eb8dc403SDave Cobbley def run_configure(self, configure_args='', extra_cmds=''): 52eb8dc403SDave Cobbley return self._run('cd %s; gnu-configize; %s ./configure %s' % (self.targetdir, extra_cmds, configure_args)) 53eb8dc403SDave Cobbley 54eb8dc403SDave Cobbley def run_make(self, make_args=''): 55eb8dc403SDave Cobbley return self._run('cd %s; make %s' % (self.targetdir, make_args)) 56eb8dc403SDave Cobbley 57eb8dc403SDave Cobbley def run_install(self, install_args=''): 58eb8dc403SDave Cobbley return self._run('cd %s; make install %s' % (self.targetdir, install_args)) 59eb8dc403SDave Cobbley 60eb8dc403SDave Cobbley def clean(self): 61*93c203f3SPatrick Williams if self.tempdirobj: 62*93c203f3SPatrick Williams self.tempdirobj.cleanup() 63977dc1acSBrad Bishop if not self.needclean: 64977dc1acSBrad Bishop return 65eb8dc403SDave Cobbley self._run('rm -rf %s' % self.targetdir) 66eb8dc403SDave Cobbley subprocess.check_call('rm -f %s' % self.localarchive, shell=True) 67