build: fix missing dependency for library
[vpp.git] / src / cmake / library.cmake
1 # Copyright (c) 2018 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 macro(add_vpp_library lib)
15   cmake_parse_arguments(ARG
16     "LTO"
17     "COMPONENT"
18     "SOURCES;MULTIARCH_SOURCES;API_FILES;LINK_LIBRARIES;INSTALL_HEADERS;DEPENDS"
19     ${ARGN}
20   )
21
22   set (lo ${lib}_objs)
23   add_library(${lo} OBJECT ${ARG_SOURCES})
24   set_target_properties(${lo} PROPERTIES POSITION_INDEPENDENT_CODE ON)
25   target_compile_options(${lo} PUBLIC ${VPP_DEFAULT_MARCH_FLAGS})
26
27   add_library(${lib} SHARED)
28   target_sources(${lib} PRIVATE $<TARGET_OBJECTS:${lo}>)
29
30   if(VPP_LIB_VERSION)
31     set_target_properties(${lib} PROPERTIES SOVERSION ${VPP_LIB_VERSION})
32   endif()
33
34   # library deps
35   if(ARG_LINK_LIBRARIES)
36     target_link_libraries(${lib} ${ARG_LINK_LIBRARIES})
37   endif()
38   # install .so
39   if(NOT ARG_COMPONENT)
40     set(ARG_COMPONENT vpp)
41   endif()
42   install(
43     TARGETS ${lib}
44     DESTINATION ${VPP_LIBRARY_DIR}
45     COMPONENT ${ARG_COMPONENT}
46   )
47
48   if (ARG_LTO AND VPP_USE_LTO)
49      set_property(TARGET ${lo} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
50      set_property(TARGET ${lib} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
51      target_compile_options (${lib} PRIVATE "-ffunction-sections")
52      target_compile_options (${lib} PRIVATE "-fdata-sections")
53      target_link_libraries (${lib} "-Wl,--gc-sections")
54      if(compiler_flag_no_stringop_overflow)
55        target_link_libraries (${lib} "-Wno-stringop-overflow")
56      endif()
57   endif()
58
59   if(ARG_MULTIARCH_SOURCES)
60     vpp_library_set_multiarch_sources(${lib} DEPENDS ${ARG_DEPENDS} SOURCES ${ARG_MULTIARCH_SOURCES})
61   endif()
62
63   if(ARG_API_FILES)
64     vpp_add_api_files(${lib} core vpp ${ARG_API_FILES})
65     foreach(file ${ARG_API_FILES})
66       get_filename_component(dir ${file} DIRECTORY)
67       install(
68         FILES ${file} ${CMAKE_CURRENT_BINARY_DIR}/${file}.h
69         ${CMAKE_CURRENT_BINARY_DIR}/${file}_enum.h
70         ${CMAKE_CURRENT_BINARY_DIR}/${file}_types.h
71         ${CMAKE_CURRENT_BINARY_DIR}/${file}_tojson.h
72         ${CMAKE_CURRENT_BINARY_DIR}/${file}_fromjson.h
73         DESTINATION include/${lib}/${dir}
74         COMPONENT vpp-dev
75       )
76     endforeach()
77   endif()
78
79   if(NOT VPP_EXTERNAL_PROJECT)
80     add_dependencies(${lo} api_headers)
81   endif()
82
83   if(VPP_EXTERNAL_PROJECT AND ARG_API_FILES)
84     add_dependencies(${lo} ${lib}_api_headers)
85   endif()
86
87   if(ARG_DEPENDS)
88     add_dependencies(${lo} ${ARG_DEPENDS})
89   endif()
90
91   # install headers
92   if(ARG_INSTALL_HEADERS)
93     foreach(file ${ARG_INSTALL_HEADERS})
94       get_filename_component(dir ${file} DIRECTORY)
95       install(
96         FILES ${file}
97         DESTINATION include/${lib}/${dir}
98         COMPONENT ${ARG_COMPONENT}-dev
99       )
100     endforeach()
101   endif()
102 endmacro()
103
104 ##############################################################################
105 # header files
106 ##############################################################################
107 function (add_vpp_headers path)
108   foreach(file ${ARGN})
109     get_filename_component(dir ${file} DIRECTORY)
110     install(
111       FILES ${file}
112       DESTINATION include/${path}/${dir}
113       COMPONENT vpp-dev
114     )
115   endforeach()
116 endfunction()
117
118 macro(add_vat_test_library lib)
119   cmake_parse_arguments(TEST
120     ""
121     ""
122     ${ARGN}
123   )
124
125   foreach(file ${ARGN})
126     get_filename_component(name ${file} NAME_WE)
127     set(test_lib ${lib}_${name}_plugin)
128     add_library(${test_lib} SHARED ${file})
129     target_compile_options(${test_lib} PUBLIC ${VPP_DEFAULT_MARCH_FLAGS})
130     if(NOT VPP_EXTERNAL_PROJECT)
131       add_dependencies(${test_lib} api_headers)
132     endif()
133     include_directories(${CMAKE_CURRENT_BINARY_DIR})
134     set_target_properties(${test_lib} PROPERTIES NO_SONAME 1)
135     set_target_properties(${test_lib} PROPERTIES
136       PREFIX ""
137       LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/vpp_api_test_plugins)
138
139     # install .so
140     install(
141       TARGETS ${test_lib}
142       DESTINATION ${VPP_LIBRARY_DIR}/vpp_api_test_plugins
143       COMPONENT ${ARG_COMPONENT}
144     )
145   endforeach()
146 endmacro()
147
148 macro(add_vpp_test_library lib)
149   cmake_parse_arguments(TEST
150     ""
151     ""
152     ${ARGN}
153   )
154
155   foreach(file ${ARGN})
156     get_filename_component(name ${file} NAME_WE)
157     set(test_lib ${lib}_${name}_plugin)
158     add_library(${test_lib} SHARED ${file}_test2.c)
159     target_compile_options(${test_lib} PUBLIC ${VPP_DEFAULT_MARCH_FLAGS})
160     if(NOT VPP_EXTERNAL_PROJECT)
161       add_dependencies(${test_lib} api_headers)
162     endif()
163     include_directories(${CMAKE_CURRENT_BINARY_DIR})
164     set_target_properties(${test_lib} PROPERTIES NO_SONAME 1)
165     set_target_properties(${test_lib} PROPERTIES
166       PREFIX ""
167       LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/vat2_plugins)
168
169     # install .so
170     install(
171       TARGETS ${test_lib}
172       DESTINATION ${VPP_LIBRARY_DIR}/vat2_plugins
173       COMPONENT ${ARG_COMPONENT}
174     )
175   endforeach()
176 endmacro()
177
178 macro(vpp_find_library var)
179   find_library(${var} ${ARGN})
180   mark_as_advanced(${var})
181 endmacro()
182 macro(vpp_find_path var)
183   find_path(${var} ${ARGN})
184   mark_as_advanced(${var})
185 endmacro()