# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

#########################################
# consensus_metadata_proto
#########################################

PROTOBUF_GENERATE_CPP(
  METADATA_PROTO_SRCS METADATA_PROTO_HDRS METADATA_PROTO_TGTS
  SOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..
  BINARY_ROOT ${CMAKE_CURRENT_BINARY_DIR}/../..
  PROTO_FILES
    metadata.proto
    opid.proto
    replica_management.proto)
set(METADATA_PROTO_LIBS
  kudu_common_proto
  fs_proto
  protobuf)
ADD_EXPORTABLE_LIBRARY(consensus_metadata_proto
  SRCS ${METADATA_PROTO_SRCS}
  DEPS ${METADATA_PROTO_LIBS}
  NONLINK_DEPS ${METADATA_PROTO_TGTS})

#########################################
# consensus_proto
#########################################

KRPC_GENERATE(
  CONSENSUS_KRPC_SRCS CONSENSUS_KRPC_HDRS CONSENSUS_KRPC_TGTS
  SOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..
  BINARY_ROOT ${CMAKE_CURRENT_BINARY_DIR}/../..
  PROTO_FILES consensus.proto)
list(APPEND CONSENSUS_KRPC_SRCS opid_util.cc)
set(CONSENSUS_KRPC_LIBS
  cfile_proto
  consensus_metadata_proto
  krpc
  kudu_common_proto
  rpc_header_proto
  protobuf
  tablet_proto
  tserver_admin_proto
  wire_protocol_proto)

ADD_EXPORTABLE_LIBRARY(consensus_proto
  SRCS ${CONSENSUS_KRPC_SRCS}
  DEPS ${CONSENSUS_KRPC_LIBS}
  NONLINK_DEPS ${CONSENSUS_KRPC_TGTS})

#########################################
# log_proto
#########################################

PROTOBUF_GENERATE_CPP(
  LOG_PROTO_SRCS LOG_PROTO_HDRS LOG_PROTO_TGTS
  SOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..
  BINARY_ROOT ${CMAKE_CURRENT_BINARY_DIR}/../..
  PROTO_FILES log.proto)

add_library(log_proto ${LOG_PROTO_SRCS} ${LOG_PROTO_HDRS})
target_link_libraries(log_proto
  consensus_proto)

set(LOG_SRCS
  log_util.cc
  log.cc
  log_anchor_registry.cc
  log_index.cc
  log_reader.cc
  log_metrics.cc
)

add_library(log ${LOG_SRCS})
target_link_libraries(log
  clock
  gutil
  kudu_common
  kudu_fs
  kudu_util_compression
  consensus_proto
  log_proto
  consensus_metadata_proto)

set(CONSENSUS_SRCS
  consensus_meta.cc
  consensus_meta_manager.cc
  consensus_peers.cc
  consensus_queue.cc
  leader_election.cc
  log_cache.cc
  peer_manager.cc
  pending_rounds.cc
  quorum_util.cc
  raft_consensus.cc
  time_manager.cc
)

add_library(consensus ${CONSENSUS_SRCS})
target_link_libraries(consensus
  consensus_proto
  kudu_common
  log
  protobuf)

SET_KUDU_TEST_LINK_LIBS(
  log
  consensus
  tserver_proto
  cfile
  tablet
  kudu_util)

ADD_KUDU_TEST(consensus_meta-test)
ADD_KUDU_TEST(consensus_meta_manager-stress-test RUN_SERIAL true)
ADD_KUDU_TEST(consensus_meta_manager-test)
ADD_KUDU_TEST(consensus_peers-test)
ADD_KUDU_TEST(consensus_queue-test)
ADD_KUDU_TEST(leader_election-test)
ADD_KUDU_TEST(log-test)
ADD_KUDU_TEST(log_anchor_registry-test)
ADD_KUDU_TEST(log_cache-test PROCESSORS 2)
ADD_KUDU_TEST(log_index-test)
ADD_KUDU_TEST(mt-log-test PROCESSORS 5)
ADD_KUDU_TEST(quorum_util-test)
ADD_KUDU_TEST(raft_consensus_quorum-test)
ADD_KUDU_TEST(time_manager-test)

# Our current version of gmock overrides virtual functions without adding
# the 'override' keyword which, since our move to c++11, make the compiler
# issue warnings. This suppresses those warnings.
# TODO This problem has been resolved in recent versions of gtest/gmock (now
# googletest). Remove this when we upgrade.
set_source_files_properties(raft_consensus-test.cc
    PROPERTIES COMPILE_FLAGS -Wno-inconsistent-missing-override)
