build: export vapi generation in vpp-dev
[vpp.git] / src / cmake / api.cmake
index 922c83a..c936f73 100644 (file)
@@ -55,6 +55,65 @@ function(vpp_generate_api_json_header file dir component)
   )
 endfunction()
 
+##############################################################################
+# VPP-API
+##############################################################################
+function(vpp_generate_vapi_c_header f)
+  get_filename_component(output ${f}.vapi.h NAME)
+  set (output_name ${CMAKE_BINARY_DIR}/vpp-api/vapi/${output})
+  if(NOT VPP_VAPI_C_GEN)
+    set(VPP_VAPI_C_GEN ${CMAKE_SOURCE_DIR}/vpp-api/vapi/vapi_c_gen.py)
+    set(VPP_VAPI_C_GEN_DEPENDS
+        ${CMAKE_SOURCE_DIR}/vpp-api/vapi/vapi_c_gen.py
+        ${CMAKE_SOURCE_DIR}/vpp-api/vapi/vapi_json_parser.py
+    )
+  endif()
+
+  # C VAPI Headers
+  set(input ${CMAKE_CURRENT_BINARY_DIR}/${f}.json)
+  add_custom_command(
+    OUTPUT ${output_name}
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/vpp-api/vapi
+    COMMAND ${VPP_VAPI_C_GEN}
+    ARGS --remove-path ${input}
+    DEPENDS ${input} ${VPP_VAPI_C_GEN_DEPENDS}
+    COMMENT "Generating VAPI C header ${output_name}"
+  )
+  install(
+    FILES ${output_name}
+    DESTINATION include/vapi
+    COMPONENT vpp-dev
+  )
+endfunction ()
+
+function (vpp_generate_vapi_cpp_header f)
+  get_filename_component(output ${f}.vapi.hpp NAME)
+  set (output_name ${CMAKE_BINARY_DIR}/vpp-api/vapi/${output})
+  if(NOT VPP_VAPI_CPP_GEN)
+    set(VPP_VAPI_CPP_GEN ${CMAKE_SOURCE_DIR}/vpp-api/vapi/vapi_cpp_gen.py)
+    set(VPP_VAPI_CPP_GEN_DEPENDS
+        ${CMAKE_SOURCE_DIR}/vpp-api/vapi/vapi_cpp_gen.py
+        ${CMAKE_SOURCE_DIR}/vpp-api/vapi/vapi_json_parser.py
+    )
+  endif()
+  # C++ VAPI Headers
+  set(input ${CMAKE_CURRENT_BINARY_DIR}/${f}.json)
+  add_custom_command(
+    OUTPUT ${output_name}
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/vpp-api/vapi
+    COMMAND ${VPP_VAPI_CPP_GEN}
+    ARGS --gen-h-prefix=vapi --remove-path ${input}
+    DEPENDS ${input} ${VPP_VAPI_CPP_GEN_DEPENDS}
+    COMMENT "Generating VAPI C++ header ${output_name}"
+  )
+  install(
+    FILES ${output_name}
+    DESTINATION include/vapi
+    COMPONENT vpp-dev
+  )
+endfunction ()
+
+
 ##############################################################################
 # generate the .h and .json files for a .api file
 #  @param file - the name of the .api
@@ -62,18 +121,30 @@ endfunction()
 #                generated .json file
 ##############################################################################
 function(vpp_generate_api_header file dir component)
-    vpp_generate_api_c_header (${file})
-    vpp_generate_api_json_header (${file} ${dir} ${component})
+  vpp_generate_api_c_header (${file})
+  vpp_generate_api_json_header (${file} ${dir} ${component})
+  vpp_generate_vapi_c_header (${file})
+  vpp_generate_vapi_cpp_header (${file})
 endfunction()
 
-function(vpp_add_api_files name)
+function(vpp_add_api_files name dir component)
   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 vpp)
-    list(APPEND header_files ${file}.h ${file}.json)
-    set_property(GLOBAL APPEND PROPERTY VPP_API_FILES ${rpath}/${file})
+    vpp_generate_api_header (${file} ${dir} ${component})
+    # Basic api headers get installed in a subdirectory according to
+    # their component name, but vapi is expected to be found directly under
+    # "vapi". Both by in-source components (e.g. vpp-api/vapi/vapi.c), and
+    # out-of-tree plugins use #include <vapi/component.api.vapi.h>.
+    # ${file} contains the subdirectory, so strip it here.
+    get_filename_component(name ${file} NAME)
+    list(APPEND header_files
+      ${file}.h
+      ${file}.json
+      ${CMAKE_BINARY_DIR}/vpp-api/vapi/${name}.vapi.h
+      ${CMAKE_BINARY_DIR}/vpp-api/vapi/${name}.vapi.hpp
+    )
   endforeach()
   add_custom_target(${target} DEPENDS ${header_files})
 endfunction()