# Copyright (c) 2017, Intel Corporation
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.

cmake_minimum_required(VERSION 3.5)


include(os_release_info.cmake)

get_os_release_info(os_name os_version)

if(NOT DEFINED CMAKE_INSTALL_PREFIX OR CMAKE_INSTALL_PREFIX STREQUAL "")
    set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "..." FORCE)
endif()
message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")

if(NOT DEFINED MEDIA_VERSION OR MEDIA_VERSION STREQUAL "")
    set(MEDIA_VERSION "1.0.0")
endif()

if("${os_name}" STREQUAL "clear-linux-os")
    # clear-linux-os distribution avoids /etc for distribution defaults.
    # Set this variable explicitly before including GNUInstallDirs.
    set(CMAKE_INSTALL_SYSCONFDIR "usr/share/defaults/etc")
endif()

include(CMakeDependentOption)

option (ENABLE_KERNELS "Build driver with shaders (kernels) support" ON)
# ENABLE_NONFREE_KERNELS option permits to enable closed source EU shaders (kernels)
# additionally to open source EU shaders and fixed function hardware.
cmake_dependent_option( ENABLE_NONFREE_KERNELS
    "Use closed source pre-built  binary shaders (kernels)" ON
    "ENABLE_KERNELS" OFF)
cmake_dependent_option( BUILD_KERNELS
    "Rebuild shaders (kernels) from sources" OFF
    "ENABLE_KERNELS;NOT ENABLE_NONFREE_KERNELS" OFF)
option (BUILD_CMRTLIB "Build and Install cmrtlib together with media driver" ON)

include(GNUInstallDirs)

if (BUILD_CMRTLIB)
    add_subdirectory(cmrtlib)
endif()

if (BUILD_KERNELS)
    find_program(IGA iga64)
    if (NOT IGA)
        message(FATAL_ERROR "Failed to find IGA")
    endif()

    find_program(CMC cmc)
    if (NOT CMC)
        message(FATAL_ERROR "Failed to find CMC")
    endif()

    find_program(PYTHON python)
    if (NOT PYTHON)
        message(FATAL_ERROR "Failed to find PYTHON")
    endif()

    add_subdirectory(Tools/MediaDriverTools)
endif()

add_subdirectory(media_driver)

if("${LIBVA_DRIVERS_PATH}" STREQUAL "")
    set(LIBVA_DRIVERS_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/dri/")
endif()
message(STATUS "LIBVA_DRIVERS_PATH = ${LIBVA_DRIVERS_PATH}")

install (PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/media_driver/iHD_drv_video.so DESTINATION ${LIBVA_DRIVERS_PATH} COMPONENT media)

option (INSTALL_DRIVER_SYSCONF "Install driver system configuration file" OFF)
if (INSTALL_DRIVER_SYSCONF)
    configure_file (
        ${CMAKE_CURRENT_SOURCE_DIR}/media_driver/cmake/linux/intel-media.sh.in
        ${CMAKE_CURRENT_BINARY_DIR}/media_driver/cmake/linux/intel-media.sh)
    install (FILES ${CMAKE_CURRENT_BINARY_DIR}/media_driver/cmake/linux/intel-media.sh
        DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/profile.d/ COMPONENT media)
endif()

include(${CMAKE_CURRENT_LIST_DIR}/pack_ext.cmake OPTIONAL)

if (NOT MEDIA_PACKING)
    set(CPACK_GENERATOR "DEB" "RPM")
else()
    set(CPACK_GENERATOR ${MEDIA_PACKAGING})
endif()
set(CPACK_PACKAGE_NAME "intel-media")
set(CPACK_PACKAGE_VENDOR "Intel")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "intel-media Open Source Driver")
set(CPACK_RPM_PACKAGE_ARCHITECTURE "x86_64")
set(CPACK_RPM_PACKAGE_GROUP "System Environment/Libraries")
set(CPACK_RPM_PACKAGE_LICENSE "Intel")

if (DEFINED MEDIA_VERSION)
    string(REPLACE "." ";" MEDIA_VERSION_LIST ${MEDIA_VERSION})
    list(GET MEDIA_VERSION_LIST 0 MEDIA_VERSION_MAJOR)
    list(GET MEDIA_VERSION_LIST 1 MEDIA_VERSION_MINOR)
    list(GET MEDIA_VERSION_LIST 2 MEDIA_VERSION_PATCH)
    set(CPACK_PACKAGE_VERSION_MAJOR "${MEDIA_VERSION_MAJOR}")
    set(CPACK_PACKAGE_VERSION_MINOR "${MEDIA_VERSION_MINOR}")
    set(CPACK_PACKAGE_VERSION_PATCH "${MEDIA_VERSION_PATCH}")
endif()

set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Intel")

# Create Distro OS initial based on 1st-2nd letter of string
# or label "generic" for unsupported/unknown distros for CPACK_PACKAGE_FILE_NAME
if("${os_name}" STREQUAL "ubuntu")
    set(DISTRO_INFO "u${os_version}")
elseif("${os_name}" STREQUAL "fedora")
    set(DISTRO_INFO "f${os_version}")
elseif("${os_name}" STREQUAL "clear-linux-os")
    set(DISTRO_INFO "cl${os_version}")
elseif("${os_name}" STREQUAL "centos")
    set(DISTRO_INFO "ce${os_version}")
else()
    set(DISTRO_INFO "generic")
endif()

# Format Package Version and Build Type Strings for CPACK_PACKAGE_FILE_NAME
set(PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
string(TOLOWER "${BUILD_TYPE}.${CPACK_RPM_PACKAGE_ARCHITECTURE}" PACKAGE_TYPE)

set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${PACKAGE_VERSION}-${DISTRO_INFO}-${PACKAGE_TYPE}")

include(CPack)
