X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fcmake%2Flibrary.cmake;h=a06a795c69ff7a19bd0b8df4709bde97eb9632d5;hb=HEAD;hp=dc14ae59e460720b3455c1395fa4b9dfece79b7c;hpb=dc20371f83ed81462c0b24eb750b76f7819df64a;p=vpp.git diff --git a/src/cmake/library.cmake b/src/cmake/library.cmake index dc14ae59e46..a06a795c69f 100644 --- a/src/cmake/library.cmake +++ b/src/cmake/library.cmake @@ -13,13 +13,20 @@ 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}) + set (lo ${lib}_objs) + add_library(${lo} OBJECT ${ARG_SOURCES}) + set_target_properties(${lo} PROPERTIES POSITION_INDEPENDENT_CODE ON) + target_compile_options(${lo} PUBLIC ${VPP_DEFAULT_MARCH_FLAGS}) + + add_library(${lib} SHARED) + target_sources(${lib} PRIVATE $) + if(VPP_LIB_VERSION) set_target_properties(${lib} PROPERTIES SOVERSION ${VPP_LIB_VERSION}) endif() @@ -34,12 +41,25 @@ macro(add_vpp_library lib) endif() install( TARGETS ${lib} - DESTINATION lib - COMPONENT ${ARG_COMPONENT} + LIBRARY + DESTINATION ${VPP_LIBRARY_DIR} + COMPONENT ${ARG_COMPONENT} + NAMELINK_COMPONENT ${ARG_COMPONENT}-dev ) + if (ARG_LTO AND VPP_USE_LTO) + set_property(TARGET ${lo} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + 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") + if(compiler_flag_no_stringop_overflow) + target_link_libraries (${lib} "-Wno-stringop-overflow") + endif() + endif() + if(ARG_MULTIARCH_SOURCES) - vpp_library_set_multiarch_sources(${lib} ${ARG_MULTIARCH_SOURCES}) + vpp_library_set_multiarch_sources(${lib} DEPENDS ${ARG_DEPENDS} SOURCES ${ARG_MULTIARCH_SOURCES}) endif() if(ARG_API_FILES) @@ -50,14 +70,24 @@ macro(add_vpp_library lib) FILES ${file} ${CMAKE_CURRENT_BINARY_DIR}/${file}.h ${CMAKE_CURRENT_BINARY_DIR}/${file}_enum.h ${CMAKE_CURRENT_BINARY_DIR}/${file}_types.h - DESTINATION include/${lib}/${dir} + ${CMAKE_CURRENT_BINARY_DIR}/${file}_tojson.h + ${CMAKE_CURRENT_BINARY_DIR}/${file}_fromjson.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${lib}/${dir} COMPONENT vpp-dev ) endforeach() endif() + if(NOT VPP_EXTERNAL_PROJECT) + add_dependencies(${lo} api_headers) + endif() + + if(VPP_EXTERNAL_PROJECT AND ARG_API_FILES) + add_dependencies(${lo} ${lib}_api_headers) + endif() + if(ARG_DEPENDS) - add_dependencies(${lib} ${ARG_DEPENDS}) + add_dependencies(${lo} ${ARG_DEPENDS}) endif() # install headers @@ -66,7 +96,7 @@ macro(add_vpp_library lib) get_filename_component(dir ${file} DIRECTORY) install( FILES ${file} - DESTINATION include/${lib}/${dir} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${lib}/${dir} COMPONENT ${ARG_COMPONENT}-dev ) endforeach() @@ -81,8 +111,77 @@ function (add_vpp_headers path) get_filename_component(dir ${file} DIRECTORY) install( FILES ${file} - DESTINATION include/${path}/${dir} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${path}/${dir} COMPONENT vpp-dev ) endforeach() endfunction() + +macro(add_vat_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}) + target_compile_options(${test_lib} PUBLIC ${VPP_DEFAULT_MARCH_FLAGS}) + 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}/vpp_api_test_plugins) + + # install .so + install( + TARGETS ${test_lib} + DESTINATION ${VPP_LIBRARY_DIR}/vpp_api_test_plugins + COMPONENT ${ARG_COMPONENT} + ) + endforeach() +endmacro() + +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) + target_compile_options(${test_lib} PUBLIC ${VPP_DEFAULT_MARCH_FLAGS}) + 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) + + # install .so + install( + TARGETS ${test_lib} + DESTINATION ${VPP_LIBRARY_DIR}/vat2_plugins + COMPONENT ${ARG_COMPONENT} + ) + endforeach() +endmacro() + +macro(vpp_find_library var) + find_library(${var} ${ARGN}) + mark_as_advanced(${var}) +endmacro() +macro(vpp_find_path var) + find_path(${var} ${ARGN}) + mark_as_advanced(${var}) +endmacro()