CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
CMAKE_POLICY(VERSION 2.8)

SET(PACKAGE "ffmpegthumbnailer")
SET(PACKAGE_VERSION_MAJOR 2)
SET(PACKAGE_VERSION_MINOR 0)
SET(PACKAGE_VERSION_PATCH 10)
SET(PACKAGE_VERSION ${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH})

SET(CPACK_PACKAGE_NAME ${PACKAGE})
SET(CPACK_PACKAGE_VERSION_MAJOR ${PACKAGE_VERSION_MAJOR})
SET(CPACK_PACKAGE_VERSION_MINOR ${PACKAGE_VERSION_MINOR})
SET(CPACK_PACKAGE_VERSION_PATCH ${PACKAGE_VERSION_PATCH})
SET(CPACK_SOURCE_GENERATOR "TBZ2")
SET(CPACK_PACKAGE_FILE_NAME $CPACK_PACKAGE_NAME)
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-bin")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
SET(CPACK_SOURCE_IGNORE_FILES "/build/;/debug/;/release/;/gfx/;/include/;/lib/;/.git/;/src/tags;/.*[.]sublime-.*;~$;${CPACK_SOURCE_IGNORE_FILES}")
SET(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR}/README)
SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/COPYING)

IF (APPLE)
    SET (MACOSX_RPATH ON)
ENDIF ()

PROJECT(${PACKAGE})
INCLUDE(CPack)

SET(CMAKE_EXPORT_COMPILE_COMMANDS 1)

OPTION(ENABLE_SHARED "Build shared library" ON)
OPTION(ENABLE_STATIC "Build static library" OFF)
OPTION(ENABLE_TESTS "Build unit tests" ON)
OPTION(ENABLE_GIO "Support for gio file uris" OFF)
OPTION(ENABLE_THUMBNAILER "Register ffmpegthumbnailer as thumbnailer" OFF)

INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})

FIND_PACKAGE(JPEG)
IF (JPEG_FOUND)
    OPTION(HAVE_JPEG "Jpeg support" ON)
ENDIF ()

FIND_PACKAGE(PNG)
IF (PNG_FOUND)
    OPTION(HAVE_PNG "Png support" ON)
ENDIF ()

FIND_PACKAGE(PkgConfig)
PKG_CHECK_MODULES(AVCODEC_PKG libavcodec REQUIRED)
PKG_CHECK_MODULES(AVFORMAT_PKG libavformat REQUIRED)
PKG_CHECK_MODULES(AVUTIL_PKG libavutil REQUIRED)
PKG_CHECK_MODULES(SWSCALE_PKG libswscale REQUIRED)

FIND_PATH(AVCODEC_INCLUDE_DIR
    NAMES libavcodec/avcodec.h
    PATHS ${AVCODEC_PKG_INCLUDE_DIRS}
)

FIND_PATH(AVFORMAT_INCLUDE_DIR
    NAMES libavcodec/avcodec.h
    PATHS ${AVFORMAT_PKG_INCLUDE_DIRS}
)

FIND_PATH(AVUTIL_INCLUDE_DIR
    NAMES libavutil/avutil.h
    PATHS ${AVUTIL_PKG_INCLUDE_DIRS}
)

FIND_PATH(SWSCALE_INCLUDE_DIR
    NAMES libswscale/swscale.h
    PATHS ${SWSCALE_PKG_INCLUDE_DIRS}
)

FIND_LIBRARY(AVCODEC_LIBRARY
    NAMES ${AVCODEC_PKG_LIBRARIES}
    PATHS ${AVCODEC_PKG_LIBRARY_DIRS}
)

FIND_LIBRARY(AVFORMAT_LIBRARY
    NAMES ${AVFORMAT_PKG_LIBRARIES}
    PATHS ${AVFORMAT_PKG_LIBRARY_DIRS}
)

FIND_LIBRARY(AVUTIL_LIBRARY
    NAMES ${AVUTIL_PKG_LIBRARIES}
    PATHS ${AVUTIL_PKG_LIBRARY_DIRS}
)

FIND_LIBRARY(SWSCALE_LIBRARY
    NAMES ${SWSCALE_PKG_LIBRARIES}
    PATHS ${SWSCALE_PKG_LIBRARY_DIRS}
)

IF (ENABLE_GIO)
    FIND_PATH(DL_INCLUDES dlfcn.h)
    FIND_LIBRARY(DL_LIBRARY dl)
    LIST(APPEND FFMPEGTHUMBNAILER_INCLUDE_DIRS ${DL_INCLUDES})
    LIST(APPEND FFMPEGTHUMBNAILER_LIBRARIES ${DL_LIBRARY})
ENDIF ()

LIST(APPEND FFMPEGTHUMBNAILER_INCLUDE_DIRS ${AVFORMAT_INCLUDE_DIR} ${AVCODEC_INCLUDE_DIR} ${AVUTIL_INCLUDE_DIR} ${SWSCALE_INCLUDE_DIR})
LIST(APPEND FFMPEGTHUMBNAILER_LIBRARIES ${AVFORMAT_LIBRARY} ${AVCODEC_LIBRARY} ${AVUTIL_LIBRARY} ${SWSCALE_LIBRARY})

SET(FFMPEGTHUMBNAILER_PKG_LIBS "-L${AVCODEC_PKG_LIBRARY_DIRS} -l${AVCODEC_PKG_LIBRARIES} -l${AVUTIL_PKG_LIBRARIES} -l${AVFORMAT_PKG_LIBRARIES} -l${SWSCALE_PKG_LIBRARIES}")
FOREACH(VAL ${JPEG_LIBRARIES})
    SET(FFMPEGTHUMBNAILER_PKG_LIBS "${FFMPEGTHUMBNAILER_PKG_LIBS} ${VAL}")
ENDFOREACH()
FOREACH(VAL ${PNG_LIBRARIES})
    SET(FFMPEGTHUMBNAILER_PKG_LIBS "${FFMPEGTHUMBNAILER_PKG_LIBS} ${VAL}")
ENDFOREACH()

SET(LIB_HDRS
    libffmpegthumbnailer/videothumbnailer.h
    libffmpegthumbnailer/videothumbnailerc.h
    libffmpegthumbnailer/imagetypes.h
    libffmpegthumbnailer/ifilter.h
    libffmpegthumbnailer/videoframe.h
    libffmpegthumbnailer/filmstripfilter.h
)

SET (LIB_SRC_LIST
    libffmpegthumbnailer/moviedecoder.h
    libffmpegthumbnailer/moviedecoder.cpp
    libffmpegthumbnailer/imagewriter.h
    libffmpegthumbnailer/imagewriterfactory.h
    libffmpegthumbnailer/stringoperations.h
    libffmpegthumbnailer/stringoperations.cpp
    libffmpegthumbnailer/videothumbnailer.cpp
    libffmpegthumbnailer/videothumbnailerc.cpp
    libffmpegthumbnailer/ifilter.h
    libffmpegthumbnailer/videoframe.h
    libffmpegthumbnailer/histogram.h
    libffmpegthumbnailer/grayscalefilter.h
    libffmpegthumbnailer/filmstrip.h
    libffmpegthumbnailer/filmstripfilter.h
    libffmpegthumbnailer/filmstripfilter.cpp
)

IF (HAVE_JPEG)
    LIST(APPEND LIB_SRC_LIST libffmpegthumbnailer/jpegwriter.h libffmpegthumbnailer/jpegwriter.cpp)
    LIST(APPEND FFMPEGTHUMBNAILER_INCLUDE_DIRS ${JPEG_INCLUDE_DIR})
    LIST(APPEND FFMPEGTHUMBNAILER_LIBRARY_DIRS ${JPEG_LIBRARY_DIRS})
    LIST(APPEND FFMPEGTHUMBNAILER_LIBRARIES ${JPEG_LIBRARIES})
ENDIF ()

IF (HAVE_PNG)
    LIST(APPEND LIB_SRC_LIST libffmpegthumbnailer/pngwriter.h libffmpegthumbnailer/pngwriter.cpp)
    LIST(APPEND FFMPEGTHUMBNAILER_INCLUDE_DIRS ${PNG_INCLUDE_DIR})
    LIST(APPEND FFMPEGTHUMBNAILER_LIBRARY_DIRS ${PNG_LIBRARY_DIRS})
    LIST(APPEND FFMPEGTHUMBNAILER_LIBRARIES ${PNG_LIBRARIES})
ENDIF ()

SET (FFMPEGTHUMBNAILER_SOVERSION_MAJOR 4)
SET (FFMPEGTHUMBNAILER_SOVERSION_MINOR 9)
SET (FFMPEGTHUMBNAILER_SOVERSION_PATCH 0)

ADD_DEFINITIONS("-D__STDC_CONSTANT_MACROS")
INCLUDE_DIRECTORIES(${FFMPEGTHUMBNAILER_INCLUDE_DIRS})

IF (ENABLE_STATIC)
    ADD_LIBRARY(libffmpegthumbnailerstatic STATIC ${LIB_SRC_LIST})
    TARGET_LINK_LIBRARIES(libffmpegthumbnailerstatic ${FFMPEGTHUMBNAILER_LIBRARIES})
    SET_TARGET_PROPERTIES(libffmpegthumbnailerstatic PROPERTIES
        OUTPUT_NAME libffmpegthumbnailer
    )
    SET (STATIC_LIB libffmpegthumbnailerstatic)
ENDIF ()
IF (ENABLE_SHARED)
    ADD_LIBRARY(libffmpegthumbnailer SHARED ${LIB_SRC_LIST})
    TARGET_LINK_LIBRARIES(libffmpegthumbnailer ${FFMPEGTHUMBNAILER_LIBRARIES})
    SET_TARGET_PROPERTIES(libffmpegthumbnailer PROPERTIES
        PREFIX ""
        VERSION ${FFMPEGTHUMBNAILER_SOVERSION_MAJOR}.${FFMPEGTHUMBNAILER_SOVERSION_MINOR}.${FFMPEGTHUMBNAILER_SOVERSION_PATCH}
        SOVERSION ${FFMPEGTHUMBNAILER_SOVERSION_MAJOR}
        PUBLIC_HEADER "${LIB_HDRS}"
        MACOSX_RPATH TRUE
    )
    SET (SHARED_LIB libffmpegthumbnailer)
ENDIF ()

ADD_EXECUTABLE(ffmpegthumbnailer main.cpp)
IF (ENABLE_SHARED)
    TARGET_LINK_LIBRARIES(ffmpegthumbnailer ${SHARED_LIB})
ELSE ()
    TARGET_LINK_LIBRARIES(ffmpegthumbnailer ${STATIC_LIB})
ENDIF ()

INSTALL(TARGETS ffmpegthumbnailer ${STATIC_LIB} ${SHARED_LIB}
    LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
    ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/include/libffmpegthumbnailer
)

INSTALL(FILES man/ffmpegthumbnailer.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/man/man1)
INSTALL(FILES ${CMAKE_BINARY_DIR}/libffmpegthumbnailer.pc DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig)

IF (ENABLE_THUMBNAILER)
    INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dist/ffmpegthumbnailer.thumbnailer DESTINATION ${CMAKE_INSTALL_PREFIX}/share/thumbnailers)
ENDIF ()

CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/libffmpegthumbnailer.pc.in ${CMAKE_BINARY_DIR}/libffmpegthumbnailer.pc @ONLY)
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/CMakeUninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/CMakeUninstall.cmake" IMMEDIATE @ONLY)
ADD_CUSTOM_TARGET(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/CMakeUninstall.cmake)

IF (ENABLE_TESTS)
    ENABLE_TESTING()
    ADD_SUBDIRECTORY(test)
ENDIF ()

MESSAGE(STATUS "")
MESSAGE(STATUS "CONFIGURATION SUMMARY")

IF (HAVE_PNG)
    MESSAGE(STATUS "png support          : enabled")
ELSE ()
    MESSAGE(STATUS "png support          : disabled")
ENDIF ()

IF (HAVE_JPEG)
    MESSAGE(STATUS "jpeg support         : enabled")
ELSE ()
    MESSAGE(STATUS "jpeg support         : disabled")
ENDIF ()

IF (ENABLE_GIO)
    MESSAGE(STATUS "gio support          : enabled")
ELSE ()
    MESSAGE(STATUS "gio support          : disabled")
ENDIF ()

IF (ENABLE_THUMBNAILER)
    MESSAGE(STATUS "register thumbnailer : enabled")
ELSE ()
    MESSAGE(STATUS "register thumbnailer : disabled")
ENDIF ()

IF (ENABLE_UNITTEST)
    MESSAGE(STATUS "unittests            : enabled")
ELSE ()
    MESSAGE(STATUS "unittests            : disabled")
ENDIF ()

IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
    MESSAGE(STATUS "debug mode           : enabled")
ELSE ()
    MESSAGE(STATUS "debug mode           : disabled")
ENDIF ()
