api: vat2 and json autogeneration for api messages
[vpp.git] / src / cmake / library.cmake
index 0d1e97c..3f17e30 100644 (file)
 
 macro(add_vpp_library lib)
   cmake_parse_arguments(ARG
-    ""
+    "LTO"
     "COMPONENT"
     "SOURCES;MULTIARCH_SOURCES;API_FILES;LINK_LIBRARIES;INSTALL_HEADERS;DEPENDS"
     ${ARGN}
   )
 
   add_library(${lib} SHARED ${ARG_SOURCES})
-  target_compile_options(${lib} PRIVATE -Wall)
+  if(VPP_LIB_VERSION)
+    set_target_properties(${lib} PROPERTIES SOVERSION ${VPP_LIB_VERSION})
+  endif()
 
   # library deps
   if(ARG_LINK_LIBRARIES)
@@ -32,20 +34,31 @@ macro(add_vpp_library lib)
   endif()
   install(
     TARGETS ${lib}
-    DESTINATION ${VPP_LIB_DIR_NAME}
+    DESTINATION ${VPP_LIBRARY_DIR}
     COMPONENT ${ARG_COMPONENT}
   )
 
+  if (ARG_LTO AND VPP_USE_LTO)
+     set_property(TARGET ${lib} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
+     target_compile_options (${lib} PRIVATE "-ffunction-sections")
+     target_compile_options (${lib} PRIVATE "-fdata-sections")
+     target_link_libraries (${lib} "-Wl,--gc-sections")
+  endif()
+
   if(ARG_MULTIARCH_SOURCES)
-    vpp_library_set_multiarch_sources(${lib} ${ARG_MULTIARCH_SOURCES})
+    vpp_library_set_multiarch_sources(${lib} "${ARG_DEPENDS}" ${ARG_MULTIARCH_SOURCES})
   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(
-       FILES ${CMAKE_CURRENT_BINARY_DIR}/${file}.h
+       FILES ${file} ${CMAKE_CURRENT_BINARY_DIR}/${file}.h
+       ${CMAKE_CURRENT_BINARY_DIR}/${file}_enum.h
+       ${CMAKE_CURRENT_BINARY_DIR}/${file}_types.h
+       ${CMAKE_CURRENT_BINARY_DIR}/${file}_tojson.h
+       ${CMAKE_CURRENT_BINARY_DIR}/${file}_fromjson.h
        DESTINATION include/${lib}/${dir}
        COMPONENT vpp-dev
       )
@@ -63,7 +76,7 @@ macro(add_vpp_library lib)
       install(
        FILES ${file}
        DESTINATION include/${lib}/${dir}
-       COMPONENT vpp-dev
+       COMPONENT ${ARG_COMPONENT}-dev
       )
     endforeach()
   endif()
@@ -75,6 +88,40 @@ endmacro()
 function (add_vpp_headers path)
   foreach(file ${ARGN})
     get_filename_component(dir ${file} DIRECTORY)
-    install(FILES ${file} DESTINATION include/${path}/${dir})
+    install(
+      FILES ${file}
+      DESTINATION include/${path}/${dir}
+      COMPONENT vpp-dev
+    )
   endforeach()
 endfunction()
+
+macro(add_vpp_test_library lib)
+  cmake_parse_arguments(TEST
+    ""
+    ""
+    ${ARGN}
+  )
+
+  foreach(file ${ARGN})
+    get_filename_component(name ${file} NAME_WE)
+    set(test_lib ${lib}_${name}_plugin)
+    add_library(${test_lib} SHARED ${file}_test2.c)
+    if(NOT VPP_EXTERNAL_PROJECT)
+      add_dependencies(${test_lib} api_headers)
+    endif()
+    include_directories(${CMAKE_CURRENT_BINARY_DIR})
+    set_target_properties(${test_lib} PROPERTIES NO_SONAME 1)
+    set_target_properties(${test_lib} PROPERTIES
+      PREFIX ""
+      LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/vat2_plugins)
+
+    # Later: Install and package
+    # install .so
+    #install(
+    #  TARGETS ${test_lib}
+    #  DESTINATION ${VPP_LIBRARY_DIR}/vat2_plugins
+    #  #COMPONENT ${ARG_COMPONENT}
+    #  )
+  endforeach()
+endmacro()