# Copyright (c) 2017-present, XXX, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

CMAKE_MINIMUM_REQUIRED(VERSION 3.10 FATAL_ERROR)
CMAKE_POLICY(VERSION 3.0)
PROJECT(CherryPi)
ENABLE_TESTING()
if(POLICY CMP0058) 
    cmake_policy(SET CMP0058 NEW) 
endif() 

SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
INCLUDE(TargetLinkCherpi)

SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
OPTION(ONLY_BENCH "Only build cpid (requires linux)" OFF)
OPTION(ASAN "ASAN-enabled build" OFF)
OPTION(TSAN "TSAN-enabled build" OFF)
OPTION(BUILD_OPENBW "Build BWAPI/OpenBW with CherryPi" OFF)

IF(BUILD_OPENBW)
  add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/3rdparty/openbw)
ENDIF(BUILD_OPENBW)

IF(MSVC)
  ADD_DEFINITIONS(-DWITHOUT_POSIX)
  ADD_DEFINITIONS(-DBETTER_ENUMS_HAVE_CONSTEXPR -DNOMINMAX -D_USE_MATH_DEFINES)
  # On Windows, glog functions are annotated for DLLS but we want to link
  # statically.
  ADD_DEFINITIONS(-DGOOGLE_GLOG_DLL_DECL=)
  # Denote error re functions with no return statement (with have a few in
  # cbwapi) to warning level 3
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /w34716")
  SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
  SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
  SET(CHERRYPI_WARNINGS "")
  OPTION(BUILD_SHARED_LIBS "Build shared libraries" OFF)

  # ZSTD
  SET(ZSTD_USE_STATIC_RUNTIME ON)
  SET(ZSTD_BUILD_PROGRAMS OFF)
  add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/3rdparty/pytorch/third_party/zstd/build/cmake)
  set_property(TARGET libzstd_static PROPERTY POSITION_INDEPENDENT_CODE ON)
  SET(ZSTD_LIBRARY libzstd_static)
  SET(ZSTD_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/3rdparty/pytorch/third_party/zstd/lib)
  INCLUDE_DIRECTORIES("${ZSTD_INCLUDE_DIR}")
ELSE(MSVC)
  ADD_COMPILE_OPTIONS("$<$<CONFIG:RELASE>:-O3 -march=native -DNDEBUG>")
  ADD_COMPILE_OPTIONS("-fdiagnostics-color")
  SET(CHERRYPI_WARNINGS
    -Wall
    -Wno-undefined-var-template
    -Wno-missing-braces
    -Wno-unknown-warning-option)
  OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON)
  INCLUDE(UseGold)
ENDIF(MSVC)

# Static version required for advanced, experimental functionality
FIND_PACKAGE(ZSTD 1.0 REQUIRED static)

# Pytorch hack... Otherwise it redefines LOG
ADD_DEFINITIONS(-DC10_USE_GLOG)

ADD_DEFINITIONS(-DCEREAL_THREAD_SAFE)
INCLUDE_DIRECTORIES(3rdparty)
ADD_SUBDIRECTORY(3rdparty/fmt EXCLUDE_FROM_ALL)
ADD_SUBDIRECTORY(3rdparty/glop)

OPTION(WITH_CPIDLIB "Include training library" ON)
# Gloo supports Linux only, and the training library depends on it
IF(APPLE OR MSVC)
  SET(WITH_CPIDLIB OFF)
ENDIF(APPLE OR MSVC)
FIND_PACKAGE(Torch REQUIRED)
ADD_SUBDIRECTORY(common)

IF(ONLY_BENCH)
  ADD_SUBDIRECTORY(cpid)
  ADD_SUBDIRECTORY(./scripts/distributed_bench)
  TARGET_INCLUDE_DIRECTORIES(distributed_bench PUBLIC
    "${CMAKE_CURRENT_SOURCE_DIR}")
ELSE(ONLY_BENCH)
  IF(NOT MSVC)
    ADD_SUBDIRECTORY(3rdparty/bwreplib EXCLUDE_FROM_ALL)
    ADD_SUBDIRECTORY(3rdparty/cnpy EXCLUDE_FROM_ALL)
    ADD_SUBDIRECTORY(3rdparty/torchcraft/BWEnv)
    TARGET_COMPILE_OPTIONS(BWEnv PRIVATE "${CHERRYPI_WARNINGS}")
  ENDIF(NOT MSVC)

  ADD_SUBDIRECTORY(3rdparty/bwapilib EXCLUDE_FROM_ALL)
  IF(MSVC)
    LINK_DIRECTORIES("${PROJECT_SOURCE_DIR}/deps")
  ENDIF(MSVC)

  IF(ASAN AND TSAN)
    message( FATAL_ERROR "You can not build with both ASAN and TSAN" )
  ENDIF(ASAN AND TSAN)

  IF(ASAN)
    # Enable ASAN for the following sub-projects only. We can't load an
    # ASAN-enabled BWEnv.dll in a non-ASAN OpenBW.
    SET(CMAKE_CXX_FLAGS
        "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
  ELSE(ASAN)
    IF(TSAN)
      SET(CMAKE_CXX_FLAGS
        "${CMAKE_CXX_FLAGS} -fsanitize=thread -fno-omit-frame-pointer")
    ENDIF(TSAN)
  ENDIF(ASAN)

  ADD_SUBDIRECTORY(3rdparty/torchcraft EXCLUDE_FROM_ALL)
  ADD_SUBDIRECTORY(tcbwapi)
  ADD_SUBDIRECTORY(3rdparty/bwem EXCLUDE_FROM_ALL)
  IF(NOT MSVC)
    IF(WITH_CPIDLIB)
      ADD_SUBDIRECTORY(cpid)
      ADD_DEFINITIONS(-DHAVE_CPID)
    ENDIF(WITH_CPIDLIB)
  ENDIF(NOT MSVC)
  ADD_SUBDIRECTORY(src)
  ADD_SUBDIRECTORY(experiments)

ENDIF(ONLY_BENCH)

