#!/usr/bin/env python # Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Simple tool to generate NMF file by just reformatting given arguments. This tool is similar to native_client_sdk/src/tools/create_nmf.py. create_nmf.py handles most cases, with the exception of Non-SFI nexes. create_nmf.py tries to auto-detect nexe and pexe types based on their contents, but it does not work for Non-SFI nexes (which don't have a marker to distinguish them from SFI nexes). This script simply reformats the command line arguments into NMF JSON format. """ import argparse import collections import json import logging import os _FILES_KEY = 'files' _PORTABLE_KEY = 'portable' _PROGRAM_KEY = 'program' _URL_KEY = 'url' _X86_32_NONSFI_KEY = 'x86-32-nonsfi' def ParseArgs(): parser = argparse.ArgumentParser() parser.add_argument( '--program', metavar='FILE', help='Main program nexe') # To keep compatibility with create_nmf.py, we use -x and --extra-files # as flags. parser.add_argument( '-x', '--extra-files', action='append', metavar='KEY:FILE', default=[], help=('Add extra key:file tuple to the "files" ' 'section of the .nmf')) parser.add_argument( '--output', metavar='FILE', help='Path to the output nmf file.') return parser.parse_args() def BuildNmfMap(root_path, program, extra_files): """Build simple map representing nmf json.""" result = { _PROGRAM_KEY: { _X86_32_NONSFI_KEY: { # The program path is relative to the root_path. _URL_KEY: os.path.relpath(program, root_path) } } } if extra_files: files = {} for named_file in extra_files: name, path = named_file.split(':', 1) files[name] = { _PORTABLE_KEY: { # Note: use path as is, unlike program path. _URL_KEY: path } } if files: result[_FILES_KEY] = files return result def OutputNmf(nmf_map, output_path): """Writes the nmf to an output file at given path in JSON format.""" with open(output_path, 'w') as output: json.dump(nmf_map, output, indent=2) def main(): args = ParseArgs() if not args.program: logging.error('--program is not specified.') sys.exit(1) if not args.output: logging.error('--output is not specified.') sys.exit(1) nmf_map = BuildNmfMap(os.path.dirname(args.output), args.program, args.extra_files) OutputNmf(nmf_map, args.output) if __name__ == '__main__': main()