cmake: add vapi build
Change-Id: Id939a0cbe35601478ad262f49bb0a1abdb62aa45
Signed-off-by: Damjan Marion <damarion@cisco.com>
diff --git a/src/vpp-api/CMakeLists.txt b/src/vpp-api/CMakeLists.txt
index cfabc71..5715069 100644
--- a/src/vpp-api/CMakeLists.txt
+++ b/src/vpp-api/CMakeLists.txt
@@ -27,3 +27,5 @@
add_vpp_headers(vpp-api
client/vppapiclient.h
)
+
+add_subdirectory(vapi)
diff --git a/src/vpp-api/vapi/CMakeLists.txt b/src/vpp-api/vapi/CMakeLists.txt
new file mode 100644
index 0000000..8feb12e
--- /dev/null
+++ b/src/vpp-api/vapi/CMakeLists.txt
@@ -0,0 +1,75 @@
+# Copyright (c) 2018 Cisco and/or its affiliates.
+# 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.
+
+include_directories (
+ ${CMAKE_CURRENT_SOURCE_DIR}/..
+ ${CMAKE_CURRENT_BINARY_DIR}/..
+)
+
+unset(VAPICLIENT_API_C_HEADERS)
+unset(VAPICLIENT_API_CPP_HEADERS)
+
+get_property(VPP_API_FILES GLOBAL PROPERTY VPP_API_FILES)
+foreach(f ${VPP_API_FILES})
+ get_filename_component(output ${f}.vapi.h NAME)
+ set(input ${CMAKE_BINARY_DIR}/${f}.json)
+
+ # C VAPI Headers
+ add_custom_command(
+ OUTPUT ${output}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/vapi_c_gen.py
+ ARGS --remove-path ${input}
+ DEPENDS ${input} vapi_c_gen.py vapi_json_parser.py
+ COMMENT "Generating VAPI C header ${output}"
+ )
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${output} DESTINATION include/vapi)
+ list(APPEND VAPICLIENT_API_CPP_HEADERS ${output})
+
+ # C++ VAPI Headers
+ get_filename_component(output ${f}.vapi.hpp NAME)
+ add_custom_command(
+ OUTPUT ${output}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/vapi_cpp_gen.py
+ ARGS --remove-path ${input}
+ DEPENDS ${input} vapi_cpp_gen.py vapi_json_parser.py
+ COMMENT "Generating VAPI C++ header ${output}"
+ )
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${output} DESTINATION include/vapi)
+ list(APPEND VAPICLIENT_API_CPP_HEADERS ${output})
+endforeach ()
+
+add_custom_target(all-vapi-headers ALL DEPENDS
+ ${VAPICLIENT_API_C_HEADERS}
+ ${VAPICLIENT_API_CPP_HEADERS}
+)
+
+add_vpp_library(vapiclient
+ SOURCES
+ vapi.c
+ libvapiclient.map
+
+ LINK_LIBRARIES vppinfra vlibmemoryclient svm pthread m rt
+)
+
+install(
+ FILES
+ vapi.h
+ vapi_common.h
+ vapi_dbg.h
+ vapi.hpp
+ vapi_internal.h
+
+ DESTINATION include/vapi
+)
diff --git a/src/vpp-api/vapi/vapi_c_gen.py b/src/vpp-api/vapi/vapi_c_gen.py
index 5a18539..445790d 100755
--- a/src/vpp-api/vapi/vapi_c_gen.py
+++ b/src/vpp-api/vapi/vapi_c_gen.py
@@ -532,6 +532,7 @@
def gen_json_unified_header(parser, logger, j, io, name):
+ d, f = os.path.split(j)
logger.info("Generating header `%s'" % name)
orig_stdout = sys.stdout
sys.stdout = io
@@ -561,7 +562,7 @@
print("extern vapi_msg_id_t %s;" % m.get_msg_id_name())
print("")
print("#define DEFINE_VAPI_MSG_IDS_%s\\" %
- j.replace(".", "_").replace("/", "_").replace("-", "_").upper())
+ f.replace(".", "_").replace("/", "_").replace("-", "_").upper())
print("\\\n".join([
" vapi_msg_id_t %s;" % m.get_msg_id_name()
for m in parser.messages_by_json[j].values()
@@ -639,15 +640,19 @@
raise Exception("Unexpected json name `%s'!" % json_name)
-def gen_c_unified_headers(parser, logger, prefix):
+def gen_c_unified_headers(parser, logger, prefix, remove_path):
if prefix == "" or prefix is None:
prefix = ""
else:
prefix = "%s/" % prefix
for j in parser.json_files:
- with open('%s%s' % (prefix, json_to_c_header_name(j)), "w") as io:
+ if remove_path:
+ d, f = os.path.split(j)
+ else:
+ f = j
+ with open('%s%s' % (prefix, json_to_c_header_name(f)), "w") as io:
gen_json_unified_header(
- parser, logger, j, io, json_to_c_header_name(j))
+ parser, logger, j, io, json_to_c_header_name(f))
if __name__ == '__main__':
@@ -673,6 +678,8 @@
'(may be specified multiple times)')
argparser.add_argument('--prefix', action='store', default=None,
help='path prefix')
+ argparser.add_argument('--remove-path', action='store_true',
+ help='remove path from filename')
args = argparser.parse_args()
jsonparser = JsonParser(logger, args.files,
@@ -686,7 +693,7 @@
# Damjan), to avoid symbol version issues in .so
# gen_c_headers_and_code(jsonparser, logger, args.prefix)
- gen_c_unified_headers(jsonparser, logger, args.prefix)
+ gen_c_unified_headers(jsonparser, logger, args.prefix, args.remove_path)
for e in jsonparser.exceptions:
- logger.error(e)
+ logger.warning(e)
diff --git a/src/vpp-api/vapi/vapi_cpp_gen.py b/src/vpp-api/vapi/vapi_cpp_gen.py
index e83e151..adf85c7 100755
--- a/src/vpp-api/vapi/vapi_cpp_gen.py
+++ b/src/vpp-api/vapi/vapi_cpp_gen.py
@@ -129,8 +129,9 @@
logger.info("Generating header `%s'" % io.name)
orig_stdout = sys.stdout
sys.stdout = io
+ d, f = os.path.split(j)
include_guard = "__included_hpp_%s" % (
- j.replace(".", "_").replace("/", "_").replace("-", "_"))
+ f.replace(".", "_").replace("/", "_").replace("-", "_"))
print("#ifndef %s" % include_guard)
print("#define %s" % include_guard)
print("")
@@ -192,7 +193,7 @@
raise Exception("Unexpected json name `%s'!" % json_name)
-def gen_cpp_headers(parser, logger, prefix, gen_h_prefix,
+def gen_cpp_headers(parser, logger, prefix, gen_h_prefix, remove_path,
add_debug_comments=False):
if prefix == "" or prefix is None:
prefix = ""
@@ -203,7 +204,11 @@
else:
gen_h_prefix = "%s/" % gen_h_prefix
for j in parser.json_files:
- with open('%s%s' % (prefix, json_to_cpp_header_name(j)), "w") as io:
+ if remove_path:
+ d, f = os.path.split(j)
+ else:
+ f = j
+ with open('%s%s' % (prefix, json_to_cpp_header_name(f)), "w") as io:
gen_json_header(parser, logger, j, io,
gen_h_prefix, add_debug_comments)
@@ -233,6 +238,8 @@
help='path prefix')
argparser.add_argument('--gen-h-prefix', action='store', default=None,
help='generated C header prefix')
+ argparser.add_argument('--remove-path', action='store_true',
+ help='remove path from filename')
args = argparser.parse_args()
jsonparser = JsonParser(logger, args.files,
@@ -241,7 +248,8 @@
field_class=CppField,
message_class=CppMessage)
- gen_cpp_headers(jsonparser, logger, args.prefix, args.gen_h_prefix)
+ gen_cpp_headers(jsonparser, logger, args.prefix, args.gen_h_prefix,
+ args.remove_path)
for e in jsonparser.exceptions:
- logger.error(e)
+ logger.warning(e)
diff --git a/src/vpp-api/vapi/vapi_json_parser.py b/src/vpp-api/vapi/vapi_json_parser.py
index 58a7577..b18eda4 100644
--- a/src/vpp-api/vapi/vapi_json_parser.py
+++ b/src/vpp-api/vapi/vapi_json_parser.py
@@ -346,7 +346,7 @@
def finalize_parsing(self):
if len(self.messages) == 0:
for e in self.exceptions:
- self.logger.error(e)
+ self.logger.warning(e)
for jn, j in self.messages_by_json.items():
remove = []
for n, m in j.items():