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