cmake: add vapi build 88/14488/4
authorDamjan Marion <damarion@cisco.com>
Sun, 26 Aug 2018 16:14:46 +0000 (18:14 +0200)
committerMarco Varlese <marco.varlese@suse.de>
Mon, 27 Aug 2018 12:25:48 +0000 (12:25 +0000)
Change-Id: Id939a0cbe35601478ad262f49bb0a1abdb62aa45
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/CMakeLists.txt
src/cmake/api.cmake
src/cmake/library.cmake
src/cmake/plugin.cmake
src/vpp-api/CMakeLists.txt
src/vpp-api/vapi/CMakeLists.txt [new file with mode: 0644]
src/vpp-api/vapi/vapi_c_gen.py
src/vpp-api/vapi/vapi_cpp_gen.py
src/vpp-api/vapi/vapi_json_parser.py
src/vpp/CMakeLists.txt

index 0f218cb..51f9f7e 100644 (file)
@@ -61,7 +61,7 @@ include(cmake/deb.cmake)
 ##############################################################################
 # subdirs
 ##############################################################################
-foreach (DIR vppinfra svm vlib vlibmemory vlibapi vnet vpp vpp-api vat vcl plugins)
+foreach (DIR vppinfra svm vlib vlibmemory vlibapi vnet vpp vat vcl plugins vpp-api)
   add_subdirectory(${DIR})
 endforeach ()
 
index 644e80b..533448a 100644 (file)
@@ -50,11 +50,14 @@ function(vpp_generate_api_header file dir)
     vpp_generate_api_json_header (${file} ${dir})
 endfunction()
 
-function(vpp_add_api_files target)
+function(vpp_add_api_files name)
   unset(header_files)
+  set(target ${name}_api_headers)
+  file(RELATIVE_PATH rpath ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
   foreach(file ${ARGN})
     vpp_generate_api_header (${file} core)
-    list (APPEND header_files ${file}.h ${file}.json)
+    list(APPEND header_files ${file}.h ${file}.json)
+    set_property(GLOBAL APPEND PROPERTY VPP_API_FILES ${rpath}/${file})
   endforeach()
   add_custom_target(${target} DEPENDS ${header_files})
 endfunction()
index 6aa0ae8..9ed53e9 100644 (file)
@@ -33,7 +33,7 @@ macro(add_vpp_library lib)
   endif()
 
   if(ARG_API_FILES)
-    vpp_add_api_files(${lib}_api_headers ${ARG_API_FILES})
+    vpp_add_api_files(${lib} ${ARG_API_FILES})
     foreach(file ${ARG_API_FILES})
       get_filename_component(dir ${file} DIRECTORY)
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${file}.h DESTINATION include/${lib}/${dir})
index 4087325..a5b4bf5 100644 (file)
@@ -20,9 +20,11 @@ macro(add_vpp_plugin name)
   )
   set(plugin_name ${name}_plugin)
   set(api_headers)
+  file(RELATIVE_PATH rpath ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
   foreach(f ${PLUGIN_API_FILES})
-     vpp_generate_api_header(${f} plugins)
-     list(APPEND api_headers ${f}.h ${f}.json)
+    vpp_generate_api_header(${f} plugins)
+    list(APPEND api_headers ${f}.h ${f}.json)
+    set_property(GLOBAL APPEND PROPERTY VPP_API_FILES ${rpath}/${f})
   endforeach()
   add_library(${plugin_name} SHARED ${PLUGIN_SOURCES} ${api_headers})
   add_dependencies(${plugin_name} vpp_version_h api_headers)
index cfabc71..5715069 100644 (file)
@@ -27,3 +27,5 @@ add_dependencies(vppapiclient vpp_version_h api_headers)
 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 (file)
index 0000000..8feb12e
--- /dev/null
@@ -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
+)
index 5a18539..445790d 100755 (executable)
@@ -532,6 +532,7 @@ vapi_send_with_control_ping (vapi_ctx_t ctx, void *msg, u32 context)
 
 
 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 @@ def gen_json_unified_header(parser, logger, j, io, name):
         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 @@ def json_to_c_header_name(json_name):
     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 @@ if __name__ == '__main__':
                            '(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 @@ if __name__ == '__main__':
     # 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)
index e83e151..adf85c7 100755 (executable)
@@ -129,8 +129,9 @@ def gen_json_header(parser, logger, j, io, gen_h_prefix, add_debug_comments):
     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 @@ def json_to_cpp_header_name(json_name):
     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 @@ def gen_cpp_headers(parser, logger, prefix, gen_h_prefix,
     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 @@ if __name__ == '__main__':
                            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 @@ if __name__ == '__main__':
                             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)
index 58a7577..b18eda4 100644 (file)
@@ -346,7 +346,7 @@ class JsonParser(object):
     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():
index 80114bd..6f58e8d 100644 (file)
@@ -39,7 +39,7 @@ set(VPP_API_FILES
   oam/oam.api
 )
 
-vpp_add_api_files(vpp_api_headers ${VPP_API_FILES})
+vpp_add_api_files(vpp ${VPP_API_FILES})
 
 foreach(file ${VPP_API_FILES})
   get_filename_component(dir ${file} DIRECTORY)