cmake_minimum_required(VERSION 3.0.0)
project(kRPC)

set(VERSION_NUMBER 0.5.4)
set(CMAKE_BUILD_TYPE "Release")

if(CMAKE_COMPILER_IS_GNUCXX)
  # Enable C++ 2011 when building with gcc
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()

# Check for protobuf
find_package(Protobuf 3.2 REQUIRED)

# Check for ASIO headers
find_path(ASIO_INCLUDE_DIR asio.hpp)
if(NOT ASIO_INCLUDE_DIR)
  unset(ASIO_INCLUDE_DIR CACHE)
  message(FATAL_ERROR "asio.hpp not found")
endif()
add_definitions(-DASIO_STANDALONE)

if(WIN32 OR CYGWIN)
  add_definitions(-D_SCL_SECURE_NO_WARNINGS)
  add_definitions(-D_WIN32_WINNT=0x0501)
  add_definitions(-D__USE_W32_SOCKETS)
endif()

if(MSVC)
  # Esure .lib files are generated
  set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
  # protobuf statically links against MT, so need to compile with /MT not /MD
  foreach(var
        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
      if(${var} MATCHES "/MD")
        string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
      endif()
    endforeach()
endif()

include_directories(include include/krpc ${PROTOBUF_INCLUDE_DIRS} ${ASIO_INCLUDE_DIR})

if (PROTOBUF_PROTOC_EXECUTABLE)
  message(STATUS "Found Protobuf compiler ${PROTOBUF_PROTOC_EXECUTABLE}")
  protobuf_generate_cpp(PROTO_SRC_ORIG PROTO_HDR_ORIG protobuf/krpc.proto)
else()
  message(STATUS "Protobuf compiler not found; using pre-built source files")
  set(PROTO_HDR_ORIG ${CMAKE_CURRENT_SOURCE_DIR}/protobuf/krpc.pb.hpp)
  set(PROTO_SRC_ORIG ${CMAKE_CURRENT_SOURCE_DIR}/protobuf/krpc.pb.cpp)
endif()

set(PROTO_HDR ${CMAKE_CURRENT_BINARY_DIR}/protobuf/include/krpc/krpc.pb.hpp)
set(PROTO_SRC ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/krpc.pb.cpp)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/protobuf/include)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/protobuf/include/krpc)

add_custom_command(
  OUTPUT ${PROTO_HDR}
  COMMAND ${CMAKE_COMMAND} -E copy ${PROTO_HDR_ORIG} ${PROTO_HDR}
  DEPENDS ${PROTO_HDR_ORIG}
  COMMENT "Copying ${PROTO_HDR_ORIG} to ${PROTO_HDR}"
)
add_custom_command(
  OUTPUT ${PROTO_SRC}
  COMMAND ${CMAKE_COMMAND}
          -Dinput=${PROTO_SRC_ORIG}
          -Doutput=${PROTO_SRC}
          -P ${CMAKE_CURRENT_SOURCE_DIR}/protobuf-include.cmake
  DEPENDS ${PROTO_SRC_ORIG}
  COMMENT "Copying ${PROTO_SRC_ORIG} to ${PROTO_SRC}"
)

file(GLOB SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
if(MSVC)
  add_library(krpc STATIC ${SRC} ${PROTO_HDR} ${PROTO_SRC})
else()
  add_library(krpc SHARED ${SRC} ${PROTO_HDR} ${PROTO_SRC})
endif()

set_target_properties(
  krpc PROPERTIES VERSION   ${VERSION_NUMBER}
                  SOVERSION ${VERSION_NUMBER}
                  INSTALL_NAME_DIR lib)

target_link_libraries(krpc ${PROTOBUF_LIBRARIES} z)

if(WIN32 OR CYGWIN)
  target_link_libraries(krpc ws2_32 mswsock)
endif()

install(TARGETS krpc
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

install(DIRECTORY include DESTINATION . FILES_MATCHING PATTERN "*.hpp")
install(FILES ${PROTO_HDR} DESTINATION include/krpc)
