@ -1,30 +1,77 @@
#!/usr/bin/env python3
#!/usr/bin/env python3
# QAPI generator
#
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# See the COPYING file in the top-level directory.
# See the COPYING file in the top-level directory.
"""
QAPI Generator
This is the main entry point for generating C code from the QAPI schema .
"""
import argparse
import argparse
import re
import re
import sys
import sys
from typing import Optional
from qapi . commands import gen_commands
from qapi . commands import gen_commands
from qapi . error import QAPIError
from qapi . events import gen_events
from qapi . events import gen_events
from qapi . introspect import gen_introspect
from qapi . introspect import gen_introspect
from qapi . schema import QAPIError , QAPI Schema
from qapi . schema import QAPISchema
from qapi . types import gen_types
from qapi . types import gen_types
from qapi . visit import gen_visit
from qapi . visit import gen_visit
def main ( argv ) :
def invalid_prefix_char ( prefix : str ) - > Optional [ str ] :
match = re . match ( r ' ([A-Za-z_.-][A-Za-z0-9_.-]*)? ' , prefix )
if match . end ( ) != len ( prefix ) :
return prefix [ match . end ( ) ]
return None
def generate ( schema_file : str ,
output_dir : str ,
prefix : str ,
unmask : bool = False ,
builtins : bool = False ) - > None :
"""
Generate C code for the given schema into the target directory .
: param schema_file : The primary QAPI schema file .
: param output_dir : The output directory to store generated code .
: param prefix : Optional C - code prefix for symbol names .
: param unmask : Expose non - ABI names through introspection ?
: param builtins : Generate code for built - in types ?
: raise QAPIError : On failures .
"""
assert invalid_prefix_char ( prefix ) is None
schema = QAPISchema ( schema_file )
gen_types ( schema , output_dir , prefix , builtins )
gen_visit ( schema , output_dir , prefix , builtins )
gen_commands ( schema , output_dir , prefix )
gen_events ( schema , output_dir , prefix )
gen_introspect ( schema , output_dir , prefix , unmask )
def main ( ) - > int :
"""
gapi - gen executable entry point .
Expects arguments via sys . argv , see - - help for details .
: return : int , 0 on success , 1 on failure .
"""
parser = argparse . ArgumentParser (
parser = argparse . ArgumentParser (
description = ' Generate code from a QAPI schema ' )
description = ' Generate code from a QAPI schema ' )
parser . add_argument ( ' -b ' , ' --builtins ' , action = ' store_true ' ,
parser . add_argument ( ' -b ' , ' --builtins ' , action = ' store_true ' ,
help = " generate code for built-in types " )
help = " generate code for built-in types " )
parser . add_argument ( ' -o ' , ' --output-dir ' , action = ' store ' , default = ' ' ,
parser . add_argument ( ' -o ' , ' --output-dir ' , action = ' store ' ,
default = ' ' ,
help = " write output to directory OUTPUT_DIR " )
help = " write output to directory OUTPUT_DIR " )
parser . add_argument ( ' -p ' , ' --prefix ' , action = ' store ' , default = ' ' ,
parser . add_argument ( ' -p ' , ' --prefix ' , action = ' store ' ,
default = ' ' ,
help = " prefix for symbols " )
help = " prefix for symbols " )
parser . add_argument ( ' -u ' , ' --unmask-non-abi-names ' , action = ' store_true ' ,
parser . add_argument ( ' -u ' , ' --unmask-non-abi-names ' , action = ' store_true ' ,
dest = ' unmask ' ,
dest = ' unmask ' ,
@ -32,25 +79,23 @@ def main(argv):
parser . add_argument ( ' schema ' , action = ' store ' )
parser . add_argument ( ' schema ' , action = ' store ' )
args = parser . parse_args ( )
args = parser . parse_args ( )
match = re . match ( r ' ([A-Za-z_.-][A-Za-z0-9_.-]*)? ' , args . prefix )
funny_char = invalid_prefix_char ( args . prefix )
if match . end ( ) != len ( args . prefix ) :
if funny_char :
print ( " %s : ' funny character ' %s ' in argument of --prefix "
msg = f " funny character ' { funny_char } ' in argument of --prefix "
% ( sys . argv [ 0 ] , args . prefix [ match . end ( ) ] ) ,
print ( f " { sys . argv [ 0 ] } : { msg } " , file = sys . stderr )
file = sys . stderr )
return 1
sys . exit ( 1 )
try :
try :
schema = QAPISchema ( args . schema )
generate ( args . schema ,
output_dir = args . output_dir ,
prefix = args . prefix ,
unmask = args . unmask ,
builtins = args . builtins )
except QAPIError as err :
except QAPIError as err :
print ( err , file = sys . stderr )
print ( f " { sys . argv [ 0 ] } : { str ( err ) } " , file = sys . stderr )
exit ( 1 )
return 1
return 0
gen_types ( schema , args . output_dir , args . prefix , args . builtins )
gen_visit ( schema , args . output_dir , args . prefix , args . builtins )
gen_commands ( schema , args . output_dir , args . prefix )
gen_events ( schema , args . output_dir , args . prefix )
gen_introspect ( schema , args . output_dir , args . prefix , args . unmask )
if __name__ == ' __main__ ' :
if __name__ == ' __main__ ' :
main ( sys . argv )
sys . exit ( main ( ) )