From feb559cea604a8990f4a4a062bd809fbb6f141fa Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Mon, 3 Jun 2019 18:33:03 +0300 Subject: [PATCH 01/16] CMake correct third_party handling --- sdks/cpp/CMakeLists.txt | 272 ++++++++------------------- sdks/cpp/cmake/Fetch_gRPC.cmake | 54 ------ sdks/cpp/cmake/agonesConfig.cmake.in | 4 +- sdks/cpp/cmake/prerequisites.cmake | 165 ++++++++++++++++ 4 files changed, 251 insertions(+), 244 deletions(-) delete mode 100644 sdks/cpp/cmake/Fetch_gRPC.cmake create mode 100644 sdks/cpp/cmake/prerequisites.cmake diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index a5e344b7a5..ee932d202c 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -20,38 +20,40 @@ cmake_minimum_required (VERSION 3.13.0) # For *nix: cmake --build . --target install -- -s option(AGONES_SILENT_OUTPUT "Show only warnings/error messages" OFF) if (AGONES_SILENT_OUTPUT) - function(message) - list(GET ARGV 0 MessageType) - if(MessageType STREQUAL FATAL_ERROR OR - MessageType STREQUAL SEND_ERROR OR - MessageType STREQUAL WARNING OR - MessageType STREQUAL AUTHOR_WARNING) - list(REMOVE_AT ARGV 0) - _message(${MessageType} "${ARGV}") - endif() - endfunction() - - set(CMAKE_INSTALL_MESSAGE NEVER) - set(CMAKE_VERBOSE_MAKEFILE OFF) - set_property(GLOBAL PROPERTY RULE_MESSAGES OFF) - set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) + function(message) + list(GET ARGV 0 MessageType) + list(REMOVE_AT ARGV 0) + if (MessageType STREQUAL FATAL_ERROR OR + MessageType STREQUAL SEND_ERROR OR + MessageType STREQUAL WARNING OR + MessageType STREQUAL AUTHOR_WARNING OR + NOT ${AGONES_SILENT_OUTPUT} + ) + _message(${MessageType} "${ARGV}") + endif() + endfunction() + + set(CMAKE_INSTALL_MESSAGE NEVER) + set(CMAKE_VERBOSE_MAKEFILE OFF) + set_property(GLOBAL PROPERTY RULE_MESSAGES OFF) + set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) endif(AGONES_SILENT_OUTPUT) # Project AGONES -project(agones VERSION 0.9.0 HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) +project(agones VERSION 0.10.0 HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) # Build options -option(AGONES_BUILD_SHARED "Build Agones C++ SDK as dynamic library" OFF) -option(AGONES_FORCE_GRPC_VERSION "Build Agones C++ SDK only with officially supported gRPC version" ON) -option(AGONES_CREATE_PACKAGE "Generate CMake installation step and package files for Agones C++ SDK" ON) +option(AGONES_FORCE_gRPC_VERSION "Build Agones C++ SDK only with officially supported gRPC version" ON) -# Currently we doesn't support build time generation of proto/grpc files, +# Currently we doesn't support build time generation of proto/gRPC files, # so gRPC version should be strict -set(AGONES_FORCE_GRPC_VERSION ON) +set(AGONES_FORCE_gRPC_VERSION ON) +set(AGONES_GRPC_VERSION_MATCH "") +if (AGONES_FORCE_gRPC_VERSION) + set(AGONES_GRPC_VERSION_MATCH EXACT) +endif() # Settings -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") - set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(CMAKE_CXX_STANDARD 14) @@ -60,212 +62,104 @@ set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) set(CMAKE_DEBUG_POSTFIX "d") -set(AGONES_GRPC_VERSION "1.16.1") - -if (AGONES_BUILD_SHARED) - add_compile_definitions( - PROTOBUF_USE_DLLS - LIBPROTOBUF_EXPORTS - ) -endif() - -# --> Connecting gRPC -macro(validate_path IN_PATH OUT_RESULT) - set(${OUT_RESULT} FALSE) - if (NOT IS_DIRECTORY ${${IN_PATH}}) - file(TO_CMAKE_PATH "$ENV{${IN_PATH}}" ${IN_PATH}) - else() - file(TO_CMAKE_PATH "${${IN_PATH}}" ${IN_PATH}) - endif() - if (IS_DIRECTORY ${${IN_PATH}}) - set(${OUT_RESULT} TRUE) - endif() -endmacro(validate_path) - -set(GRPC_IS_INSTALLED FALSE) -set(GRPC_PATH_FOUND FALSE) -validate_path(grpc_SOURCE_DIR GRPC_PATH_FOUND) -if (GRPC_PATH_FOUND) - # Checking if we use gRPC package or gRPC source folder - # Usually it should be findXXX.cmake or xxxConfig.cmake files, but for gRPC we need to check gRPCTargets.cmake too - if (EXISTS ${grpc_SOURCE_DIR}/gRPCTargets.cmake) - set(GRPC_IS_INSTALLED TRUE) - find_package(gRPC CONFIG REQUIRED) - endif() -else() - # Download gRPC, if necessary - include(Fetch_gRPC) -endif() - -add_subdirectory(${grpc_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL) - -# Check gRPC version -get_directory_property(GRPC_VERSION DIRECTORY ${grpc_SOURCE_DIR} DEFINITION PACKAGE_VERSION) -if (NOT GRPC_VERSION STREQUAL AGONES_GRPC_VERSION) - set(GRPC_VERSION_SEVERITY WARNING) - if (AGONES_FORCE_GRPC_VERSION) - set(GRPC_VERSION_SEVERITY FATAL_ERROR) - endif() - message(${GRPC_VERSION_SEVERITY} "Agones SDK currently supports only \"${AGONES_GRPC_VERSION}\" version. Building with \"${GRPC_VERSION}\" may cause unexpected problems.") -endif() +set(AGONES_gRPC_VERSION "1.16.1") -# Configuring -set(AGONES_DEPENDENCIES libprotobuf grpc++_unsecure) -set(AGONES_GRPC_TARGETS address_sorting c-ares gpr grpc_unsecure grpc++_unsecure libprotobuf zlibstatic) -foreach(THIRDPARTY_TARGET ${AGONES_GRPC_TARGETS}) - set_property(TARGET ${THIRDPARTY_TARGET} PROPERTY FOLDER third_party) -endforeach() -# <-- Connecting gRPC +# Third party +include(./cmake/prerequisites.cmake) +find_package(gRPC ${AGONES_gRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} CONFIG REQUIRED) +find_package(protobuf CONFIG REQUIRED) # Platform specific stuff if (WIN32) - # Windows - add_compile_definitions( - _WIN32_WINNT=0x0600 - WINDOWS - ) + # Windows + add_compile_definitions( + _WIN32_WINNT=0x0600 + WINDOWS + ) elseif (APPLE) - # Mac OS + # Mac OS elseif (UNIX AND NOT APPLE) - # Linux -endif() - -if (MSVS) - set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661) - target_compile_options(libprotobuf PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS}) - target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS}) -else() - set(OPT_DISABLE_COMPILER_WARNINGS -wd4101 -wd4146 -wd4251 -wd4661) + # Linux endif() # Agones SDK include(./sources.cmake) -set(AGONES_BUILD_TYPE STATIC) -if (AGONES_BUILD_SHARED) - set(AGONES_BUILD_TYPE SHARED) +# Global header +set(GLOBAL_HEADER "${PROJECT_NAME}_global.h") +set(GLOBAL_CONFIG_CONTENT "\n") +configure_file(cmake/${GLOBAL_HEADER}.in ${GLOBAL_HEADER} @ONLY) + +if(MSVC) + add_definitions(/FI"${GLOBAL_HEADER}") +else() + # GCC or Clang + add_definitions(-include ${GLOBAL_HEADER}) endif() -add_library(${PROJECT_NAME} ${AGONES_BUILD_TYPE} ${ALL_FILES}) -target_link_libraries(${PROJECT_NAME} PRIVATE ${AGONES_DEPENDENCIES}) +set(AGONES_DEPENDENCIES gRPC::grpc++_unsecure protobuf::libprotobuf) + +add_library(${PROJECT_NAME} STATIC ${ALL_FILES}) +target_link_libraries(${PROJECT_NAME} PUBLIC ${AGONES_DEPENDENCIES}) target_include_directories(${PROJECT_NAME} PUBLIC - $ - $ - $ + $ + $ + $ ) # Fix compiler warnings # https://github.com/protocolbuffers/protobuf/blob/master/cmake/README.md#notes-on-compiler-warnings +if (MSVC) + set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661) +else() + set(OPT_DISABLE_COMPILER_WARNINGS -wd4101 -wd4146 -wd4251 -wd4661) +endif() +target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS}) # Export header include(GenerateExportHeader) set(EXPORT_HEADER "${PROJECT_NAME}_export.h") generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ${EXPORT_HEADER} DEFINE_NO_DEPRECATED) -# Global header -set(GLOBAL_HEADER "${PROJECT_NAME}_global.h") -set(GLOBAL_CONFIG_CONTENT "") -if (AGONES_BUILD_SHARED) - set(GLOBAL_CONFIG_CONTENT "\ -// Dynamic linkage require macro for protobuf\n\ -#ifndef PROTOBUF_USE_DLLS\n\ -#define PROTOBUF_USE_DLLS\n\ -#endif\n" - ) -endif() -configure_file(cmake/${GLOBAL_HEADER}.in ${GLOBAL_HEADER} @ONLY) - -if(MSVC) - add_definitions(/FI"${GLOBAL_HEADER}") -else() - # GCC or Clang - add_definitions(-include ${GLOBAL_HEADER}) -endif() - # CMake package generation include(CMakePackageConfigHelpers) -if (AGONES_CREATE_PACKAGE) - set(_INCLUDE_DIRS "include") - set(_CMAKE_CONFIG_DESTINATION "cmake") +set(_INCLUDE_DIRS "include") +set(_CMAKE_CONFIG_DESTINATION "cmake") - # If gRPC is built from source (not from package), then we need to redistribute gRPC and it dependencies - if (NOT GRPC_IS_INSTALLED) - # gRPC headers - install(DIRECTORY ${grpc_SOURCE_DIR}/include/ DESTINATION ${_INCLUDE_DIRS}) - # Protobuf headers - install(DIRECTORY ${grpc_SOURCE_DIR}/third_party/protobuf/src/ DESTINATION ${_INCLUDE_DIRS} FILES_MATCHING PATTERN "*.h") - # gRPC and it dependencies - if (NOT AGONES_BUILD_SHARED) - install(TARGETS ${AGONES_GRPC_TARGETS} EXPORT gRPC - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - INCLUDES DESTINATION ${_INCLUDE_DIRS} - ) - endif() - endif() - - # Config for find_package - configure_package_config_file( +# Config for find_package +configure_package_config_file( cmake/${PROJECT_NAME}Config.cmake.in ${PROJECT_NAME}Config.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/${_CMAKE_CONFIG_DESTINATION} PATH_VARS _INCLUDE_DIRS PROJECT_VERSION - NO_SET_AND_CHECK_MACRO - ) - # Build artifacts - install(TARGETS ${PROJECT_NAME} ${AGONES_GRPC_TARGETS} EXPORT ${PROJECT_NAME} + NO_SET_AND_CHECK_MACRO +) + +# Build artifacts +install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME} LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin INCLUDES DESTINATION ${_INCLUDE_DIRS} - ) - install(EXPORT ${PROJECT_NAME} DESTINATION ${_CMAKE_CONFIG_DESTINATION} FILE ${PROJECT_NAME}Targets.cmake) - # Package config - install( +) +install(EXPORT ${PROJECT_NAME} DESTINATION ${_CMAKE_CONFIG_DESTINATION} FILE ${PROJECT_NAME}Targets.cmake) +# Package config +install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake DESTINATION ${_CMAKE_CONFIG_DESTINATION} - ) - # Agones header files - install( - FILES ${HEADER_FILES} "${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_HEADER}" "${CMAKE_CURRENT_BINARY_DIR}/${GLOBAL_HEADER}" +) +# Agones header files +install( + FILES ${HEADER_FILES} "${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_HEADER}" DESTINATION include/${PROJECT_NAME} - ) - # Google header files - install( +) +# Google header files +install( FILES ${GOOGLE_HEADER_FILES} DESTINATION include/google/api - ) - # PDB file - if (AGONES_BUILD_SHARED) - install(FILES $ DESTINATION bin CONFIGURATIONS Debug OPTIONAL) - install(FILES $ DESTINATION bin CONFIGURATIONS Debug OPTIONAL) - endif() - - unset(_INCLUDE_DIRS) - unset(_CMAKE_CONFIG_DESTINATION) -else() # Package is created with absolute pathes in build folder - # Use agones and thirdparty include directories - set(_INCLUDE_DIRS - "${CMAKE_CURRENT_LIST_DIR}/include" - "${grpc_SOURCE_DIR}/include" - "${grpc_SOURCE_DIR}/third_party/protobuf/src" - ) - set(_CMAKE_CONFIG_DESTINATION "${CMAKE_BINARY_DIR}") - - configure_package_config_file( - cmake/${PROJECT_NAME}Config.cmake.in - "${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake" - INSTALL_DESTINATION ${_CMAKE_CONFIG_DESTINATION} - PATH_VARS _INCLUDE_DIRS PROJECT_VERSION - NO_SET_AND_CHECK_MACRO - ) - export(TARGETS ${PROJECT_NAME} ${AGONES_GRPC_TARGETS} FILE "${CMAKE_BINARY_DIR}/${PROJECT_NAME}Targets.cmake") - # Register SDK local artifacts in system https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#package-registry-example - #export(PACKAGE ${PROJECT_NAME}) +) - unset(_INCLUDE_DIRS) - unset(_CMAKE_CONFIG_DESTINATION) -endif(AGONES_CREATE_PACKAGE) +unset(_INCLUDE_DIRS) +unset(_CMAKE_CONFIG_DESTINATION) diff --git a/sdks/cpp/cmake/Fetch_gRPC.cmake b/sdks/cpp/cmake/Fetch_gRPC.cmake deleted file mode 100644 index 4701b1ad2d..0000000000 --- a/sdks/cpp/cmake/Fetch_gRPC.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2019 Google LLC All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cmake_minimum_required (VERSION 3.12.0) - -include(FetchContent) - -set(GRPC_GIT_REPO "https://github.com/grpc/grpc.git") -set(GRPC_GIT_TAG "v${AGONES_GRPC_VERSION}") - -FetchContent_Declare( - grpc - GIT_REPOSITORY "${GRPC_GIT_REPO}" - GIT_TAG "${GRPC_GIT_TAG}" - PREFIX grpc - SOURCE_DIR "grpc/.src" - BINARY_DIR "grpc/.bin" - INSTALL_DIR "grpc/.install" - SUBBUILD_DIR "grpc/.subbuild" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) -FetchContent_GetProperties(grpc) -if (NOT grpc_POPULATED) - message("Fetching gRPC ${AGONES_GRPC_VERSION}") - FetchContent_Populate( - grpc - QUIET - GIT_REPOSITORY "${GRPC_GIT_REPO}" - GIT_TAG "${GRPC_GIT_TAG}" - PREFIX grpc - SOURCE_DIR "grpc/.src" - BINARY_DIR "grpc/.bin" - INSTALL_DIR "grpc/.install" - SUBBUILD_DIR "grpc/.subbuild" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) -endif() diff --git a/sdks/cpp/cmake/agonesConfig.cmake.in b/sdks/cpp/cmake/agonesConfig.cmake.in index 64c1e609ac..91293e717a 100644 --- a/sdks/cpp/cmake/agonesConfig.cmake.in +++ b/sdks/cpp/cmake/agonesConfig.cmake.in @@ -1,10 +1,12 @@ -set(agones_VERSION 0.9.0) +set(agones_VERSION @agones_VERSION@) @PACKAGE_INIT@ set(agones_INCLUDE_DIRS @PACKAGE__INCLUDE_DIRS@) include(CMakeFindDependencyMacro) +find_dependency(protobuf CONFIG REQUIRED) +find_dependency(gRPC CONFIG REQUIRED) include("${CMAKE_CURRENT_LIST_DIR}/agonesTargets.cmake") check_required_components(agones) \ No newline at end of file diff --git a/sdks/cpp/cmake/prerequisites.cmake b/sdks/cpp/cmake/prerequisites.cmake new file mode 100644 index 0000000000..38bb5b005d --- /dev/null +++ b/sdks/cpp/cmake/prerequisites.cmake @@ -0,0 +1,165 @@ +# Copyright 2019 Google LLC All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required (VERSION 3.13.0) + +option(BUILD_THIRDPARTY_DEBUG "Build debug version of thirdparty libraries (MSVC only)" TRUE) +set(OPENSSL_CONFIG_STRING "VC-WIN64A" CACHE STRING "See https://github.com/openssl/openssl/blob/master/INSTALL for details") + +if (NOT MSVC) + set(BUILD_THIRDPARTY_DEBUG FALSE) + set(OPENSSL_CONFIG_STRING "" CACHE STRING "" FORCE) +endif() + +set(THIRDPARTY_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}) + +set(gRPC_GIT_REPO "https://github.com/gRPC/gRPC.git") +set(gRPC_GIT_TAG "v1.16.1") + +# OpenSSL required only for successful build gRPC +set(OPENSSL_GIT_REPO "https://github.com/openssl/openssl.git") +set(OPENSSL_GIT_TAG "OpenSSL_1_1_1") + +include(FetchContent) + +function(download_git_repo NAME REPO TAG) + set(${NAME}_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${NAME}/src") + FetchContent_Declare( + ${NAME} + GIT_REPOSITORY "${REPO}" + GIT_TAG "${TAG}" + PREFIX ${NAME} + SOURCE_DIR "${${NAME}_DIR}" + BINARY_DIR "${NAME}/.bin" + INSTALL_DIR "${NAME}/.install" + SUBBUILD_DIR "${NAME}/.build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) + FetchContent_GetProperties(${NAME}) + if (NOT ${NAME}_POPULATED) + message("Fetching ${NAME} ${TAG}") + FetchContent_Populate( + ${NAME} + QUIET + GIT_REPOSITORY "${REPO}" + GIT_TAG "${TAG}" + PREFIX ${NAME} + SOURCE_DIR "${${NAME}_SOURCE_DIR}" + BINARY_DIR "${NAME}/.bin" + INSTALL_DIR "${NAME}/.install" + SUBBUILD_DIR "${NAME}/.build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) + endif() + set(${NAME}_SOURCE_DIR "${${NAME}_SOURCE_DIR}" PARENT_SCOPE) +endfunction(download_git_repo) + +function(execute_and_check WORKING_DIR) + execute_process( + COMMAND ${ARGN} + WORKING_DIRECTORY ${WORKING_DIR} + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE output + ) + set(OUTPUT_TYPE STATUS) + if (NOT ${result} EQUAL 0) + set(OUTPUT_TYPE FATAL_ERROR) + message(SEND_ERROR "Command:${ARGN}\n${result}\n") + endif() + message(${OUTPUT_TYPE} ${output}) +endfunction() + +function(invoke_cmake_build NAME CMAKELISTS_PATH) + message(STATUS "Building ${NAME}...") + + # Build directory + set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/third_party/${NAME}) + set(INSTALL_DIR ${THIRDPARTY_INSTALL_PATH}) + file(MAKE_DIRECTORY ${BUILD_DIR}) + + # Makefile generation + set(ARG_BUILD_TYPE "") + set(ARG_CONFIG_DEBUG "--config" "Debug") + set(ARG_CONFIG_RELEASE "--config" "Release") + if (NOT ${CMAKE_BUILD_TYPE} STREQUAL "") + set(ARG_BUILD_TYPE "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") + set(ARG_CONFIG_DEBUG "") + set(ARG_CONFIG_RELEASE "") + endif() + + execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} ${CMAKELISTS_PATH} -G ${CMAKE_GENERATOR} -Wno-dev ${ARG_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} ${ARGN}) + + # Building + if (BUILD_THIRDPARTY_DEBUG) + execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} --build . ${ARG_CONFIG_DEBUG} --target install) + endif() + + execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} --build . ${ARG_CONFIG_RELEASE} --target install) + set(${NAME}_DIR "${INSTALL_DIR}" PARENT_SCOPE) +endfunction(invoke_cmake_build) + +# OpenSSL +find_package(OpenSSL QUIET) + +if (NOT ${OpenSSL_FOUND}) + set(OPENSSL_ROOT_DIR "${THIRDPARTY_INSTALL_PATH}/OpenSSL") + find_package(OpenSSL QUIET) + if (NOT ${OpenSSL_FOUND}) + download_git_repo(openssl ${OPENSSL_GIT_REPO} ${OPENSSL_GIT_TAG}) + message(STATUS "Building OpenSSL... ${OPENSSL_CONFIG_STRING}") + if (WIN32) + execute_and_check(${openssl_SOURCE_DIR} perl Configure ${OPENSSL_CONFIG_STRING} "--prefix=${OPENSSL_ROOT_DIR}" "--openssldir=${OPENSSL_ROOT_DIR}") + execute_and_check(${openssl_SOURCE_DIR} nmake) + execute_and_check(${openssl_SOURCE_DIR} nmake install) + else() + execute_and_check(${openssl_SOURCE_DIR} "./config" "--prefix=${OPENSSL_ROOT_DIR}" "--openssldir=${OPENSSL_ROOT_DIR}") + execute_and_check(${openssl_SOURCE_DIR} make) + execute_and_check(${openssl_SOURCE_DIR} make install) + endif() + endif() +endif() + +# gRPC +find_package(gRPC QUIET) + +if (NOT ${gRPC_FOUND}) + download_git_repo(gRPC ${gRPC_GIT_REPO} ${gRPC_GIT_TAG}) + + invoke_cmake_build(zlib ${gRPC_SOURCE_DIR}/third_party/zlib) + invoke_cmake_build(cares ${gRPC_SOURCE_DIR}/third_party/cares/cares) + invoke_cmake_build(protobuf ${gRPC_SOURCE_DIR}/third_party/protobuf/cmake + "-DZLIB_ROOT=${zlib_DIR}" + "-Dprotobuf_MSVC_STATIC_RUNTIME=OFF" + "-Dprotobuf_BUILD_TESTS=OFF" + ) + invoke_cmake_build(gRPC ${gRPC_SOURCE_DIR} + "-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}" + "-DZLIB_ROOT=${zlib_DIR}" + "-DgRPC_INSTALL=ON" + "-DgRPC_BUILD_TESTS=OFF" + "-DgRPC_PROTOBUF_PROVIDER=package" + "-DgRPC_ZLIB_PROVIDER=package" + "-DgRPC_CARES_PROVIDER=package" + "-DgRPC_SSL_PROVIDER=package" + ) + + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_INSTALL_PREFIX}) +endif() \ No newline at end of file From 79da10d9fbdcf368b57eda534d08d4aef1b9644b Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Mon, 3 Jun 2019 19:29:12 +0300 Subject: [PATCH 02/16] Fixed protobuf lookup on MacOS --- sdks/cpp/CMakeLists.txt | 4 ++-- sdks/cpp/build_scripts/build.sh | 0 sdks/cpp/cmake/prerequisites.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 sdks/cpp/build_scripts/build.sh diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index ee932d202c..b869e8a1d3 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -66,8 +66,8 @@ set(AGONES_gRPC_VERSION "1.16.1") # Third party include(./cmake/prerequisites.cmake) +find_package(Protobuf CONFIG REQUIRED) find_package(gRPC ${AGONES_gRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} CONFIG REQUIRED) -find_package(protobuf CONFIG REQUIRED) # Platform specific stuff if (WIN32) @@ -113,7 +113,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC if (MSVC) set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661) else() - set(OPT_DISABLE_COMPILER_WARNINGS -wd4101 -wd4146 -wd4251 -wd4661) + # set(OPT_DISABLE_COMPILER_WARNINGS -wd4101 -wd4146 -wd4251 -wd4661) endif() target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS}) diff --git a/sdks/cpp/build_scripts/build.sh b/sdks/cpp/build_scripts/build.sh old mode 100644 new mode 100755 diff --git a/sdks/cpp/cmake/prerequisites.cmake b/sdks/cpp/cmake/prerequisites.cmake index 38bb5b005d..9777414d83 100644 --- a/sdks/cpp/cmake/prerequisites.cmake +++ b/sdks/cpp/cmake/prerequisites.cmake @@ -145,7 +145,7 @@ if (NOT ${gRPC_FOUND}) invoke_cmake_build(zlib ${gRPC_SOURCE_DIR}/third_party/zlib) invoke_cmake_build(cares ${gRPC_SOURCE_DIR}/third_party/cares/cares) - invoke_cmake_build(protobuf ${gRPC_SOURCE_DIR}/third_party/protobuf/cmake + invoke_cmake_build(Protobuf ${gRPC_SOURCE_DIR}/third_party/protobuf/cmake "-DZLIB_ROOT=${zlib_DIR}" "-Dprotobuf_MSVC_STATIC_RUNTIME=OFF" "-Dprotobuf_BUILD_TESTS=OFF" From 43851cb785d9470b8d702a90ffebb073c8265b73 Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Thu, 6 Jun 2019 19:13:28 +0300 Subject: [PATCH 03/16] Cpp SDK. Improved CMake build. --- sdks/cpp/CMakeLists.txt | 12 +++---- sdks/cpp/cmake/prerequisites.cmake | 54 +++++++++++++++++------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index b869e8a1d3..e72dbd5bb7 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -40,7 +40,7 @@ if (AGONES_SILENT_OUTPUT) endif(AGONES_SILENT_OUTPUT) # Project AGONES -project(agones VERSION 0.10.0 HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) +project(agones VERSION 0.11.0 HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) # Build options option(AGONES_FORCE_gRPC_VERSION "Build Agones C++ SDK only with officially supported gRPC version" ON) @@ -66,8 +66,8 @@ set(AGONES_gRPC_VERSION "1.16.1") # Third party include(./cmake/prerequisites.cmake) -find_package(Protobuf CONFIG REQUIRED) -find_package(gRPC ${AGONES_gRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} CONFIG REQUIRED) +find_package(Protobuf REQUIRED CONFIG) +find_package(gRPC ${AGONES_gRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} REQUIRED CONFIG) # Platform specific stuff if (WIN32) @@ -111,11 +111,9 @@ target_include_directories(${PROJECT_NAME} PUBLIC # Fix compiler warnings # https://github.com/protocolbuffers/protobuf/blob/master/cmake/README.md#notes-on-compiler-warnings if (MSVC) - set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661) -else() - # set(OPT_DISABLE_COMPILER_WARNINGS -wd4101 -wd4146 -wd4251 -wd4661) + set(OPT_DISABLE_COMPILER_WARNINGS /wd4101 /wd4146 /wd4251 /wd4661) + target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS}) endif() -target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_DISABLE_COMPILER_WARNINGS}) # Export header include(GenerateExportHeader) diff --git a/sdks/cpp/cmake/prerequisites.cmake b/sdks/cpp/cmake/prerequisites.cmake index 9777414d83..50f6b5d4dc 100644 --- a/sdks/cpp/cmake/prerequisites.cmake +++ b/sdks/cpp/cmake/prerequisites.cmake @@ -14,16 +14,16 @@ cmake_minimum_required (VERSION 3.13.0) -option(BUILD_THIRDPARTY_DEBUG "Build debug version of thirdparty libraries (MSVC only)" TRUE) +option(BUILD_THIRDPARTY_DEBUG "Build debug version of thirdparty libraries (MSVC only)" ON) set(OPENSSL_CONFIG_STRING "VC-WIN64A" CACHE STRING "See https://github.com/openssl/openssl/blob/master/INSTALL for details") +set(THIRDPARTY_INSTALL_PATH "${CMAKE_BINARY_DIR}/third_party" CACHE STRING "Path for installing third-party OpenSSL and gRPC, if they are not found with find_package") if (NOT MSVC) set(BUILD_THIRDPARTY_DEBUG FALSE) set(OPENSSL_CONFIG_STRING "" CACHE STRING "" FORCE) endif() -set(THIRDPARTY_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}) - +# gRPC repo and version set(gRPC_GIT_REPO "https://github.com/gRPC/gRPC.git") set(gRPC_GIT_TAG "v1.16.1") @@ -34,16 +34,17 @@ set(OPENSSL_GIT_TAG "OpenSSL_1_1_1") include(FetchContent) function(download_git_repo NAME REPO TAG) - set(${NAME}_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${NAME}/src") + set(BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NAME}) + set(${NAME}_SOURCE_DIR "${BASE_DIR}/src") FetchContent_Declare( ${NAME} GIT_REPOSITORY "${REPO}" GIT_TAG "${TAG}" PREFIX ${NAME} - SOURCE_DIR "${${NAME}_DIR}" - BINARY_DIR "${NAME}/.bin" - INSTALL_DIR "${NAME}/.install" - SUBBUILD_DIR "${NAME}/.build" + SOURCE_DIR "${BASE_DIR}/src" + BINARY_DIR "${BASE_DIR}/.bin" + INSTALL_DIR "${BASE_DIR}/.install" + SUBBUILD_DIR "${BASE_DIR}/.build" CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" @@ -58,10 +59,10 @@ function(download_git_repo NAME REPO TAG) GIT_REPOSITORY "${REPO}" GIT_TAG "${TAG}" PREFIX ${NAME} - SOURCE_DIR "${${NAME}_SOURCE_DIR}" - BINARY_DIR "${NAME}/.bin" - INSTALL_DIR "${NAME}/.install" - SUBBUILD_DIR "${NAME}/.build" + SOURCE_DIR "${BASE_DIR}/src" + BINARY_DIR "${BASE_DIR}/.bin" + INSTALL_DIR "${BASE_DIR}/.install" + SUBBUILD_DIR "${BASE_DIR}/.build" CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" @@ -91,8 +92,8 @@ function(invoke_cmake_build NAME CMAKELISTS_PATH) message(STATUS "Building ${NAME}...") # Build directory - set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/third_party/${NAME}) - set(INSTALL_DIR ${THIRDPARTY_INSTALL_PATH}) + set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NAME}/.bin) + set(INSTALL_DIR ${THIRDPARTY_INSTALL_PATH}/${NAME}) file(MAKE_DIRECTORY ${BUILD_DIR}) # Makefile generation @@ -105,7 +106,7 @@ function(invoke_cmake_build NAME CMAKELISTS_PATH) set(ARG_CONFIG_RELEASE "") endif() - execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} ${CMAKELISTS_PATH} -G ${CMAKE_GENERATOR} -Wno-dev ${ARG_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} ${ARGN}) + execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} ${CMAKELISTS_PATH} -G ${CMAKE_GENERATOR} -Wno-dev ${ARG_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DCMAKE_MODULE_PATH=${THIRDPARTY_INSTALL_PATH} -DCMAKE_PREFIX_PATH=${THIRDPARTY_INSTALL_PATH} ${ARGN}) # Building if (BUILD_THIRDPARTY_DEBUG) @@ -116,10 +117,11 @@ function(invoke_cmake_build NAME CMAKELISTS_PATH) set(${NAME}_DIR "${INSTALL_DIR}" PARENT_SCOPE) endfunction(invoke_cmake_build) -# OpenSSL +find_package(gRPC CONFIG QUIET) find_package(OpenSSL QUIET) -if (NOT ${OpenSSL_FOUND}) +# OpenSSL // Required only for gRPC build. Do not build, if gRPC is found. +if (NOT ${OpenSSL_FOUND} AND NOT ${gRPC_FOUND}) set(OPENSSL_ROOT_DIR "${THIRDPARTY_INSTALL_PATH}/OpenSSL") find_package(OpenSSL QUIET) if (NOT ${OpenSSL_FOUND}) @@ -138,28 +140,34 @@ if (NOT ${OpenSSL_FOUND}) endif() # gRPC -find_package(gRPC QUIET) - if (NOT ${gRPC_FOUND}) download_git_repo(gRPC ${gRPC_GIT_REPO} ${gRPC_GIT_TAG}) + file(MAKE_DIRECTORY ${THIRDPARTY_INSTALL_PATH}) + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${THIRDPARTY_INSTALL_PATH}) + # Build gRPC prerequisites invoke_cmake_build(zlib ${gRPC_SOURCE_DIR}/third_party/zlib) - invoke_cmake_build(cares ${gRPC_SOURCE_DIR}/third_party/cares/cares) + invoke_cmake_build(c-ares ${gRPC_SOURCE_DIR}/third_party/cares/cares) invoke_cmake_build(Protobuf ${gRPC_SOURCE_DIR}/third_party/protobuf/cmake "-DZLIB_ROOT=${zlib_DIR}" "-Dprotobuf_MSVC_STATIC_RUNTIME=OFF" "-Dprotobuf_BUILD_TESTS=OFF" ) + + # Build gRPC as cmake package + set(OPENSSL_PARAM "") + if (DEFINED OPENSSL_ROOT_DIR) + set(OPENSSL_PARAM "-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}") + endif() invoke_cmake_build(gRPC ${gRPC_SOURCE_DIR} - "-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}" + "${OPENSSL_PARAM}" "-DZLIB_ROOT=${zlib_DIR}" "-DgRPC_INSTALL=ON" "-DgRPC_BUILD_TESTS=OFF" "-DgRPC_PROTOBUF_PROVIDER=package" + "-DgRPC_PROTOBUF_PACKAGE_TYPE=CONFIG" "-DgRPC_ZLIB_PROVIDER=package" "-DgRPC_CARES_PROVIDER=package" "-DgRPC_SSL_PROVIDER=package" ) - - set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_INSTALL_PREFIX}) endif() \ No newline at end of file From 262b187f9dd15267726b0c33755fdf4fa8362e9e Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Fri, 7 Jun 2019 02:29:27 +0300 Subject: [PATCH 04/16] Fixed ZLib reference --- sdks/cpp/CMakeLists.txt | 3 ++- sdks/cpp/cmake/prerequisites.cmake | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index e72dbd5bb7..cb5f5bfee1 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -66,6 +66,7 @@ set(AGONES_gRPC_VERSION "1.16.1") # Third party include(./cmake/prerequisites.cmake) +find_package(ZLIB REQUIRED) find_package(Protobuf REQUIRED CONFIG) find_package(gRPC ${AGONES_gRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} REQUIRED CONFIG) @@ -97,7 +98,7 @@ else() add_definitions(-include ${GLOBAL_HEADER}) endif() -set(AGONES_DEPENDENCIES gRPC::grpc++_unsecure protobuf::libprotobuf) +set(AGONES_DEPENDENCIES protobuf::libprotobuf gRPC::grpc++_unsecure) add_library(${PROJECT_NAME} STATIC ${ALL_FILES}) target_link_libraries(${PROJECT_NAME} PUBLIC ${AGONES_DEPENDENCIES}) diff --git a/sdks/cpp/cmake/prerequisites.cmake b/sdks/cpp/cmake/prerequisites.cmake index 50f6b5d4dc..d6934261ce 100644 --- a/sdks/cpp/cmake/prerequisites.cmake +++ b/sdks/cpp/cmake/prerequisites.cmake @@ -69,7 +69,7 @@ function(download_git_repo NAME REPO TAG) TEST_COMMAND "" ) endif() - set(${NAME}_SOURCE_DIR "${${NAME}_SOURCE_DIR}" PARENT_SCOPE) + set(${NAME}_SOURCE_DIR "${${NAME}_SOURCE_DIR}" CACHE PATH "Source directory for ${NAME}" FORCE) endfunction(download_git_repo) function(execute_and_check WORKING_DIR) @@ -114,7 +114,7 @@ function(invoke_cmake_build NAME CMAKELISTS_PATH) endif() execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} --build . ${ARG_CONFIG_RELEASE} --target install) - set(${NAME}_DIR "${INSTALL_DIR}" PARENT_SCOPE) + set(${NAME}_DIR "${INSTALL_DIR}" CACHE PATH "CMake package directory for ${NAME}" FORCE) endfunction(invoke_cmake_build) find_package(gRPC CONFIG QUIET) @@ -122,7 +122,7 @@ find_package(OpenSSL QUIET) # OpenSSL // Required only for gRPC build. Do not build, if gRPC is found. if (NOT ${OpenSSL_FOUND} AND NOT ${gRPC_FOUND}) - set(OPENSSL_ROOT_DIR "${THIRDPARTY_INSTALL_PATH}/OpenSSL") + set(OPENSSL_ROOT_DIR "${THIRDPARTY_INSTALL_PATH}/OpenSSL" CACHE PATH "OpenSSL root directory" FORCE) find_package(OpenSSL QUIET) if (NOT ${OpenSSL_FOUND}) download_git_repo(openssl ${OPENSSL_GIT_REPO} ${OPENSSL_GIT_TAG}) @@ -147,6 +147,7 @@ if (NOT ${gRPC_FOUND}) # Build gRPC prerequisites invoke_cmake_build(zlib ${gRPC_SOURCE_DIR}/third_party/zlib) + set(ZLIB_ROOT "${zlib_DIR}" CACHE PATH "ZLIB root dir for find_package" FORCE) invoke_cmake_build(c-ares ${gRPC_SOURCE_DIR}/third_party/cares/cares) invoke_cmake_build(Protobuf ${gRPC_SOURCE_DIR}/third_party/protobuf/cmake "-DZLIB_ROOT=${zlib_DIR}" From 76f98c5cbde5491246377fcfe710b7a59fab7f7c Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Mon, 10 Jun 2019 17:40:38 +0300 Subject: [PATCH 05/16] Cpp SDK docs update. Build scripts unification. --- sdks/cpp/CMakeLists.txt | 10 ++--- .../build_scripts/msvs_2017_x64_release.bat | 2 +- sdks/cpp/cmake/prerequisites.cmake | 33 ++++++++------ .../content/en/docs/Guides/Client SDKs/cpp.md | 45 +++++++++++-------- 4 files changed, 52 insertions(+), 38 deletions(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index cb5f5bfee1..89e89ebdfc 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -43,13 +43,13 @@ endif(AGONES_SILENT_OUTPUT) project(agones VERSION 0.11.0 HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) # Build options -option(AGONES_FORCE_gRPC_VERSION "Build Agones C++ SDK only with officially supported gRPC version" ON) +option(AGONES_FORCE_GRPC_VERSION "Build Agones C++ SDK only with supported gRPC version" ON) # Currently we doesn't support build time generation of proto/gRPC files, # so gRPC version should be strict -set(AGONES_FORCE_gRPC_VERSION ON) +set(AGONES_FORCE_GRPC_VERSION ON) set(AGONES_GRPC_VERSION_MATCH "") -if (AGONES_FORCE_gRPC_VERSION) +if (AGONES_FORCE_GRPC_VERSION) set(AGONES_GRPC_VERSION_MATCH EXACT) endif() @@ -62,13 +62,13 @@ set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) set(CMAKE_DEBUG_POSTFIX "d") -set(AGONES_gRPC_VERSION "1.16.1") +set(AGONES_GRPC_VERSION "1.16.1") # Third party include(./cmake/prerequisites.cmake) find_package(ZLIB REQUIRED) find_package(Protobuf REQUIRED CONFIG) -find_package(gRPC ${AGONES_gRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} REQUIRED CONFIG) +find_package(gRPC ${AGONES_GRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} REQUIRED CONFIG) # Platform specific stuff if (WIN32) diff --git a/sdks/cpp/build_scripts/msvs_2017_x64_release.bat b/sdks/cpp/build_scripts/msvs_2017_x64_release.bat index e56429ba06..9c586fb432 100644 --- a/sdks/cpp/build_scripts/msvs_2017_x64_release.bat +++ b/sdks/cpp/build_scripts/msvs_2017_x64_release.bat @@ -17,6 +17,6 @@ pushd .. if not exist ".build" md ".build" pushd ".build" cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=./install -Wno-dev -cmake --build . --config Release --target INSTALL +cmake --build . --config Release --target install popd popd diff --git a/sdks/cpp/cmake/prerequisites.cmake b/sdks/cpp/cmake/prerequisites.cmake index d6934261ce..7b29d5c1e7 100644 --- a/sdks/cpp/cmake/prerequisites.cmake +++ b/sdks/cpp/cmake/prerequisites.cmake @@ -14,15 +14,21 @@ cmake_minimum_required (VERSION 3.13.0) -option(BUILD_THIRDPARTY_DEBUG "Build debug version of thirdparty libraries (MSVC only)" ON) -set(OPENSSL_CONFIG_STRING "VC-WIN64A" CACHE STRING "See https://github.com/openssl/openssl/blob/master/INSTALL for details") -set(THIRDPARTY_INSTALL_PATH "${CMAKE_BINARY_DIR}/third_party" CACHE STRING "Path for installing third-party OpenSSL and gRPC, if they are not found with find_package") +option(AGONES_BUILD_THIRDPARTY_DEBUG "Build debug version of thirdparty libraries (MSVC only)" ON) +set(AGONES_OPENSSL_CONFIG_STRING "VC-WIN64A" CACHE STRING "See https://github.com/openssl/openssl/blob/master/INSTALL for details") +set(AGONES_THIRDPARTY_INSTALL_PATH "${CMAKE_BINARY_DIR}/third_party" CACHE STRING "Path for installing third-party OpenSSL and gRPC, if they are not found with find_package") if (NOT MSVC) - set(BUILD_THIRDPARTY_DEBUG FALSE) - set(OPENSSL_CONFIG_STRING "" CACHE STRING "" FORCE) + set(AGONES_BUILD_THIRDPARTY_DEBUG FALSE) + set(AGONES_OPENSSL_CONFIG_STRING "" CACHE STRING "" FORCE) endif() +include(ProcessorCount) +ProcessorCount(CPU_COUNT) +if (CPU_COUNT GREATER 0 AND NOT DEFINED CMAKE_BUILD_PARALLEL_LEVEL) + set($ENV{CMAKE_BUILD_PARALLEL_LEVEL} ${CPU_COUNT}) +endif(CPU_COUNT) + # gRPC repo and version set(gRPC_GIT_REPO "https://github.com/gRPC/gRPC.git") set(gRPC_GIT_TAG "v1.16.1") @@ -83,7 +89,6 @@ function(execute_and_check WORKING_DIR) set(OUTPUT_TYPE STATUS) if (NOT ${result} EQUAL 0) set(OUTPUT_TYPE FATAL_ERROR) - message(SEND_ERROR "Command:${ARGN}\n${result}\n") endif() message(${OUTPUT_TYPE} ${output}) endfunction() @@ -93,7 +98,7 @@ function(invoke_cmake_build NAME CMAKELISTS_PATH) # Build directory set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NAME}/.bin) - set(INSTALL_DIR ${THIRDPARTY_INSTALL_PATH}/${NAME}) + set(INSTALL_DIR ${AGONES_THIRDPARTY_INSTALL_PATH}/${NAME}) file(MAKE_DIRECTORY ${BUILD_DIR}) # Makefile generation @@ -106,10 +111,10 @@ function(invoke_cmake_build NAME CMAKELISTS_PATH) set(ARG_CONFIG_RELEASE "") endif() - execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} ${CMAKELISTS_PATH} -G ${CMAKE_GENERATOR} -Wno-dev ${ARG_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DCMAKE_MODULE_PATH=${THIRDPARTY_INSTALL_PATH} -DCMAKE_PREFIX_PATH=${THIRDPARTY_INSTALL_PATH} ${ARGN}) + execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} ${CMAKELISTS_PATH} -G ${CMAKE_GENERATOR} -Wno-dev ${ARG_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DCMAKE_MODULE_PATH=${AGONES_THIRDPARTY_INSTALL_PATH} -DCMAKE_PREFIX_PATH=${AGONES_THIRDPARTY_INSTALL_PATH} ${ARGN}) # Building - if (BUILD_THIRDPARTY_DEBUG) + if (AGONES_BUILD_THIRDPARTY_DEBUG) execute_and_check(${BUILD_DIR} ${CMAKE_COMMAND} --build . ${ARG_CONFIG_DEBUG} --target install) endif() @@ -122,13 +127,13 @@ find_package(OpenSSL QUIET) # OpenSSL // Required only for gRPC build. Do not build, if gRPC is found. if (NOT ${OpenSSL_FOUND} AND NOT ${gRPC_FOUND}) - set(OPENSSL_ROOT_DIR "${THIRDPARTY_INSTALL_PATH}/OpenSSL" CACHE PATH "OpenSSL root directory" FORCE) + set(OPENSSL_ROOT_DIR "${AGONES_THIRDPARTY_INSTALL_PATH}/OpenSSL" CACHE PATH "OpenSSL root directory" FORCE) find_package(OpenSSL QUIET) if (NOT ${OpenSSL_FOUND}) download_git_repo(openssl ${OPENSSL_GIT_REPO} ${OPENSSL_GIT_TAG}) - message(STATUS "Building OpenSSL... ${OPENSSL_CONFIG_STRING}") + message(STATUS "Building OpenSSL... ${AGONES_OPENSSL_CONFIG_STRING}") if (WIN32) - execute_and_check(${openssl_SOURCE_DIR} perl Configure ${OPENSSL_CONFIG_STRING} "--prefix=${OPENSSL_ROOT_DIR}" "--openssldir=${OPENSSL_ROOT_DIR}") + execute_and_check(${openssl_SOURCE_DIR} perl Configure ${AGONES_OPENSSL_CONFIG_STRING} "--prefix=${OPENSSL_ROOT_DIR}" "--openssldir=${OPENSSL_ROOT_DIR}") execute_and_check(${openssl_SOURCE_DIR} nmake) execute_and_check(${openssl_SOURCE_DIR} nmake install) else() @@ -142,8 +147,8 @@ endif() # gRPC if (NOT ${gRPC_FOUND}) download_git_repo(gRPC ${gRPC_GIT_REPO} ${gRPC_GIT_TAG}) - file(MAKE_DIRECTORY ${THIRDPARTY_INSTALL_PATH}) - set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${THIRDPARTY_INSTALL_PATH}) + file(MAKE_DIRECTORY ${AGONES_THIRDPARTY_INSTALL_PATH}) + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${AGONES_THIRDPARTY_INSTALL_PATH}) # Build gRPC prerequisites invoke_cmake_build(zlib ${gRPC_SOURCE_DIR}/third_party/zlib) diff --git a/site/content/en/docs/Guides/Client SDKs/cpp.md b/site/content/en/docs/Guides/Client SDKs/cpp.md index 15b20ce1e1..328df0e215 100644 --- a/site/content/en/docs/Guides/Client SDKs/cpp.md +++ b/site/content/en/docs/Guides/Client SDKs/cpp.md @@ -91,7 +91,6 @@ status = sdk->SetAnnotation("test-annotation", "test value"); if (!status.ok()) { ... } ``` - To get the details on the [backing `GameServer`]({{< relref "_index.md#gameserver" >}}) call `sdk->GameServer(&gameserver)`, passing in a `stable::agones::dev::sdk::GameServer*` to push the results of the `GameServer` configuration into. @@ -127,46 +126,56 @@ When running on Agones, the above functions should only fail under exceptional c file a bug if it occurs. ### Building the Libraries from source -CMake is used to build SDK for all platforms. It is possible to build SDK as a static or dynamic library. +CMake is used to build SDK for all supported platforms (Linux/Window/MacOS). ## Prerequisites * CMake >= 3.13.0 * Git * C++14 compiler +Agones SDK depends on [gRPC](https://github.com/grpc/grpc/blob/master/BUILDING.md). If CMake can't find gRPC with find_package(), it download and build gRPC. +There are some extra prerequisites for OpenSSL on Windows, see [documentation](https://github.com/openssl/openssl/blob/master/NOTES.WIN): +* Perl +* NASM + +Note that OpenSSL is not used in Agones SDK, but it required to have full successfull build of gRPC. + ## Options -Following options are available -- **AGONES_BUILD_SHARED** (default is OFF) - build sdk as a shared library. -- **AGONES_CREATE_PACKAGE** (default is ON) - create an "install" step, to create a cmake package. +Following options are available: +- **AGONES_THIRDPARTY_INSTALL_PATH** (default is ${CMAKE_BINARY_DIR}/third_party) - this path will be used to build and install Agones prerequisites, if they are not found by find_package. + +Windows only: +- **AGONES_BUILD_THIRDPARTY_DEBUG** (default is ON) - build both debug and release versions of SDK's prerequisities. Option is not used if you already have built gRPC. +- **AGONES_OPENSSL_CONFIG_STRING** (default is VC-WIN64A) - arguments to configure OpenSSL build ([documentation](https://github.com/openssl/openssl/blob/master/INSTALL)). Used only if OpenSSL and gRPC is built by Agones. + +## Linux / MacOS +``` +mkdir -p .build +cd .build +cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=./install +cmake --build . --target install +``` ## Windows Building with Visual Studio: ``` md .build cd .build -cmake .. -G "Visual Studio 15 2017 Win64" -Wno-dev -cmake --build . --config Release +cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=./install +cmake --build . --config Release --target install ``` Building with NMake ``` md .build cd .build -cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -Wno-dev -cmake --build . -``` - -## Linux / MacOS -``` -mkdir -p .build -cd .build -cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -Wno-dev -cmake --build . +cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install +cmake --build . --target install ``` ## Remarks +**CMAKE_INSTALL_PREFIX** may be skipped if it is OK to install Agones SDK to default location (usually /usr/local or c:/Program Files/Agones). CMake option `-Wno-dev` is specified to suppress [CMP0048](https://cmake.org/cmake/help/v3.13/policy/CMP0048.html) deprecation warning for gRPC dependency. ### Using SDK In CMake-based projects it's enough to specify a folder where SDK is installed with `CMAKE_PREFIX_PATH` and use `find_package(agones CONFIG REQUIRED)` command. For example: {{< ghlink href="examples/cpp-simple" >}}cpp-simple{{< / >}}. -If **AGONES_CREATE_PACKAGE** option is off, then `CMAKE_PREFIX_PATH` should be set to a path where SDK is built (usually `agones/sdks/cpp/.build`). It maybe useful to disable some [protobuf warnings](https://github.com/protocolbuffers/protobuf/blob/master/cmake/README.md#notes-on-compiler-warnings) in your project. From daa91041a9ff28c320b688b6fdd5db6063b4582c Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Tue, 18 Jun 2019 16:21:19 +0300 Subject: [PATCH 06/16] CMake option: build only prerequisities. (cherry picked from commit 0179a55c1ce20c449d8a60d3966e821552ecffdc) --- sdks/cpp/CMakeLists.txt | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index 89e89ebdfc..f5e2b92ef7 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -42,9 +42,24 @@ endif(AGONES_SILENT_OUTPUT) # Project AGONES project(agones VERSION 0.11.0 HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) -# Build options +# Options option(AGONES_FORCE_GRPC_VERSION "Build Agones C++ SDK only with supported gRPC version" ON) +option(AGONES_BUILD_ONLY_PREREQUISITIES "Build only prerequisites of Agones" OFF) +option(AGONES_BUILD_THIRDPARTY_DEBUG "Build debug version of thirdparty libraries (MSVC only)" ON) +set(AGONES_THIRDPARTY_INSTALL_PATH "${CMAKE_BINARY_DIR}/third_party" CACHE STRING "Path for installing third-party OpenSSL and gRPC, if they are not found with find_package") +set(AGONES_OPENSSL_CONFIG_STRING "VC-WIN64A" CACHE STRING "See https://github.com/openssl/openssl/blob/master/INSTALL for details") + +# Prerequisities +include(./cmake/prerequisites.cmake) +find_package(ZLIB REQUIRED) +find_package(Protobuf REQUIRED CONFIG) +find_package(gRPC ${AGONES_GRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} REQUIRED CONFIG) + +if (AGONES_BUILD_ONLY_PREREQUISITIES) + return() +endif() + # Currently we doesn't support build time generation of proto/gRPC files, # so gRPC version should be strict set(AGONES_FORCE_GRPC_VERSION ON) @@ -64,11 +79,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) set(CMAKE_DEBUG_POSTFIX "d") set(AGONES_GRPC_VERSION "1.16.1") -# Third party -include(./cmake/prerequisites.cmake) -find_package(ZLIB REQUIRED) -find_package(Protobuf REQUIRED CONFIG) -find_package(gRPC ${AGONES_GRPC_VERSION} ${AGONES_GRPC_VERSION_MATCH} REQUIRED CONFIG) # Platform specific stuff if (WIN32) From fcb9e754ebfa84d12c1f5afebd5ef84ac1334bae Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 19 Jun 2019 13:20:59 +0300 Subject: [PATCH 07/16] Cpp SDK. Picking version string from git tag. --- sdks/cpp/CMakeLists.txt | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index f5e2b92ef7..c9955b5054 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -39,8 +39,25 @@ if (AGONES_SILENT_OUTPUT) set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) endif(AGONES_SILENT_OUTPUT) +# Getting version from git +find_package(Git QUIET) +set(AGONES_VERSION "0.0.0") +if (Git_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0 + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ) + if (${result} EQUAL 0) + string(REPLACE "v" "" AGONES_VERSION ${output}) + endif() +else() + message(WARNING "Git was not found. Current Agones version is set to ${AGONES_VERSION}") +endif() + # Project AGONES -project(agones VERSION 0.11.0 HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) +project(agones VERSION ${AGONES_VERSION} HOMEPAGE_URL https://github.com/GoogleCloudPlatform/agones LANGUAGES C CXX) # Options option(AGONES_FORCE_GRPC_VERSION "Build Agones C++ SDK only with supported gRPC version" ON) From b532943dd3ad5e4e4964fd4ebdfd474c377ba8d4 Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 19 Jun 2019 13:46:36 +0300 Subject: [PATCH 08/16] Fixed regex for getting version number --- sdks/cpp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index 97c959b3ee..7f25d51b95 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -50,7 +50,7 @@ if (Git_FOUND) OUTPUT_VARIABLE output ) if (${result} EQUAL 0) - string(REPLACE "v" "" AGONES_VERSION ${output}) + string(REGEX MATCH "\\d+.\\d+.\\d+" AGONES_VERSION ${output}) endif() else() message(WARNING "Git was not found. Current Agones version is set to ${AGONES_VERSION}") From 16df65fd4fa1ac66ad9cbdd4cc2059933c4fbf8e Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 15:50:15 +0300 Subject: [PATCH 09/16] Cpp sdk, added clang-format build step --- sdks/cpp/CMakeLists.txt | 24 +++++++++++++++++++++++ sdks/cpp/sources.cmake | 42 ++++++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index 7f25d51b95..e888a89f5c 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -189,3 +189,27 @@ install( unset(_INCLUDE_DIRS) unset(_CMAKE_CONFIG_DESTINATION) + +# clang format +find_program( + CLANG_FORMAT_APP + NAMES "clang-format" + DOC "Path to clang-format" +) +if (NOT CLANG_FORMAT_APP) + message(STATUS "clang-format not found.") +else() + message(STATUS "clang-format found: ${CLANG_FORMAT_APP}") + + set(FILES_TO_FORMAT) + foreach(relpath ${SDK_FILES}) + get_filename_component(fullpath "${CMAKE_CURRENT_LIST_DIR}/${relpath}" ABSOLUTE) + list(APPEND FILES_TO_FORMAT ${fullpath}) + endforeach() + + add_custom_target( + clang-format-apply + COMMAND ${CLANG_FORMAT_APP} -i --style=file --fallback-style=Google ${FILES_TO_FORMAT} + ) + add_dependencies(${PROJECT_NAME} "clang-format-apply") +endif() diff --git a/sdks/cpp/sources.cmake b/sdks/cpp/sources.cmake index 24a09f9596..f8c89e64ca 100644 --- a/sdks/cpp/sources.cmake +++ b/sdks/cpp/sources.cmake @@ -1,27 +1,35 @@ set(SOURCE_FILES - src/agones/sdk.cc - src/agones/sdk.grpc.pb.cc - src/agones/sdk.pb.cc - - src/google/annotations.pb.cc - src/google/http.pb.cc + src/agones/sdk.cc ) set(HEADER_FILES - include/agones/sdk.h - include/agones/sdk.grpc.pb.h - include/agones/sdk.pb.h + include/agones/sdk.h ) -set(GOOGLE_HEADER_FILES - include/google/api/annotations.pb.h - include/google/api/http.pb.h +set(GENERATED_SOURCE_FILES + src/agones/sdk.grpc.pb.cc + src/agones/sdk.pb.cc + src/google/annotations.pb.cc + src/google/http.pb.cc +) + +set(GENERATED_HEADER_FILES + include/agones/sdk.grpc.pb.h + include/agones/sdk.pb.h + include/google/api/annotations.pb.h + include/google/api/http.pb.h ) set(ALL_FILES - ${SOURCE_FILES} - ${HEADER_FILES} - ${GOOGLE_HEADER_FILES} - "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_export.h" - "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_global.h" + ${SOURCE_FILES} + ${HEADER_FILES} + ${GENERATED_SOURCE_FILES} + ${GENERATED_HEADER_FILES} + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_export.h" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_global.h" ) + +set(SDK_FILES + ${SOURCE_FILES} + ${HEADER_FILES} +) \ No newline at end of file From 0262f4f0dae9f7a84b773ab427cfcba32ee60fc9 Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 16:56:33 +0300 Subject: [PATCH 10/16] Cpp clang-format verification build step --- sdks/cpp/CMakeLists.txt | 19 +++++++++++++++---- sdks/cpp/cmake/clang-verify.in | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 sdks/cpp/cmake/clang-verify.in diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index e888a89f5c..609859c7cf 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -201,15 +201,26 @@ if (NOT CLANG_FORMAT_APP) else() message(STATUS "clang-format found: ${CLANG_FORMAT_APP}") - set(FILES_TO_FORMAT) + set(CLANGFORMAT_INPUT) foreach(relpath ${SDK_FILES}) get_filename_component(fullpath "${CMAKE_CURRENT_LIST_DIR}/${relpath}" ABSOLUTE) - list(APPEND FILES_TO_FORMAT ${fullpath}) + list(APPEND CLANGFORMAT_INPUT ${fullpath}) endforeach() - + + # format add_custom_target( clang-format-apply - COMMAND ${CLANG_FORMAT_APP} -i --style=file --fallback-style=Google ${FILES_TO_FORMAT} + COMMAND ${CLANG_FORMAT_APP} -i --style=file --fallback-style=Google ${CLANGFORMAT_INPUT} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) add_dependencies(${PROJECT_NAME} "clang-format-apply") + + # verification + set(CLANGFORMAT_WORKING_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + configure_file("cmake/clang-verify.in" "clang-format/CMakeLists.txt" @ONLY) + add_custom_target( + clang-format-verify + COMMAND ${CMAKE_COMMAND} . + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/clang-format" + ) endif() diff --git a/sdks/cpp/cmake/clang-verify.in b/sdks/cpp/cmake/clang-verify.in new file mode 100644 index 0000000000..060d908d70 --- /dev/null +++ b/sdks/cpp/cmake/clang-verify.in @@ -0,0 +1,32 @@ +cmake_minimum_required (VERSION 3.13.0) + +set(files @CLANGFORMAT_INPUT@) +set(workingdir @CLANGFORMAT_WORKING_DIR@) + +find_package(Git REQUIRED) +find_program( + CLANG_FORMAT_APP + NAMES "clang-format" + DOC "Path to clang-format" +) + +if (NOT CLANG_FORMAT_APP) + message(FATAL_ERROR "Could not find clang-format") +endif() + +execute_process( + COMMAND ${CLANG_FORMAT_APP} -i --style=file --fallback-style=Google ${files} + WORKING_DIRECTORY ${workingdir} +) + +foreach(source_file ${files}) + execute_process( + COMMAND ${GIT_EXECUTABLE} diff HEAD~1 ${source_file} + WORKING_DIRECTORY ${workingdir} + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ) + if (NOT "${output}" STREQUAL "") + message(FATAL_ERROR "clang-format code style check failed for: ${source_file}") + endif() +endforeach() From 4caa3e849ec52ba6c871bc0f42212c691ece4a94 Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 17:22:16 +0300 Subject: [PATCH 11/16] Cpp codestyle verification with docker build --- build/build-sdk-images/cpp/Dockerfile | 2 +- build/build-sdk-images/cpp/build.sh | 2 +- sdks/cpp/Makefile | 5 +++- sdks/cpp/cmake/agonesConfig.cmake.in | 14 +++++++++++ sdks/cpp/cmake/clang-verify.in | 35 +++++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/build/build-sdk-images/cpp/Dockerfile b/build/build-sdk-images/cpp/Dockerfile index 4181f298cf..81b77ca27a 100644 --- a/build/build-sdk-images/cpp/Dockerfile +++ b/build/build-sdk-images/cpp/Dockerfile @@ -15,7 +15,7 @@ ARG BASE_IMAGE=agones-build-sdk-base:latest FROM $BASE_IMAGE RUN apt-get update && \ - apt-get install -y zip wget && \ + apt-get install -y zip wget clang-format-7 && \ apt-get clean ADD https://cmake.org/files/v3.14/cmake-3.14.1-Linux-x86_64.sh /cmake-3.14.1-Linux-x86_64.sh diff --git a/build/build-sdk-images/cpp/build.sh b/build/build-sdk-images/cpp/build.sh index 1894151c5a..ca3e952b44 100644 --- a/build/build-sdk-images/cpp/build.sh +++ b/build/build-sdk-images/cpp/build.sh @@ -17,4 +17,4 @@ set -ex cd ./sdks/cpp -make build install archive VERSION=$VERSION \ No newline at end of file +make build verify install archive VERSION=$VERSION \ No newline at end of file diff --git a/sdks/cpp/Makefile b/sdks/cpp/Makefile index 71cc050ea7..bf507c561e 100644 --- a/sdks/cpp/Makefile +++ b/sdks/cpp/Makefile @@ -26,7 +26,10 @@ build: -mkdir $(build_path) cd $(build_path) && cmake .. -DCMAKE_BUILD_TYPE=Release -DAGONES_SILENT_OUTPUT=ON -G "Unix Makefiles" -Wno-dev -DCMAKE_INSTALL_PREFIX=.install cd $(build_path) && cmake --build . --target install -- -s - + +verify: + cd $(build_path)/clang-format && cmake . -DAGONES_SILENT_OUTPUT=ON + install: cp -r $(build_path)/.install $(install_path) diff --git a/sdks/cpp/cmake/agonesConfig.cmake.in b/sdks/cpp/cmake/agonesConfig.cmake.in index 91293e717a..9931c30205 100644 --- a/sdks/cpp/cmake/agonesConfig.cmake.in +++ b/sdks/cpp/cmake/agonesConfig.cmake.in @@ -1,3 +1,17 @@ +# Copyright 2019 Google LLC All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + set(agones_VERSION @agones_VERSION@) @PACKAGE_INIT@ diff --git a/sdks/cpp/cmake/clang-verify.in b/sdks/cpp/cmake/clang-verify.in index 060d908d70..ee4e2ddb60 100644 --- a/sdks/cpp/cmake/clang-verify.in +++ b/sdks/cpp/cmake/clang-verify.in @@ -1,5 +1,40 @@ +# Copyright 2019 Google LLC All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + cmake_minimum_required (VERSION 3.13.0) +option(AGONES_SILENT_OUTPUT "Show only warnings/error messages" OFF) +if (AGONES_SILENT_OUTPUT) + function(message) + list(GET ARGV 0 MessageType) + list(REMOVE_AT ARGV 0) + if (MessageType STREQUAL FATAL_ERROR OR + MessageType STREQUAL SEND_ERROR OR + MessageType STREQUAL WARNING OR + MessageType STREQUAL AUTHOR_WARNING OR + NOT ${AGONES_SILENT_OUTPUT} + ) + _message(${MessageType} "${ARGV}") + endif() + endfunction() + + set(CMAKE_INSTALL_MESSAGE NEVER) + set(CMAKE_VERBOSE_MAKEFILE OFF) + set_property(GLOBAL PROPERTY RULE_MESSAGES OFF) + set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) +endif(AGONES_SILENT_OUTPUT) + set(files @CLANGFORMAT_INPUT@) set(workingdir @CLANGFORMAT_WORKING_DIR@) From 6da4b1d896f9a9918a032ade6dc1bf346904ed5d Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 17:45:14 +0300 Subject: [PATCH 12/16] clang-format installation in docker --- build/build-sdk-images/cpp/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/build-sdk-images/cpp/Dockerfile b/build/build-sdk-images/cpp/Dockerfile index 81b77ca27a..fe86a972df 100644 --- a/build/build-sdk-images/cpp/Dockerfile +++ b/build/build-sdk-images/cpp/Dockerfile @@ -15,7 +15,7 @@ ARG BASE_IMAGE=agones-build-sdk-base:latest FROM $BASE_IMAGE RUN apt-get update && \ - apt-get install -y zip wget clang-format-7 && \ + apt-get install -y zip wget clang-format && \ apt-get clean ADD https://cmake.org/files/v3.14/cmake-3.14.1-Linux-x86_64.sh /cmake-3.14.1-Linux-x86_64.sh @@ -37,4 +37,4 @@ ENV PATH /usr/local/go/bin:/go/bin:$PATH # code generation scripts COPY *.sh /root/ -RUN chmod +x /root/*.sh \ No newline at end of file +RUN chmod +x /root/*.sh From 881b49e976e8ce29ad5fc73b4e45b1984cf9fecf Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 17:45:34 +0300 Subject: [PATCH 13/16] Test of clang-format --- sdks/cpp/src/agones/sdk.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdks/cpp/src/agones/sdk.cc b/sdks/cpp/src/agones/sdk.cc index bf074ce5d4..8e7a2df968 100644 --- a/sdks/cpp/src/agones/sdk.cc +++ b/sdks/cpp/src/agones/sdk.cc @@ -22,7 +22,7 @@ const int kPort = 59357; namespace agones { -class SDKImpl final { +class SDKImpl final { public: std::shared_ptr channel_; std::unique_ptr stub_; From b5a6c9664d02064979f51f45faf79b3a4e84c72e Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 17:53:21 +0300 Subject: [PATCH 14/16] clang-format fixed git diff usage --- sdks/cpp/cmake/clang-verify.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdks/cpp/cmake/clang-verify.in b/sdks/cpp/cmake/clang-verify.in index ee4e2ddb60..e42626d39e 100644 --- a/sdks/cpp/cmake/clang-verify.in +++ b/sdks/cpp/cmake/clang-verify.in @@ -56,7 +56,7 @@ execute_process( foreach(source_file ${files}) execute_process( - COMMAND ${GIT_EXECUTABLE} diff HEAD~1 ${source_file} + COMMAND ${GIT_EXECUTABLE} diff WORKING_DIRECTORY ${workingdir} RESULT_VARIABLE result OUTPUT_VARIABLE output From 5cf365acc5e79f9f542e3a924a191cf215946df1 Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 19:53:39 +0300 Subject: [PATCH 15/16] test --- sdks/cpp/cmake/clang-verify.in | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sdks/cpp/cmake/clang-verify.in b/sdks/cpp/cmake/clang-verify.in index e42626d39e..d66136deb9 100644 --- a/sdks/cpp/cmake/clang-verify.in +++ b/sdks/cpp/cmake/clang-verify.in @@ -37,6 +37,7 @@ endif(AGONES_SILENT_OUTPUT) set(files @CLANGFORMAT_INPUT@) set(workingdir @CLANGFORMAT_WORKING_DIR@) +set(root @AGONES_ROOT@) find_package(Git REQUIRED) find_program( @@ -49,19 +50,22 @@ if (NOT CLANG_FORMAT_APP) message(FATAL_ERROR "Could not find clang-format") endif() +#[[ execute_process( COMMAND ${CLANG_FORMAT_APP} -i --style=file --fallback-style=Google ${files} WORKING_DIRECTORY ${workingdir} ) +]]# foreach(source_file ${files}) + file(RELATIVE_PATH source_relative ${root} ${source_file}) execute_process( - COMMAND ${GIT_EXECUTABLE} diff - WORKING_DIRECTORY ${workingdir} + COMMAND ${GIT_EXECUTABLE} diff --quiet "master:./${source_relative}" "./${source_relative}" + WORKING_DIRECTORY ${root} RESULT_VARIABLE result OUTPUT_VARIABLE output ) - if (NOT "${output}" STREQUAL "") - message(FATAL_ERROR "clang-format code style check failed for: ${source_file}") + if (NOT ${result} EQUAL 0) + message(FATAL_ERROR "clang-format code style check failed for: ${source_relative}") endif() endforeach() From f9101146c8da3225835ac8397eee6aa7d04fa73a Mon Sep 17 00:00:00 2001 From: Dmitry Sazonov Date: Wed, 26 Jun 2019 19:57:31 +0300 Subject: [PATCH 16/16] Fixed git diff usage for clang-format --- sdks/cpp/CMakeLists.txt | 3 ++- sdks/cpp/cmake/clang-verify.in | 5 +---- sdks/cpp/src/agones/sdk.cc | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/sdks/cpp/CMakeLists.txt b/sdks/cpp/CMakeLists.txt index 609859c7cf..95340ff28f 100644 --- a/sdks/cpp/CMakeLists.txt +++ b/sdks/cpp/CMakeLists.txt @@ -190,7 +190,7 @@ install( unset(_INCLUDE_DIRS) unset(_CMAKE_CONFIG_DESTINATION) -# clang format +# clang-format find_program( CLANG_FORMAT_APP NAMES "clang-format" @@ -217,6 +217,7 @@ else() # verification set(CLANGFORMAT_WORKING_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + get_filename_component(AGONES_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE) configure_file("cmake/clang-verify.in" "clang-format/CMakeLists.txt" @ONLY) add_custom_target( clang-format-verify diff --git a/sdks/cpp/cmake/clang-verify.in b/sdks/cpp/cmake/clang-verify.in index d66136deb9..c37aec7721 100644 --- a/sdks/cpp/cmake/clang-verify.in +++ b/sdks/cpp/cmake/clang-verify.in @@ -50,20 +50,17 @@ if (NOT CLANG_FORMAT_APP) message(FATAL_ERROR "Could not find clang-format") endif() -#[[ execute_process( COMMAND ${CLANG_FORMAT_APP} -i --style=file --fallback-style=Google ${files} WORKING_DIRECTORY ${workingdir} ) -]]# foreach(source_file ${files}) file(RELATIVE_PATH source_relative ${root} ${source_file}) execute_process( - COMMAND ${GIT_EXECUTABLE} diff --quiet "master:./${source_relative}" "./${source_relative}" + COMMAND ${GIT_EXECUTABLE} diff --quiet "HEAD:./${source_relative}" "./${source_relative}" WORKING_DIRECTORY ${root} RESULT_VARIABLE result - OUTPUT_VARIABLE output ) if (NOT ${result} EQUAL 0) message(FATAL_ERROR "clang-format code style check failed for: ${source_relative}") diff --git a/sdks/cpp/src/agones/sdk.cc b/sdks/cpp/src/agones/sdk.cc index 8e7a2df968..bf074ce5d4 100644 --- a/sdks/cpp/src/agones/sdk.cc +++ b/sdks/cpp/src/agones/sdk.cc @@ -22,7 +22,7 @@ const int kPort = 59357; namespace agones { -class SDKImpl final { +class SDKImpl final { public: std::shared_ptr channel_; std::unique_ptr stub_;