-
Notifications
You must be signed in to change notification settings - Fork 395
Expand file tree
/
Copy pathUserverModule.cmake
More file actions
195 lines (180 loc) · 8.03 KB
/
Copy pathUserverModule.cmake
File metadata and controls
195 lines (180 loc) · 8.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
include_guard(GLOBAL)
# Creates a userver module with name MODULE. That includes the following cmake targets:
# - userver-MODULE library target
# - userver-MODULE-dynamic-configs library target
# - userver-MODULE-unittest binary target
# - userver-MODULE-dbtest binary target
# - userver-MODULE-benchmark binary target
#
# @arg MODULE Module name
# @option NO_INSTALL Do not install the module on 'cmake install'
# @option NO_CORE_LINK Do not link with userver-core
# @option GENERATE_DYNAMIC_CONFIGS Generate dynamic config models from 'dynamic_configs/'
# @param SOURCE_DIR @required Source directory of the module
# @param INSTALL_COMPONENT Component name to install (defaults to MODULE)
# @multiparam IGNORE_SOURCES ???
# @multiparam LINK_LIBRARIES Targets to link as PUBLIC
# @multiparam LINK_LIBRARIES_PRIVATE Targets to link as PRIVATE
# @multiparam INCLUDE_DIRS Directories to add to -I as PUBLIC
# @multiparam INCLUDE_DIRS_PRIVATE Directories to add to -I as PRIVATE
# @multiparam UTEST_DIRS ???
# @multiparam UTEST_SOURCES Glob expression for gtest source files
# @multiparam UTEST_LINK_LIBRARIES Targets to link for gtest target
# @multiparam DBTEST_DIRS ???
# @multiparam DBTEST_SOURCES ???
# @multiparam DBTEST_LINK_LIBRARIES Targets to link to dbtest target
# @multiparam DBTEST_DATABASES Database names to start for dbtest
# @multiparam DBTEST_ENV Environment variables to set for dbtest
# @multiparam UBENCH_DIRS ???
# @multiparam UBENCH_SOURCES ???
# @multiparam UBENCH_LINK_LIBRARIES ???
# @multiparam UBENCH_DATABASES Databases to start for benchmarks
# @multiparam UBENCH_ENV Environment variables to set for benchmarks
# @multiparam DEPENDS Userver module name(s) that the current module depends on
# @multiparam EMBED_FILES Files to embed
function(userver_module MODULE)
unset(ARG_UNPARSED_ARGUMENTS)
set(OPTIONS NO_INSTALL NO_CORE_LINK GENERATE_DYNAMIC_CONFIGS)
set(ONE_VALUE_ARGS SOURCE_DIR INSTALL_COMPONENT)
set(MULTI_VALUE_ARGS
IGNORE_SOURCES
LINK_LIBRARIES
LINK_LIBRARIES_PRIVATE
INCLUDE_DIRS
INCLUDE_DIRS_PRIVATE
UTEST_DIRS
UTEST_SOURCES
UTEST_LINK_LIBRARIES
DBTEST_DIRS
DBTEST_SOURCES
DBTEST_LINK_LIBRARIES
DBTEST_DATABASES
DBTEST_ENV
UBENCH_DIRS
UBENCH_SOURCES
UBENCH_LINK_LIBRARIES
UBENCH_DATABASES
UBENCH_ENV
DEPENDS
EMBED_FILES
)
cmake_parse_arguments(ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
if(ARG_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "Invalid arguments: ${ARG_UNPARSED_ARGUMENTS}")
endif()
# 1. userver-${MODULE}
file(GLOB_RECURSE SOURCES "${ARG_SOURCE_DIR}/src/*.cpp" "${ARG_SOURCE_DIR}/src/*.hpp"
"${ARG_SOURCE_DIR}/include/*.hpp"
)
# cmake <= 3.19 has a bug in remove_item
list(REMOVE_ITEM SOURCES ${ARG_IGNORE_SOURCES} "")
list(TRANSFORM ARG_UTEST_DIRS APPEND "/*.cpp" OUTPUT_VARIABLE UTEST_DIRS_SOURCES)
file(GLOB_RECURSE UTEST_SOURCES ${ARG_UTEST_SOURCES} ${UTEST_DIRS_SOURCES})
list(REMOVE_ITEM SOURCES ${UTEST_SOURCES} "")
list(TRANSFORM ARG_DBTEST_DIRS APPEND "/*.cpp" OUTPUT_VARIABLE DBTEST_DIRS_SOURCES)
file(GLOB_RECURSE DBTEST_SOURCES ${ARG_DBTEST_SOURCES} ${DBTEST_DIRS_SOURCES})
list(REMOVE_ITEM SOURCES ${DBTEST_SOURCES} "")
list(TRANSFORM ARG_UBENCH_DIRS APPEND "/*.cpp" OUTPUT_VARIABLE UBENCH_DIRS_SOURCES)
file(GLOB_RECURSE UBENCH_SOURCES ${ARG_UBENCH_SOURCES} ${UBENCH_DIRS_SOURCES})
list(REMOVE_ITEM SOURCES ${UBENCH_SOURCES} "")
add_library(userver-${MODULE} STATIC ${SOURCES})
set_target_properties(userver-${MODULE} PROPERTIES LINKER_LANGUAGE CXX)
target_include_directories(
userver-${MODULE}
PUBLIC $<BUILD_INTERFACE:${ARG_SOURCE_DIR}/include> ${ARG_INCLUDE_DIRS}
PRIVATE "${ARG_SOURCE_DIR}/src" ${ARG_INCLUDE_DIRS_PRIVATE}
)
target_link_libraries(
userver-${MODULE}
PUBLIC ${ARG_LINK_LIBRARIES}
PRIVATE ${ARG_LINK_LIBRARIES_PRIVATE}
)
if(NOT ARG_NO_CORE_LINK)
target_link_libraries(userver-${MODULE} PUBLIC userver-core)
endif()
if(NOT ARG_NO_INSTALL)
if(ARG_INSTALL_COMPONENT)
set(INSTALL_COMPONENT ${ARG_INSTALL_COMPONENT})
else()
set(INSTALL_COMPONENT ${MODULE})
endif()
_userver_directory_install(
COMPONENT ${INSTALL_COMPONENT}
DIRECTORY "${ARG_SOURCE_DIR}/include"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/.."
)
_userver_install_targets(COMPONENT ${INSTALL_COMPONENT} TARGETS userver-${MODULE})
if(NOT ARG_INSTALL_COMPONENT)
set(install_config_file "${USERVER_ROOT_DIR}/cmake/install/userver-${MODULE}-config.cmake")
if(NOT EXISTS ${install_config_file})
message(FATAL_ERROR "Can not install ${MODULE}, no installation config in ${install_config_file}")
endif()
_userver_directory_install(
COMPONENT ${MODULE}
FILES "${install_config_file}"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/userver"
)
endif()
_userver_install_component(MODULE ${MODULE} DEPENDS ${ARG_DEPENDS})
endif()
# 1. userver-${MODULE}-unittest
if(USERVER_BUILD_TESTS AND UTEST_SOURCES)
add_executable(userver-${MODULE}-unittest ${UTEST_SOURCES})
target_link_libraries(
userver-${MODULE}-unittest PRIVATE userver-utest userver-${MODULE} ${ARG_UTEST_LINK_LIBRARIES}
)
target_include_directories(
userver-${MODULE}-unittest PRIVATE $<TARGET_PROPERTY:userver-${MODULE},INCLUDE_DIRECTORIES>
${ARG_UTEST_DIRS}
)
add_google_tests(userver-${MODULE}-unittest)
endif()
# 1. userver-${MODULE}-dbtest
if(USERVER_BUILD_TESTS AND DBTEST_SOURCES)
add_executable(userver-${MODULE}-dbtest ${DBTEST_SOURCES})
target_link_libraries(
userver-${MODULE}-dbtest PRIVATE userver-utest userver-${MODULE} ${ARG_DBTEST_LINK_LIBRARIES}
)
target_include_directories(
userver-${MODULE}-dbtest PRIVATE $<TARGET_PROPERTY:userver-${MODULE},INCLUDE_DIRECTORIES>
${ARG_DBTEST_DIRS}
)
userver_add_utest(
NAME userver-${MODULE}-dbtest
DATABASES ${ARG_DBTEST_DATABASES}
TEST_ENV ${ARG_DBTEST_ENV}
)
endif()
# 1. userver-${MODULE}-benchmark
if(USERVER_BUILD_TESTS AND UBENCH_SOURCES)
add_executable(userver-${MODULE}-benchmark ${UBENCH_SOURCES})
target_link_libraries(
userver-${MODULE}-benchmark PRIVATE userver-ubench userver-${MODULE} ${ARG_UBENCH_LINK_LIBRARIES}
)
target_include_directories(
userver-${MODULE}-benchmark PRIVATE $<TARGET_PROPERTY:userver-${MODULE},INCLUDE_DIRECTORIES>
${ARG_UBENCH_DIRS}
)
userver_add_ubench_test(
NAME userver-${MODULE}-benchmark
DATABASES ${ARG_UBENCH_DATABASES}
TEST_ENV ${ARG_UBENCH_ENV}
)
endif()
# 1. userver-${MODULE}-dynamic-configs
if(ARG_GENERATE_DYNAMIC_CONFIGS)
userver_target_generate_chaotic_dynamic_configs(userver-${MODULE}-dynamic-configs dynamic_configs/*.yaml)
target_link_libraries(userver-${MODULE} PUBLIC userver-${MODULE}-dynamic-configs)
_userver_install_targets(COMPONENT ${MODULE} TARGETS userver-${MODULE}-dynamic-configs)
_userver_directory_install(
COMPONENT ${MODULE}
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dynamic_configs/include
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/.."
)
endif()
foreach(FILE ${ARG_EMBED_FILES})
string(MAKE_C_IDENTIFIER "userver-${MODULE}-embed_${FILE}" EMBED_TARGET_NAME)
userver_embed_file(${EMBED_TARGET_NAME} FILEPATH "${FILE}" HPP_FILENAME "${FILE}")
target_link_libraries(userver-${MODULE} PRIVATE "$<BUILD_INTERFACE:${EMBED_TARGET_NAME}>")
endforeach()
endfunction()