cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

if(EXTENSION_360_VIDEO)
  project(NextSoftware360)
else()
  project(NextSoftware)
endif()
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
  message(STATUS "ccache found. using it.")
  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
  set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif()
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    set(USE_ADDRESS_SANITIZER OFF CACHE BOOL "Compiles with -sanitize=address and links to libasan")
  endif()
endif()
set(EXTENSION_360_VIDEO OFF CACHE BOOL "If EXTENSION_360_VIDEO is on, 360Lib will be added")
set(EXTENSION_HDRTOOLS OFF CACHE BOOL "If EXTENSION_HDRTOOLS is on, HDRLib will be added")
set(SET_ENABLE_TRACING OFF CACHE BOOL "Set ENABLE_TRACING as a compiler flag")
set(ENABLE_TRACING OFF CACHE BOOL "If SET_ENABLE_TRACING is on, it will be set to this value")

if(CMAKE_COMPILER_IS_GNUCC)
  set(BUILD_STATIC OFF CACHE BOOL "Build static executables")
endif()

# set c++14
set( CMAKE_CXX_STANDARD 14 )
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
include(${CMAKE_SOURCE_DIR}/cmake/CMakeBuild/cmake/modules/BBuildEnv.cmake)
bb_multithreading()
find_package(OpenMP)
if(OpenMP_FOUND)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
  set(SET_ENABLE_SPLIT_PARALLELISM OFF CACHE BOOL "Set ENABLE_SPLIT_PARALLELISM as a compiler flag")
  set(ENABLE_SPLIT_PARALLELISM OFF CACHE BOOL "If SET_ENABLE_SPLIT_PARALLELISM is on, it will be set to this value")
  set(SET_ENABLE_WPP_PARALLELISM OFF CACHE BOOL "Set ENABLE_WPP_PARALLELISM as a compiler flag")
  set(ENABLE_WPP_PARALLELISM OFF CACHE BOOL "If SET_ENABLE_WPP_PARALLELISM is on, it will be set to this value")
endif()

# "-fsanitize=address" must be appended to `CMAKE_C_FLAGS`
# `CMAKE_CXX_FLAGS` and `CMAKE_EXE_LINKER_FLAGS` in order
# to use ASAN properly, see https://gist.github.com/jlblancoc/44be9d4d466f0a973b1f3808a8e56782
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    if(USE_ADDRESS_SANITIZER)
      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
      set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
    endif()
  endif()
endif()

# Enable warnings for some generators and toolsets.
# bb_enable_warnings( gcc warnings-as-errors -Wno-sign-compare )
# bb_enable_warnings( gcc -Wno-unused-variable )
# bb_enable_warnings( gcc-4.8 warnings-as-errors -Wno-unused-variable )
# for gcc 8.2:
bb_enable_warnings( gcc  -Wno-sign-compare -Wno-class-memaccess ) # warnings-as-errors

# for gcc 10:
bb_enable_warnings( gcc  -Wno-sign-compare -Wno-class-memaccess -Wno-stringop-overflow ) # warnings-as-errors

if(XCODE)
    bb_enable_warnings(clang warnings-as-errors
                       -Wno-deprecated-declarations
                       -Wno-unknown-attributes
                       -Wno-deprecated-register
                       -Wno-pessimizing-move
                       -Wno-absolute-value
                       -Wno-unused-const-variable)
else()
    bb_enable_warnings(clang warnings-as-errors
                       -Wno-unknown-attributes
                       -Wno-deprecated-register
                       -Wno-pessimizing-move
                       -Wno-absolute-value
                       -Wno-unused-const-variable)
   bb_enable_warnings(msvc warnings-as-errors "/wd4996")
endif()

if(UNIX OR MINGW)
  add_compile_options("-msse4.1")
endif()
if(MSVC)
  add_compile_options("/MP")
  add_compile_options("/EHsc")
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
    add_compile_options("-fabi-version=6")
  endif()
endif()

set(PATH_TO_DIRECTORY_CORE_COMMON "../../Lib/IntraPredNN")



if(XCODE)
  set(LLDB_INSTALL_ROOT "$ENV{HOME}/.lldb.d")
  set(LLDBINIT_FILE "$ENV{HOME}/.lldbinit")
  set(ENABLE_LLDBINIT_UPDATE ON)
  add_subdirectory("lldb")
endif()


find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")


add_subdirectory("source/Lib/CommonLib")
#add_subdirectory( "source/Lib/CommonAnalyserLib" )
if(EXTENSION_360_VIDEO)
  add_subdirectory("source/Lib/Lib360")
  add_subdirectory("source/Lib/AppEncHelper360")
endif()
if(EXTENSION_HDRTOOLS)
  add_subdirectory("source/Lib/HDRLib")
endif()
#add_subdirectory( "source/Lib/DecoderAnalyserLib" )
add_subdirectory("source/Lib/DecoderLib")
add_subdirectory("source/Lib/EncoderLib")
add_subdirectory("source/Lib/Utilities")

#add_subdirectory( "source/App/DecoderAnalyserApp" )
add_subdirectory("source/App/DecoderApp")
add_subdirectory("source/App/EncoderApp")
#add_subdirectory( "source/App/SEIRemovalApp" )
#add_subdirectory( "source/App/Parcat" )
#add_subdirectory( "source/App/StreamMergeApp" )
#add_subdirectory( "source/App/BitstreamExtractorApp" )
if(EXTENSION_360_VIDEO)
  add_subdirectory("source/App/utils/360ConvertApp")
endif()


