Skip to content

Commit bb195d3

Browse files
Dmitry Sazonovmarkmandel
authored andcommitted
Cpp SDK. Cross-platform cmake-based build of third parties. (agones-dev#803)
1 parent ebc32a2 commit bb195d3

5 files changed

Lines changed: 353 additions & 215 deletions

File tree

‎sdks/cpp/CMakeLists.txt‎

Lines changed: 111 additions & 194 deletions
Original file line numberDiff line numberDiff line change
@@ -20,38 +20,72 @@ cmake_minimum_required (VERSION 3.13.0)
2020
# For *nix: cmake --build . --target install -- -s
2121
option(AGONES_SILENT_OUTPUT "Show only warnings/error messages" OFF)
2222
if (AGONES_SILENT_OUTPUT)
23-
function(message)
24-
list(GET ARGV 0 MessageType)
25-
if(MessageType STREQUAL FATAL_ERROR OR
26-
MessageType STREQUAL SEND_ERROR OR
27-
MessageType STREQUAL WARNING OR
28-
MessageType STREQUAL AUTHOR_WARNING)
29-
list(REMOVE_AT ARGV 0)
30-
_message(${MessageType} "${ARGV}")
31-
endif()
32-
endfunction()
33-
34-
set(CMAKE_INSTALL_MESSAGE NEVER)
35-
set(CMAKE_VERBOSE_MAKEFILE OFF)
36-
set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)
37-
set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF)
23+
function(message)
24+
list(GET ARGV 0 MessageType)
25+
list(REMOVE_AT ARGV 0)
26+
if (MessageType STREQUAL FATAL_ERROR OR
27+
MessageType STREQUAL SEND_ERROR OR
28+
MessageType STREQUAL WARNING OR
29+
MessageType STREQUAL AUTHOR_WARNING OR
30+
NOT ${AGONES_SILENT_OUTPUT}
31+
)
32+
_message(${MessageType} "${ARGV}")
33+
endif()
34+
endfunction()
35+
36+
set(CMAKE_INSTALL_MESSAGE NEVER)
37+
set(CMAKE_VERBOSE_MAKEFILE OFF)
38+
set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)
39+
set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF)
3840
endif(AGONES_SILENT_OUTPUT)
3941

40-
# Project AGONES
41-
project(agones VERSION 0.9.0 HOMEPAGE_URL https://github.com/googleforgames/agones LANGUAGES C CXX)
42+
# Getting version from git
43+
find_package(Git QUIET)
44+
set(AGONES_VERSION "0.0.0")
45+
if (Git_FOUND)
46+
execute_process(
47+
COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0
48+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
49+
RESULT_VARIABLE result
50+
OUTPUT_VARIABLE output
51+
)
52+
if (${result} EQUAL 0)
53+
string(REGEX MATCH "\\d+.\\d+.\\d+" AGONES_VERSION ${output})
54+
endif()
55+
else()
56+
message(WARNING "Git was not found. Current Agones version is set to ${AGONES_VERSION}")
57+
endif()
4258

43-
# Build options
44-
option(AGONES_BUILD_SHARED "Build Agones C++ SDK as dynamic library" OFF)
45-
option(AGONES_FORCE_GRPC_VERSION "Build Agones C++ SDK only with officially supported gRPC version" ON)
46-
option(AGONES_CREATE_PACKAGE "Generate CMake installation step and package files for Agones C++ SDK" ON)
59+
# Project AGONES
60+
project(agones VERSION ${AGONES_VERSION} HOMEPAGE_URL https://github.com/googleforgames/agones LANGUAGES C CXX)
61+
62+
# Options
63+
option(AGONES_FORCE_GRPC_VERSION "Build Agones C++ SDK only with supported gRPC version" ON)
64+
option(AGONES_BUILD_ONLY_PREREQUISITIES "Build only prerequisites of Agones" OFF)
65+
option(AGONES_ZLIB_STATIC "Use static version of ZLIB" ON)
66+
option(AGONES_BUILD_THIRDPARTY_DEBUG "Build debug version of thirdparty libraries (MSVC only)" OFF)
67+
set(AGONES_THIRDPARTY_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}" CACHE STRING "Path for installing third-party OpenSSL and gRPC, if they are not found with find_package")
68+
set(AGONES_OPENSSL_CONFIG_STRING "VC-WIN64A" CACHE STRING "See https://github.com/openssl/openssl/blob/master/INSTALL for details")
69+
70+
# Prerequisities
71+
include(./cmake/prerequisites.cmake)
72+
find_package(ZLIB REQUIRED)
73+
find_package(Protobuf REQUIRED CONFIG)
74+
find_package(gRPC ${AGONES_GRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} REQUIRED CONFIG)
75+
76+
if (AGONES_BUILD_ONLY_PREREQUISITIES)
77+
return()
78+
endif()
4779

48-
# Currently we doesn't support build time generation of proto/grpc files,
80+
# Currently we doesn't support build time generation of proto/gRPC files,
4981
# so gRPC version should be strict
5082
set(AGONES_FORCE_GRPC_VERSION ON)
83+
set(AGONES_GRPC_VERSION_MATCH "")
84+
if (AGONES_FORCE_GRPC_VERSION)
85+
set(AGONES_GRPC_VERSION_MATCH EXACT)
86+
endif()
5187

5288
# Settings
53-
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
54-
5589
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
5690

5791
set(CMAKE_CXX_STANDARD 14)
@@ -62,210 +96,93 @@ set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
6296
set(CMAKE_DEBUG_POSTFIX "d")
6397
set(AGONES_GRPC_VERSION "1.16.1")
6498

65-
if (AGONES_BUILD_SHARED)
66-
add_compile_definitions(
67-
PROTOBUF_USE_DLLS
68-
LIBPROTOBUF_EXPORTS
69-
)
70-
endif()
71-
72-
# --> Connecting gRPC
73-
macro(validate_path IN_PATH OUT_RESULT)
74-
set(${OUT_RESULT} FALSE)
75-
if (NOT IS_DIRECTORY ${${IN_PATH}})
76-
file(TO_CMAKE_PATH "$ENV{${IN_PATH}}" ${IN_PATH})
77-
else()
78-
file(TO_CMAKE_PATH "${${IN_PATH}}" ${IN_PATH})
79-
endif()
80-
if (IS_DIRECTORY ${${IN_PATH}})
81-
set(${OUT_RESULT} TRUE)
82-
endif()
83-
endmacro(validate_path)
84-
85-
set(GRPC_IS_INSTALLED FALSE)
86-
set(GRPC_PATH_FOUND FALSE)
87-
validate_path(grpc_SOURCE_DIR GRPC_PATH_FOUND)
88-
if (GRPC_PATH_FOUND)
89-
# Checking if we use gRPC package or gRPC source folder
90-
# Usually it should be findXXX.cmake or xxxConfig.cmake files, but for gRPC we need to check gRPCTargets.cmake too
91-
if (EXISTS ${grpc_SOURCE_DIR}/gRPCTargets.cmake)
92-
set(GRPC_IS_INSTALLED TRUE)
93-
find_package(gRPC CONFIG REQUIRED)
94-
endif()
95-
else()
96-
# Download gRPC, if necessary
97-
include(Fetch_gRPC)
98-
endif()
99-
100-
add_subdirectory(${grpc_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL)
101-
102-
# Check gRPC version
103-
get_directory_property(GRPC_VERSION DIRECTORY ${grpc_SOURCE_DIR} DEFINITION PACKAGE_VERSION)
104-
if (NOT GRPC_VERSION STREQUAL AGONES_GRPC_VERSION)
105-
set(GRPC_VERSION_SEVERITY WARNING)
106-
if (AGONES_FORCE_GRPC_VERSION)
107-
set(GRPC_VERSION_SEVERITY FATAL_ERROR)
108-
endif()
109-
message(${GRPC_VERSION_SEVERITY} "Agones SDK currently supports only \"${AGONES_GRPC_VERSION}\" version. Building with \"${GRPC_VERSION}\" may cause unexpected problems.")
110-
endif()
111-
112-
# Configuring
113-
set(AGONES_DEPENDENCIES libprotobuf grpc++_unsecure)
114-
set(AGONES_GRPC_TARGETS address_sorting c-ares gpr grpc_unsecure grpc++_unsecure libprotobuf zlibstatic)
115-
foreach(THIRDPARTY_TARGET ${AGONES_GRPC_TARGETS})
116-
set_property(TARGET ${THIRDPARTY_TARGET} PROPERTY FOLDER third_party)
117-
endforeach()
118-
# <-- Connecting gRPC
119-
12099
# Platform specific stuff
121100
if (WIN32)
122-
# Windows
123-
add_compile_definitions(
124-
_WIN32_WINNT=0x0600
125-
WINDOWS
126-
)
101+
# Windows
102+
add_compile_definitions(
103+
_WIN32_WINNT=0x0600
104+
WINDOWS
105+
)
127106
elseif (APPLE)
128-
# Mac OS
107+
# Mac OS
129108
elseif (UNIX AND NOT APPLE)
130-
# Linux
131-
endif()
132-
133-
if (MSVS)
134-
set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661)
135-
target_compile_options(libprotobuf PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS})
136-
target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS})
137-
else()
138-
set(OPT_DISABLE_COMPILER_WARNINGS -wd4101 -wd4146 -wd4251 -wd4661)
109+
# Linux
139110
endif()
140111

141112
# Agones SDK
142113
include(./sources.cmake)
143114

144-
set(AGONES_BUILD_TYPE STATIC)
145-
if (AGONES_BUILD_SHARED)
146-
set(AGONES_BUILD_TYPE SHARED)
115+
# Global header
116+
set(GLOBAL_HEADER "${PROJECT_NAME}_global.h")
117+
set(GLOBAL_CONFIG_CONTENT "\n")
118+
configure_file(cmake/${GLOBAL_HEADER}.in ${GLOBAL_HEADER} @ONLY)
119+
120+
if(MSVC)
121+
add_definitions(/FI"${GLOBAL_HEADER}")
122+
else()
123+
# GCC or Clang
124+
add_definitions(-include ${GLOBAL_HEADER})
147125
endif()
148126

149-
add_library(${PROJECT_NAME} ${AGONES_BUILD_TYPE} ${ALL_FILES})
150-
target_link_libraries(${PROJECT_NAME} PRIVATE ${AGONES_DEPENDENCIES})
127+
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
128+
target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure)
151129

152130
target_include_directories(${PROJECT_NAME} PUBLIC
153-
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
154-
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/${PROJECT_NAME}>
155-
$<INSTALL_INTERFACE:include>
131+
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
132+
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/${PROJECT_NAME}>
133+
$<INSTALL_INTERFACE:${PROJECT_NAME}/include>
156134
)
157135

158136
# Fix compiler warnings
159137
# https://github.com/protocolbuffers/protobuf/blob/master/cmake/README.md#notes-on-compiler-warnings
138+
if (MSVC)
139+
set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661)
140+
target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS})
141+
endif()
160142

161143
# Export header
162144
include(GenerateExportHeader)
163145
set(EXPORT_HEADER "${PROJECT_NAME}_export.h")
164146
generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ${EXPORT_HEADER} DEFINE_NO_DEPRECATED)
165147

166-
# Global header
167-
set(GLOBAL_HEADER "${PROJECT_NAME}_global.h")
168-
set(GLOBAL_CONFIG_CONTENT "")
169-
if (AGONES_BUILD_SHARED)
170-
set(GLOBAL_CONFIG_CONTENT "\
171-
// Dynamic linkage require macro for protobuf\n\
172-
#ifndef PROTOBUF_USE_DLLS\n\
173-
#define PROTOBUF_USE_DLLS\n\
174-
#endif\n"
175-
)
176-
endif()
177-
configure_file(cmake/${GLOBAL_HEADER}.in ${GLOBAL_HEADER} @ONLY)
178-
179-
if(MSVC)
180-
add_definitions(/FI"${GLOBAL_HEADER}")
181-
else()
182-
# GCC or Clang
183-
add_definitions(-include ${GLOBAL_HEADER})
184-
endif()
185-
186148
# CMake package generation
187149
include(CMakePackageConfigHelpers)
188150

189-
if (AGONES_CREATE_PACKAGE)
190-
set(_INCLUDE_DIRS "include")
191-
set(_CMAKE_CONFIG_DESTINATION "cmake")
151+
set(_INCLUDE_DIRS "agones/include")
152+
set(_CMAKE_CONFIG_DESTINATION "agones/cmake")
192153

193-
# If gRPC is built from source (not from package), then we need to redistribute gRPC and it dependencies
194-
if (NOT GRPC_IS_INSTALLED)
195-
# gRPC headers
196-
install(DIRECTORY ${grpc_SOURCE_DIR}/include/ DESTINATION ${_INCLUDE_DIRS})
197-
# Protobuf headers
198-
install(DIRECTORY ${grpc_SOURCE_DIR}/third_party/protobuf/src/ DESTINATION ${_INCLUDE_DIRS} FILES_MATCHING PATTERN "*.h")
199-
# gRPC and it dependencies
200-
if (NOT AGONES_BUILD_SHARED)
201-
install(TARGETS ${AGONES_GRPC_TARGETS} EXPORT gRPC
202-
LIBRARY DESTINATION lib
203-
ARCHIVE DESTINATION lib
204-
RUNTIME DESTINATION bin
205-
INCLUDES DESTINATION ${_INCLUDE_DIRS}
206-
)
207-
endif()
208-
endif()
209-
210-
# Config for find_package
211-
configure_package_config_file(
154+
# Config for find_package
155+
configure_package_config_file(
212156
cmake/${PROJECT_NAME}Config.cmake.in
213157
${PROJECT_NAME}Config.cmake
214158
INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/${_CMAKE_CONFIG_DESTINATION}
215159
PATH_VARS _INCLUDE_DIRS PROJECT_VERSION
216-
NO_SET_AND_CHECK_MACRO
217-
)
218-
# Build artifacts
219-
install(TARGETS ${PROJECT_NAME} ${AGONES_GRPC_TARGETS} EXPORT ${PROJECT_NAME}
220-
LIBRARY DESTINATION lib
221-
ARCHIVE DESTINATION lib
222-
RUNTIME DESTINATION bin
160+
NO_SET_AND_CHECK_MACRO
161+
)
162+
163+
# Build artifacts
164+
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}
165+
LIBRARY DESTINATION ${PROJECT_NAME}/lib
166+
ARCHIVE DESTINATION ${PROJECT_NAME}/lib
167+
RUNTIME DESTINATION ${PROJECT_NAME}/bin
223168
INCLUDES DESTINATION ${_INCLUDE_DIRS}
224-
)
225-
install(EXPORT ${PROJECT_NAME} DESTINATION ${_CMAKE_CONFIG_DESTINATION} FILE ${PROJECT_NAME}Targets.cmake)
226-
# Package config
227-
install(
169+
)
170+
install(EXPORT ${PROJECT_NAME} DESTINATION ${_CMAKE_CONFIG_DESTINATION} FILE ${PROJECT_NAME}Targets.cmake)
171+
# Package config
172+
install(
228173
FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
229174
DESTINATION ${_CMAKE_CONFIG_DESTINATION}
230-
)
231-
# Agones header files
232-
install(
175+
)
176+
# Agones header files
177+
install(
233178
FILES ${HEADER_FILES} "${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_HEADER}" "${CMAKE_CURRENT_BINARY_DIR}/${GLOBAL_HEADER}"
234-
DESTINATION include/${PROJECT_NAME}
235-
)
236-
# Google header files
237-
install(
179+
DESTINATION ${_INCLUDE_DIRS}/${PROJECT_NAME}
180+
)
181+
# Google header files
182+
install(
238183
FILES ${GOOGLE_HEADER_FILES}
239-
DESTINATION include/google/api
240-
)
241-
# PDB file
242-
if (AGONES_BUILD_SHARED)
243-
install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin CONFIGURATIONS Debug OPTIONAL)
244-
install(FILES $<TARGET_PDB_FILE:${AGONES_GRPC_TARGETS}> DESTINATION bin CONFIGURATIONS Debug OPTIONAL)
245-
endif()
246-
247-
unset(_INCLUDE_DIRS)
248-
unset(_CMAKE_CONFIG_DESTINATION)
249-
else() # Package is created with absolute pathes in build folder
250-
# Use agones and thirdparty include directories
251-
set(_INCLUDE_DIRS
252-
"${CMAKE_CURRENT_LIST_DIR}/include"
253-
"${grpc_SOURCE_DIR}/include"
254-
"${grpc_SOURCE_DIR}/third_party/protobuf/src"
255-
)
256-
set(_CMAKE_CONFIG_DESTINATION "${CMAKE_BINARY_DIR}")
257-
258-
configure_package_config_file(
259-
cmake/${PROJECT_NAME}Config.cmake.in
260-
"${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
261-
INSTALL_DESTINATION ${_CMAKE_CONFIG_DESTINATION}
262-
PATH_VARS _INCLUDE_DIRS PROJECT_VERSION
263-
NO_SET_AND_CHECK_MACRO
264-
)
265-
export(TARGETS ${PROJECT_NAME} ${AGONES_GRPC_TARGETS} FILE "${CMAKE_BINARY_DIR}/${PROJECT_NAME}Targets.cmake")
266-
# Register SDK local artifacts in system https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#package-registry-example
267-
#export(PACKAGE ${PROJECT_NAME})
184+
DESTINATION ${_INCLUDE_DIRS}/google/api
185+
)
268186

269-
unset(_INCLUDE_DIRS)
270-
unset(_CMAKE_CONFIG_DESTINATION)
271-
endif(AGONES_CREATE_PACKAGE)
187+
unset(_INCLUDE_DIRS)
188+
unset(_CMAKE_CONFIG_DESTINATION)

‎sdks/cpp/build_scripts/msvs_2017_x64_release.bat‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ pushd ..
1717
if not exist ".build" md ".build"
1818
pushd ".build"
1919
cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=./install -Wno-dev
20-
cmake --build . --config Release --target INSTALL
20+
cmake --build . --config Release --target install
2121
popd
2222
popd
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1-
set(agones_VERSION 0.9.0)
1+
set(agones_VERSION @agones_VERSION@)
22

33
@PACKAGE_INIT@
44

55
set(agones_INCLUDE_DIRS @PACKAGE__INCLUDE_DIRS@)
66

7+
set(AGONES_OWN_GRPC @AGONES_OWN_GRPC@)
8+
if (${AGONES_OWN_GRPC})
9+
set(ZLIB_ROOT @zlib_DIR@)
10+
set(ZLIB_LIBRARIES @ZLIB_LIBRARIES@)
11+
set(OPENSSL_ROOT_DIR @OPENSSL_ROOT_DIR@)
12+
endif()
13+
714
include(CMakeFindDependencyMacro)
15+
find_dependency(ZLIB REQUIRED)
16+
find_dependency(Protobuf REQUIRED CONFIG)
17+
find_dependency(gRPC REQUIRED CONFIG)
818
include("${CMAKE_CURRENT_LIST_DIR}/agonesTargets.cmake")
919

1020
check_required_components(agones)

0 commit comments

Comments
 (0)