def main(): import argparse cmd_parser = argparse.ArgumentParser(description="A tool to work with MicroPython .mpy files.") cmd_parser.add_argument("-d", "--dump", action="store_true", help="dump contents of files") cmd_parser.add_argument("-f", "--freeze", action="store_true", help="freeze files") cmd_parser.add_argument( "--merge", action="store_true", help="merge multiple .mpy files into one" ) cmd_parser.add_argument("-q", "--qstr-header", help="qstr header file to freeze against") cmd_parser.add_argument( "-mlongint-impl", choices=["none", "longlong", "mpz"], default="mpz", help="long-int implementation used by target (default mpz)", ) cmd_parser.add_argument( "-mmpz-dig-size", metavar="N", type=int, default=16, help="mpz digit size used by target (default 16)", ) cmd_parser.add_argument("-o", "--output", default=None, help="output file") cmd_parser.add_argument("files", nargs="+", help="input .mpy files") args = cmd_parser.parse_args() # set config values relevant to target machine config.MICROPY_LONGINT_IMPL = { "none": config.MICROPY_LONGINT_IMPL_NONE, "longlong": config.MICROPY_LONGINT_IMPL_LONGLONG, "mpz": config.MICROPY_LONGINT_IMPL_MPZ, }[args.mlongint_impl] config.MPZ_DIG_SIZE = args.mmpz_dig_size config.native_arch = MP_NATIVE_ARCH_NONE # set config values for qstrs, and get the existing base set of qstrs if args.qstr_header: qcfgs, base_qstrs = qstrutil.parse_input_headers([args.qstr_header]) config.MICROPY_QSTR_BYTES_IN_LEN = int(qcfgs["BYTES_IN_LEN"]) config.MICROPY_QSTR_BYTES_IN_HASH = int(qcfgs["BYTES_IN_HASH"]) else: config.MICROPY_QSTR_BYTES_IN_LEN = 1 config.MICROPY_QSTR_BYTES_IN_HASH = 1 base_qstrs = {} raw_codes = [read_mpy(file) for file in args.files] if args.dump: dump_mpy(raw_codes) elif args.freeze: try: freeze_mpy(base_qstrs, raw_codes) except FreezeError as er: print(er, file=sys.stderr) sys.exit(1) elif args.merge: merged_mpy = merge_mpy(raw_codes, args.output)
def main(): import argparse cmd_parser = argparse.ArgumentParser( description='A tool to work with MicroPython .mpy files.') cmd_parser.add_argument('-d', '--dump', action='store_true', help='dump contents of files') cmd_parser.add_argument('-f', '--freeze', action='store_true', help='freeze files') cmd_parser.add_argument('-q', '--qstr-header', help='qstr header file to freeze against') cmd_parser.add_argument( '-mlongint-impl', choices=['none', 'longlong', 'mpz'], default='mpz', help='long-int implementation used by target (default mpz)') cmd_parser.add_argument('-mmpz-dig-size', metavar='N', type=int, default=16, help='mpz digit size used by target (default 16)') cmd_parser.add_argument('files', nargs='+', help='input .mpy files') args = cmd_parser.parse_args() # set config values relevant to target machine config.MICROPY_LONGINT_IMPL = { 'none': config.MICROPY_LONGINT_IMPL_NONE, 'longlong': config.MICROPY_LONGINT_IMPL_LONGLONG, 'mpz': config.MICROPY_LONGINT_IMPL_MPZ, }[args.mlongint_impl] config.MPZ_DIG_SIZE = args.mmpz_dig_size config.native_arch = MP_NATIVE_ARCH_NONE # set config values for qstrs, and get the existing base set of qstrs if args.qstr_header: qcfgs, base_qstrs = qstrutil.parse_input_headers([args.qstr_header]) config.MICROPY_QSTR_BYTES_IN_LEN = int(qcfgs['BYTES_IN_LEN']) config.MICROPY_QSTR_BYTES_IN_HASH = int(qcfgs['BYTES_IN_HASH']) else: config.MICROPY_QSTR_BYTES_IN_LEN = 1 config.MICROPY_QSTR_BYTES_IN_HASH = 1 base_qstrs = {} raw_codes = [read_mpy(file) for file in args.files] if args.dump: dump_mpy(raw_codes) elif args.freeze: try: freeze_mpy(base_qstrs, raw_codes) except FreezeError as er: print(er, file=sys.stderr) sys.exit(1)
def main(): import argparse cmd_parser = argparse.ArgumentParser(description='A tool to work with MicroPython .mpy files.') cmd_parser.add_argument('-d', '--dump', action='store_true', help='dump contents of files') cmd_parser.add_argument('-f', '--freeze', action='store_true', help='freeze files') cmd_parser.add_argument('-q', '--qstr-header', help='qstr header file to freeze against') cmd_parser.add_argument('-mlongint-impl', choices=['none', 'longlong', 'mpz'], default='mpz', help='long-int implementation used by target (default mpz)') cmd_parser.add_argument('-mmpz-dig-size', metavar='N', type=int, default=16, help='mpz digit size used by target (default 16)') cmd_parser.add_argument('files', nargs='+', help='input .mpy files') args = cmd_parser.parse_args() # set config values relevant to target machine config.MICROPY_LONGINT_IMPL = { 'none':config.MICROPY_LONGINT_IMPL_NONE, 'longlong':config.MICROPY_LONGINT_IMPL_LONGLONG, 'mpz':config.MICROPY_LONGINT_IMPL_MPZ, }[args.mlongint_impl] config.MPZ_DIG_SIZE = args.mmpz_dig_size # set config values for qstrs, and get the existing base set of qstrs if args.qstr_header: qcfgs, base_qstrs = qstrutil.parse_input_headers([args.qstr_header]) config.MICROPY_QSTR_BYTES_IN_LEN = int(qcfgs['BYTES_IN_LEN']) config.MICROPY_QSTR_BYTES_IN_HASH = int(qcfgs['BYTES_IN_HASH']) else: config.MICROPY_QSTR_BYTES_IN_LEN = 1 config.MICROPY_QSTR_BYTES_IN_HASH = 1 base_qstrs = {} raw_codes = [read_mpy(file) for file in args.files] if args.dump: dump_mpy(raw_codes) elif args.freeze: try: freeze_mpy(base_qstrs, raw_codes) except FreezeError as er: print(er, file=sys.stderr) sys.exit(1)
def generatedQstrdefs(self, outputdir): sys.path.append( str(Path(user_data_dir+"/ardupycore/ArduPy/MicroPython/py"))) # import makemoduledefs import makeqstrdata import makeqstrdefs # import makeversionhdr genhdr = Path(outputdir+"/genhdr") os.makedirs(genhdr) extern_mp_src = [] # makeversionhdr.make_version_header(str(Path(genhdr,"mpversion.h"))) shutil.copyfile(str(Path( user_data_dir+"/ardupycore/Seeeduino/tools/genhdr/mpversion.h")), str(Path(genhdr, "mpversion.h"))) shutil.copyfile(str(Path(user_data_dir+"/ardupycore/Seeeduino/tools/genhdr/moduledefs.h")), str(Path(genhdr, "moduledefs.h"))) mp_generate_flag = micropython_CFLAGS.format(str(Path(user_data_dir+"/ardupycore/ArduPy")), str(Path(user_data_dir+"/ardupycore/ArduPy/boards/"+self.board))) # remove cpp files # todoï¼› only scan file start wirh "mod_ardupy_" for f in self.srcfile: if f[-3:] == "cpp" or f[-2:] == "cc": continue if f.find("objmodule.c") != -1 or \ f.find("parse.c") != -1 or \ f.find("qstr.c") != -1: continue extern_mp_src.append(f) gen_i_last = self.gcc + "-E -DARDUPY_MODULE -DNO_QSTR " + mp_generate_flag + " ".join(extern_mp_src) + \ " " + str(Path(user_data_dir+"/ardupycore/ArduPy/boards/"+self.board+"/mpconfigport.h")) + \ " > " + str(Path(genhdr, "qstr.i.last")) print(gen_i_last) os.system(gen_i_last) import io class Args: pass args = Args() args.input_filename = str(Path(genhdr, "qstr.i.last")) args.output_dir = str(Path(genhdr, "qstr")) args.output_file = str(Path(genhdr, "qstrdefs.collected.h")) try: os.makedirs(args.output_dir) except OSError: pass makeqstrdefs.args = args with io.open(args.input_filename, encoding='utf-8') as infile: makeqstrdefs.process_file(infile) makeqstrdefs.cat_together() qcfgs, qstrs = makeqstrdata.parse_input_headers([str(Path(user_data_dir+"/ardupycore/Seeeduino/tools/genhdr/qstrdefs.preprocessed.h")), str(Path(genhdr, "qstrdefs.collected.h"))]) qstrdefs_generated_h = open(Path(genhdr, "qstrdefs.generated.h"), "w") # get config variables cfg_bytes_len = int(qcfgs['BYTES_IN_LEN']) cfg_bytes_hash = int(qcfgs['BYTES_IN_HASH']) # print out the starter of the generated C header file qstrdefs_generated_h.writelines( '// This file was automatically generated by makeqstrdata.py\n') qstrdefs_generated_h.writelines('\n') # add NULL qstr with no hash or data qstrdefs_generated_h.writelines('QDEF(MP_QSTR_NULL, (const byte*)"%s%s" "")\n' % ( '\\x00' * cfg_bytes_hash, '\\x00' * cfg_bytes_len)) # go through each qstr and print it out for order, ident, qstr in sorted(qstrs.values(), key=lambda x: x[0]): qbytes = makeqstrdata.make_bytes( cfg_bytes_len, cfg_bytes_hash, qstr) qstrdefs_generated_h.writelines( 'QDEF(MP_QSTR_%s, %s)\n' % (ident, qbytes)) qstrdefs_generated_h.close() # os.system("cp "+ str(Path(genhdr,"qstrdefs.generated.h"))+" /tmp") self.headerlist.append(str(outputdir)) return genhdr