@@ -20,38 +20,72 @@ cmake_minimum_required (VERSION 3.13.0)
2020# For *nix: cmake --build . --target install -- -s
2121option (AGONES_SILENT_OUTPUT "Show only warnings/error messages" OFF )
2222if (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 )
3840endif (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
5082set (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-
5589set_property (GLOBAL PROPERTY USE_FOLDERS ON )
5690
5791set (CMAKE_CXX_STANDARD 14)
@@ -62,210 +96,93 @@ set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
6296set (CMAKE_DEBUG_POSTFIX "d" )
6397set (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
121100if (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+ )
127106elseif (APPLE )
128- # Mac OS
107+ # Mac OS
129108elseif (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
139110endif ()
140111
141112# Agones SDK
142113include (./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} )
147125endif ()
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
152130target_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
162144include (GenerateExportHeader )
163145set (EXPORT_HEADER "${PROJECT_NAME } _export.h" )
164146generate_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
187149include (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)
0 commit comments