|
Packit |
534379 |
#!/usr/bin/env python
|
|
Packit |
534379 |
# Copyright(c) 2017, Intel Corporation
|
|
Packit |
534379 |
#
|
|
Packit |
534379 |
# Redistribution and use in source and binary forms, with or without
|
|
Packit |
534379 |
# modification, are permitted provided that the following conditions are met:
|
|
Packit |
534379 |
#
|
|
Packit |
534379 |
# * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
534379 |
# this list of conditions and the following disclaimer.
|
|
Packit |
534379 |
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
Packit |
534379 |
# this list of conditions and the following disclaimer in the documentation
|
|
Packit |
534379 |
# and/or other materials provided with the distribution.
|
|
Packit |
534379 |
# * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
534379 |
# may be used to endorse or promote products derived from this software
|
|
Packit |
534379 |
# without specific prior written permission.
|
|
Packit |
534379 |
#
|
|
Packit |
534379 |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
534379 |
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
534379 |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit |
534379 |
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
Packit |
534379 |
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
Packit |
534379 |
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
Packit |
534379 |
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
Packit |
534379 |
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
Packit |
534379 |
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit |
534379 |
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
Packit |
534379 |
# POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
534379 |
|
|
Packit |
534379 |
import os
|
|
Packit |
534379 |
import sys
|
|
Packit |
534379 |
import subprocess
|
|
Packit |
534379 |
import shutil
|
|
Packit |
534379 |
import argparse
|
|
Packit |
534379 |
import json
|
|
Packit |
534379 |
import utils
|
|
Packit |
534379 |
from afu import AFU
|
|
Packit |
534379 |
from gbs import GBS
|
|
Packit |
534379 |
from metadata import metadata
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
PACKAGER_EXEC = "packager"
|
|
Packit |
534379 |
DESCRIPTION = 'Intel OPAE FPGA Packager'
|
|
Packit |
534379 |
VERSION = "@OPAE_VERSION@"
|
|
Packit |
534379 |
|
|
Packit |
534379 |
try:
|
|
Packit |
534379 |
assert sys.version_info >= (2, 7)
|
|
Packit |
534379 |
except AssertionError:
|
|
Packit |
534379 |
print(DESCRIPTION + " requires Python 2 version 2.7+")
|
|
Packit |
534379 |
sys.exit(1)
|
|
Packit |
534379 |
|
|
Packit |
534379 |
USAGE = """
|
|
Packit |
534379 |
{0}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
{1} <cmd> [options]
|
|
Packit |
534379 |
|
|
Packit |
534379 |
The following values for <cmd> are currently supported:
|
|
Packit |
534379 |
\t help - displays this message
|
|
Packit |
534379 |
\t create-gbs - creates GBS file from RBF and Accelerator Description File
|
|
Packit |
534379 |
\t modify-gbs - modify metadata of existing GBS file using --set-value
|
|
Packit |
534379 |
\t gbs-info - prints information about GBS file
|
|
Packit |
534379 |
\t get-rbf - creates RBF file by extracting RBF from GBS file
|
|
Packit |
534379 |
|
|
Packit |
534379 |
{1} <cmd> --h will give command specific help
|
|
Packit |
534379 |
""".format(DESCRIPTION, PACKAGER_EXEC)
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
def run_packager():
|
|
Packit |
534379 |
parser = argparse.ArgumentParser(usage=USAGE, add_help=False)
|
|
Packit |
534379 |
parser.add_argument("cmd", nargs="?")
|
|
Packit |
534379 |
parser.add_argument("remain_args", nargs=argparse.REMAINDER)
|
|
Packit |
534379 |
args = parser.parse_args(sys.argv[1:])
|
|
Packit |
534379 |
cmd_description = "{0} {1}".format(PACKAGER_EXEC, args.cmd)
|
|
Packit |
534379 |
subparser = argparse.ArgumentParser(description=cmd_description)
|
|
Packit |
534379 |
subparser._optionals.title = 'Options'
|
|
Packit |
534379 |
|
|
Packit |
534379 |
if args.cmd == "help" or not args.cmd:
|
|
Packit |
534379 |
print(USAGE)
|
|
Packit |
534379 |
|
|
Packit |
534379 |
elif args.cmd == "version":
|
|
Packit |
534379 |
if VERSION.startswith("@"):
|
|
Packit |
534379 |
try:
|
|
Packit |
534379 |
devnull = open(os.devnull, 'w')
|
|
Packit |
534379 |
repo = subprocess.check_output('git remote -v',
|
|
Packit |
534379 |
shell=True,
|
|
Packit |
534379 |
stderr=devnull)
|
|
Packit |
534379 |
version = (subprocess.check_output('git describe --tags',
|
|
Packit |
534379 |
shell=True,
|
|
Packit |
534379 |
stderr=devnull).split()[0]
|
|
Packit |
534379 |
if "opae-sdk" in repo else "UNKNOWN REPO")
|
|
Packit |
534379 |
except subprocess.CalledProcessError:
|
|
Packit |
534379 |
version = "UNKNOWN"
|
|
Packit |
534379 |
else:
|
|
Packit |
534379 |
version = VERSION
|
|
Packit |
534379 |
print("{0}: version {1}".format(DESCRIPTION, version))
|
|
Packit |
534379 |
elif args.cmd == "create-gbs":
|
|
Packit |
534379 |
subparser.usage = "\n" + cmd_description + \
|
|
Packit |
534379 |
" --rbf=<RBF_PATH> --afu-json=<AFU_JSON_PATH>"\
|
|
Packit |
534379 |
" --gbs=<NAME_FOR_GBS> --set-value <key>:<value>\n"
|
|
Packit |
534379 |
subparser.add_argument('--rbf', required=True,
|
|
Packit |
534379 |
help='RBF file (REQUIRED)')
|
|
Packit |
534379 |
subparser.add_argument('--afu-json', required=False,
|
|
Packit |
534379 |
help='AFU JSON file that contains metadata')
|
|
Packit |
534379 |
subparser.add_argument('--no-metadata', default=False,
|
|
Packit |
534379 |
action='store_true',
|
|
Packit |
534379 |
help='Empty metadata section will be appended')
|
|
Packit |
534379 |
subparser.add_argument('--gbs', required=False,
|
|
Packit |
534379 |
help='Output location for gbs file. '
|
|
Packit |
534379 |
'Default is <rbf_name>.gbs')
|
|
Packit |
534379 |
subparser.add_argument('--set-value', required=False, nargs='*',
|
|
Packit |
534379 |
help='set values for keys in JSON metadata as '
|
|
Packit |
534379 |
'<key>:<value>. Can be followed by more than '
|
|
Packit |
534379 |
'one <key>:<value> pairs.')
|
|
Packit |
534379 |
subargs = subparser.parse_args(args.remain_args)
|
|
Packit |
534379 |
afu = AFU(subargs.afu_json)
|
|
Packit |
534379 |
gbs_file = afu.create_gbs(subargs.rbf, subargs.gbs, subargs.set_value)
|
|
Packit |
534379 |
print("Wrote {0}".format(gbs_file))
|
|
Packit |
534379 |
|
|
Packit |
534379 |
elif args.cmd == "modify-gbs":
|
|
Packit |
534379 |
subparser.usage = "\n" + cmd_description + \
|
|
Packit |
534379 |
" --input-gbs=<PATH_TO_GBS_TO_BE_MODIFIED>"\
|
|
Packit |
534379 |
" --output-gbs=<NAME_FOR_NEW_GBS> --set-value <key>:<value>\n"
|
|
Packit |
534379 |
subparser.add_argument('--input-gbs', required=True,
|
|
Packit |
534379 |
help='Path to input gbs file')
|
|
Packit |
534379 |
subparser.add_argument('--output-gbs', required=False,
|
|
Packit |
534379 |
help='Path to output gbs file. Will replace '
|
|
Packit |
534379 |
'original file if not provided')
|
|
Packit |
534379 |
subparser.add_argument('--set-value', required=True, nargs='*',
|
|
Packit |
534379 |
help='set values for keys in JSON metadata as '
|
|
Packit |
534379 |
'<key>:<value>. Can be followed by more than '
|
|
Packit |
534379 |
'one <key>:<value> pairs.')
|
|
Packit |
534379 |
subargs = subparser.parse_args(args.remain_args)
|
|
Packit |
534379 |
gbs = GBS(subargs.input_gbs)
|
|
Packit |
534379 |
afu = AFU.create_afu_from_gbs(gbs)
|
|
Packit |
534379 |
afu.update_afu_json(subargs.set_value)
|
|
Packit |
534379 |
afu.validate(packaging=True)
|
|
Packit |
534379 |
gbs.update_gbs_info(afu.afu_json)
|
|
Packit |
534379 |
gbs_file = gbs.write_gbs(subargs.output_gbs)
|
|
Packit |
534379 |
print("Wrote {0}".format(gbs_file))
|
|
Packit |
534379 |
|
|
Packit |
534379 |
elif args.cmd == "package":
|
|
Packit |
534379 |
subparser.usage = "\n" + cmd_description + \
|
|
Packit |
534379 |
" --afu-json=<AFU_JSON_PATH> --rbf=<RBF_PATH>"\
|
|
Packit |
534379 |
" --out=<NAME_OF_PACKAGE>\n"
|
|
Packit |
534379 |
subparser.usage += cmd_description + \
|
|
Packit |
534379 |
" --afu-json=<AFU_JSON_PATH> --rbf=<RBF_PATH> --sw-dir=<SW_DIR>"\
|
|
Packit |
534379 |
" --doc-dir=<DOC_DIR>"
|
|
Packit |
534379 |
subparser.add_argument('--afu-json', required=True,
|
|
Packit |
534379 |
help='AFU JSON file that contains metadata '
|
|
Packit |
534379 |
'(REQUIRED)')
|
|
Packit |
534379 |
subparser.add_argument('--rbf', required=True,
|
|
Packit |
534379 |
help='RBF file (REQUIRED)')
|
|
Packit |
534379 |
subparser.add_argument('--sw-dir', required=False,
|
|
Packit |
534379 |
help='Location of software files to include')
|
|
Packit |
534379 |
subparser.add_argument('--doc-dir', required=False,
|
|
Packit |
534379 |
help='Location of documentation files to '
|
|
Packit |
534379 |
'include')
|
|
Packit |
534379 |
subparser.add_argument('--out', required=False, default="afu",
|
|
Packit |
534379 |
help='Used to specify name of package')
|
|
Packit |
534379 |
subargs = subparser.parse_args(args.remain_args)
|
|
Packit |
534379 |
afu = AFU(subargs.afu_json)
|
|
Packit |
534379 |
afu.package(subargs.rbf, subargs.sw_dir, subargs.doc_dir, subargs.out)
|
|
Packit |
534379 |
print("Wrote {0}.zip".format(subargs.out))
|
|
Packit |
534379 |
|
|
Packit |
534379 |
elif args.cmd == "gbs-info":
|
|
Packit |
534379 |
subparser.usage = "\n" + cmd_description + " --gbs=<GBS_PATH>"
|
|
Packit |
534379 |
subparser.add_argument('--gbs', required=True,
|
|
Packit |
534379 |
help='Path to GBS file')
|
|
Packit |
534379 |
subargs = subparser.parse_args(args.remain_args)
|
|
Packit |
534379 |
gbs = GBS(subargs.gbs)
|
|
Packit |
534379 |
gbs.print_gbs_info()
|
|
Packit |
534379 |
|
|
Packit |
534379 |
elif args.cmd == "get-rbf":
|
|
Packit |
534379 |
subparser.usage = "\n" + cmd_description + \
|
|
Packit |
534379 |
"--gbs=<GBS_PATH> --rbf=<NAME_FOR_RBF>"
|
|
Packit |
534379 |
subparser.add_argument('--gbs', required=True,
|
|
Packit |
534379 |
help='Path to GBS file from which rbf is to be '
|
|
Packit |
534379 |
'extracted')
|
|
Packit |
534379 |
subparser.add_argument('--rbf', required=False,
|
|
Packit |
534379 |
help='Output location for rbf file. Default is '
|
|
Packit |
534379 |
'<gbs_name>.rbf')
|
|
Packit |
534379 |
subargs = subparser.parse_args(args.remain_args)
|
|
Packit |
534379 |
gbs = GBS(subargs.gbs)
|
|
Packit |
534379 |
rbf_file = gbs.write_rbf(subargs.rbf)
|
|
Packit |
534379 |
print("Wrote {0}".format(rbf_file))
|
|
Packit |
534379 |
|
|
Packit |
534379 |
else:
|
|
Packit |
534379 |
raise Exception("{0} is not a command for {1}!".format(
|
|
Packit |
534379 |
args.cmd, DESCRIPTION))
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
def main():
|
|
Packit |
534379 |
try:
|
|
Packit |
534379 |
sys.exit(run_packager())
|
|
Packit |
534379 |
except Exception as e:
|
|
Packit |
534379 |
print("ERROR: {0}".format(e.__str__()))
|
|
Packit |
534379 |
sys.exit(1)
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
if __name__ == '__main__':
|
|
Packit |
534379 |
main()
|