# Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA


# Exclude mysqlpump tool from being compiled by SunStudio compiler. It has bug
# that forbids usage of pure virtual interfaces (and other classes with no
# fields) without dummy workarounds. In fact, only libmysql must be build with
# this toolset, so it is acceptable to exclude mysqlpump here.

INCLUDE_DIRECTORIES(
  ${CMAKE_SOURCE_DIR}/dump
)

IF (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
  RETURN()
ENDIF()

# Prevent Boost from including external precompiled Boost libraries, use
# threading (not implemented for Solaris) and turn off unused functionality.
IF(USING_LOCAL_BOOST)
  ADD_DEFINITIONS(
    -DBOOST_ALL_NO_LIB
    -DBOOST_SYSTEM_NO_DEPRECATED)
ENDIF()

IF(WIN32)
  LIST(APPEND BOOST_THREAD_SOURCES
    ${BOOST_SOURCES_DIR}/libs/thread/src/win32/thread.cpp
    ${BOOST_SOURCES_DIR}/libs/thread/src/win32/tss_dll.cpp
    ${BOOST_SOURCES_DIR}/libs/thread/src/win32/tss_pe.cpp
  )
ELSE()
  LIST(APPEND BOOST_THREAD_SOURCES
    ${BOOST_SOURCES_DIR}/libs/thread/src/pthread/once.cpp
    ${BOOST_SOURCES_DIR}/libs/thread/src/pthread/thread.cpp
  )
ENDIF()

SET(BOOST_LIB_SOURCES
  ${BOOST_SOURCES_DIR}/libs/atomic/src/lockpool.cpp
  ${BOOST_SOURCES_DIR}/libs/chrono/src/chrono.cpp
  ${BOOST_SOURCES_DIR}/libs/chrono/src/process_cpu_clocks.cpp
  ${BOOST_SOURCES_DIR}/libs/chrono/src/thread_clock.cpp
  ${BOOST_SOURCES_DIR}/libs/system/src/error_code.cpp
  ${BOOST_SOURCES_DIR}/libs/thread/src/future.cpp
)

IF(USING_LOCAL_BOOST)
  ADD_CONVENIENCE_LIBRARY(boost_lib ${BOOST_LIB_SOURCES} ${BOOST_THREAD_SOURCES})

  SET_TARGET_PROPERTIES(boost_lib
    PROPERTIES COMPILE_FLAGS "-DBOOST_THREAD_BUILD_LIB")
  # Do not build library unless it is needed by some other target.
  SET_PROPERTY(TARGET boost_lib PROPERTY EXCLUDE_FROM_ALL TRUE)

  ADD_COMPILE_FLAGS(
    ${BOOST_LIB_SOURCES}
    ${BOOST_THREAD_SOURCES}
    COMPILE_FLAGS -I${BOOST_PATCHES_DIR} -isystem ${BOOST_INCLUDE_DIR}
    )

  IF(HAVE_clock_gettime_IN_rt)
    TARGET_LINK_LIBRARIES(boost_lib ${LIBRT})
  ENDIF()

  # Need explicit pthread for gcc -fsanitize=address
  IF(CMAKE_USE_PTHREADS_INIT AND CMAKE_C_FLAGS MATCHES "-fsanitize=")
    TARGET_LINK_LIBRARIES(boost_lib pthread)
  ENDIF()
  SET(LOCAL_BOOST_LIB boost_lib)
ENDIF()

SET(MYSQLPUMP_LIB_SOURCES
  abstract_chain_element.cc
  abstract_connection_provider.cc
  abstract_crawler.cc
  abstract_data_formatter_wrapper.cc
  abstract_data_object.cc
  abstract_database_dump_task.cc
  abstract_dump_task.cc
  abstract_mysql_chain_element_extension.cc
  abstract_object_reader_wrapper.cc
  abstract_output_writer_wrapper.cc
  abstract_plain_sql_object.cc
  abstract_plain_sql_object_dump_task.cc
  abstract_progress_reporter.cc
  abstract_progress_watcher.cc
  abstract_simple_dump_task.cc
  abstract_table_dump_task.cc
  chain_data.cc
  composite_message_handler.cc
  compression_lz4_writer.cc
  compression_zlib_writer.cc
  database.cc
  database_end_dump_task.cc
  database_start_dump_task.cc
  dump_end_dump_task.cc
  dump_start_dump_task.cc
  event_scheduler_event.cc
  field.cc
  file_writer.cc
  i_chain_element.cc
  i_connection_provider.cc
  i_crawler.cc
  i_data_formatter.cc
  i_data_formatter_wrapper.cc
  i_data_object.cc
  i_dump_task.cc
  i_object_reader.cc
  i_object_reader_wrapper.cc
  i_output_writer.cc
  i_output_writer_wrapper.cc
  i_progress_reporter.cc
  i_progress_watcher.cc
  item_processing_data.cc
  mysql_chain_element_options.cc
  mysql_crawler.cc
  mysql_field.cc
  mysql_function.cc
  mysql_object_reader.cc
  mysql_object_reader_options.cc
  mysqldump_tool_chain_maker.cc
  mysqldump_tool_chain_maker_options.cc
  object_filter.cc
  object_queue.cc
  pattern_matcher.cc
  privilege.cc
  row.cc
  row_group_dump_task.cc
  simple_id_generator.cc
  single_transaction_connection_provider.cc
  sql_formatter.cc
  sql_formatter_options.cc
  standard_progress_watcher.cc
  standard_writer.cc
  stored_procedure.cc
  table.cc
  table_deferred_indexes_dump_task.cc
  table_definition_dump_task.cc
  table_rows_dump_task.cc
  tables_definition_ready_dump_task.cc
  thread.cc
  thread_group.cc
  thread_specific_connection_provider.cc
  trigger.cc
  view.cc
  ../../sql-common/my_user.c)
ADD_CONVENIENCE_LIBRARY(mysqlpump_lib ${MYSQLPUMP_LIB_SOURCES})
TARGET_LINK_LIBRARIES(mysqlpump_lib
   client_base ${LZ4_LIBRARY})

ADD_COMPILE_FLAGS(
  ${MYSQLPUMP_LIB_SOURCES}
  COMPILE_FLAGS -I${BOOST_PATCHES_DIR} -isystem ${BOOST_INCLUDE_DIR}
  )

# Files that use Boost sources that trigger compilation warnings
SET(MYSQLPUMP_BOOST_SOURCES
  ${BOOST_SOURCES_DIR}/libs/thread/src/pthread/once.cpp
  ${BOOST_SOURCES_DIR}/libs/thread/src/pthread/thread.cpp
  abstract_crawler.cc
  abstract_mysql_chain_element_extension.cc
  abstract_progress_watcher.cc
  mysql_chain_element_options.cc
  mysql_object_reader.cc
  mysqldump_tool_chain_maker.cc
  mysqldump_tool_chain_maker_options.cc
  object_filter.cc
  object_queue.cc
  program.cc
  standard_progress_watcher.cc
  sql_formatter.cc
  table.cc
)

# Boost source has unused local typedefs.
MY_CHECK_CXX_COMPILER_FLAG("-Wunused-local-typedefs" HAVE_UNUSED_TYPEDEFS)
IF(HAVE_UNUSED_TYPEDEFS)
  ADD_COMPILE_FLAGS(${MYSQLPUMP_BOOST_SOURCES}
    COMPILE_FLAGS "-Wno-unused-local-typedefs")
ENDIF()

ADD_COMPILE_FLAGS(
  compression_writer.cc
  mysqldump_tool_chain_maker.cc
  COMPILE_FLAGS -I${LZ4_INCLUDE_DIR}
)
MYSQL_ADD_EXECUTABLE(mysqlpump  program.cc)
ADD_COMPILE_FLAGS(
  program.cc COMPILE_FLAGS -I${BOOST_PATCHES_DIR} -isystem ${BOOST_INCLUDE_DIR}
)

TARGET_LINK_LIBRARIES(mysqlpump mysqlpump_lib ${LOCAL_BOOST_LIB})
IF(USING_SYSTEM_BOOST)
  TARGET_LINK_LIBRARIES(mysqlpump "-lboost_system")
  TARGET_LINK_LIBRARIES(mysqlpump "-lboost_chrono")
ENDIF()

SET_TARGET_PROPERTIES(mysqlpump PROPERTIES HAS_CXX TRUE)

# Store the executable in our parent directory.
# Why? In pushbuild we do 'touch client/mysql*' to prevent rebuild,
#      in the case where we have a separate build of libmysqlclient.so
IF (NOT WIN32)
  SET_TARGET_PROPERTIES(mysqlpump
    PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/client)
ENDIF()

