From 9529feb4525dfd13e5636640083361256121d275 Mon Sep 17 00:00:00 2001 From: Paul Vinciguerra Date: Mon, 15 Jul 2019 15:22:31 -0400 Subject: [PATCH] build: add targets for json api files Type: make Ticket: VPP-1715 Change-Id: I78497d679d9e793b47a06a0c5cb3b12d86b08489 Signed-off-by: Paul Vinciguerra --- Makefile | 8 +++ src/tools/vppapigen/generate_json.py | 94 ++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100755 src/tools/vppapigen/generate_json.py diff --git a/Makefile b/Makefile index ded43ea4fd5..0c8b1730023 100644 --- a/Makefile +++ b/Makefile @@ -218,6 +218,8 @@ help: @echo " wipe-doxygen - wipe all generated documentation" @echo " checkfeaturelist - check FEATURE.yaml according to schema" @echo " featurelist - dump feature list in markdown" + @echo " json-api-files - (re)-generate json api files" + @echo " json-api-files-debug - (re)-generate json api files for debug target" @echo " docs - Build the Sphinx documentation" @echo " docs-venv - Build the virtual environment for the Sphinx docs" @echo " docs-clean - Remove the generated files from the Sphinx docs" @@ -534,6 +536,12 @@ dpdk-install-dev: install-ext-deps: make -C build/external install-$(PKG) +json-api-files: + $(WS_ROOT)/src/tools/vppapigen/generate_json.py + +json-api-files-debug: + $(WS_ROOT)/src/tools/vppapigen/generate_json.py --debug-target + ctags: ctags.files @ctags --totals --tag-relative -L $< @rm $< diff --git a/src/tools/vppapigen/generate_json.py b/src/tools/vppapigen/generate_json.py new file mode 100755 index 00000000000..6987cd21f25 --- /dev/null +++ b/src/tools/vppapigen/generate_json.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +# Copyright (c) 2019. Vinci Consulting Corp. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import pathlib +import subprocess +BASE_DIR = subprocess.check_output('git rev-parse --show-toplevel', + shell=True).strip().decode() +vppapigen_bin = pathlib.Path( + '%s/src/tools/vppapigen/vppapigen.py' % BASE_DIR).as_posix() + +api_types = ['vnet', 'plugins'] +src_dir_depth = 3 +output_path = pathlib.Path( + '%s/build-root/install-vpp-native/vpp/share/vpp/api/' % BASE_DIR) +output_path_debug = pathlib.Path( + '%s/build-root/install-vpp_debug-native/vpp/share/vpp/api/' % BASE_DIR) + +output_dir_map = {'vnet': 'core', + 'plugins': 'plugins'} + + +def api_search_globs(src_dir): + globs = [] + for g in api_types: + globs.extend(list(src_dir.glob('%s/**/*.api' % g))) + return globs + + +def api_files(src_dir): + print("Searching '%s' for .api files." % src_dir.as_posix()) + return [x for x in api_search_globs(src_dir)] + + +def vppapigen(vppapigen_bin, output_path, src_dir, src_file): + try: + subprocess.check_output( + [vppapigen_bin, '--includedir', src_dir.as_posix(), + '--input', src_file.as_posix(), 'JSON', + '--output', '%s/%s/%s.json' % ( + output_path, + output_dir_map[src_file.as_posix().split('/')[ + src_dir_depth + BASE_DIR.count('/') - 1]], + src_file.name)]) + except KeyError: + print('src_file: %s' % src_file) + raise + + +def main(): + cliparser = argparse.ArgumentParser( + description='VPP API JSON definition generator') + cliparser.add_argument('--srcdir', action='store', + default='%s/src' % BASE_DIR), + cliparser.add_argument('--output', action='store', + help='directory to store files'), + cliparser.add_argument('--debug-target', action='store_true', + default=False, + help="'True' if -debug target"), + args = cliparser.parse_args() + + src_dir = pathlib.Path(args.srcdir) + output_target = output_path_debug if args.debug_target else output_path + + if args.output: + output_dir = pathlib.Path(args.output) + else: + output_dir = pathlib.Path(output_target) + + for d in output_dir_map.values(): + output_dir.joinpath(d).mkdir(exist_ok=True, parents=True) + + for f in output_dir.glob('**/*.api.json'): + f.unlink() + + for f in api_files(src_dir): + vppapigen(vppapigen_bin, output_dir, src_dir, f) + print('json files written to: %s/.' % output_dir) + + +if __name__ == '__main__': + main() -- 2.16.6