Exemplo n.º 1
0
 def __init__(self):
     self.config = {'exe': 'default', 'verbose': 0}
     self.labels = {'exe': 'Executable', 'verbose': 'Verbose'}
     self.settings = {}
     self.packages = {}
     self._profile_path = util.safe_join(util.get_home_dir(),
                                         'profile.json')
     self.load()
Exemplo n.º 2
0
    def _run(self, command):
        result = []
        system_dir = join(util.get_home_dir(), 'packages', 'system')

        if isdir(system_dir):
            result = util.exec_command(join(system_dir, command + self.ext),
                                       stdout=util.AsyncPipe(self._on_run_out),
                                       stderr=util.AsyncPipe(self._on_run_out))
        else:
            click.secho('Error: system tools are not installed', fg='red')
            click.secho('Please run:\n' '   apio install system', fg='yellow')
            return 1

        return result
Exemplo n.º 3
0
    def run(self, command, variables=[], board=None):
        """Executes scons for building"""

        packages_dir = os.path.join(util.get_home_dir(), 'packages')
        icestorm_dir = os.path.join(packages_dir, 'toolchain-icestorm', 'bin')
        iverilog_dir = os.path.join(packages_dir, 'toolchain-iverilog', 'bin')
        scons_dir = os.path.join(packages_dir, 'tool-scons', 'script')
        sconstruct_name = 'SConstruct'

        # Give the priority to the packages installed by apio
        os.environ['PATH'] = os.pathsep.join(
            [iverilog_dir, icestorm_dir, os.environ['PATH']])

        # Add environment variables
        os.environ['IVL'] = os.path.join(packages_dir, 'toolchain-iverilog',
                                         'lib', 'ivl')
        os.environ['VLIB'] = os.path.join(packages_dir, 'toolchain-iverilog',
                                          'vlib', 'system.v')

        # -- Check for the scons
        if not isdir(scons_dir):
            click.secho('Error: scons toolchain is not installed', fg='red')
            click.secho('Please run:\n' '   apio install scons', fg='yellow')

        # -- Check for the icestorm tools
        if not isdir(icestorm_dir):
            click.secho('Error: icestorm toolchain is not installed', fg='red')
            click.secho('Please run:\n'
                        '   apio install icestorm',
                        fg='yellow')

        # -- Check for the iverilog tools
        if not isdir(iverilog_dir):
            click.secho('Error: iverilog toolchain is not installed', fg='red')
            click.secho('Please run:\n'
                        '   apio install iverilog',
                        fg='yellow')

        # -- Check for the SConstruct file
        if not isfile(join(util.get_project_dir(), sconstruct_name)):
            click.secho('Using default SConstruct file')
            variables += [
                '-f',
                join(dirname(__file__), '..', 'resources', sconstruct_name)
            ]

        # -- Execute scons
        if isdir(scons_dir) and isdir(icestorm_dir) and isdir(iverilog_dir):
            terminal_width, _ = click.get_terminal_size()
            start_time = time.time()

            if command == 'build' or \
               command == 'upload' or \
               command == 'time':
                if board:
                    processing_board = board
                else:
                    processing_board = 'custom board'
                click.echo(
                    "[%s] Processing %s" %
                    (datetime.datetime.now().strftime("%c"),
                     click.style(processing_board, fg="cyan", bold=True)))
                click.secho("-" * terminal_width, bold=True)

            click.secho("Executing: scons -Q {0} {1}".format(
                command, ' '.join(variables)))
            result = util.exec_command([
                os.path.normpath(sys.executable),
                os.path.join(scons_dir, 'scons'), '-Q', command
            ] + variables,
                                       stdout=util.AsyncPipe(self._on_run_out),
                                       stderr=util.AsyncPipe(self._on_run_err))

            # -- Print result
            exit_code = result['returncode']
            is_error = exit_code != 0
            summary_text = " Took %.2f seconds " % (time.time() - start_time)
            half_line = "=" * int(
                ((terminal_width - len(summary_text) - 10) / 2))
            click.echo(
                "%s [%s]%s%s" %
                (half_line,
                 (click.style(" ERROR ", fg="red", bold=True) if is_error else
                  click.style("SUCCESS", fg="green", bold=True)), summary_text,
                 half_line),
                err=is_error)

            if False:
                if is_error:
                    print("""
  ______                     _
 |  ____|                   | |
 | |__   _ __ _ __ ___  _ __| |
 |  __| | '__| '__/ _ \| '__| |
 | |____| |  | | | (_) | |  |_|
 |______|_|  |_|  \___/|_|  (_)
""")
                else:
                    print("""
   _____                             _
  / ____|                           | |
 | (___  _   _  ___ ___ ___  ___ ___| |
  \___ \| | | |/ __/ __/ _ \/ __/ __| |
  ____) | |_| | (_| (_|  __/\__ \__ \_|
 |_____/ \__,_|\___\___\___||___/___(_)
""")

            return exit_code
        else:
            return 1
Exemplo n.º 4
0
    def __init__(self, package, platform='', force=False, checkversion=True):

        # Parse version
        if '@' in package:
            split = package.split('@')
            self.package = split[0]
            self.version = split[1]
        else:
            self.package = package
            self.version = None

        self.force_install = force
        self.packages_dir = ''

        self.resources = Resources(platform)

        if self.package in self.resources.packages:

            self.profile = Profile()

            dirname = 'packages'
            self.packages_dir = util.safe_join(util.get_home_dir(), dirname)

            # Get data
            data = self.resources.packages.get(self.package)
            distribution = self.resources.distribution

            self.specversion = distribution.get('packages').get(self.package)
            self.package_name = data.get('release').get('package_name')
            self.extension = data.get('release').get('extension')
            platform = platform or self._get_platform()

            if checkversion:
                # Check version
                valid_version = self._get_valid_version(
                    data.get('repository').get('name'),
                    data.get('repository').get('organization'),
                    data.get('release').get('tag_name'),
                    self.version,
                    self.specversion,
                    force
                )
                # Valid version
                if not valid_version:
                    # Error
                    click.secho(
                        'Error: No version {} found'.format(self.version),
                        fg='red')
                    exit(1)

                self.version = valid_version

                # e.g., [linux_x86_64, linux]
                platform_os = platform.split('_')[0]
                self.download_urls = [
                    {
                        'url': self.get_download_url(data, platform),
                        'platform': platform
                    },
                    {
                        'url': self.get_download_url(data, platform_os),
                        'platform': platform_os
                    }
                ]

        if self.packages_dir == '':
            click.secho(
                'Error: No such package \'{0}\''.format(self.package),
                fg='red')
            exit(1)
Exemplo n.º 5
0
    def __init__(self, package, platform='', force=False, checkversion=True):

        # Parse version
        if '@' in package:
            split = package.split('@')
            self.package = split[0]
            self.version = split[1]
        else:
            self.package = package
            self.version = None

        self.force_install = force
        self.packages_dir = ''

        self.resources = Resources(platform)

        if self.package in self.resources.packages:

            self.profile = Profile()

            dirname = 'packages'
            self.packages_dir = util.safe_join(util.get_home_dir(), dirname)

            # Get data
            data = self.resources.packages.get(self.package)
            distribution = self.resources.distribution

            self.spec_version = distribution.get('packages').get(self.package)
            self.package_name = data.get('release').get('package_name')
            self.extension = data.get('release').get('extension')
            platform = platform or self._get_platform()

            if checkversion:
                # Check version
                valid_version = self._get_valid_version(
                    data.get('repository').get('name'),
                    data.get('repository').get('organization'),
                    data.get('release').get('tag_name')
                )
                # Valid version
                if not valid_version:
                    # Error
                    click.secho('Error: no valid version found', fg='red')
                    exit(1)

                self.version = valid_version

                # e.g., [linux_x86_64, linux]
                platform_os = platform.split('_')[0]
                self.download_urls = [
                    {
                        'url': self.get_download_url(data, platform),
                        'platform': platform
                    },
                    {
                        'url': self.get_download_url(data, platform_os),
                        'platform': platform_os
                    }
                ]

        if self.packages_dir == '':
            click.secho(
                'Error: no such package \'{}\''.format(self.package),
                fg='red')
            exit(1)
Exemplo n.º 6
0
    def __init__(self, package, platform='', force=False):

        # Parse version
        if '@' in package:
            split = package.split('@')
            self.package = split[0]
            self.version = split[1]
        else:
            self.package = package
            self.version = None

        self.forced_install = force
        self.packages_dir = ''

        self.resources = Resources(platform)

        if self.package in self.resources.packages:

            self.profile = Profile()

            dirname = 'packages'
            self.packages_dir = join(get_home_dir(), dirname)

            # Check version
            data = self.resources.packages[self.package]
            distribution = self.resources.distribution
            self.specversion = distribution['packages'][self.package]

            version = self._get_valid_version(
                data['repository']['name'], data['repository']['organization'],
                data['release']['tag_name'], self.version, self.specversion)

            # Valid version added with @
            if version and self.version:
                self.forced_install = True
            self.version = version if version else ''

            # Valid version
            if version:
                self.platform = platform or self._get_platform()

                release = data['release']
                self.compressed_name = release['compressed_name'].replace(
                    '%V', self.version).replace('%P', self.platform)
                self.uncompressed_name = release['uncompressed_name'].replace(
                    '%V', self.version).replace('%P', self.platform)
                self.package_name = data['release']['package_name']

                if isinstance(data['release']['extension'], dict):
                    for os in ['linux', 'darwin', 'windows']:
                        if os in self.platform:
                            self.extension = data['release']['extension'][os]
                else:
                    self.extension = data['release']['extension']

                self.tarball = self._get_tarball_name(self.compressed_name,
                                                      self.extension)

                self.download_url = self._get_download_url(
                    data['repository']['name'],
                    data['repository']['organization'],
                    data['release']['tag_name'].replace('%V', self.version),
                    self.tarball)
Exemplo n.º 7
0
    def __init__(self, package, platform='', force=False):

        # Parse version
        if '@' in package:
            split = package.split('@')
            self.package = split[0]
            self.version = split[1]
        else:
            self.package = package
            self.version = None

        self.forced_install = force
        self.packages_dir = ''

        self.resources = Resources(platform)

        if self.package in self.resources.packages:

            self.profile = Profile()

            dirname = 'packages'
            self.packages_dir = join(get_home_dir(), dirname)

            # Check version
            data = self.resources.packages[self.package]
            distribution = self.resources.distribution
            self.specversion = distribution['packages'][self.package]

            version = self._get_valid_version(
                data['repository']['name'],
                data['repository']['organization'],
                data['release']['tag_name'],
                self.version,
                self.specversion
            )

            # Valid version added with @
            if version and self.version:
                self.forced_install = True
            self.version = version if version else ''

            # Valid version
            if version:
                self.platform = platform or self._get_platform()

                release = data['release']
                self.compressed_name = release['compressed_name'].replace(
                    '%V', self.version).replace('%P', self.platform)
                self.uncompressed_name = release['uncompressed_name'].replace(
                    '%V', self.version).replace('%P', self.platform)
                self.package_name = data['release']['package_name']

                if isinstance(data['release']['extension'], dict):
                    for os in ['linux', 'darwin', 'windows']:
                        if os in self.platform:
                            self.extension = data['release']['extension'][os]
                else:
                    self.extension = data['release']['extension']

                self.tarball = self._get_tarball_name(
                    self.compressed_name,
                    self.extension
                )

                self.download_url = self._get_download_url(
                    data['repository']['name'],
                    data['repository']['organization'],
                    data['release']['tag_name'].replace('%V', self.version),
                    self.tarball
                )
Exemplo n.º 8
0
    def __init__(self, package):

        # Parse version
        if '@' in package:
            split = package.split('@')
            self.package = split[0]
            self.version = split[1]
        else:
            self.package = package
            self.version = None

        self.forced_install = False
        self.valid_version = True

        self.resources = Resources()
        self.profile = Profile()

        if self.package in self.resources.packages:

            data = self.resources.packages[self.package]

            if self.version:
                # Validate version
                valid = self._validate_version(
                    data['repository']['name'],
                    data['repository']['organization'],
                    data['release']['tag_name'],
                    self.version
                )
                if valid:
                    self.forced_install = True
                else:
                    self.valid_version = False
            else:
                # Get latest version
                self.version = self._get_latest_version(
                    data['repository']['name'],
                    data['repository']['organization'],
                    data['release']['tag_name']
                )

            self.arch = self._get_architecture()

            release = data['release']
            self.compressed_name = release['compressed_name'].replace(
                '%V', self.version).replace('%A', self.arch)
            self.uncompressed_name = release['uncompressed_name'].replace(
                '%V', self.version).replace('%A', self.arch)
            self.package_name = data['release']['package_name']

            if isinstance(data['release']['extension'], dict):
                for os in ['linux', 'darwin', 'windows']:
                    if os in self.arch:
                        self.extension = data['release']['extension'][os]
            else:
                self.extension = data['release']['extension']

            self.tarball = self._get_tarball_name(
                self.compressed_name,
                self.extension
            )

            self.download_url = self._get_download_url(
                data['repository']['name'],
                data['repository']['organization'],
                data['release']['tag_name'].replace('%V', self.version),
                self.tarball
            )

            if 'main_dir' in data.keys():
                self.packages_dir = join(expanduser('~'), data['main_dir'])
            else:
                self.packages_dir = join(util.get_home_dir(), 'packages')
Exemplo n.º 9
0
 def __init__(self):
     self.config = {'exe': 'default', 'verbose': 0}
     self.labels = {'exe': 'Executable', 'verbose': 'Verbose'}
     self.packages = {}
     self._profile_path = join(get_home_dir(), 'profile.json')
     self.load()
Exemplo n.º 10
0
 def __init__(self):
     self.examples_dir = join(util.get_home_dir(), 'packages', 'examples')