Source code for pyccel.commands.quickstart

# -*- coding: utf-8 -*-
"""
    Quickly setup a Pyccel source to work with pyccel.
"""

# TODO this file has not been refactored yet
# TODO: - enables testing extensions when invoking pyccel-quickstart

import sys
import os
import argparse

from os import path

from pyccel.codegen.utilities_old import load_extension
from pyccel.codegen.utilities_old import initialize_project
from pyccel.codegen.utilities_old import build_cmakelists_dir
from pyccel.codegen.utilities_old import generate_project_main
from pyccel.codegen.utilities_old import generate_project_init
from pyccel.codegen.utilities_old import generate_project_conf


EXTENSIONS = {
    'math': True
}

THIRD_PARTIES = {
    'blaslapack': False,
}

FLAGS_REGISTRY = ['blaslapack_dir']


DEFAULT_VALUE = {
    'author': '__AUTHOR__',
    'sep': True,
    'dot': '', #'_',
    'language': 'fortran',
    'suffix': '.f90',
    'master': 'main',
    'epub': False,
    'makefile': True,
    'batchfile': True,
}


[docs]def mkdir_p(dir): # type: (unicode) -> None if path.isdir(dir): return os.makedirs(dir)
[docs]def get_parser(): # type: () -> argparse.ArgumentParser parser = argparse.ArgumentParser( usage='%(prog)s [OPTIONS] <PROJECT_DIR>', epilog="For more information, visit <http://pyccel.readthedocs.io/>.", description=""" Generate required files for a Pyccel project. pyccel-quickstart is an interactive tool that asks some questions about your project and then generates a complete pyccel directory and sample Makefile to be used with pyccel-build. """) parser.add_argument('-q', '--quiet', action='store_true', dest='quiet', default=False, help='quiet mode') # parser.add_argument('--version', action='version', dest='show_version', # version='%%(prog)s %s' % __display_version__) parser.add_argument('path', metavar='PROJECT_DIR', default='.', help='output path') group = parser.add_argument_group('Structure options') group.add_argument('--sep', action='store_true', help='if specified, separate source and build dirs') group.add_argument('--dot', metavar='DOT', help='replacement for dot in _build etc.') group = parser.add_argument_group('Project basic options') group.add_argument('-a', '--author', metavar='AUTHOR', dest='author', help='author names') group.add_argument('-v', metavar='VERSION', dest='version', default='', help='version of project') group.add_argument('-r', '--release', metavar='RELEASE', dest='release', help='release of project') group.add_argument('--suffix-library', type=str, help='Suffix of 3 letters for the library') group.add_argument('-l', '--language', metavar='LANGUAGE', dest='language', help='target language') group.add_argument('--convert-only', action='store_true', help='Converts pyccel files only without build') group.add_argument('--compiler', type=str, help='Used compiler') group.add_argument('--master', metavar='MASTER', help='master file name') group.add_argument('--include', type=str, help='path to include directory.') group.add_argument('--libdir', type=str, help='path to lib directory.') group.add_argument('--libs', type=str, help='list of libraries to link with.') group = parser.add_argument_group('Extension options') for ext, default in EXTENSIONS.items(): group.add_argument('--ext-' + ext, action='store_true', dest='ext_' + ext, default=default, help='enable %s extension' % ext) group.add_argument('--extensions', metavar='EXTENSIONS', dest='extensions', action='append', help='enable extensions') group = parser.add_argument_group('Third party options') for ext, default in THIRD_PARTIES.items(): group.add_argument('--with-' + ext, action='store_true', dest='with_' + ext, default=default, help='enable %s third party' % ext) group.add_argument('--with-' + ext + '-dir', type=str, dest=ext + '_dir', help='%s third party directory' % ext) return parser
[docs]def generate(d, silent=False): """Generates the project from a dictionary.""" # escape backslashes and single quotes in strings that are put into # a Python string literal # for key in ('project', # 'author', 'copyright', # 'version', 'release', 'master'): if not path.isdir(d['path']): mkdir_p(d['path']) srcdir = d['sep'] and path.join(d['path'], 'src') or d['path'] mkdir_p(srcdir) if d['sep']: builddir = path.join(d['path'], 'build') d['exclude_patterns'] = '' else: builddir = path.join(srcdir, d['dot'] + 'build') exclude_patterns = map(repr, [ d['dot'] + 'build', 'Thumbs.db', '.DS_Store', ]) d['exclude_patterns'] = ', '.join(exclude_patterns) if 'suffix-library' in d: if len(d['suffix-library']) != 3: raise ValueError('Library suffix must contain exactly 3 letters.') suffix_library = d['suffix-library'] else: suffix_library = d['path'][:3] d['suffix-library'] = suffix_library mkdir_p(builddir) # ... project = d['path'] libname = project base_dir = project extensions_dir = os.path.join(srcdir, 'extensions') extensions = [k[4:] for k,v in d.items() if v and (k[:4] == 'ext_')] for ext in extensions: load_extension(ext, extensions_dir, silent=silent) # ... when using sep directory for sources if d['sep']: build_cmakelists_dir(srcdir, force=True) # ... # ... flags = {} for key in FLAGS_REGISTRY: flag = d.pop(key, None) if flag: flags[key.upper()] = flag if ('BLASLAPACK_DIR' in flags) and flags['BLASLAPACK_DIR']: flags['LAPACK_ENABLED'] = 'ON' d['flags'] = flags # ... # ... if not('prefix' in d) or not(d['prefix']): d['prefix'] = os.path.join(d['path'], 'usr') # ... # ... if not('fflags' in d) or not(d['fflags']): d['fflags'] = '-O2 -fbounds-check' # ... # ... if not('fc' in d) or not(d['fc']): d['fc'] = 'gfortran' # ... # ... if not('suffix' in d) or not(d['suffix']): raise ValueError('suffix can not be found in settings') # ... # ... generate_project_init(d['path'], project, **d) generate_project_main(d['path'], project, extensions) generate_project_conf(d['path'], project, **d) # ... # ... if not('convert_only' in d): initialize_project(base_dir, project, libname, d)
# ...
[docs]def main(argv=sys.argv[1:]): """Creates a new pyccel project.""" # ... parser = get_parser() try: args = parser.parse_args(argv) except SystemExit as err: return err.code # ... d = vars(args) # delete None or False value d = dict((k, v) for k, v in d.items() if not (v is None or v is False)) # ... settings = DEFAULT_VALUE.copy() for k,v in d.items(): settings[k] = v # ... # ... settings['extensions'] = [k[4:] for k,v in d.items() if v and (k[:4] == 'ext_')] # ... # ... generate(settings)
# ...