-
Notifications
You must be signed in to change notification settings - Fork 37
/
CMakeLists.txt
174 lines (148 loc) · 6.46 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
cmake_minimum_required(VERSION 3.16...3.22)
set(QT_PROTOBUF_VERSION 0.6.0)
set(QT_PROTOBUF_NAMESPACE QtProtobuf)
set(QT_PREFIX Qt)
set(QT_VERSIONED_PREFIX Qt5)
project(${QT_PROTOBUF_NAMESPACE} VERSION ${QT_PROTOBUF_VERSION} LANGUAGES CXX)
# Conan support, optional
if(EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake")
include("${CMAKE_BINARY_DIR}/conanbuildinfo.cmake")
conan_basic_setup()
endif()
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
set(QT_PROTOBUF_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
set(QT_PROTOBUF_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(QT_PROTOBUF_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
list(PREPEND CMAKE_MODULE_PATH ${QT_PROTOBUF_CMAKE_DIR})
find_package(WrapgRPC)
if(NOT CMAKE_CROSSCOMPILING)
find_package(WrapProtobuf COMPONENTS Protoc OPTIONAL_COMPONENTS Generator Protobuf REQUIRED)
else()
if(NOT QT_PROTOBUF_HOST_PATH)
message(FATAL_ERROR "QT_PROTOBUF_HOST_PATH is not specified. You shall specify
QT_PROTOBUF_HOST_PATH to find the host version of QtProtobufGenerator")
endif()
find_package(${QT_PROTOBUF_NAMESPACE} COMPONENTS ProtobufGenerator CONFIG REQUIRED
PATHS ${QT_PROTOBUF_HOST_PATH}
NO_DEFAULT_PATH
)
endif()
find_package(Threads)
find_package(${QT_VERSIONED_PREFIX} COMPONENTS Core Qml CONFIG REQUIRED)
find_package(${QT_VERSIONED_PREFIX} OPTIONAL_COMPONENTS Network Quick Gui CONFIG)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ${${QT_VERSIONED_PREFIX}_POSITION_INDEPENDENT_CODE})
if(UNIX)
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
# using Clang
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wno-pessimizing-move -Wno-mismatched-tags -Wno-unused-private-field -Wno-self-assign-overloaded")
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# using GCC
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wno-error=deprecated-declarations")
endif()
elseif(WIN32)
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
#TODO: not all l4 warnings are fixed for MSVC. Enable options bellow
# once fixed
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX /W4 /MD")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX /W4 /MD")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /bigobj /wd4005")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /wd4005")
else()
message(WARNING "Only MSVC compilers family are supported for build")
endif()
endif()
include(QtProtobufInternalHelpers)
include(QtProtobufCoverage)
include(QtProtobufGen)
qt_protobuf_internal_check_install()
set(PROTOBUF_QUICK_PLUGIN_NAME protobufquickplugin)
set(GRPC_QUICK_PLUGIN_NAME grpcquickplugin)
set(QT_PROTOBUF_MAKE_TESTS ON CACHE BOOL "Enable QtProtobuf tests build")
set(QT_PROTOBUF_STANDALONE_TESTS OFF CACHE BOOL "Enable QtProtobuf tests build")
set(QT_PROTOBUF_MAKE_EXAMPLES ON CACHE BOOL "Enable QtProtobuf examples build")
set(QT_PROTOBUF_MAKE_COVERAGE OFF CACHE BOOL "Enable QtProtobuf build for profiler (gcov)")
set(QT_PROTOBUF_FIELD_ENUM OFF CACHE BOOL "Enable generation of enumeration with fields numbers for well-known and Qt types libraries")
set(QT_PROTOBUF_NATIVE_GRPC_CHANNEL OFF CACHE BOOL "Enable native gRPC channel implementation")
if(NOT QT_PROTOBUF_STANDALONE_TESTS)
if(QT_PROTOBUF_NATIVE_GRPC_CHANNEL)
if(NOT WrapgRPC_FOUND OR NOT Threads_FOUND)
message("QT_PROTOBUF_NATIVE_GRPC_CHANNEL is ON, but required dependencies are not found.")
set(QT_PROTOBUF_NATIVE_GRPC_CHANNEL OFF)
endif()
endif()
if(CMAKE_CROSSCOMPILING)
set(QT_PROTOBUF_MAKE_TESTS OFF)
set(QT_PROTOBUF_MAKE_EXAMPLES OFF)
endif()
set(QT_PROTOBUF_STATIC OFF CACHE INTERNAL "" FORCE)
if(NOT BUILD_SHARED_LIBS)
set(QT_PROTOBUF_STATIC ON CACHE INTERNAL "" FORCE)
endif()
set(extra_type_libraries_options "") #Prevent to set from outside
if(QT_PROTOBUF_FIELD_ENUM)
set(extra_type_libraries_options "FIELDENUM ${extra_type_libraries_options}")
endif()
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/ProjectConfig.cmake.in" "${QT_PROTOBUF_BINARY_DIR}/${QT_PROTOBUF_NAMESPACE}Config.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake")
install(FILES "${QT_PROTOBUF_BINARY_DIR}/${QT_PROTOBUF_NAMESPACE}Config.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QT_PROTOBUF_NAMESPACE}"
COMPONENT dev
)
export(PACKAGE ${QT_PROTOBUF_NAMESPACE})
install(FILES "${QT_PROTOBUF_CMAKE_DIR}/FindWrapProtobuf.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QT_PROTOBUF_NAMESPACE}"
COMPONENT dev
)
if(NOT CMAKE_CROSSCOMPILING)
add_subdirectory("src/generator")
endif()
add_subdirectory("src/protobuf")
if(TARGET ${QT_VERSIONED_PREFIX}::Network)
if(${QT_VERSIONED_PREFIX}Core_VERSION VERSION_LESS "5.12.4")
# grpc target requires QT version not less than 5.12.4
# earlier versions Http2DirectAttribute is broken: https://doc.qt.io/qt-5/whatsnew511.html
# https://bugreports.qt.io/browse/QTBUG-74765
message(WARNING "QtGrpc requires the Qt framework version 5.12.4 or higher")
else()
add_subdirectory("src/grpc")
endif()
endif()
if(TARGET protobuf::libprotobuf AND TARGET protobuf::protoc)
add_subdirectory("src/wellknowntypes")
endif()
if(TARGET ${QT_VERSIONED_PREFIX}::Gui AND TARGET protobuf::protoc)
add_subdirectory("src/qttypes")
endif()
else()
# Disable any installtion rules if build tests only
set(QT_PROTOBUF_INSTALL FALSE CACHE INTERNAL "" FORCE)
set(QT_PROTOBUF_MAKE_TESTS TRUE)
endif()
if(QT_PROTOBUF_MAKE_TESTS)
find_package(WrapGTest)
find_package(${QT_VERSIONED_PREFIX} OPTIONAL_COMPONENTS Test QuickTest CONFIG)
if(WrapGTest_FOUND AND TARGET ${QT_VERSIONED_PREFIX}::Test)
enable_testing()
add_subdirectory("tests")
else()
message(STATUS "googletest not found. Force disable tests.")
endif()
endif()
if(QT_PROTOBUF_MAKE_EXAMPLES AND NOT QT_PROTOBUF_STANDALONE_TESTS)
if(TARGET ${QT_VERSIONED_PREFIX}::Quick)
add_subdirectory("examples")
else()
message(STATUS "${QT_VERSIONED_PREFIX}::Quick is not found. Disable examples")
endif()
endif()
if(QT_PROTOBUF_INSTALL)
include(packaging)
endif()
include(doxygen)
qt_protobuf_internal_install_targets()