summaryrefslogtreecommitdiffstats
path: root/src/cmake
diff options
context:
space:
mode:
authorOliver Giles <oliver_g@radwin.com>2019-12-05 23:37:36 +0200
committerDamjan Marion <dmarion@me.com>2019-12-17 18:05:15 +0000
commitdc20371f83ed81462c0b24eb750b76f7819df64a (patch)
tree01eb5b83c0be944987f9cbd4777877c03f6bc36f /src/cmake
parent3d14f036199d9b3098268821424b4e6f5e8f46dc (diff)
build: export vapi generation in vpp-dev
Adds the higher-level vapi generation to cmake/api.cmake and exposes the necessary python scripts in vpp-dev, so that out-of-tree/downstream plugins can also leverage the more convenient API. Type: feature Signed-off-by: Oliver Giles <oliver_g@radwin.com> Change-Id: I8c40a14d27ba3cb972c6907632e03c0e7b0ce982
Diffstat (limited to 'src/cmake')
-rw-r--r--src/cmake/VPPConfig.cmake2
-rw-r--r--src/cmake/api.cmake83
-rw-r--r--src/cmake/library.cmake2
-rw-r--r--src/cmake/plugin.cmake7
4 files changed, 84 insertions, 10 deletions
diff --git a/src/cmake/VPPConfig.cmake b/src/cmake/VPPConfig.cmake
index c6fd9fa3ded..870c2a5b182 100644
--- a/src/cmake/VPPConfig.cmake
+++ b/src/cmake/VPPConfig.cmake
@@ -15,6 +15,8 @@ get_filename_component(CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
find_path(VPP_INCLUDE_DIR PATH_SUFFIXES NAMES vppinfra/clib.h)
find_program(VPP_APIGEN vppapigen)
+find_program(VPP_VAPI_C_GEN vapi_c_gen.py)
+find_program(VPP_VAPI_CPP_GEN vapi_cpp_gen.py)
if(VPP_INCLUDE_DIR AND VPP_APIGEN)
include_directories (${VPP_INCLUDE_DIR})
diff --git a/src/cmake/api.cmake b/src/cmake/api.cmake
index 922c83a8b4d..c936f731632 100644
--- a/src/cmake/api.cmake
+++ b/src/cmake/api.cmake
@@ -56,24 +56,95 @@ 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
# @param dir - the install directory under ROOT/share/vpp/api to place the
# 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()
diff --git a/src/cmake/library.cmake b/src/cmake/library.cmake
index fd6c077ea21..dc14ae59e46 100644
--- a/src/cmake/library.cmake
+++ b/src/cmake/library.cmake
@@ -43,7 +43,7 @@ macro(add_vpp_library lib)
endif()
if(ARG_API_FILES)
- vpp_add_api_files(${lib} ${ARG_API_FILES})
+ vpp_add_api_files(${lib} core vpp ${ARG_API_FILES})
foreach(file ${ARG_API_FILES})
get_filename_component(dir ${file} DIRECTORY)
install(
diff --git a/src/cmake/plugin.cmake b/src/cmake/plugin.cmake
index a0c3de78f3c..2e2749a440e 100644
--- a/src/cmake/plugin.cmake
+++ b/src/cmake/plugin.cmake
@@ -31,12 +31,10 @@ macro(add_vpp_plugin name)
endif()
endif()
- file(RELATIVE_PATH rpath ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+ vpp_add_api_files(${plugin_name} plugins ${PLUGIN_COMPONENT} ${PLUGIN_API_FILES})
foreach(f ${PLUGIN_API_FILES})
get_filename_component(dir ${f} DIRECTORY)
- vpp_generate_api_header(${f} plugins ${PLUGIN_COMPONENT})
list(APPEND api_includes ${f}.h ${f}.json)
- set_property(GLOBAL APPEND PROPERTY VPP_API_FILES ${rpath}/${f})
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/${f}.h
${CMAKE_CURRENT_BINARY_DIR}/${f}_enum.h
@@ -47,6 +45,9 @@ macro(add_vpp_plugin name)
endforeach()
add_library(${plugin_name} SHARED ${PLUGIN_SOURCES} ${api_includes})
set_target_properties(${plugin_name} PROPERTIES NO_SONAME 1)
+ if(PLUGIN_API_FILES)
+ add_dependencies(${plugin_name} ${plugin_name}_api_headers)
+ endif()
if(NOT VPP_EXTERNAL_PROJECT)
add_dependencies(${plugin_name} vpp_version_h api_headers)
endif()