diff options
| author | Michael Hirsch, Ph.D <scivision@users.noreply.github.com> | 2019-10-18 11:35:13 -0400 | 
|---|---|---|
| committer | Jussi Pakkanen <jpakkane@gmail.com> | 2019-10-19 14:28:03 +0300 | 
| commit | ba7428c9d30a32a02c13166e586406138d4508a6 (patch) | |
| tree | 092501f035cccc1868b602bd4c4bcaf60131c25a /tools/cmake2meson.py | |
| parent | 9382884872506c54a70edaebf26bd0af377279a7 (diff) | |
| download | meson-ba7428c9d30a32a02c13166e586406138d4508a6.tar.gz | |
cmake2meson: improve exceptions, add type annotations, use argparse
Diffstat (limited to 'tools/cmake2meson.py')
| -rwxr-xr-x | tools/cmake2meson.py | 44 | 
1 files changed, 22 insertions, 22 deletions
diff --git a/tools/cmake2meson.py b/tools/cmake2meson.py index 9dc9f6e6d..07ff3c9df 100755 --- a/tools/cmake2meson.py +++ b/tools/cmake2meson.py @@ -14,21 +14,22 @@  # See the License for the specific language governing permissions and  # limitations under the License. -from typing import List +import typing  from pathlib import Path  import sys  import re +import argparse  class Token: -    def __init__(self, tid, value): +    def __init__(self, tid: str, value: str):          self.tid = tid          self.value = value          self.lineno = 0          self.colno = 0  class Statement: -    def __init__(self, name, args): +    def __init__(self, name: str, args: list):          self.name = name.lower()          self.args = args @@ -46,7 +47,7 @@ class Lexer:              ('rparen', re.compile(r'\)')),          ] -    def lex(self, code): +    def lex(self, code: str) -> typing.Iterator[Token]:          lineno = 1          line_start = 0          loc = 0 @@ -80,10 +81,10 @@ class Lexer:                      elif tid == 'varexp':                          yield(Token('varexp', match_text[2:-1]))                      else: -                        raise RuntimeError('Wharrgarbl') +                        raise ValueError('lex: unknown element {}'.format(tid))                      break              if not matched: -                raise RuntimeError('Lexer got confused line %d column %d' % (lineno, col)) +                raise ValueError('Lexer got confused line %d column %d' % (lineno, col))  class Parser:      def __init__(self, code: str): @@ -96,18 +97,18 @@ class Parser:          except StopIteration:              self.current = Token('eof', '') -    def accept(self, s): +    def accept(self, s: str) -> bool:          if self.current.tid == s:              self.getsym()              return True          return False -    def expect(self, s): +    def expect(self, s: str) -> bool:          if self.accept(s):              return True -        raise RuntimeError('Expecting %s got %s.' % (s, self.current.tid), self.current.lineno, self.current.colno) +        raise ValueError('Expecting %s got %s.' % (s, self.current.tid), self.current.lineno, self.current.colno) -    def statement(self): +    def statement(self) -> Statement:          cur = self.current          if self.accept('comment'):              return Statement('_', [cur.value]) @@ -117,7 +118,7 @@ class Parser:          self.expect('rparen')          return Statement(cur.value, args) -    def arguments(self): +    def arguments(self) -> list:          args = []          if self.accept('lparen'):              args.append(self.arguments()) @@ -134,7 +135,7 @@ class Parser:              args += rest          return args -    def parse(self): +    def parse(self) -> typing.Iterator[Statement]:          while not self.accept('eof'):              yield(self.statement()) @@ -147,9 +148,9 @@ class Converter:          self.cmake_root = Path(cmake_root).expanduser()          self.indent_unit = '  '          self.indent_level = 0 -        self.options = []  # type: List[tuple] +        self.options = []  # type: typing.List[tuple] -    def convert_args(self, args: List[Token], as_array: bool = True): +    def convert_args(self, args: typing.List[Token], as_array: bool = True) -> str:          res = []          if as_array:              start = '[' @@ -165,15 +166,14 @@ class Converter:              elif i.tid == 'string':                  res.append("'%s'" % i.value)              else: -                print(i) -                raise RuntimeError('Unknown arg type.') +                raise ValueError('Unknown arg type {}'.format(i.tid))          if len(res) > 1:              return start + ', '.join(res) + end          if len(res) == 1:              return res[0]          return '' -    def write_entry(self, outfile, t): +    def write_entry(self, outfile: typing.TextIO, t: Statement):          if t.name in Converter.ignored_funcs:              return          preincrement = 0 @@ -313,8 +313,8 @@ class Converter:                  optfile.write(line)  if __name__ == '__main__': -    if len(sys.argv) != 2: -        print(sys.argv[0], '<CMake project root>') -        sys.exit(1) -    c = Converter(sys.argv[1]) -    c.convert() +    p = argparse.ArgumentParser(description='Convert CMakeLists.txt to meson.build and meson_options.txt') +    p.add_argument('cmake_root', help='CMake project root (where top-level CMakeLists.txt is)') +    P = p.parse_args() + +    Converter(P.cmake_root).convert()  | 
