# 指定CMake版本
cmake_minimum_required(VERSION 3.5)
#使能c++11
set(CMAKE_CXX_STANDARD 11)

# 项目信息
project(Demo C CXX)

# 设置为调试版本
set(CMAKE_BUILD_TYPE Debug)

# 设置可执行文件路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/source/bin/)

# ---[ Options
option(build_inference "build module inference" ON)
option(build_decoder "build module decoder" ON)
option(build_inifile "build module inifile" ON)
option(build_dataType "build module dataType" ON)
option(build_HttpClient "build module HttpClient" ON)
option(build_md5 "build module md5" ON)
option(build_userApp "build module userApp" ON)
option(build_TCPClient "build module TCPClient" ON)
option(build_recorder "build module recorder" ON)
option(WITH_FFMPEG "with ffmpeg" ON)
option(WITH_OPENCV "with opencv" ON)
option(WITH_ZLMediaKit "with ZLMediaKit" OFF)

set(ENABLE_MYSQL ON CACHE BOOL "enable mysql")


# ---[ Google-gflags
if(CMAKE_TOOLCHAIN_FILE)
  set(GFLAGS_LIBRARIES gflags)
else()
  include("${PROJECT_SOURCE_DIR}/cmake/FindGFlags.cmake")
endif()
list(APPEND 3RDPARTY_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIRS})
list(APPEND 3RDPARTY_LIBS ${GFLAGS_LIBRARIES})

# ---[ Google-glog
if(CMAKE_TOOLCHAIN_FILE)
  set(GLOG_LIBRARIES glog)
else()
  include("${PROJECT_SOURCE_DIR}/cmake/FindGlog.cmake")
endif()
list(APPEND 3RDPARTY_INCLUDE_DIRS ${GLOG_INCLUDE_DIRS})
list(APPEND 3RDPARTY_LIBS ${GLOG_LIBRARIES})
list(APPEND 3RDPARTY_LIBS mpeg mov flv mk_api zltoolkit zlmediakit)

##OpenCV
if(WITH_OPENCV)
  if(CMAKE_TOOLCHAIN_FILE)
    if(EXISTS ${PROJECT_SOURCE_DIR}/include/opencv)
       set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_features2d opencv_flann)
       if(EXISTS ${PROJECT_SOURCE_DIR}/include/opencv2/imgcodecs)
         list(APPEND OpenCV_LIBS opencv_imgcodecs)
       endif()
       if(EXISTS ${PROJECT_SOURCE_DIR}/include/opencv2/videoio)
         list(APPEND OpenCV_LIBS opencv_videoio)
       endif()
       message(STATUS "HAVE_OPENCV enabled")
       message(STATUS "opencv libraries: ${OpenCV_LIBS}")
       set(HAVE_OPENCV true)
       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_OPENCV")
    else()
      set (HAVE_OPENCV false)
    endif()
  else()
     set(OpenCV_FIND_QUIETLY true)
     #find_package(OpenCV REQUIRED) //this will include opencv_ts which result in crash on centos
     find_package(OpenCV OPTIONAL_COMPONENTS imgcodecs)
     find_package(OpenCV OPTIONAL_COMPONENTS videoio)
     set(optional_opencv_libs ${OpenCV_LIBS})
     find_package(OpenCV REQUIRED core imgproc highgui features2d)
     if(OpenCV_FOUND)
       if(imgcodecs_FOUND)
         list(APPEND OpenCV_LIBS optional_opencv_libs)
       endif()
       message(STATUS "HAVE_OPENCV enabled")
       message(STATUS "opencv libraries: ${OpenCV_LIBS}")
       set(HAVE_OPENCV true)
       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_OPENCV")
     else()
       set (HAVE_OPENCV false)
     endif()
   endif()
else()
  set (HAVE_OPENCV false)
endif()


##FFmpeg
if(WITH_FFMPEG)
  if(CMAKE_TOOLCHAIN_FILE)
    if(EXISTS ${PROJECT_SOURCE_DIR}/include/libavcodec)
      set(FFMPEG_LIBRARIES avformat avcodec avutil swscale swresample)
      if (WITH_FFMPEG_AVDEVICE)
        list(APPEND FFMPEG_LIBRARIES avdevice)
      endif ()
      set(HAVE_FFMPEG true)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_FFMPEG")
      message(STATUS "HAVE_FFMPEG enabled")
      message(STATUS "ffmpeg libraries: ${FFMPEG_LIBRARIES}")
    else()
      set (HAVE_FFMPEG false)
    endif()
  else()
    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
    find_package(FFmpeg REQUIRED)
    if (FFMPEG_FOUND)
      include_directories(${FFMPEG_INCLUDE_DIR})
      set(HAVE_FFMPEG true)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_FFMPEG")
      message(STATUS "HAVE_FFMPEG enabled")
      message(STATUS "ffmpeg include: ${FFMPEG_INCLUDE_DIR}")
      message(STATUS "ffmpeg libraries: ${FFMPEG_LIBRARIES}")
    else ()
      message(FATAL_ERROR "Can't find FFmpeg libs!")
      set (HAVE_FFMPEG false)
    endif ()
  endif()
else()
  set (HAVE_FFMPEG false)
endif()

# -- ZLMediaKit
if(WITH_ZLMediaKit)
  add_subdirectory(${PROJECT_SOURCE_DIR}/3rdparty)
endif()

#查找mysql是否安装
find_package(MYSQL QUIET)
if(MYSQL_FOUND AND ENABLE_MYSQL)
    message(STATUS "找到mysqlclient库:\"${MYSQL_INCLUDE_DIR}\",ENABLE_MYSQL宏已打开")
    include_directories(${MYSQL_INCLUDE_DIR})
    include_directories(${MYSQL_INCLUDE_DIR}/mysql)
    add_definitions(-DENABLE_MYSQL)
    list(APPEND  3RDPARTY_LIBS ${MYSQL_LIBRARIES})
endif()


#设置工程源码根目录
set(ToolKit_Root ${PROJECT_SOURCE_DIR}/3rdparty/ZLMediaKit/3rdpart/ZLToolKit/src)
set(MediaKit_Root ${PROJECT_SOURCE_DIR}/3rdparty/ZLMediaKit/src)
set(MediaServer_Root ${PROJECT_SOURCE_DIR}/3rdparty/ZLMediaKit/3rdpart/media-server)

# -- include
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/rapidjson/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/inference/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/decoder/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/userApp/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/md5/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/inifile/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/TCPClient/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/dataType/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/HttpClient/include/)
include_directories(${PROJECT_SOURCE_DIR}/modules/recorder/include/)

include_directories(${ToolKit_Root})
include_directories(${MediaKit_Root})
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/ZLMediaKit)

# -- include gstreamer
include_directories(/usr/include/gstreamer-1.0)
include_directories(/usr/include/glib-2.0/)
include_directories(/usr/lib/aarch64-linux-gnu/glib-2.0/include)
include_directories(/opt/nvidia/deepstream/deepstream-5.0/sources/includes/)
include_directories(/usr/local/cuda-10.2/include/)

# 寻找当前目录下所有源文件
aux_source_directory(./source/src DIR_SRCS)

# 添加编译参数
add_compile_options(-Wall -std=c++11 -O2 -g -DPLATFORM_TEGRA)

link_directories(${PROJECT_SOURCE_DIR}/lib)
link_directories(/opt/nvidia/deepstream/deepstream-5.0/lib/)


list(APPEND Source_LINKER_LIBS mov flv mk_api mpeg zlmediakit ZLToolKit dl ${3RDPARTY_LIBS}  ${OpenCV_LIBS} ${FFMPEG_LIBRARIES} pthread)
list(APPEND ALL_LINKER_LIBS gstreamer-1.0 gobject-2.0 glib-2.0 nvdsgst_meta nvds_meta nvdsgst_helper nvbufsurface m ${Source_LINKER_LIBS}) 

add_subdirectory(${PROJECT_SOURCE_DIR}/modules)

# 指定生成的目标
add_executable(main ${DIR_SRCS})

# 链接
target_link_libraries(main ${ALL_LINKER_LIBS} modules)