agones.dev/agones@v1.53.0/sdks/cpp/CMakeLists.txt (about) 1 # Copyright 2018 Google LLC All Rights Reserved. 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http://www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 # See the License for the specific language governing permissions and 13 # limitations under the License. 14 15 cmake_minimum_required(VERSION 3.15) 16 17 # Silent cmake/build output (internal option) 18 # Extra command line options 19 # For windows: cmake --build . --config Release --target install -- /v:quiet /nologo 20 # For *nix: cmake --build . --target install -- -s 21 option(AGONES_SILENT_OUTPUT "Show only warnings/error messages" OFF) 22 if (AGONES_SILENT_OUTPUT) 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) 40 endif(AGONES_SILENT_OUTPUT) 41 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 ERROR_QUIET 52 ) 53 if (${result} EQUAL 0) 54 string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" AGONES_VERSION ${output}) 55 endif() 56 else() 57 message(WARNING "Git was not found. Current Agones version is set to ${AGONES_VERSION}") 58 endif() 59 60 # Project AGONES 61 project(agones VERSION ${AGONES_VERSION} HOMEPAGE_URL https://github.com/googleforgames/agones LANGUAGES C CXX) 62 63 # Options 64 option(AGONES_FORCE_GRPC_VERSION "Build Agones C++ SDK only with supported gRPC version" ON) 65 option(AGONES_CLANG_FORMAT "Apply clang-format (if found) as a pre-build step" OFF) 66 67 # Prerequisities 68 # [markmandel] - not 100% sure what include(CMakeFindDependencyMacro) does, but it solves the building issue. 69 # https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#creating-a-package-configuration-file 70 include(CMakeFindDependencyMacro) 71 include(ProcessorCount) 72 73 ProcessorCount(CPU_COUNT) 74 if (CPU_COUNT GREATER 0 AND NOT DEFINED CMAKE_BUILD_PARALLEL_LEVEL) 75 set(ENV{CMAKE_BUILD_PARALLEL_LEVEL} "${CPU_COUNT}") 76 message(STATUS "Setting CMAKE_BUILD_PARALLEL_LEVEL to $ENV{CMAKE_BUILD_PARALLEL_LEVEL}") 77 endif() 78 79 # gRPC 80 find_package(Protobuf REQUIRED) 81 find_package(gRPC CONFIG REQUIRED) 82 find_package(Threads REQUIRED) 83 84 message(STATUS "gRPC version found: ${gRPC_VERSION}") 85 86 # Settings 87 set_property(GLOBAL PROPERTY USE_FOLDERS ON) 88 89 set(CMAKE_CXX_STANDARD 17) 90 set(CMAKE_CXX_STANDARD_REQUIRED TRUE) 91 set(CMAKE_CXX_EXTENSIONS OFF) 92 set(CMAKE_INCLUDE_CURRENT_DIR ON) 93 set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) 94 set(CMAKE_DEBUG_POSTFIX "d") 95 96 # Platform specific stuff 97 if (WIN32) 98 # Windows 99 add_compile_definitions( 100 _WIN32_WINNT=0x0600 101 WINDOWS 102 ) 103 elseif (APPLE) 104 # Mac OS 105 elseif (UNIX AND NOT APPLE) 106 # Linux 107 endif() 108 109 # Agones SDK 110 include(./sources.cmake) 111 112 # Global header 113 set(GLOBAL_HEADER "${PROJECT_NAME}_global.h") 114 set(GLOBAL_CONFIG_CONTENT "\n") 115 configure_file(cmake/${GLOBAL_HEADER}.in ${GLOBAL_HEADER} @ONLY) 116 117 if(MSVC) 118 add_definitions(/FI"${GLOBAL_HEADER}") 119 else() 120 # GCC or Clang 121 add_definitions(-include ${GLOBAL_HEADER}) 122 endif() 123 124 add_library(${PROJECT_NAME} STATIC ${ALL_FILES}) 125 target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure) 126 127 target_include_directories(${PROJECT_NAME} PUBLIC 128 $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> 129 $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/${PROJECT_NAME}> 130 $<INSTALL_INTERFACE:${PROJECT_NAME}/include> 131 ) 132 133 # Fix compiler warnings 134 # https://github.com/protocolbuffers/protobuf/blob/master/cmake/README.md#notes-on-compiler-warnings 135 if (MSVC) 136 set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661) 137 target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS}) 138 endif() 139 140 # Export header 141 include(GenerateExportHeader) 142 set(EXPORT_HEADER "${PROJECT_NAME}_export.h") 143 generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ${EXPORT_HEADER} DEFINE_NO_DEPRECATED) 144 145 # CMake package generation 146 include(CMakePackageConfigHelpers) 147 148 set(_INCLUDE_DIRS "agones/include") 149 set(_CMAKE_CONFIG_DESTINATION "agones/cmake") 150 151 # Config for find_package 152 configure_package_config_file( 153 cmake/${PROJECT_NAME}Config.cmake.in 154 ${PROJECT_NAME}Config.cmake 155 INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/${_CMAKE_CONFIG_DESTINATION} 156 PATH_VARS _INCLUDE_DIRS PROJECT_VERSION 157 NO_SET_AND_CHECK_MACRO 158 ) 159 160 # Build artifacts 161 install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME} 162 LIBRARY DESTINATION ${PROJECT_NAME}/lib 163 ARCHIVE DESTINATION ${PROJECT_NAME}/lib 164 RUNTIME DESTINATION ${PROJECT_NAME}/bin 165 INCLUDES DESTINATION ${_INCLUDE_DIRS} 166 ) 167 install(EXPORT ${PROJECT_NAME} DESTINATION ${_CMAKE_CONFIG_DESTINATION} FILE ${PROJECT_NAME}Targets.cmake) 168 # Package config 169 install( 170 FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake 171 DESTINATION ${_CMAKE_CONFIG_DESTINATION} 172 ) 173 # Agones header files 174 install( 175 FILES ${HEADER_FILES} "${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_HEADER}" "${CMAKE_CURRENT_BINARY_DIR}/${GLOBAL_HEADER}" 176 DESTINATION ${_INCLUDE_DIRS}/${PROJECT_NAME} 177 ) 178 # Generated header files 179 install( 180 FILES ${GENERATED_HEADER_FILES} 181 DESTINATION ${_INCLUDE_DIRS}/${PROJECT_NAME} 182 ) 183 # Google header files 184 install( 185 FILES ${GENERATED_GOOGLE_HEADER_FILES} 186 DESTINATION ${_INCLUDE_DIRS}/google/api 187 ) 188 # grpc-gateway header files 189 install( 190 FILES ${GENERATED_GRPC_HEADER_FILES} 191 DESTINATION ${_INCLUDE_DIRS}/protoc-gen-openapiv2/options 192 ) 193 194 unset(_INCLUDE_DIRS) 195 unset(_CMAKE_CONFIG_DESTINATION) 196 197 # clang-format 198 find_program( 199 CLANG_FORMAT_APP 200 NAMES "clang-format" 201 DOC "Path to clang-format" 202 ) 203 if (NOT CLANG_FORMAT_APP) 204 message(STATUS "clang-format not found.") 205 else() 206 message(STATUS "clang-format found: ${CLANG_FORMAT_APP}") 207 208 set(CLANGFORMAT_INPUT) 209 foreach(relpath ${SDK_FILES}) 210 get_filename_component(fullpath "${CMAKE_CURRENT_LIST_DIR}/${relpath}" ABSOLUTE) 211 list(APPEND CLANGFORMAT_INPUT ${fullpath}) 212 endforeach() 213 214 # format 215 add_custom_target( 216 clang-format-apply 217 COMMAND ${CLANG_FORMAT_APP} -i --style=file --fallback-style=Google ${CLANGFORMAT_INPUT} 218 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 219 ) 220 if (${AGONES_CLANG_FORMAT}) 221 add_dependencies(${PROJECT_NAME} "clang-format-apply") 222 endif() 223 224 # verification 225 set(CLANGFORMAT_WORKING_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 226 get_filename_component(AGONES_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE) 227 get_filename_component(AGONES_TEMP "${CMAKE_CURRENT_BINARY_DIR}/clang-format/temp" ABSOLUTE) 228 configure_file("cmake/clang-verify.in" "clang-format/CMakeLists.txt" @ONLY) 229 add_custom_target( 230 clang-format-verify 231 COMMAND ${CMAKE_COMMAND} . 232 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/clang-format" 233 ) 234 endif()