Merge pull request #6658 from michaelbadcrumble/clean_meson_init

Update minit.py
pull/5854/merge
Dylan Baker 4 years ago committed by GitHub
commit a94d70711c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 117
      mesonbuild/minit.py

@ -15,118 +15,130 @@
"""Code that creates simple startup projects."""
from pathlib import Path
import re, shutil, subprocess
from enum import Enum
import subprocess
import shutil
import re
from glob import glob
from mesonbuild import mesonlib
from mesonbuild.environment import detect_ninja
from mesonbuild.templates.ctemplates import (create_exe_c_sample, create_lib_c_sample)
from mesonbuild.templates.cpptemplates import (create_exe_cpp_sample, create_lib_cpp_sample)
from mesonbuild.templates.cstemplates import (create_exe_cs_sample, create_lib_cs_sample)
from mesonbuild.templates.cudatemplates import (create_exe_cuda_sample, create_lib_cuda_sample)
from mesonbuild.templates.objctemplates import (create_exe_objc_sample, create_lib_objc_sample)
from mesonbuild.templates.fortrantemplates import (create_exe_fortran_sample, create_lib_fortran_sample)
from mesonbuild.templates.objcpptemplates import (create_exe_objcpp_sample, create_lib_objcpp_sample)
from mesonbuild.templates.dlangtemplates import (create_exe_d_sample, create_lib_d_sample)
from mesonbuild.templates.javatemplates import (create_exe_java_sample, create_lib_java_sample)
from mesonbuild.templates.fortrantemplates import (create_exe_fortran_sample, create_lib_fortran_sample)
from mesonbuild.templates.rusttemplates import (create_exe_rust_sample, create_lib_rust_sample)
from mesonbuild.templates.javatemplates import (create_exe_java_sample, create_lib_java_sample)
from mesonbuild.templates.cudatemplates import (create_exe_cuda_sample, create_lib_cuda_sample)
from mesonbuild.templates.objctemplates import (create_exe_objc_sample, create_lib_objc_sample)
from mesonbuild.templates.cpptemplates import (create_exe_cpp_sample, create_lib_cpp_sample)
from mesonbuild.templates.cstemplates import (create_exe_cs_sample, create_lib_cs_sample)
from mesonbuild.templates.ctemplates import (create_exe_c_sample, create_lib_c_sample)
'''
there is currently only one meson template at this time.
we currently have one meson template at this time.
'''
from mesonbuild.templates.mesontemplates import create_meson_build
FORTRAN_SUFFIXES = ['.f', '.for', '.F', '.f90', '.F90']
FORTRAN_SUFFIXES = {'.f', '.for', '.F', '.f90', '.F90'}
LANG_SUFFIXES = {'.c', '.cc', '.cpp', '.cs', '.cu', '.d', '.m', '.mm', '.rs', '.java'} | FORTRAN_SUFFIXES
LANG_SUPPORTED = {'c', 'cpp', 'cs', 'cuda', 'd', 'fortran', 'java', 'rust', 'objc', 'objcpp'}
UNREACHABLE_CODE = 'Unreachable code'
DEFAULT_PROJECT = 'executable'
DEFAULT_VERSION = '0.1'
class DEFAULT_TYPES(Enum):
EXE = 'executable'
LIB = 'library'
info_message = '''Sample project created. To build it run the
UNREACHABLE_CODE_ERROR = 'Unreachable code'
INFO_MESSAGE = '''Sample project created. To build it run the
following commands:
meson builddir
ninja -C builddir
'''
def create_sample(options):
def create_sample(options) -> None:
'''
Based on what arguments are passed we check for a match in language
then check for project type and create new Meson samples project.
'''
if options.language == 'c':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_c_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_c_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'cpp':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_cpp_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_cpp_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'cs':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_cs_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_cs_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'cuda':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_cuda_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_cuda_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'd':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_d_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_d_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'fortran':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_fortran_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_fortran_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'rust':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_rust_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_rust_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'objc':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_objc_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_objc_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'objcpp':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_objcpp_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_objcpp_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
elif options.language == 'java':
if options.type == 'executable':
if options.type == DEFAULT_TYPES['EXE'].value:
create_exe_java_sample(options.name, options.version)
elif options.type == 'library':
elif options.type == DEFAULT_TYPES['LIB'].value:
create_lib_java_sample(options.name, options.version)
else:
raise RuntimeError(UNREACHABLE_CODE)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
else:
raise RuntimeError(UNREACHABLE_CODE)
print(info_message)
raise RuntimeError(UNREACHABLE_CODE_ERROR)
print(INFO_MESSAGE)
def autodetect_options(options, sample: bool = False):
def autodetect_options(options, sample: bool = False) -> None:
'''
Here we autodetect options for args not passed in so don't have to
think about it.
@ -148,7 +160,7 @@ def autodetect_options(options, sample: bool = False):
if not options.srcfiles:
srcfiles = []
for f in (f for f in Path().iterdir() if f.is_file()):
if f.suffix in (['.c', '.cc', '.cpp', '.cs', '.cu', '.d', '.m', '.mm', '.rs', '.java'] + FORTRAN_SUFFIXES):
if f.suffix in LANG_SUFFIXES:
srcfiles.append(f)
if not srcfiles:
raise SystemExit('No recognizable source files found.\n'
@ -201,13 +213,12 @@ def add_arguments(parser):
parser.add_argument("-n", "--name", help="project name. default: name of current directory")
parser.add_argument("-e", "--executable", help="executable name. default: project name")
parser.add_argument("-d", "--deps", help="dependencies, comma-separated")
parser.add_argument("-l", "--language", choices=['c', 'cpp', 'cs', 'cuda', 'd', 'fortran', 'java', 'rust', 'objc', 'objcpp'],
help="project language. default: autodetected based on source files")
parser.add_argument("-b", "--build", help="build after generation", action='store_true')
parser.add_argument("--builddir", help="directory for build", default='build')
parser.add_argument("-l", "--language", choices=LANG_SUPPORTED, help="project language. default: autodetected based on source files")
parser.add_argument("-b", "--build", action='store_true', help="build after generation")
parser.add_argument("--builddir", default='build', help="directory for build")
parser.add_argument("-f", "--force", action="store_true", help="force overwrite of existing files and directories.")
parser.add_argument('--type', default='executable', choices=['executable', 'library'])
parser.add_argument('--version', default='0.1')
parser.add_argument('--type', default=DEFAULT_PROJECT, choices=('executable', 'library'), help="project type. default: {} based project".format(DEFAULT_PROJECT))
parser.add_argument('--version', default=DEFAULT_VERSION, help="project version. default: {}".format(DEFAULT_VERSION))
def run(options) -> int:
'''

Loading…
Cancel
Save