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