cmake_minimum_required(VERSION 2.8)

project(mediascanner)

set(MEDIASCANNER_VERSION "0.3.93")
set(MEDIASCANNER_API_VERSION "1.0")
set(MEDIASCANNER_ABI "1")
set(MEDIASCANNER_GETTEXT_DOMAIN "mediascanner")
set(MEDIASCANNER_SETTINGS_ID "com.canonical.mediascanner")
set(MEDIASCANNER_SETTINGS_PATH "/com/canonical/mediascanner/")
set(MEDIASCANNER_SETTINGS_FILE "${CMAKE_BINARY_DIR}/mediascanner.gschema.xml")
set(MEDIASCANNER_PKGCONFIG_FILE "${CMAKE_BINARY_DIR}/mediascanner-${MEDIASCANNER_API_VERSION}.pc")

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")

add_definitions(-DGETTEXT_DOMAIN="${MEDIASCANNER_GETTEXT_DOMAIN}"
                -DMEDIASCANNER_SETTINGS_ID="${MEDIASCANNER_SETTINGS_ID}")

# =============================================================================
# Create and install pkg-config file
# =============================================================================
configure_file(mediascanner.pc.in ${MEDIASCANNER_PKGCONFIG_FILE})
install(FILES ${MEDIASCANNER_PKGCONFIG_FILE}
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

# =============================================================================
# Coverage build type
# =============================================================================
set(CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS_DEBUG} --coverage" )
set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG} --coverage" )
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)

if(CMAKE_BUILD_TYPE_LOWER STREQUAL "coverage")
  message(STATUS "Building for coverage testing")

  include(TestCXXAcceptsFlag)
  unset(coverage_flags_accepted)
  check_cxx_accepts_flag(--coverage coverage_flags_accepted)

  if(NOT coverage_flags_accepted)
    message(FATAL_ERROR "Compiler doesn't accept all required coverage flags")
  endif(NOT coverage_flags_accepted)

  find_program(LCOV lcov DOC "Path to lcov, the graphical GCOV front-end")
  find_program(GCOV gcov DOC "Path to gcov, the GNU coverage testing tool")
  find_program(GENHTML genhtml DOC "Path to genhtml, which generates a HTML view from LCOV coverage data files")

  if(${LCOV} STREQUAL LCOV-NOTFOUND OR
     ${GCOV} STREQUAL GCOV-NOTFOUND OR
     ${GENHTML} STREQUAL GENHTML-NOTFOUND)
    set(LCOV_FOUND OFF)
  else(${LCOV} STREQUAL LCOV-NOTFOUND OR
       ${GCOV} STREQUAL GCOV-NOTFOUND OR
       ${GENHTML} STREQUAL GENHTML-NOTFOUND)
    set(LCOV_FOUND ON)
  endif(${LCOV} STREQUAL LCOV-NOTFOUND OR
        ${GCOV} STREQUAL GCOV-NOTFOUND OR
        ${GENHTML} STREQUAL GENHTML-NOTFOUND)

  set(LCOV_FLAGS --gcov-tool=${GCOV}
      CACHE STRING "Flags which get passed to lcov")

  find_program(GCOVR gcovr DOC "Path to gcovr, which generates Cobertura reports from GCOV")

  if(${GCOVR} STREQUAL GCOVR-NOTFOUND)
    set(GCOVR_FOUND OFF)
  else(${GCOVR} STREQUAL GCOVR-NOTFOUND)
    set(GCOVR_FOUND ON)
  endif(${GCOVR} STREQUAL GCOVR-NOTFOUND)

endif(CMAKE_BUILD_TYPE_LOWER STREQUAL "coverage")

# =============================================================================
# Check supported compiler warnings and enable them
# =============================================================================
include(EnableCompilerWarnings)
enable_compiler_warnings()

# =============================================================================
# Pull GNU standard installation directories
# =============================================================================
include(GNUInstallDirs)

# =============================================================================
# Permit persistent extension of pkg-config's search path
# =============================================================================
set(PKG_CONFIG_PATH "" CACHE STRING "Additional pkg-config search path")

if(PKG_CONFIG_PATH)
  set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}")
endif(PKG_CONFIG_PATH)

# =============================================================================
# Search required packages via pkg-config
# =============================================================================
find_package(PkgConfig REQUIRED)
pkg_check_modules(DEPS REQUIRED
                  gio-2.0>=2.18
                  gio-unix-2.0>=2.18
                  grilo-0.2>=0.2.1
                  gstreamer-pbutils-1.0>=0.11.93
                  gudev-1.0>=175
                  liblucene++>=3.0.3.4
                  libsoup-2.4
)

# http://public.kitware.com/Bug/view.php?id=14381
if(NOT DEPS_FOUND)
  message(FATAL_ERROR "Required dependencies not found.")
endif()

add_definitions(-DGST_USE_UNSTABLE_API=1)

execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
                glib-2.0 --variable=glib_mkenums
                OUTPUT_VARIABLE GLIB_MKENUMS
                OUTPUT_STRIP_TRAILING_WHITESPACE)

set(GLIB_MKENUMS "${GLIB_MKENUMS}"
    CACHE PATH "Path of the glib-mkenums tool")

execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
                gio-2.0 --variable=glib_compile_schemas
                OUTPUT_VARIABLE GLIB_COMPILE_SCHEMAS
                OUTPUT_STRIP_TRAILING_WHITESPACE)

set(GLIB_COMPILE_SCHEMAS "${GLIB_COMPILE_SCHEMAS}"
    CACHE PATH "Path of the glib-compile-schemas tool")

execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
               gio-2.0 --variable=prefix
               OUTPUT_VARIABLE GLIB_SCHEMAS_PREFIX
               OUTPUT_STRIP_TRAILING_WHITESPACE)

set(GLIB_SCHEMAS_PREFIX "${GLIB_SCHEMAS_PREFIX}"
    CACHE PATH "Installation location of glib schemas library")

execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
                grilo-0.2 --variable=plugindir
                OUTPUT_VARIABLE GRILO_PLUGIN_DIR_DEF
                OUTPUT_STRIP_TRAILING_WHITESPACE)

set(GRILO_PLUGIN_DIR "${GRILO_PLUGIN_DIR_DEF}"
    CACHE PATH "Installation location of Grilo plugins")

execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
                gudev-1.0 --modversion
                OUTPUT_VARIABLE GUDEV_VERSION
                OUTPUT_STRIP_TRAILING_WHITESPACE)

# =============================================================================
# Configure API key for "The Movie Database" API Key
# =============================================================================

set(TMDB_APIKEY "" CACHE STRING "API key for \"The Movie Database\"")

if(TMDB_APIKEY)
  set(TMDB_PLUGIN_CONFIG "(\"grl-tmdb\", \"grl-tmdb\", {\"api-key\": \"${TMDB_APIKEY}\"})")
else(TMDB_APIKEY)
  set(TMDB_PLUGIN_CONFIG "")
endif(TMDB_APIKEY)

# =============================================================================
# Validate and install gsettings schema
# =============================================================================

option(GLIB_SCHEMAS_COMPILE "Compile GSettings Schemas after installation" ON)

configure_file(mediascanner.gschema.xml.in
               ${MEDIASCANNER_SETTINGS_FILE})

set(GLIB_SCHEMAS_DIR "${GLIB_SCHEMAS_PREFIX}/share/glib-2.0/schemas/"
    CACHE PATH "Installation location of glib schemas")

if(${GLIB_COMPILE_SCHEMAS} STREQUAL GLIB_COMPILE_SCHEMAS-NOTFOUND)
    message(FATAL_ERROR "Cannot find glib-compile-schemas in path")
endif(${GLIB_COMPILE_SCHEMAS} STREQUAL GLIB_COMPILE_SCHEMAS-NOTFOUND)


add_custom_command(OUTPUT mediascanner.gschema.valid
                   DEPENDS ${MEDIASCANNER_SETTINGS_FILE}
                   COMMAND ${GLIB_COMPILE_SCHEMAS} --dry-run --strict
                           --schema-file=mediascanner.gschema.xml
                   COMMAND touch mediascanner.gschema.valid)

add_custom_target(checksettings ALL DEPENDS mediascanner.gschema.valid)

install(FILES ${MEDIASCANNER_SETTINGS_FILE} DESTINATION ${GLIB_SCHEMAS_DIR})

if(GLIB_SCHEMAS_COMPILE)
  install(CODE "message(STATUS \"Compiling GSettings schemas at \$ENV{DESTDIR}${GLIB_SCHEMAS_DIR}\")")
  install(CODE "execute_process(COMMAND ${GLIB_COMPILE_SCHEMAS} --strict \$ENV{DESTDIR}${GLIB_SCHEMAS_DIR})")
endif(GLIB_SCHEMAS_COMPILE)

message(STATUS "Using ${GLIB_COMPILE_SCHEMAS} to compile GSettings schemas")
message(STATUS "GSettings schemas will be installed into ${GLIB_SCHEMAS_DIR}")

# =============================================================================
# Install Upstart session job
# =============================================================================

install(
  FILES mediascanner.conf
  DESTINATION ${CMAKE_INSTALL_DATADIR}/upstart/sessions
)

# =============================================================================
# Checking for required Boost libraries
# =============================================================================
find_package(Boost 1.50
             COMPONENTS date_time filesystem locale regex system
             REQUIRED)

# =============================================================================
# Check that Lucene++ has the correct build configuration
# =============================================================================
include(CheckLucenePlusPlus)
check_lucene_plusplus()

# =============================================================================
# Check for Google Tests
# =============================================================================
include(FindGoogleTests)
find_google_tests()

# =============================================================================

install(FILES README.md DESTINATION ${CMAKE_INSTALL_DOCDIR})

# =============================================================================
# Include subdirectories
# =============================================================================
add_subdirectory(src/mediascanner)
add_subdirectory(src/mediascanner-service)
add_subdirectory(src/grlmediascanner)
add_subdirectory(${GTEST_ROOT_DIR} tests/gtest)
add_subdirectory(tests)
add_subdirectory(examples)
add_subdirectory(docs)

# =============================================================================
# Enable quality measures
# =============================================================================

enable_testing()

add_custom_target(check COMMAND ${CMAKE_BUILD_TOOL} test)
add_custom_target(check-headless COMMAND ${CMAKE_BUILD_TOOL} test)

add_test(licensecheck ${CMAKE_CURRENT_SOURCE_DIR}/tools/licensecheck.py)
set_property(TEST licensecheck PROPERTY  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
