blob: dfb96618680d47ac10ae22fa1a4e2a99a542ddb3 [file] [log] [blame]
#
# Copyright (C) 2013-2016 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
# Provides a class for automating build tests for projects
import os
import re
import subprocess
import shutil
import tempfile
from abc import ABCMeta, abstractmethod
class BuildProject(metaclass=ABCMeta):
def __init__(self, uri, foldername=None, tmpdir=None, dl_dir=None):
self.uri = uri
self.archive = os.path.basename(uri)
self.tempdirobj = None
if not tmpdir:
self.tempdirobj = tempfile.TemporaryDirectory(prefix='buildproject-')
tmpdir = self.tempdirobj.name
self.localarchive = os.path.join(tmpdir, self.archive)
self.dl_dir = dl_dir
if foldername:
self.fname = foldername
else:
self.fname = re.sub(r'\.tar\.bz2$|\.tar\.gz$|\.tar\.xz$', '', self.archive)
self.needclean = False
# Download self.archive to self.localarchive
def _download_archive(self):
self.needclean = True
if self.dl_dir and os.path.exists(os.path.join(self.dl_dir, self.archive)):
shutil.copyfile(os.path.join(self.dl_dir, self.archive), self.localarchive)
return
cmd = "wget -O %s %s" % (self.localarchive, self.uri)
subprocess.check_output(cmd, shell=True)
# This method should provide a way to run a command in the desired environment.
@abstractmethod
def _run(self, cmd):
pass
# The timeout parameter of target.run is set to 0 to make the ssh command
# run with no timeout.
def run_configure(self, configure_args='', extra_cmds=''):
return self._run('cd %s; gnu-configize; %s ./configure %s' % (self.targetdir, extra_cmds, configure_args))
def run_make(self, make_args=''):
return self._run('cd %s; make %s' % (self.targetdir, make_args))
def run_install(self, install_args=''):
return self._run('cd %s; make install %s' % (self.targetdir, install_args))
def clean(self):
if self.tempdirobj:
self.tempdirobj.cleanup()
if not self.needclean:
return
self._run('rm -rf %s' % self.targetdir)
subprocess.check_call('rm -f %s' % self.localarchive, shell=True)