forked from LanterECR/LAN-4GateLibraryCPP
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
255 lines (191 loc) · 10.9 KB
/
CMakeLists.txt
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
cmake_minimum_required(VERSION 3.10)
get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)
# Подключение и загрузка пакетного менеджера Hunter
# Если данный проект подключен через add_subdirectory, то загрузить и инициировать Hunter не выйдет
if(NOT IS_SUBPROJECT)
if("$ENV{HUNTER_ROOT}" STREQUAL "")
set(ENV{HUNTER_ROOT} ${CMAKE_BINARY_DIR}/cmake/hunter)
endif()
set(HUNTER_GATE_PATH ${CMAKE_BINARY_DIR}/cmake/HunterGate.cmake)
if(NOT EXISTS ${HUNTER_GATE_PATH})
file(DOWNLOAD
https://raw.githubusercontent.com/cpp-pm/gate/master/cmake/HunterGate.cmake
${HUNTER_GATE_PATH})
endif()
include(${HUNTER_GATE_PATH})
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.313.tar.gz"
SHA1 "6c369e5aab2749a616917df3b23511535f413604"
)
endif()
project(LAN_4GateLib VERSION 0.9.6 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
if(NOT CMAKE_CXX_EXTENSIONS)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
option(L4G_TESTS "Enable unit-testing" OFF)
option(L4G_BUILD_MODULE "Build module library" ON)
option(L4G_BUILD_SHARED "Build shared library" ON)
option(L4G_BUILD_STATIC "Build static library" ON)
option(L4G_BUILD_SWIG "Build shared library with SWIG integration. SWIG build disable other builds" OFF)
set(L4G_SWIG_TARGET_LANGUAGE "csharp" CACHE STRING "Target language for SWIG" )
if(NOT L4G_BUILD_SHARED AND NOT L4G_BUILD_STATIC AND NOT L4G_BUILD_MODULE AND NOT L4G_BUILD_SWIG)
message(FATAL_ERROR "This library must be static or shared. Enable L4G_BUILD_STATIC, L4G_BUILD_SHARED or L4G_BUILD_MODULE flag")
endif()
hunter_add_package(asio)
hunter_add_package(jsoncpp)
find_package(Threads REQUIRED)
find_package(jsoncpp CONFIG REQUIRED)
find_package(asio CONFIG REQUIRED)
include_directories(include;Impl)
#поиск всех заголовочников
file(GLOB_RECURSE INCLUDE_FILES include/*.h)
#поиск всех исходников
file(GLOB_RECURSE SOURCE_FILES src/*.cpp)
#поиск заголовочников имплементации
file(GLOB_RECURSE IMPL_INCLUDE_FILES Impl/*.h)
#поиск исходников имплементации
file(GLOB_RECURSE IMPL_SOURCE_FILES Impl/*.cpp)
add_compile_definitions(L4G_VERSION="${PROJECT_VERSION}")
#список зависимостей библиотеки
set(DEPENDENCIES_LIST jsoncpp_object asio::asio_headeronly)
set(INSTALLATION_TARGETS "")
if(L4G_BUILD_SWIG)
if(NOT "${L4G_SWIG_TARGET_LANGUAGE}" STREQUAL "csharp" AND NOT "${L4G_SWIG_TARGET_LANGUAGE}" STREQUAL "java")
message(FATAL_ERROR "${L4G_SWIG_TARGET_LANGUAGE} doesn`t support yet")
endif()
if("${L4G_SWIG_TARGET_LANGUAGE}" STREQUAL "csharp")
set(SWIG_IFACE_RESULT_SUFFUX "cs")
set(SWIG_LANG_PARAMS -${L4G_SWIG_TARGET_LANGUAGE} -namespace Lanter.Lan4Gate -outfile Lan4gateInterface.${SWIG_IFACE_RESULT_SUFFUX})
set(L4G_SWIG_INTERFACE_OUTDIR ${L4G_SWIG_TARGET_LANGUAGE})
elseif("${L4G_SWIG_TARGET_LANGUAGE}" STREQUAL "java")
set(SWIG_IFACE_RESULT_SUFFUX "jar")
set(SWIG_LANG_PARAMS -${L4G_SWIG_TARGET_LANGUAGE} -package org.lanter.lan4gate)
find_package(JNI)
include_directories(${JAVA_INCLUDE_PATH})
if(JAVA_INCLUDE_PATH2)
include_directories(${JAVA_INCLUDE_PATH2})
endif()
set(L4G_SWIG_INTERFACE_OUTDIR ${L4G_SWIG_TARGET_LANGUAGE}/org/lanter/lan4gate)
endif()
FIND_PACKAGE(SWIG REQUIRED)
add_custom_command(OUTPUT "Lan4GateSwig_wrap.cxx"
COMMAND ${CMAKE_COMMAND} -E make_directory ${L4G_SWIG_INTERFACE_OUTDIR}
COMMAND ${SWIG_EXECUTABLE} -outdir ${L4G_SWIG_INTERFACE_OUTDIR}
-c++
${SWIG_LANG_PARAMS}
-outcurrentdir
-I${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include/Lan4GateSwig.i)
add_library(l4g_swig MODULE ${INCLUDE_FILES} ${SOURCE_FILES} ${IMPL_INCLUDE_FILES} ${IMPL_SOURCE_FILES} Lan4GateSwig_wrap.cxx)
target_include_directories(l4g_swig INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_compile_features(l4g_swig INTERFACE cxx_std_11)
target_link_libraries(l4g_swig ${DEPENDENCIES_LIST})
target_compile_definitions(l4g_swig PUBLIC LANTER_BUILD_SHARED)
set_target_properties(l4g_swig PROPERTIES OUTPUT_NAME "Lan4Gate")
if("${L4G_SWIG_TARGET_LANGUAGE}" STREQUAL "java")
find_package(Java COMPONENTS Development)
#расскоментировать для создания списка классов. Результат вставить в JAVA_SRC
#[[file(GLOB_RECURSE FOUND_JAVA_SRC ${L4G_SWIG_INTERFACE_OUTDIR}/*.java)
message("!!!!!!!!!!!!!${FOUND_JAVA_SRC}")]]
set(JAVA_SRC ${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/ByteVector.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/CardInputMethod.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/CardholderAuthMethod.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/CommunicationFactory.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/ICommunication.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/IConnectionCallback.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/IInteractionCallback.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/IInteractionData.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/ILan4Gate.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/INotificationCallback.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/INotificationData.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/IRequestCallback.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/IRequestData.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/IResponseCallback.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/IResponseData.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/InteractionCode.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/Lan4Gate.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/Lan4GateFactory.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/Lan4GateJNI.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/NotificationCode.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/OperationCode.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/RequestField.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/RequestFieldsArray.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/ResponseArray.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/ResponseField.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/ResponseFieldsArray.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/SWIGTYPE_p_p_char.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/Status.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/Version.java
${CMAKE_CURRENT_BINARY_DIR}/java/org/lanter/lan4gate/imaxdiv_t.java)
include(UseJava)
add_jar(Lan4gateInterface
SOURCES ${JAVA_SRC}
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/java)
add_custom_command(TARGET l4g_swig POST_BUILD
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR} --target Lan4gateInterface)
endif()
install(FILES ${CMAKE_BINARY_DIR}/${L4G_SWIG_TARGET_LANGUAGE}/Lan4gateInterface.${SWIG_IFACE_RESULT_SUFFUX} DESTINATION ${L4G_SWIG_TARGET_LANGUAGE})
install(TARGETS l4g_swig
RUNTIME DESTINATION bin
LIBRARY DESTINATION bin
)
else()
#Исходники будут скомпилированы дважды из-за разных дефайнов
if(L4G_BUILD_STATIC)
add_library(l4g_static STATIC ${INCLUDE_FILES} ${SOURCE_FILES} ${IMPL_INCLUDE_FILES} ${IMPL_SOURCE_FILES})
target_include_directories(l4g_static INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_compile_features(l4g_static INTERFACE cxx_std_11)
target_link_libraries(l4g_static ${DEPENDENCIES_LIST})
add_library(L4G::l4g_static ALIAS l4g_static)
list(APPEND INSTALLATION_TARGETS l4g_static)
endif()
if(L4G_BUILD_SHARED)
add_library(l4g_shared SHARED ${INCLUDE_FILES} ${SOURCE_FILES} ${IMPL_INCLUDE_FILES} ${IMPL_SOURCE_FILES})
target_include_directories(l4g_shared INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_compile_features(l4g_shared INTERFACE cxx_std_11)
target_link_libraries(l4g_shared ${DEPENDENCIES_LIST})
target_compile_definitions(l4g_shared PUBLIC LANTER_BUILD_SHARED)
add_library(L4G::l4g_shared ALIAS l4g_shared)
list(APPEND INSTALLATION_TARGETS l4g_shared)
endif()
if(L4G_BUILD_MODULE)
add_library(l4g_module MODULE ${INCLUDE_FILES} ${SOURCE_FILES} ${IMPL_INCLUDE_FILES} ${IMPL_SOURCE_FILES})
target_include_directories(l4g_module INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_compile_features(l4g_module INTERFACE cxx_std_11)
target_link_libraries(l4g_module ${DEPENDENCIES_LIST})
target_compile_definitions(l4g_module PUBLIC LANTER_BUILD_SHARED)
add_library(L4G::l4g_module ALIAS l4g_module)
list(APPEND INSTALLATION_TARGETS l4g_module)
endif()
if(L4G_TESTS AND L4G_BUILD_STATIC AND NOT IS_SUBPROJECT)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
option(INSTALL_GTEST OFF)
enable_testing()
hunter_add_package(GTest)
add_subdirectory(tests)
endif()
install(DIRECTORY include/Lanter DESTINATION include)
install(TARGETS ${INSTALLATION_TARGETS} EXPORT LAN_4GateLibConfig
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
install(EXPORT LAN_4GateLibConfig NAMESPACE L4G:: DESTINATION share/LAN_4GateLib/cmake)
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/LAN_4GateLibConfigVersion.cmake"
VERSION
${PROJECT_VERSION}
COMPATIBILITY
AnyNewerVersion
)
install(FILES "${PROJECT_BINARY_DIR}/LAN_4GateLibConfigVersion.cmake" DESTINATION share/LAN_4GateLib/cmake)
endif()