1 # The MIT License (MIT)
3 # Copyright (c) 2014-2016 Philippe Proulx <pproulx@efficios.com>
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to deal
7 # in the Software without restriction, including without limitation the rights
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 # copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice shall be included in
13 # all copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 from pkg_resources
import resource_filename
24 from termcolor
import cprint
, colored
25 import barectf
.tsdl182gen
37 cprint('Error: ', 'red', end
='', file=sys
.stderr
)
38 cprint(msg
, 'red', attrs
=['bold'], file=sys
.stderr
)
42 def _pconfig_error(e
):
51 if not hasattr(e
, 'prev'):
59 cprint('Error:', 'red', file=sys
.stderr
)
61 for i
, line
in enumerate(lines
):
62 suf
= ':' if i
< len(lines
) - 1 else ''
63 cprint(' ' + line
+ suf
, 'red', attrs
=['bold'], file=sys
.stderr
)
69 cprint('{}'.format(msg
), 'green', attrs
=['bold'])
73 ap
= argparse
.ArgumentParser()
75 ap
.add_argument('-c', '--code-dir', metavar
='DIR', action
='store',
77 help='output directory of C source file')
78 ap
.add_argument('--dump-config', action
='store_true',
79 help='also dump the effective YAML configuration file used for generation')
80 ap
.add_argument('-H', '--headers-dir', metavar
='DIR', action
='store',
82 help='output directory of C header files')
83 ap
.add_argument('-I', '--include-dir', metavar
='DIR', action
='append',
85 help='add directory DIR to the list of directories to be searched for include files')
86 ap
.add_argument('--ignore-include-not-found', action
='store_true',
87 help='continue to process the configuration file when included files are not found')
88 ap
.add_argument('-m', '--metadata-dir', metavar
='DIR', action
='store',
90 help='output directory of CTF metadata')
91 ap
.add_argument('-p', '--prefix', metavar
='PREFIX', action
='store',
92 help='override configuration\'s prefix')
93 ap
.add_argument('-V', '--version', action
='version',
94 version
='%(prog)s {}'.format(barectf
.__version
__))
95 ap
.add_argument('config', metavar
='CONFIG', action
='store',
96 help='barectf YAML configuration file')
99 args
= ap
.parse_args()
101 # validate output directories
102 for d
in [args
.code_dir
, args
.headers_dir
, args
.metadata_dir
] + args
.include_dir
:
103 if not os
.path
.isdir(d
):
104 _perror('"{}" is not an existing directory'.format(d
))
106 # validate that configuration file exists
107 if not os
.path
.isfile(args
.config
):
108 _perror('"{}" is not an existing, regular file'.format(args
.config
))
110 # append current working directory and provided include directory
111 args
.include_dir
+= [os
.getcwd(), resource_filename(__name__
, 'include')]
116 def _write_file(d
, name
, content
):
117 with
open(os
.path
.join(d
, name
), 'w') as f
:
125 # create configuration
127 config
= barectf
.config
.from_yaml_file(args
.config
, args
.include_dir
,
128 args
.ignore_include_not_found
,
130 except barectf
.config
.ConfigError
as e
:
132 except Exception as e
:
133 _perror('unknown exception: {}'.format(e
))
135 # replace prefix if needed
138 config
.prefix
= args
.prefix
139 except barectf
.config
.ConfigError
as e
:
143 metadata
= barectf
.tsdl182gen
.from_metadata(config
.metadata
)
146 _write_file(args
.metadata_dir
, 'metadata', metadata
)
147 except Exception as e
:
148 _perror('cannot write metadata file: {}'.format(e
))
151 generator
= barectf
.gen
.CCodeGenerator(config
)
154 header
= generator
.generate_header()
155 bitfield_header
= generator
.generate_bitfield_header()
158 _write_file(args
.headers_dir
, generator
.get_header_filename(), header
)
159 _write_file(args
.headers_dir
, generator
.get_bitfield_header_filename(),
161 except Exception as e
:
162 _perror('cannot write header files: {}'.format(e
))
165 c_src
= generator
.generate_c_src()
168 _write_file(args
.code_dir
, '{}.c'.format(config
.prefix
.rstrip('_')),
170 except Exception as e
:
171 _perror('cannot write C source file: {}'.format(e
))
This page took 0.033763 seconds and 4 git commands to generate.