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()